public UnmountHandler(ITracer tracer, RepoRegistry registry, NamedPipeServer.Connection connection, NamedPipeMessages.UnmountRepoRequest request) { this.tracer = tracer; this.registry = registry; this.connection = connection; this.request = request; }
private bool RequestUnmount(string rootPath, out string errorMessage) { errorMessage = string.Empty; NamedPipeMessages.UnmountRepoRequest request = new NamedPipeMessages.UnmountRepoRequest(); request.EnlistmentRoot = rootPath; using (NamedPipeClient client = new NamedPipeClient(this.ServicePipeName)) { if (!client.Connect()) { errorMessage = "Unable to unmount because GVFS.Service is not responding. Run 'sc start GVFS.Service' from an elevated command prompt to ensure it is running."; return(false); } try { client.SendRequest(request.ToMessage()); NamedPipeMessages.Message response = client.ReadResponse(); if (response.Header == NamedPipeMessages.UnmountRepoRequest.Response.Header) { NamedPipeMessages.UnmountRepoRequest.Response message = NamedPipeMessages.UnmountRepoRequest.Response.FromMessage(response); if (message.State != NamedPipeMessages.CompletionState.Success) { errorMessage = message.UserText; return(false); } else { errorMessage = string.Empty; 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); } } }
private 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 { { "request", request } })) { switch (message.Header) { case NamedPipeMessages.MountRepoRequest.Header: try { NamedPipeMessages.MountRepoRequest mountRequest = NamedPipeMessages.MountRepoRequest.FromMessage(message); MountHandler mountHandler = new MountHandler(activity, this.repoRegistry, connection, mountRequest); mountHandler.Run(); } catch (SerializationException ex) { activity.RelatedError("Could not deserialize mount request: {0}", ex.Message); } break; case NamedPipeMessages.UnmountRepoRequest.Header: try { NamedPipeMessages.UnmountRepoRequest unmountRequest = NamedPipeMessages.UnmountRepoRequest.FromMessage(message); UnmountHandler unmountHandler = new UnmountHandler(activity, this.repoRegistry, connection, unmountRequest); unmountHandler.Run(); } catch (SerializationException ex) { activity.RelatedError("Could not deserialize unmount request: {0}", ex.Message); } break; case NamedPipeMessages.Notification.Request.Header: try { NamedPipeMessages.Notification.Request notificationRequest = NamedPipeMessages.Notification.Request.FromMessage(message); NotificationHandler.Instance.SendNotification(activity, notificationRequest); } catch (SerializationException ex) { activity.RelatedError("Could not deserialize notification request: {0}", ex.Message); } break; default: EventMetadata metadata = new EventMetadata(); metadata.Add("Area", EtwArea); metadata.Add("Header", message.Header); metadata.Add("ErrorMessage", "HandleNewConnection: Unknown request"); this.tracer.RelatedError(metadata); connection.TrySendResponse(NamedPipeMessages.UnknownRequest); break; } } }