Пример #1
0
 protected virtual void OnDeviceUpdated(CompanionConnectionManager m, CompanionDevice d)
 {
     if (CompanionDeviceUpdated != null)
     {
         CompanionDeviceUpdated(m, d);
     }
 }
Пример #2
0
        CompanionDevice GetCompanionDeviceFromParameters(Dictionary <string, string> Parameters)
        {
            CompanionDevice d = null;

            if ((Parameters != null) && (Parameters.ContainsKey(CompanionProtocol.parameterName)) &&
                (Parameters.ContainsKey(CompanionProtocol.parameterIPAddress)) &&
                (Parameters.ContainsKey(CompanionProtocol.parameterKind)) &&
                (Parameters.ContainsKey(CompanionProtocol.parameterID))
                )
            {
                string Name = Parameters[CompanionProtocol.parameterName];
                if (Name != null)
                {
                    string IP = Parameters[CompanionProtocol.parameterIPAddress];
                    if (IP != null)
                    {
                        string Kind = Parameters[CompanionProtocol.parameterKind];
                        if (Kind != null)
                        {
                            string Id = Parameters[CompanionProtocol.parameterID];
                            if (Id != null)
                            {
                                d = new CompanionDevice(Id, false, Name, IP, Kind);
                            }
                        }
                    }
                }
            }
            return(d);
        }
Пример #3
0
 // Summary:
 //     Check if the device is connected (a ping have been successful)
 public virtual bool IsCompanionDeviceConnected(CompanionDevice cd)
 {
     if ((listCompanionDevices.ContainsKey(cd.Id)) && (listRemoteSystems.ContainsKey(cd.Id)))
     {
         return(listCompanionDevices[cd.Id].Status == CompanionDeviceStatus.Connected);
     }
     return(false);
 }
Пример #4
0
        // Summary:
        //     Initialize CompanionConnectionManager
        public virtual async System.Threading.Tasks.Task <bool> Initialize(CompanionDevice LocalDevice, CompanionConnectionManagerInitializeArgs InitArgs)
        {
            LocalCompanionDevice = LocalDevice;
            ApplicationUri       = InitArgs.ApplicationUri;
            AppServiceName       = InitArgs.AppServiceName;
            PackageFamilyName    = InitArgs.PackageFamilyName;
            if (listCompanionDevices == null)
            {
                listCompanionDevices = new Dictionary <string, CompanionDevice>();
            }
            if (listRemoteSystems == null)
            {
                listRemoteSystems = new Dictionary <string, RemoteSystem>();
            }
            //Set up a new app service connection
            if (receiveConnection != null)
            {
                receiveConnection.ServiceClosed   -= ReceiveConnection_ServiceClosed;
                receiveConnection.RequestReceived -= ReceiveConnection_RequestReceived;
                receiveConnection = null;
            }
            receiveConnection = new AppServiceConnection();
            if (receiveConnection != null)
            {
                receiveConnection.AppServiceName    = AppServiceName;
                receiveConnection.PackageFamilyName = PackageFamilyName;
                receiveConnection.RequestReceived  += ReceiveConnection_RequestReceived;
                receiveConnection.ServiceClosed    += ReceiveConnection_ServiceClosed;
                Windows.ApplicationModel.AppService.AppServiceConnectionStatus status = await receiveConnection.OpenAsync();

                if (status == Windows.ApplicationModel.AppService.AppServiceConnectionStatus.Success)
                {
                    // Connection established with the background task
                    var inputs = new ValueSet();
                    inputs.Add(CompanionServiceMessage.ATT_TYPE, CompanionServiceMessage.TYPE_INIT);
                    AppServiceResponse response = await receiveConnection.SendMessageAsync(inputs);

                    if ((response != null) && (response.Status == AppServiceResponseStatus.Success))
                    {
                        if ((response.Message != null) && (response.Message.ContainsKey(CompanionServiceMessage.ATT_TYPE)))
                        {
                            string s = (string)response.Message[CompanionServiceMessage.ATT_TYPE];
                            if (string.Equals(s, CompanionServiceMessage.TYPE_RESULT))
                            {
                                return(true);
                            }
                        }
                    }
                }
            }
            return(false);
        }
Пример #5
0
        public virtual async System.Threading.Tasks.Task <bool> Send(CompanionDevice cd, string Message)
        {
            if (cd != null)
            {
                if (await CheckCompanionDeviceConnected(cd))
                {
                    if (listRemoteSystems.ContainsKey(cd.Id))
                    {
                        RemoteSystemConnectionRequest rscr = new RemoteSystemConnectionRequest(listRemoteSystems[cd.Id]);
                        if (rscr != null)
                        {
                            using (var connection = new AppServiceConnection())
                            {
                                //Set up a new app service connection
                                connection.AppServiceName    = AppServiceName;
                                connection.PackageFamilyName = PackageFamilyName;


                                AppServiceConnectionStatus status = await connection.OpenRemoteAsync(rscr);

                                if (status == AppServiceConnectionStatus.Success)
                                {
                                    //Set up the inputs and send a message to the service
                                    var inputs = new ValueSet();
                                    inputs.Add(CompanionServiceMessage.ATT_TYPE, CompanionServiceMessage.TYPE_DATA);
                                    inputs.Add(CompanionServiceMessage.ATT_SOURCEID, GetSourceId());
                                    inputs.Add(CompanionServiceMessage.ATT_SOURCENAME, GetSourceName());
                                    inputs.Add(CompanionServiceMessage.ATT_SOURCEIP, GetSourceIP());
                                    inputs.Add(CompanionServiceMessage.ATT_SOURCEKIND, GetSourceKind());
                                    inputs.Add(CompanionServiceMessage.ATT_MESSAGE, Message);
                                    AppServiceResponse response = await connection.SendMessageAsync(inputs);

                                    if ((response != null) && (response.Status == AppServiceResponseStatus.Success))
                                    {
                                        if ((response.Message != null) && (response.Message.ContainsKey(CompanionServiceMessage.ATT_TYPE)))
                                        {
                                            string s = (string)response.Message[CompanionServiceMessage.ATT_TYPE];
                                            if (string.Equals(s, CompanionServiceMessage.TYPE_RESULT))
                                            {
                                                return(true);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(false);
        }
Пример #6
0
        public override async System.Threading.Tasks.Task <bool> Initialize(CompanionDevice LocalDevice, CompanionConnectionManagerInitializeArgs InitArgs)
        {
            await base.Initialize(LocalDevice, InitArgs);

            MulticastCompanionConnectionManagerInitializeArgs mInitArgs = InitArgs as MulticastCompanionConnectionManagerInitializeArgs;

            if (mInitArgs != null)
            {
                MulticastIPAddress   = mInitArgs.MulticastIPAddress;
                MulticastUDPPort     = mInitArgs.MulticastUDPPort;
                UnicastUDPPort       = mInitArgs.UnicastUDPPort;
                UDPTransport         = mInitArgs.UDPTransport;
                MulticastDiscovery   = mInitArgs.MulticastDiscovery;
                SendInterfaceAddress = mInitArgs.SendInterfaceAddress;
                if (await InitializeMulticastRecv())
                {
                    if (await InitializeUnicastRecv())
                    {
                        if (await InitializeSend())
                        {
                            var searchDevice = listCompanionDevices.FirstOrDefault(device => string.Equals(device.Value.IPAddress, MulticastIPAddress));
                            if (searchDevice.Value == null)
                            {
                                CompanionDevice d = new CompanionDevice();
                                d.Id = "0";
                                d.IsRemoteSystemDevice = false;
                                d.IPAddress            = MulticastIPAddress;
                                d.Name        = CompanionProtocol.MulticastDeviceName;
                                d.Kind        = CompanionProtocol.MulticastDeviceKind;
                                d.IsMulticast = true;
                                if (listCompanionDevices.ContainsKey(d.Id))
                                {
                                    listCompanionDevices.Remove(d.Id);
                                }
                                listCompanionDevices.Add(d.Id, d);
                                OnDeviceAdded(this, d);
                            }
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
Пример #7
0
 private void RemoteSystemWatcher_RemoteSystemRemoved(RemoteSystemWatcher sender, RemoteSystemRemovedEventArgs args)
 {
     if (listCompanionDevices != null)
     {
         if (listCompanionDevices.ContainsKey(args.RemoteSystemId))
         {
             CompanionDevice d = listCompanionDevices[args.RemoteSystemId];
             OnDeviceRemoved(this, d);
             listCompanionDevices.Remove(args.RemoteSystemId);
         }
     }
     if (listRemoteSystems != null)
     {
         if (listRemoteSystems.ContainsKey(args.RemoteSystemId))
         {
             listRemoteSystems.Remove(args.RemoteSystemId);
         }
     }
 }
Пример #8
0
        protected CompanionDevice GetUniqueDeviceByName(string Name)
        {
            CompanionDevice device = null;

            foreach (var d in listCompanionDevices)
            {
                if (string.Equals(d.Value.Name, Name))
                {
                    if (device == null)
                    {
                        device = d.Value;
                    }
                    else
                    {
                        // not unique
                        return(null);
                    }
                }
            }
            return(device);
        }
Пример #9
0
 public override async System.Threading.Tasks.Task <bool> Send(CompanionDevice cd, string Message)
 {
     if (cd != null)
     {
         bool bMulticast = false;
         if ((!string.IsNullOrEmpty(cd.IPAddress)) && string.Equals(cd.IPAddress, MulticastIPAddress))
         {
             bMulticast = true;
         }
         if ((UDPTransport == false) && (bMulticast == false))
         {
             return(await base.Send(cd, Message));
         }
         else
         {
             if (!string.IsNullOrEmpty(cd.IPAddress))
             {
                 return(await Send(cd.IPAddress, Message));
             }
         }
     }
     return(false);
 }
Пример #10
0
        private void RemoteSystemWatcher_RemoteSystemAdded(RemoteSystemWatcher sender, RemoteSystemAddedEventArgs args)
        {
            CompanionDevice d = new CompanionDevice(args.RemoteSystem.Id, true, args.RemoteSystem.DisplayName, string.Empty, args.RemoteSystem.Kind);

            if ((d != null) && (listCompanionDevices != null) && (listRemoteSystems != null))
            {
                d.IsAvailableByProximity = args.RemoteSystem.IsAvailableByProximity;
                // Anniversary issue
//                d.IsAvailableBySpatialProximity = args.RemoteSystem.IsAvailableBySpatialProximity;
                d.Status = CompanionDeviceStatus.Available;
                if (listCompanionDevices.ContainsKey(args.RemoteSystem.Id))
                {
                    listCompanionDevices.Remove(args.RemoteSystem.Id);
                }
                listCompanionDevices.Add(args.RemoteSystem.Id, d);
                OnDeviceAdded(this, d);

                if (listRemoteSystems.ContainsKey(args.RemoteSystem.Id))
                {
                    listRemoteSystems.Remove(args.RemoteSystem.Id);
                }
                listRemoteSystems.Add(args.RemoteSystem.Id, args.RemoteSystem);
            }
        }
Пример #11
0
        // Summary:
        //     Open a uri on the emote device

        public virtual async System.Threading.Tasks.Task <bool> CompanionDeviceOpenUri(CompanionDevice cd, string inputUri)
        {
            if ((listCompanionDevices.ContainsKey(cd.Id)) && (listRemoteSystems.ContainsKey(cd.Id)))
            {
                RemoteSystemConnectionRequest rscr = new RemoteSystemConnectionRequest(listRemoteSystems[cd.Id]);
                if (rscr != null)
                {
                    Uri uri;
                    if (Uri.TryCreate(inputUri, UriKind.Absolute, out uri))
                    {
                        RemoteLaunchUriStatus launchUriStatus = await Windows.System.RemoteLauncher.LaunchUriAsync(rscr, uri);

                        if (launchUriStatus == RemoteLaunchUriStatus.Success)
                        {
                            listCompanionDevices[cd.Id].Status = CompanionDeviceStatus.Connected;
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
Пример #12
0
 private async void ReceiveConnection_RequestReceived(Windows.ApplicationModel.AppService.AppServiceConnection sender, Windows.ApplicationModel.AppService.AppServiceRequestReceivedEventArgs args)
 {
     System.Diagnostics.Debug.WriteLine("ReceiveConnection_RequestReceived");
     await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
     {
         var messageDeferral = args.GetDeferral();
         try
         {
             if ((args.Request != null) && (args.Request.Message != null))
             {
                 var inputs = args.Request.Message;
                 if (inputs.ContainsKey(CompanionServiceMessage.ATT_TYPE))
                 {
                     string s = (string)inputs[CompanionServiceMessage.ATT_TYPE];
                     if (string.Equals(s, CompanionServiceMessage.TYPE_DATA))
                     {
                         if ((inputs.ContainsKey(CompanionServiceMessage.ATT_SOURCEID)) &&
                             (inputs.ContainsKey(CompanionServiceMessage.ATT_SOURCEID)) &&
                             (inputs.ContainsKey(CompanionServiceMessage.ATT_SOURCEIP)) &&
                             (inputs.ContainsKey(CompanionServiceMessage.ATT_SOURCEKIND)) &&
                             (inputs.ContainsKey(CompanionServiceMessage.ATT_SOURCENAME)) &&
                             (inputs.ContainsKey(CompanionServiceMessage.ATT_MESSAGE)))
                         {
                             string id         = (string)inputs[CompanionServiceMessage.ATT_SOURCEID];
                             string name       = (string)inputs[CompanionServiceMessage.ATT_SOURCENAME];
                             string ip         = (string)inputs[CompanionServiceMessage.ATT_SOURCEIP];
                             string kind       = (string)inputs[CompanionServiceMessage.ATT_SOURCEKIND];
                             string message    = (string)inputs[CompanionServiceMessage.ATT_MESSAGE];
                             CompanionDevice d = new CompanionDevice(id, false, name, ip, kind);
                             if (!string.IsNullOrEmpty(ip))
                             {
                                 CompanionDevice a = GetUniqueDeviceByName(name);
                                 if (a != null)
                                 {
                                     if (!string.Equals(a.IPAddress, ip))
                                     {
                                         a.IPAddress = ip;
                                         listCompanionDevices.Remove(a.Id);
                                         listCompanionDevices.Add(id, a);
                                         OnDeviceUpdated(this, a);
                                     }
                                 }
                             }
                             if (MessageReceived != null)
                             {
                                 MessageReceived(d, message);
                             }
                         }
                     }
                     else if (string.Equals(s, CompanionServiceMessage.TYPE_INIT))
                     {
                         // Background task started
                     }
                 }
             }
         }
         finally
         {
             //Complete the message deferral so the platform knows we're done responding
             messageDeferral.Complete();
         }
     });
 }
Пример #13
0
        async void UDPMulticastMessageReceived(DatagramSocket socket, DatagramSocketMessageReceivedEventArgs eventArguments)
        {
            try
            {
                uint   stringLength = eventArguments.GetDataReader().UnconsumedBufferLength;
                string message      = eventArguments.GetDataReader().ReadString(stringLength);
                string Command      = CompanionProtocol.GetCommandFromMessage(message);
                Dictionary <string, string> Parameters = CompanionProtocol.GetParametersFromMessage(message);
                CompanionDevice             d          = GetCompanionDeviceFromParameters(Parameters);
                System.Diagnostics.Debug.WriteLine("Received command: " + message);

                if (string.Equals(Command, CompanionProtocol.commandPingResponse))
                {
                    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        if (d != null)
                        {
                            var searchDevice = listCompanionDevices.FirstOrDefault(device => string.Equals(device.Value.Name, d.Name));
                            if (searchDevice.Value == null)
                            {
                                // Add Device
                                d.Status = CompanionDeviceStatus.Connected;
                                if (string.IsNullOrEmpty(d.Id))
                                {
                                    d.Id = Guid.NewGuid().ToString();
                                }
                                if (listCompanionDevices.ContainsKey(d.Id))
                                {
                                    listCompanionDevices.Remove(d.Id);
                                }
                                listCompanionDevices.Add(d.Id, d);
                                OnDeviceAdded(this, d);
                            }
                            else
                            {
                                if (!string.Equals(d.IPAddress, searchDevice.Value.IPAddress))
                                {
                                    d.Id     = searchDevice.Value.Id;
                                    d.Status = CompanionDeviceStatus.Connected;
                                    listCompanionDevices.Remove(d.Id);
                                    listCompanionDevices.Add(d.Id, d);
                                    // Update device
                                    OnDeviceUpdated(this, d);
                                }
                            }
                        }
                    });
                }
                else if (string.Equals(Command, CompanionProtocol.commandPing))
                {
                    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() =>
                    {
                        if (d != null)
                        {
                            /*
                             * var searchDevice = listCompanionDevices.FirstOrDefault(device => string.Equals(device.Value.Name, d.Name) );
                             * if (searchDevice.Value == null)
                             * {
                             *  d.Status = CompanionDeviceStatus.Connected;
                             *  listCompanionDevices.Add(d.Id, d);
                             *  if (CompanionDeviceAdded != null)
                             *      CompanionDeviceAdded(this, d);
                             * }
                             * else
                             * {
                             *  if ((!string.Equals(d.Id, searchDevice.Value.Id)) ||
                             *      (!string.Equals(d.IPAddress, searchDevice.Value.IPAddress)))
                             *  {
                             *      d.Id = searchDevice.Value.Id;
                             *      d.Status = CompanionDeviceStatus.Connected;
                             *      listCompanionDevices.Remove(d.Id);
                             *      listCompanionDevices.Add(d.Id, d);
                             *      // Update device
                             *      if (CompanionDeviceUpdated != null)
                             *          CompanionDeviceUpdated(this, d);
                             *  }
                             * }
                             */
                            Dictionary <string, string> parameters = new Dictionary <string, string>();
                            if (parameters != null)
                            {
                                parameters.Add(CompanionProtocol.parameterID, LocalCompanionDevice.Id);
                                parameters.Add(CompanionProtocol.parameterIPAddress, LocalCompanionDevice.IPAddress);
                                parameters.Add(CompanionProtocol.parameterKind, LocalCompanionDevice.Kind);
                                parameters.Add(CompanionProtocol.parameterName, LocalCompanionDevice.Name);
                                string m = CompanionProtocol.CreateCommand(CompanionProtocol.commandPingResponse, parameters);
                                await Send(d.IPAddress, m);
                            }
                        }
                    });
                }
                else
                {
                    // Forward the Message
                    if (MessageReceived != null)
                    {
                        MessageReceived(d, message);
                    }
                }
            }
            catch (Exception exception)
            {
                System.Diagnostics.Debug.WriteLine("Exception on receiving UDP packets: " + exception.Message);
                SocketErrorStatus socketError = SocketError.GetStatus(exception.HResult);
                if (socketError == SocketErrorStatus.ConnectionResetByPeer)
                {
                }
                else if (socketError != SocketErrorStatus.Unknown)
                {
                }
            }
        }