Пример #1
0
        public void HandleRequest(ITracer tracer, string request, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.Message message = NamedPipeMessages.Message.FromString(request);
            if (string.IsNullOrWhiteSpace(message.Header))
            {
                return;
            }

            using (ITracer activity = this.tracer.StartActivity(message.Header, EventLevel.Informational, new EventMetadata {
                { nameof(request), request }
            }))
            {
                try
                {
                    this.HandleMessage(activity, message, connection);
                }
                catch (SerializationException ex)
                {
                    EventMetadata metadata = new EventMetadata();
                    metadata.Add("Area", this.etwArea);
                    metadata.Add("Header", message.Header);
                    metadata.Add("Exception", ex.ToString());

                    activity.RelatedError(metadata, $"Could not deserialize {this.requestDescription} request: {ex.Message}");
                }
            }
        }
Пример #2
0
        private void HandleRequest(ITracer tracer, string request, NamedPipeServer.Connection connection)
        {
            try
            {
                NamedPipeMessages.Message message = NamedPipeMessages.Message.FromString(request);
                switch (message.Header)
                {
                case NamedPipeMessages.Notification.Request.Header:
                    NamedPipeMessages.Notification.Request toastRequest = NamedPipeMessages.Notification.Request.FromMessage(message);
                    if (toastRequest != null)
                    {
                        using (ITracer activity = this.tracer.StartActivity("SendToast", EventLevel.Informational))
                        {
                            this.ShowToast(activity, toastRequest);
                        }
                    }

                    break;
                }
            }
            catch (Exception e)
            {
                this.tracer.RelatedError("Unhandled exception: {0}", e.ToString());
            }
        }
Пример #3
0
        private void HandleLockRequest(NamedPipeServer.Connection connection, NamedPipeMessages.Message message)
        {
            NamedPipeMessages.AcquireLock.Response response;
            NamedPipeMessages.AcquireLock.Data     externalHolder;

            NamedPipeMessages.AcquireLock.Request request   = new NamedPipeMessages.AcquireLock.Request(message);
            NamedPipeMessages.AcquireLock.Data    requester = request.RequestData;
            if (request == null)
            {
                response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.UnknownRequest, requester);
            }
            else if (this.currentState != MountState.Ready)
            {
                response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.MountNotReadyResult);
            }
            else
            {
                bool lockAcquired = this.gvfsLock.TryAcquireLock(requester, out externalHolder);

                if (lockAcquired)
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.AcceptResult);
                }
                else if (externalHolder == null)
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.DenyGVFSResult);
                }
                else
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.DenyGitResult, externalHolder);
                }
            }

            connection.TrySendResponse(response.CreateMessage());
        }
Пример #4
0
        private void HandleRequest(ITracer tracer, string request, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.Message message = NamedPipeMessages.Message.FromString(request);

            switch (message.Header)
            {
            case NamedPipeMessages.GetStatus.Request:
                this.HandleGetStatusRequest(connection);
                break;

            case NamedPipeMessages.Unmount.Request:
                this.HandleUnmountRequest(connection);
                break;

            case NamedPipeMessages.DownloadObject.DownloadRequest:
                this.HandleDownloadObjectRequest(message, connection);
                break;

            case NamedPipeMessages.RunPostFetchJob.PostFetchJob:
                this.HandlePostFetchJobRequest(message, connection);
                break;

            default:
                EventMetadata metadata = new EventMetadata();
                metadata.Add("Area", "Mount");
                metadata.Add("Header", message.Header);
                this.tracer.RelatedError(metadata, "HandleRequest: Unknown request");

                connection.TrySendResponse(NamedPipeMessages.UnknownRequest);
                break;
            }
        }
        private void HandleDehydrateFolders(NamedPipeMessages.Message message, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.DehydrateFolders.Request request = new NamedPipeMessages.DehydrateFolders.Request(message);

            this.tracer.RelatedInfo($"Received dehydrate folders request with body {message.Body}");

            NamedPipeMessages.DehydrateFolders.Response response;
            if (this.currentState == MountState.Ready)
            {
                response = new NamedPipeMessages.DehydrateFolders.Response(NamedPipeMessages.DehydrateFolders.DehydratedResult);
                string[] folders = request.Folders.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string folder in folders)
                {
                    if (this.fileSystemCallbacks.TryDehydrateFolder(folder, out string errorMessage))
                    {
                        response.SuccessfulFolders.Add(folder);
                    }
                    else
                    {
                        response.FailedFolders.Add($"{folder}\0{errorMessage}");
                    }
                }

                // Since placeholders and modified paths could have changed with the dehydrate, the index needs to be rebuilt
                GitProcess gitProcess = new GitProcess(this.enlistment);
                gitProcess.ForceCheckout(GVFSConstants.DotGit.HeadName);
            }
            else
            {
                response = new NamedPipeMessages.DehydrateFolders.Response(NamedPipeMessages.DehydrateFolders.MountNotReadyResult);
            }

            connection.TrySendResponse(response.CreateMessage());
        }
Пример #6
0
 public UnregisterRepoHandler(ITracer tracer, RepoRegistry registry, NamedPipeServer.Connection connection, NamedPipeMessages.UnregisterRepoRequest request)
 {
     this.tracer     = tracer;
     this.registry   = registry;
     this.connection = connection;
     this.request    = request;
 }
Пример #7
0
        private void HandleRequest(string request, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.Message message = NamedPipeMessages.Message.FromString(request);

            switch (message.Header)
            {
            case NamedPipeMessages.GetStatus.Request:
                this.HandleGetStatusRequest(connection);
                break;

            case NamedPipeMessages.Unmount.Request:
                this.HandleUnmountRequest(connection);
                break;

            case NamedPipeMessages.AcquireLock.AcquireRequest:
                this.HandleLockRequest(message.Body, connection);
                break;

            case NamedPipeMessages.ReleaseLock.Request:
                this.HandleReleaseLockRequest(message.Body, connection);
                break;

            case NamedPipeMessages.DownloadObject.DownloadRequest:
                this.HandleDownloadObjectRequest(message, connection);
                break;

            default:
                connection.TrySendResponse(NamedPipeMessages.UnknownRequest);
                break;
            }
        }
Пример #8
0
        private void HandleUnmountRequest(NamedPipeServer.Connection connection)
        {
            switch (this.currentState)
            {
            case MountState.Mounting:
                connection.TrySendResponse(NamedPipeMessages.Unmount.NotMounted);
                break;

            // Even if the previous mount failed, attempt to unmount anyway.  Otherwise the user has no
            // recourse but to kill the process.
            case MountState.MountFailed:
                goto case MountState.Ready;

            case MountState.Ready:
                this.currentState = MountState.Unmounting;

                connection.TrySendResponse(NamedPipeMessages.Unmount.Acknowledged);
                this.UnmountAndStopWorkingDirectoryCallbacks();
                connection.TrySendResponse(NamedPipeMessages.Unmount.Completed);

                this.unmountEvent.Set();
                Environment.Exit((int)ReturnCode.Success);
                break;

            case MountState.Unmounting:
                connection.TrySendResponse(NamedPipeMessages.Unmount.AlreadyUnmounting);
                break;

            default:
                connection.TrySendResponse(NamedPipeMessages.UnknownGVFSState);
                break;
            }
        }
Пример #9
0
 protected void WriteToClient(NamedPipeMessages.Message message, NamedPipeServer.Connection connection, ITracer tracer)
 {
     if (!connection.TrySendResponse(message))
     {
         tracer.RelatedError("Failed to send line to client: {0}", message);
     }
 }
 public EnableAndAttachProjFSHandler(
     ITracer tracer,
     NamedPipeServer.Connection connection,
     NamedPipeMessages.EnableAndAttachProjFSRequest request)
 {
     this.tracer     = tracer;
     this.connection = connection;
     this.request    = request;
 }
Пример #11
0
 public ExcludeFromAntiVirusHandler(
     ITracer tracer,
     NamedPipeServer.Connection connection,
     NamedPipeMessages.ExcludeFromAntiVirusRequest request)
 {
     this.tracer     = tracer;
     this.connection = connection;
     this.request    = request;
 }
Пример #12
0
 public AttachGvFltHandler(
     ITracer tracer,
     NamedPipeServer.Connection connection,
     NamedPipeMessages.AttachGvFltRequest request)
 {
     this.tracer     = tracer;
     this.connection = connection;
     this.request    = request;
 }
Пример #13
0
 private void TrySendResponse(
     ITracer tracer,
     string message,
     NamedPipeServer.Connection connection)
 {
     if (!connection.TrySendResponse(message))
     {
         tracer.RelatedError($"{nameof(this.TrySendResponse)}: Could not send response to client. Reply Info: {message}");
     }
 }
Пример #14
0
        private void HandleLockRequest(string messageBody, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.AcquireLock.Response response;

            NamedPipeMessages.LockRequest request   = new NamedPipeMessages.LockRequest(messageBody);
            NamedPipeMessages.LockData    requester = request.RequestData;
            if (this.currentState == MountState.Unmounting)
            {
                response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.UnmountInProgressResult);

                EventMetadata metadata = new EventMetadata();
                metadata.Add("LockRequest", requester.ToString());
                metadata.Add(TracingConstants.MessageKey.InfoMessage, "Request denied, unmount in progress");
                this.tracer.RelatedEvent(EventLevel.Informational, "HandleLockRequest_UnmountInProgress", metadata);
            }
            else if (this.currentState != MountState.Ready)
            {
                response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.MountNotReadyResult);
            }
            else
            {
                bool lockAcquired = false;

                NamedPipeMessages.LockData existingExternalHolder = null;
                string denyGVFSMessage = null;

                bool lockAvailable = this.context.Repository.GVFSLock.IsLockAvailableForExternalRequestor(out existingExternalHolder);
                bool isReadyForExternalLockRequests = this.fileSystemCallbacks.IsReadyForExternalAcquireLockRequests(requester, out denyGVFSMessage);

                if (!requester.CheckAvailabilityOnly && isReadyForExternalLockRequests)
                {
                    lockAcquired = this.context.Repository.GVFSLock.TryAcquireLockForExternalRequestor(requester, out existingExternalHolder);
                }

                if (requester.CheckAvailabilityOnly && lockAvailable && isReadyForExternalLockRequests)
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.AvailableResult);
                }
                else if (lockAcquired)
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.AcceptResult);
                    this.tracer.SetGitCommandSessionId(requester.GitCommandSessionId);
                }
                else if (existingExternalHolder == null)
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.DenyGVFSResult, responseData: null, denyGVFSMessage: denyGVFSMessage);
                }
                else
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.DenyGitResult, existingExternalHolder);
                }
            }

            connection.TrySendResponse(response.CreateMessage());
        }
Пример #15
0
        private void HandleLockRequest(string messageBody, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.AcquireLock.Response response;
            NamedPipeMessages.LockData             externalHolder;

            NamedPipeMessages.LockRequest request   = new NamedPipeMessages.LockRequest(messageBody);
            NamedPipeMessages.LockData    requester = request.RequestData;
            if (request == null)
            {
                response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.UnknownRequest, requester);
            }
            else if (this.currentState == MountState.Unmounting)
            {
                response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.UnmountInProgressResult);

                EventMetadata metadata = new EventMetadata();
                metadata.Add("LockRequest", requester.ToString());
                metadata.Add(TracingConstants.MessageKey.InfoMessage, "Request denied, unmount in progress");
                this.tracer.RelatedEvent(EventLevel.Informational, "HandleLockRequest_UnmountInProgress", metadata);
            }
            else if (this.currentState != MountState.Ready)
            {
                response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.MountNotReadyResult);
            }
            else
            {
                bool   lockAcquired = false;
                string denyMessage;
                if (this.gvfltCallbacks.IsReadyForExternalAcquireLockRequests(requester, out denyMessage))
                {
                    lockAcquired = this.context.Repository.GVFSLock.TryAcquireLock(requester, out externalHolder);
                }
                else
                {
                    // There might be an external lock holder, and it should be reported to the user
                    externalHolder = this.context.Repository.GVFSLock.GetExternalLockHolder();
                }

                if (lockAcquired)
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.AcceptResult);
                }
                else if (externalHolder == null)
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.DenyGVFSResult, responseData: null, denyGVFSMessage: denyMessage);
                }
                else
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.DenyGitResult, externalHolder);
                }
            }

            connection.TrySendResponse(response.CreateMessage());
        }
Пример #16
0
 public GetActiveRepoListHandler(
     ITracer tracer,
     RepoRegistry registry,
     NamedPipeServer.Connection connection,
     NamedPipeMessages.GetActiveRepoListRequest request)
 {
     this.tracer     = tracer;
     this.registry   = registry;
     this.connection = connection;
     this.request    = request;
 }
        private void HandleRequest(ITracer tracer, string request, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.Message message = NamedPipeMessages.Message.FromString(request);

            switch (message.Header)
            {
            case NamedPipeMessages.GetStatus.Request:
                this.HandleGetStatusRequest(connection);
                break;

            case NamedPipeMessages.Unmount.Request:
                this.HandleUnmountRequest(connection);
                break;

            case NamedPipeMessages.AcquireLock.AcquireRequest:
                this.HandleLockRequest(message.Body, connection);
                break;

            case NamedPipeMessages.ReleaseLock.Request:
                this.HandleReleaseLockRequest(message.Body, connection);
                break;

            case NamedPipeMessages.DownloadObject.DownloadRequest:
                this.HandleDownloadObjectRequest(message, connection);
                break;

            case NamedPipeMessages.ModifiedPaths.ListRequest:
                this.HandleModifiedPathsListRequest(message, connection);
                break;

            case NamedPipeMessages.PostIndexChanged.NotificationRequest:
                this.HandlePostIndexChangedRequest(message, connection);
                break;

            case NamedPipeMessages.RunPostFetchJob.PostFetchJob:
                this.HandlePostFetchJobRequest(message, connection);
                break;

            case NamedPipeMessages.DehydrateFolders.Dehydrate:
                this.HandleDehydrateFolders(message, connection);
                break;

            default:
                EventMetadata metadata = new EventMetadata();
                metadata.Add("Area", "Mount");
                metadata.Add("Header", message.Header);
                this.tracer.RelatedError(metadata, "HandleRequest: Unknown request");

                connection.TrySendResponse(NamedPipeMessages.UnknownRequest);
                break;
            }
        }
Пример #18
0
        private void HandleReleaseLockRequest(string messageBody, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.LockRequest request = new NamedPipeMessages.LockRequest(messageBody);

            if (this.gvfltCallbacks.TryReleaseExternalLock(request.RequestData.PID))
            {
                connection.TrySendResponse(NamedPipeMessages.ReleaseLock.SuccessResult);
            }
            else
            {
                connection.TrySendResponse(NamedPipeMessages.ReleaseLock.FailureResult);
            }
        }
Пример #19
0
        protected virtual void HandleMessage(
            ITracer tracer,
            NamedPipeMessages.Message message,
            NamedPipeServer.Connection connection)
        {
            switch (message.Header)
            {
            case NamedPipeMessages.RegisterRepoRequest.Header:
                this.requestDescription = MountRequestDescription;
                NamedPipeMessages.RegisterRepoRequest mountRequest = NamedPipeMessages.RegisterRepoRequest.FromMessage(message);
                RegisterRepoHandler mountHandler = new RegisterRepoHandler(tracer, this.repoRegistry, connection, mountRequest);
                mountHandler.Run();

                break;

            case NamedPipeMessages.UnregisterRepoRequest.Header:
                this.requestDescription = UnmountRequestDescription;
                NamedPipeMessages.UnregisterRepoRequest unmountRequest = NamedPipeMessages.UnregisterRepoRequest.FromMessage(message);
                UnregisterRepoHandler unmountHandler = new UnregisterRepoHandler(tracer, this.repoRegistry, connection, unmountRequest);
                unmountHandler.Run();

                break;

            case NamedPipeMessages.GetActiveRepoListRequest.Header:
                this.requestDescription = RepoListRequestDescription;
                NamedPipeMessages.GetActiveRepoListRequest repoListRequest = NamedPipeMessages.GetActiveRepoListRequest.FromMessage(message);
                GetActiveRepoListHandler excludeHandler = new GetActiveRepoListHandler(tracer, this.repoRegistry, connection, repoListRequest);
                excludeHandler.Run();

                break;

            case NamedPipeMessages.EnableAndAttachProjFSRequest.Header:

                // This request is ignored on non Windows platforms.
                NamedPipeMessages.EnableAndAttachProjFSRequest.Response response = new NamedPipeMessages.EnableAndAttachProjFSRequest.Response();
                response.State = NamedPipeMessages.CompletionState.Success;

                this.TrySendResponse(tracer, response.ToMessage().ToString(), connection);
                break;

            default:
                this.requestDescription = UnknownRequestDescription;
                EventMetadata metadata = new EventMetadata();
                metadata.Add("Area", this.etwArea);
                metadata.Add("Header", message.Header);
                tracer.RelatedWarning(metadata, "HandleNewConnection: Unknown request", Keywords.Telemetry);

                this.TrySendResponse(tracer, NamedPipeMessages.UnknownRequest, connection);
                break;
            }
        }
Пример #20
0
        private void HandleReleaseLockRequest(string messageBody, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.LockRequest request = new NamedPipeMessages.LockRequest(messageBody);

            if (request.RequestData == null)
            {
                this.tracer.RelatedError($"{nameof(this.HandleReleaseLockRequest)} received invalid lock request with body '{messageBody}'");
                this.UnmountAndStopWorkingDirectoryCallbacks();
                Environment.Exit((int)ReturnCode.NullRequestData);
            }

            NamedPipeMessages.ReleaseLock.Response response = this.fileSystemCallbacks.TryReleaseExternalLock(request.RequestData.PID);
            connection.TrySendResponse(response.CreateMessage());
        }
Пример #21
0
 protected override void HandleMessage(
     ITracer tracer,
     NamedPipeMessages.Message message,
     NamedPipeServer.Connection connection)
 {
     if (message.Header == NamedPipeMessages.EnableAndAttachProjFSRequest.Header)
     {
         this.requestDescription = EnableProjFSRequestDescription;
         NamedPipeMessages.EnableAndAttachProjFSRequest attachRequest = NamedPipeMessages.EnableAndAttachProjFSRequest.FromMessage(message);
         EnableAndAttachProjFSHandler attachHandler = new EnableAndAttachProjFSHandler(tracer, connection, attachRequest);
         attachHandler.Run();
     }
     else
     {
         base.HandleMessage(tracer, message, connection);
     }
 }
Пример #22
0
        protected virtual void HandleMessage(
            ITracer tracer,
            NamedPipeMessages.Message message,
            NamedPipeServer.Connection connection)
        {
            switch (message.Header)
            {
            default:
                this.requestDescription = UnknownRequestDescription;
                EventMetadata metadata = new EventMetadata();
                metadata.Add("Area", this.etwArea);
                metadata.Add("Header", message.Header);
                tracer.RelatedWarning(metadata, "HandleNewConnection: Unknown request", Keywords.Telemetry);

                this.TrySendResponse(tracer, NamedPipeMessages.UnknownRequest, connection);
                break;
            }
        }
Пример #23
0
        private void HandleLockRequest(string messageBody, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.AcquireLock.Response response;
            NamedPipeMessages.LockData             externalHolder;

            NamedPipeMessages.LockRequest request   = new NamedPipeMessages.LockRequest(messageBody);
            NamedPipeMessages.LockData    requester = request.RequestData;
            if (request == null)
            {
                response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.UnknownRequest, requester);
            }
            else if (this.currentState != MountState.Ready)
            {
                response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.MountNotReadyResult);
            }
            else
            {
                bool lockAcquired = false;
                if (this.gvfltCallbacks.IsReadyForExternalAcquireLockRequests())
                {
                    lockAcquired = this.gvfsLock.TryAcquireLock(requester, out externalHolder);
                }
                else
                {
                    // There might be an external lock holder, and it should be reported to the user
                    externalHolder = this.gvfsLock.GetExternalLockHolder();
                }

                if (lockAcquired)
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.AcceptResult);
                }
                else if (externalHolder == null)
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.DenyGVFSResult);
                }
                else
                {
                    response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.DenyGitResult, externalHolder);
                }
            }

            connection.TrySendResponse(response.CreateMessage());
        }
Пример #24
0
        private static void HandleRequest(string request, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.Message message = NamedPipeMessages.Message.FromString(request);

            switch (message.Header)
            {
            case NamedPipeMessages.AcquireLock.AcquireRequest:
                NamedPipeMessages.AcquireLock.Response response = new NamedPipeMessages.AcquireLock.Response(NamedPipeMessages.AcquireLock.AcceptResult);
                connection.TrySendResponse(response.CreateMessage());
                break;

            case NamedPipeMessages.ReleaseLock.Request:
                connection.TrySendResponse(NamedPipeMessages.ReleaseLock.SuccessResult);
                break;

            default:
                connection.TrySendResponse(NamedPipeMessages.UnknownRequest);
                break;
            }
        }
Пример #25
0
        private void HandleDownloadObjectRequest(NamedPipeMessages.Message message, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.DownloadObject.Response response;

            NamedPipeMessages.DownloadObject.Request request = new NamedPipeMessages.DownloadObject.Request(message);
            string objectSha = request.RequestSha;

            if (request == null)
            {
                response = new NamedPipeMessages.DownloadObject.Response(NamedPipeMessages.UnknownRequest);
            }
            else if (this.currentState != MountState.Ready)
            {
                response = new NamedPipeMessages.DownloadObject.Response(NamedPipeMessages.DownloadObject.MountNotReadyResult);
            }
            else
            {
                if (!SHA1Util.IsValidShaFormat(objectSha))
                {
                    response = new NamedPipeMessages.DownloadObject.Response(NamedPipeMessages.DownloadObject.InvalidSHAResult);
                }
                else
                {
                    Stopwatch downloadTime = Stopwatch.StartNew();
                    if (this.gitObjects.TryDownloadAndSaveObject(objectSha, GVFSGitObjects.RequestSource.NamedPipeMessage) == GitObjects.DownloadAndSaveObjectResult.Success)
                    {
                        response = new NamedPipeMessages.DownloadObject.Response(NamedPipeMessages.DownloadObject.SuccessResult);
                    }
                    else
                    {
                        response = new NamedPipeMessages.DownloadObject.Response(NamedPipeMessages.DownloadObject.DownloadFailed);
                    }

                    bool isBlob;
                    this.context.Repository.TryGetIsBlob(objectSha, out isBlob);
                    this.context.Repository.GVFSLock.RecordObjectDownload(isBlob, downloadTime.ElapsedMilliseconds);
                }
            }

            connection.TrySendResponse(response.CreateMessage());
        }
Пример #26
0
        private void HandlePostFetchJobRequest(NamedPipeMessages.Message message, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.RunPostFetchJob.Request request = new NamedPipeMessages.RunPostFetchJob.Request(message);

            this.tracer.RelatedInfo("Received post-fetch job request with body {0}", message.Body);

            NamedPipeMessages.RunPostFetchJob.Response response;
            if (this.currentState == MountState.Ready)
            {
                List <string> packIndexes = JsonConvert.DeserializeObject <List <string> >(message.Body);
                this.maintenanceScheduler.EnqueueOneTimeStep(new PostFetchStep(this.context, packIndexes));

                response = new NamedPipeMessages.RunPostFetchJob.Response(NamedPipeMessages.RunPostFetchJob.QueuedResult);
            }
            else
            {
                response = new NamedPipeMessages.RunPostFetchJob.Response(NamedPipeMessages.RunPostFetchJob.MountNotReadyResult);
            }

            connection.TrySendResponse(response.CreateMessage());
        }
Пример #27
0
        private void HandlePostFetchJobRequest(NamedPipeMessages.Message message, NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.RunPostFetchJob.Request request = new NamedPipeMessages.RunPostFetchJob.Request(message);

            this.tracer.RelatedInfo("Received post-fetch job request with body {0}", message.Body);

            NamedPipeMessages.RunPostFetchJob.Response response;
            if (this.currentState == MountState.Ready)
            {
                List <string> packIndexes = JsonConvert.DeserializeObject <List <string> >(message.Body);
                this.fileSystemCallbacks.LaunchPostFetchJob(packIndexes);

                response = new NamedPipeMessages.RunPostFetchJob.Response(NamedPipeMessages.RunPostFetchJob.QueuedResult);
            }
            else
            {
                response = new NamedPipeMessages.RunPostFetchJob.Response(NamedPipeMessages.RunPostFetchJob.MountNotReadyResult);
            }

            connection.TrySendResponse(response.CreateMessage());
        }
Пример #28
0
        private void HandleConnection(NamedPipeServer.Connection connection)
        {
            while (connection.IsConnected)
            {
                string request = connection.ReadRequest();

                if (request == null ||
                    !connection.IsConnected)
                {
                    break;
                }

                NamedPipeMessages.Message message = NamedPipeMessages.Message.FromString(request);

                switch (message.Header)
                {
                case NamedPipeMessages.GetStatus.Request:
                    this.HandleGetStatusRequest(connection);
                    break;

                case NamedPipeMessages.Unmount.Request:
                    this.HandleUnmountRequest(connection);
                    break;

                case NamedPipeMessages.AcquireLock.AcquireRequest:
                    this.HandleLockRequest(connection, message);
                    break;

                case NamedPipeMessages.DownloadObject.DownloadRequest:
                    this.HandleDownloadObjectRequest(connection, message);
                    break;

                default:
                    connection.TrySendResponse(NamedPipeMessages.UnknownRequest);
                    break;
                }
            }
        }
Пример #29
0
        private void HandleGetStatusRequest(NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.GetStatus.Response response = new NamedPipeMessages.GetStatus.Response();
            response.EnlistmentRoot = this.enlistment.EnlistmentRoot;
            response.LocalCacheRoot = !string.IsNullOrWhiteSpace(this.enlistment.LocalCacheRoot) ? this.enlistment.LocalCacheRoot : this.enlistment.GitObjectsRoot;
            response.RepoUrl        = this.enlistment.RepoUrl;
            response.CacheServer    = this.cacheServer.ToString();
            response.LockStatus     = this.context?.Repository.GVFSLock != null?this.context.Repository.GVFSLock.GetStatus() : "Unavailable";

            response.DiskLayoutVersion = $"{GVFSPlatform.Instance.DiskLayoutUpgrade.Version.CurrentMajorVersion}.{GVFSPlatform.Instance.DiskLayoutUpgrade.Version.CurrentMinorVersion}";

            switch (this.currentState)
            {
            case MountState.Mounting:
                response.MountStatus = NamedPipeMessages.GetStatus.Mounting;
                break;

            case MountState.Ready:
                response.MountStatus = NamedPipeMessages.GetStatus.Ready;
                response.BackgroundOperationCount = this.fileSystemCallbacks.BackgroundOperationCount;
                break;

            case MountState.Unmounting:
                response.MountStatus = NamedPipeMessages.GetStatus.Unmounting;
                break;

            case MountState.MountFailed:
                response.MountStatus = NamedPipeMessages.GetStatus.MountFailed;
                break;

            default:
                response.MountStatus = NamedPipeMessages.UnknownGVFSState;
                break;
            }

            connection.TrySendResponse(response.ToJson());
        }
Пример #30
0
        private void HandleGetStatusRequest(NamedPipeServer.Connection connection)
        {
            NamedPipeMessages.GetStatus.Response response = new NamedPipeMessages.GetStatus.Response();
            response.EnlistmentRoot = this.enlistment.EnlistmentRoot;
            response.RepoUrl        = this.enlistment.RepoUrl;
            response.ObjectsUrl     = this.enlistment.ObjectsEndpointUrl;
            response.LockStatus     = this.gvfsLock != null?this.gvfsLock.GetStatus() : "Unavailable";

            response.DiskLayoutVersion = RepoMetadata.GetCurrentDiskLayoutVersion();

            switch (this.currentState)
            {
            case MountState.Mounting:
                response.MountStatus = NamedPipeMessages.GetStatus.Mounting;
                break;

            case MountState.Ready:
                response.MountStatus = NamedPipeMessages.GetStatus.Ready;
                response.BackgroundOperationCount = this.gvfltCallbacks.GetBackgroundOperationCount();
                break;

            case MountState.Unmounting:
                response.MountStatus = NamedPipeMessages.GetStatus.Unmounting;
                break;

            case MountState.MountFailed:
                response.MountStatus = NamedPipeMessages.GetStatus.MountFailed;
                break;

            default:
                response.MountStatus = NamedPipeMessages.UnknownGVFSState;
                break;
            }

            connection.TrySendResponse(response.ToJson());
        }