Exemplo n.º 1
0
 public NativeEvent(NativeMethods.Events.EventType eventType, IntPtr eventData)
 {
     EventType = eventType;
     EventData = eventData;
 }
Exemplo n.º 2
0
        private static void MessageHandler(NativeMethods.Events.EventType eventType, IntPtr eventDataPtr)
        {
            lock (_nativeEvents) {
                switch (eventType)
                {
                // Session
                case NativeMethods.Events.EventType.SessionStarted:
                case NativeMethods.Events.EventType.SessionDisconnected:
                case NativeMethods.Events.EventType.SessionPeerStateChanged:

                // Advertiser
                case NativeMethods.Events.EventType.AdvertiserInvitationReceived:
                case NativeMethods.Events.EventType.AdvertiserStartFailed:

                // Advertiser assistant
                case NativeMethods.Events.EventType.AdvertiserAssistantInvitationDismissed:
                case NativeMethods.Events.EventType.AdvertiserAssistantInvitationPresenting:

                // Peer discovery
                case NativeMethods.Events.EventType.NearbyServiceBrowserPeerFound:
                case NativeMethods.Events.EventType.NearbyServiceBrowserPeerLost:
                case NativeMethods.Events.EventType.NearbyServiceBrowserStartFailed:

                // Peer discovery UI
                case NativeMethods.Events.EventType.BrowserViewControllerCancelled:
                case NativeMethods.Events.EventType.BrowserViewControllerFinished:
                    // Just store the event data, the event marshalling and invocation are deferred until we are on the main Unity thread
                    _nativeEvents.Push(new NativeEvent(eventType, eventDataPtr));
                    return;

                case NativeMethods.Events.EventType.BrowserViewControllerNearbyPeerPresenting: {
                    // Special event, can not defer, must be processed immediately
                    var    eventData = MarshalUtility.PtrToStructure <NativeMethods.Events.UMC_BrowserViewControllerNearbyPeerPresentingEventData>(eventDataPtr);
                    PeerId peerId    = new PeerId(eventData.PeerId);

                    Dictionary <string, string> discoveryInfo =
                        eventData.DiscoveryInfoPairArray != IntPtr.Zero ?
                        MarshalUtility.MarshalStringStringDictionary(eventData.DiscoveryInfoPairArray, eventData.DiscoveryInfoArrayPairCount) :
                        null;

                    NativeMethods.Events.UMC_BrowserViewControllerNearbyPeerPresentingResultEventData result;
                    result.ShouldPresent = true;
                    _peerDiscovery.OnNearbyPeerPresenting(peerId, discoveryInfo, ref result.ShouldPresent);

                    // Copy from managed to native
                    Marshal.StructureToPtr(result, eventData.Result, false);
                    // Event data is freed on the native side automatically after this method returns
                    return;
                }

                // Logs
                case NativeMethods.Events.EventType.Log: {
                    // Special event, logs can be logged at any time
                    var eventData = MarshalUtility.PtrToStructure <NativeMethods.Events.UMC_LogEventData>(eventDataPtr);
                    switch (eventData.Type)
                    {
                    case NativeMethods.LogType.Log:
                        Debug.Log("[ALM] " + eventData.Text);
                        break;

                    case NativeMethods.LogType.Warning:
                        Debug.LogWarning("[ALM] " + eventData.Text);
                        break;

                    case NativeMethods.LogType.Error:
                        Debug.LogError("[ALM] " + eventData.Text);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException("eventData.Type");
                    }

                    NativeMethods.Events.UMC_FreeEventData(eventType, eventDataPtr);
                    return;
                }

                default:
                    throw new ArgumentOutOfRangeException("eventType", eventType, null);
                }
            }
        }