public void Run() { string errorMessage; NamedPipeMessages.CompletionState state = NamedPipeMessages.CompletionState.Success; if (!TryEnablePrjFlt(this.tracer, out errorMessage)) { state = NamedPipeMessages.CompletionState.Failure; this.tracer.RelatedError("Unable to install or enable PrjFlt. Enlistment root: {0} \nError: {1} ", this.request.EnlistmentRoot, errorMessage); } if (!string.IsNullOrEmpty(this.request.EnlistmentRoot)) { if (!ProjFSFilter.TryAttach(this.request.EnlistmentRoot, out errorMessage)) { state = NamedPipeMessages.CompletionState.Failure; this.tracer.RelatedError("Unable to attach filter to volume. Enlistment root: {0} \nError: {1} ", this.request.EnlistmentRoot, errorMessage); } } NamedPipeMessages.EnableAndAttachProjFSRequest.Response response = new NamedPipeMessages.EnableAndAttachProjFSRequest.Response(); response.State = state; response.ErrorMessage = errorMessage; this.WriteToClient(response.ToMessage(), this.connection, this.tracer); }
/// <summary> /// Request that PrjFlt be enabled and attached to the volume of the enlistment root /// </summary> /// <param name="enlistmentRoot">Enlistment root. If string.Empty, PrjFlt will be enabled but not attached to any volumes</param> /// <param name="errorMessage">Error meesage (in the case of failure)</param> /// <returns>True is successful and false otherwise</returns> protected bool TryEnableAndAttachPrjFltThroughService(string enlistmentRoot, out string errorMessage) { errorMessage = string.Empty; NamedPipeMessages.EnableAndAttachProjFSRequest request = new NamedPipeMessages.EnableAndAttachProjFSRequest(); request.EnlistmentRoot = enlistmentRoot; using (NamedPipeClient client = new NamedPipeClient(this.ServicePipeName)) { if (!client.Connect()) { errorMessage = "GVFS.Service is not responding. " + GVFSVerb.StartServiceInstructions; return(false); } try { client.SendRequest(request.ToMessage()); NamedPipeMessages.Message response = client.ReadResponse(); if (response.Header == NamedPipeMessages.EnableAndAttachProjFSRequest.Response.Header) { NamedPipeMessages.EnableAndAttachProjFSRequest.Response message = NamedPipeMessages.EnableAndAttachProjFSRequest.Response.FromMessage(response); if (!string.IsNullOrEmpty(message.ErrorMessage)) { errorMessage = message.ErrorMessage; return(false); } if (message.State != NamedPipeMessages.CompletionState.Success) { errorMessage = $"Failed to attach ProjFS to volume."; return(false); } else { return(true); } } else { errorMessage = string.Format("GVFS.Service responded with unexpected message: {0}", response); return(false); } } catch (BrokenPipeException e) { errorMessage = "Unable to communicate with GVFS.Service: " + e.ToString(); return(false); } } }
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; } }