Esempio n. 1
0
            public static unsafe void Process(InputRemoting receiver, Message msg)
            {
                var manager = receiver.m_LocalManager;

                fixed(byte *dataPtr = msg.data)
                {
                    var dataEndPtr  = new IntPtr(dataPtr + msg.data.Length);
                    var eventCount  = 0;
                    var eventPtr    = new InputEventPtr((InputEvent *)dataPtr);
                    var senderIndex = receiver.FindOrCreateSenderRecord(msg.participantId);

                    while (eventPtr.data.ToInt64() < dataEndPtr.ToInt64())
                    {
                        // Patch up device ID to refer to local device and send event.
                        var remoteDeviceId = eventPtr.deviceId;
                        var localDeviceId  = receiver.FindLocalDeviceId(remoteDeviceId, senderIndex);
                        eventPtr.deviceId = localDeviceId;

                        if (localDeviceId != InputDevice.kInvalidDeviceId)
                        {
                            ////TODO: add API to send events in bulk rather than one by one
                            manager.QueueEvent(eventPtr);
                        }

                        ++eventCount;
                        eventPtr = eventPtr.Next();
                    }
                }
            }
Esempio n. 2
0
            public static void Process(InputRemoting receiver, Message msg)
            {
                var senderIndex = receiver.FindOrCreateSenderRecord(msg.participantId);

                // Remove devices added by remote.
                var devices = receiver.m_Senders[senderIndex].devices;

                if (devices != null)
                {
                    foreach (var remoteDevice in devices)
                    {
                        var device = receiver.m_LocalManager.TryGetDeviceById(remoteDevice.localId);
                        if (device != null)
                        {
                            receiver.m_LocalManager.RemoveDevice(device);
                        }
                    }
                }

                ////TODO: remove layouts added by remote

                ArrayHelpers.EraseAt(ref receiver.m_Senders, senderIndex);

                ////TODO: stop sending if last remote disconnects and StartSendingOnConnect is active
            }
Esempio n. 3
0
            public static void Process(InputRemoting receiver, Message msg)
            {
                var json        = Encoding.UTF8.GetString(msg.data);
                var senderIndex = receiver.FindOrCreateSenderRecord(msg.participantId);

                receiver.m_LocalManager.RegisterControlLayout(json);
                ArrayHelpers.Append(ref receiver.m_Senders[senderIndex].layouts, json);
            }
Esempio n. 4
0
            public static void Process(InputRemoting receiver, Message msg)
            {
                var senderIndex = receiver.FindOrCreateSenderRecord(msg.participantId);
                var @namespace  = receiver.m_Senders[senderIndex].layoutNamespace;

                var layoutName = Encoding.UTF8.GetString(msg.data);

                receiver.m_LocalManager.RemoveControlLayout(layoutName, @namespace: @namespace);
            }
Esempio n. 5
0
            public static void Process(InputRemoting receiver, Message msg)
            {
                var senderIndex = receiver.FindOrCreateSenderRecord(msg.participantId);
                var data        = DeserializeData <Data>(msg.data);

                // Make sure we haven't already seen the device.
                var devices = receiver.m_Senders[senderIndex].devices;

                if (devices != null)
                {
                    foreach (var entry in devices)
                    {
                        if (entry.remoteId == data.deviceId)
                        {
                            Debug.LogError(string.Format(
                                               "Already received device with id {0} (layout '{1}', description '{3}) from remote {2}",
                                               data.deviceId,
                                               data.layout, msg.participantId, data.description));
                            return;
                        }
                    }
                }

                // Create device.
                var layout = string.Format("{0}::{1}", receiver.m_Senders[senderIndex].layoutNamespace,
                                           data.layout);
                InputDevice device;

                try
                {
                    device = receiver.m_LocalManager.AddDevice(layout,
                                                               string.Format("Remote{0}::{1}", msg.participantId, data.name));
                }
                catch (Exception exception)
                {
                    Debug.Log(
                        string.Format(
                            "Could not create remote device '{0}' with layout '{1}' locally (exception: {2})",
                            data.description, data.layout, exception));
                    return;
                }
                device.m_Description = data.description;
                device.m_Flags      |= InputDevice.Flags.Remote;

                // Remember it.
                var record = new RemoteInputDevice
                {
                    remoteId    = data.deviceId,
                    localId     = device.id,
                    description = data.description,
                    layoutName  = layout
                };

                ArrayHelpers.Append(ref receiver.m_Senders[senderIndex].devices, record);
            }
Esempio n. 6
0
            public static void Process(InputRemoting receiver, Message msg)
            {
                var senderIndex    = receiver.FindOrCreateSenderRecord(msg.participantId);
                var remoteDeviceId = BitConverter.ToInt32(msg.data, 0);

                var device = receiver.TryGetDeviceByRemoteId(remoteDeviceId, senderIndex);

                if (device != null)
                {
                    receiver.m_LocalManager.RemoveDevice(device);
                }
            }
Esempio n. 7
0
            public static void Process(InputRemoting receiver, Message msg)
            {
                var senderIndex = receiver.FindOrCreateSenderRecord(msg.participantId);
                var data        = DeserializeData <Data>(msg.data);

                // Make sure we haven't already seen the device.
                var devices = receiver.m_Senders[senderIndex].devices;

                if (devices != null)
                {
                    foreach (var entry in devices)
                    {
                        if (entry.remoteId == data.deviceId)
                        {
                            Debug.LogError(string.Format(
                                               "Already received device with id {0} (layout '{1}', description '{3}) from remote {2}",
                                               data.deviceId,
                                               data.layout, msg.participantId, data.description));
                            return;
                        }
                    }
                }

                // Create device.
                InputDevice device;

                try
                {
                    ////REVIEW: this gives remote devices names the same way that local devices receive them; should we make remote status visible in the name?
                    device = receiver.m_LocalManager.AddDevice(data.layout);
                    device.m_ParticipantId = msg.participantId;
                }
                catch (Exception exception)
                {
                    Debug.LogError(
                        $"Could not create remote device '{data.description}' with layout '{data.layout}' locally (exception: {exception})");
                    return;
                }
                device.m_Description  = data.description;
                device.m_DeviceFlags |= InputDevice.DeviceFlags.Remote;

                // Remember it.
                var record = new RemoteInputDevice
                {
                    remoteId    = data.deviceId,
                    localId     = device.id,
                    description = data.description,
                    layoutName  = data.layout
                };

                ArrayHelpers.Append(ref receiver.m_Senders[senderIndex].devices, record);
            }
Esempio n. 8
0
            public static void Process(InputRemoting receiver, Message msg)
            {
                var senderIndex = receiver.FindOrCreateSenderRecord(msg.participantId);
                var data        = DeserializeData <Data>(msg.data);

                var device = receiver.TryGetDeviceByRemoteId(data.deviceId, senderIndex);

                if (device != null)
                {
                    ////TODO: clearing usages and setting multiple usages

                    if (data.usages.Length == 1)
                    {
                        receiver.m_LocalManager.SetUsage(device, new InternedString(data.usages[0]));
                    }
                }
            }