static async Task Main(string[] args) { //Get configuration var networkAddress = NetworkAddress.Parse(ConfigurationManager.AppSettings["Network"]); var broadcastPort = int.Parse(ConfigurationManager.AppSettings["BroadcastUdpPort"]); var unicastPort = int.Parse(ConfigurationManager.AppSettings["UnicastTcpPort"]); localAddress = networkAddress.GetLocalAddress(); //This client exposes all of the high-level functionality var collaborationClient = new CollaborationClient(networkAddress, broadcastPort, unicastPort); collaborationClient.CollaborationRequestAccepted += OnCollaborationRequestAccepted; collaborationClient.CollaborationRequestDeclined += OnCollaborationRequestDeclined; collaborationClient.StopCollaborationRequested += OnStopCollaborationRequested; collaborationClient.SubscriptionRequested += OnSubscriptionRequested; collaborationClient.SubscriberNotifiedToStopCollaborating += OnSubscriberNotifiedToStopCollaborating; //Start listening per collaboration requests broadcasts var broadcastListenTask = StartListeningForCollaborationRequests(collaborationClient, listeningCancellationTokenSource.Token); //And also listen for subscription requests var subscriptionListenTask = StartListeningForSubscriptions(collaborationClient, listeningCancellationTokenSource.Token); //Then, read commands from the user HandleUserInput(collaborationClient); //When it's time to close the app, cancel any pending work and shutdown the hosts workCancellationTokenSource?.Cancel(); await Task.WhenAll(broadcastListenTask, subscriptionListenTask); }
private static async Task StartListeningForCollaborationRequests(CollaborationClient client, CancellationToken token) { Uri uri = client.ListenForCollaborationRequests(); Console.WriteLine($"Started listening on incoming collaboration requests on address {uri}"); try { await Task.Delay(-1, token); } catch (OperationCanceledException) { } finally { client.StopListeningForCollaborationRequests(); } }
private static void HandleUserInput(CollaborationClient client) { ConsoleKeyInfo input; WriteInstructions(); while ((input = Console.ReadKey()).Key != ConsoleKey.Enter) { Console.WriteLine(); switch (input.Key) { case ConsoleKey.R: //Let's generate some random filename //TODO: this needs to be modified with appropriate logic var filename = Guid.NewGuid().ToString().Split('-').Last() + ".ext"; try { var collaboration = client.BroadcastCollaborationRequestForFile(filename); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"Collaboration request broadcast successfully for file {collaboration.Filename}, starting work now..."); Console.ResetColor(); workCancellationTokenSource = new CancellationTokenSource(); PerformWorkOnFile(collaboration.Filename, workCancellationTokenSource.Token); } catch (Exception exc) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(exc.Message); Console.ResetColor(); } break; case ConsoleKey.S: workCancellationTokenSource?.Cancel(); client.StopCollaboration(); Console.WriteLine("Work stopped"); WriteInstructions(); break; } } listeningCancellationTokenSource.Cancel(); }
public CollaborationRequestService(CollaborationClient client) { this.client = client; }
public SubscriptionService(CollaborationClient client) { this.client = client; }