예제 #1
0
        void peerNearMe_RefreshDataCompleted(object sender, RefreshDataCompletedEventArgs e)
        {
            var peerNearMe = sender as PeerNearMe;

            switch (e.UserState.ToString())
            {
            case "Setup":
                foreach (PeerObject peerObject in peerNearMe.GetObjects(id))
                {
                    AddLog(peerNearMe, peerObject);
                }
                AddLog("[Setup]PeerNearMe_RefreshDataCompleted", LogType.System);
                break;

            case "Added":
                foreach (PeerObject peerObject in peerNearMe.GetObjects(id))
                {
                    AddLog(peerNearMe, peerObject);
                }
                AddLog("[Added]PeerNearMe_RefreshDataCompleted", LogType.System);
                break;

            case "Updated":
                foreach (PeerObject peerObject in peerNearMe.GetObjects(id))
                {
                    AddLog(peerNearMe, peerObject);
                }
                AddLog("[Updated]PeerNearMe_RefreshDataCompleted", LogType.System);
                break;
            }

            PeerCollaboration.ContactManager.CreateContactAsync(peerNearMe, e.UserState);
        }
예제 #2
0
        protected void OnRefreshDataCompleted(RefreshDataCompletedEventArgs e)
        {
            EventHandler <RefreshDataCompletedEventArgs> handlerCopy = m_refreshDataCompleted;

            if (handlerCopy != null)
            {
                handlerCopy(this, e);
                Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Fired the refresh endpoint completed event callback.");
            }
        }
        void peerNearMe_RefreshDataCompleted(object sender, RefreshDataCompletedEventArgs e)
        {
            var peerNearMe = sender as PeerNearMe;

            switch (e.UserState.ToString())
            {
                case "Setup":
                    foreach (PeerObject peerObject in peerNearMe.GetObjects(id))
                    {
                        AddLog(peerNearMe, peerObject);
                    }
                    AddLog("[Setup]PeerNearMe_RefreshDataCompleted", LogType.System);
                    break;
                case "Added":
                    foreach (PeerObject peerObject in peerNearMe.GetObjects(id))
                    {
                        AddLog(peerNearMe, peerObject);
                    }
                    AddLog("[Added]PeerNearMe_RefreshDataCompleted", LogType.System);
                    break;
                case "Updated":
                    foreach (PeerObject peerObject in peerNearMe.GetObjects(id))
                    {
                        AddLog(peerNearMe, peerObject);
                    }
                    AddLog("[Updated]PeerNearMe_RefreshDataCompleted", LogType.System);
                    break;
            }

            PeerCollaboration.ContactManager.CreateContactAsync(peerNearMe, e.UserState);
        }
예제 #4
0
 internal void PrepareToRaiseRefreshDataCompletedEvent(AsyncOperation asyncOP, RefreshDataCompletedEventArgs args)
 {
     asyncOP.PostOperationCompleted(OnRefreshDataCompletedDelegate, args);
 }
예제 #5
0
        internal protected void InternalRefreshData(object state)
        {
            Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "InternalRefreshEndpointData called.");

            int       errorCode = 0;
            bool      isAsync   = (bool)state;
            Exception exception = null;

            AutoResetEvent  refreshedEPDataEvent = new AutoResetEvent(false);
            SafeCollabEvent safeRefreshedEPDataEvent;

            PEER_COLLAB_EVENT_REGISTRATION pcer = new PEER_COLLAB_EVENT_REGISTRATION();

            pcer.eventType = PeerCollabEventType.RequestStatusChanged;
            pcer.pInstance = IntPtr.Zero;

            //
            // Register to receive status changed event from collab
            //
            errorCode = UnsafeCollabNativeMethods.PeerCollabRegisterEvent(
                refreshedEPDataEvent.SafeWaitHandle,
                1,
                ref pcer,
                out safeRefreshedEPDataEvent);
            if (errorCode != 0)
            {
                Logging.P2PTraceSource.TraceEvent(TraceEventType.Error, 0, "PeerCollabRegisterEvent returned with errorcode {0}", errorCode);
                exception = PeerToPeerException.CreateFromHr(SR.GetString(SR.Collab_ReqStatusChangedRegFailed), errorCode);
                if (!isAsync)
                {
                    throw exception;
                }
            }

            PeerEndPointCollection peerEndPoints = PeerEndPoints;

            if (peerEndPoints.Count == 0)
            {
                return;
            }

            try{
                InternalRefreshData(peerEndPoints[0]);
            }
            catch (Exception e) {
                if (!isAsync)
                {
                    throw;
                }
                else
                {
                    exception = e;
                }
            }

            //
            // Wait till all the endpoints are refreshed
            //
            while (exception == null)
            {
                refreshedEPDataEvent.WaitOne();

                SafeCollabData eventData;

                errorCode = UnsafeCollabNativeMethods.PeerCollabGetEventData(safeRefreshedEPDataEvent,
                                                                             out eventData);
                if (errorCode != 0)
                {
                    Logging.P2PTraceSource.TraceEvent(TraceEventType.Error, 0, "PeerCollabGetEventData returned with errorcode {0}", errorCode);
                    exception = PeerToPeerException.CreateFromHr(SR.GetString(SR.Collab_RefreshDataFailed), errorCode);
                    if (!isAsync)
                    {
                        throw exception;
                    }
                    else
                    {
                        break;
                    }
                }

                PEER_COLLAB_EVENT_DATA ped = (PEER_COLLAB_EVENT_DATA)Marshal.PtrToStructure(eventData.DangerousGetHandle(),
                                                                                            typeof(PEER_COLLAB_EVENT_DATA));

                if (ped.eventType == PeerCollabEventType.RequestStatusChanged)
                {
                    PEER_EVENT_REQUEST_STATUS_CHANGED_DATA statusData = ped.requestStatusChangedData;

                    PeerEndPoint peerEndPoint = null;

                    if (statusData.pEndPoint != IntPtr.Zero)
                    {
                        PEER_ENDPOINT pe = (PEER_ENDPOINT)Marshal.PtrToStructure(statusData.pEndPoint, typeof(PEER_ENDPOINT));
                        peerEndPoint = CollaborationHelperFunctions.ConvertPEER_ENDPOINTToPeerEndPoint(pe);
                    }

                    if (statusData.hrChange < 0)
                    {
                        exception = PeerToPeerException.CreateFromHr(SR.GetString(SR.Collab_RefreshDataFailed), statusData.hrChange);
                    }

                    if (exception != null)
                    {
                        //
                        // Throw exception for sync but call callback for async with exception
                        //
                        if (!isAsync)
                        {
                            throw exception;
                        }
                    }

                    //
                    // Check if this is our endpoint
                    //
                    if (PeerEndPoints[0].Equals(peerEndPoint))
                    {
                        Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Found endpoint match in Request status changed.");

                        //
                        // For async call the callback and for sync just return
                        //
                        if (isAsync)
                        {
                            RefreshDataCompletedEventArgs args = new
                                                                 RefreshDataCompletedEventArgs(peerEndPoint,
                                                                                               null,
                                                                                               false,
                                                                                               m_refreshDataAsyncOp.UserSuppliedState);

                            if (Logging.P2PTraceSource.Switch.ShouldTrace(TraceEventType.Information))
                            {
                                Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Firing RefreshDataCompleted event with folloding peer endpoint.");
                                peerEndPoint.TracePeerEndPoint();
                            }

                            this.PrepareToRaiseRefreshDataCompletedEvent(m_refreshDataAsyncOp, args);
                        }

                        break;
                    }
                }
            }

            //
            // Async case with exception fire callback here
            // Sync would have already thrown this by now
            //
            if (exception != null)
            {
                RefreshDataCompletedEventArgs args = new
                                                     RefreshDataCompletedEventArgs(null,
                                                                                   exception,
                                                                                   false,
                                                                                   m_refreshDataAsyncOp.UserSuppliedState);
                Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Firing RefreshDataCompleted event with exception {0}.", exception);
                this.PrepareToRaiseRefreshDataCompletedEvent(m_refreshDataAsyncOp, args);
            }

            Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Leaving InternalRefreshEndpointData.");
        }