// 自訂當Peer端點登入或登出時所呼叫的方法
        private void PeerNearMeChangedCallback(Object sender, PeerNearMeChangedEventArgs e)
        {
            String str = "";

            PeerNearMe pnm = e.PeerNearMe as PeerNearMe;

            // 取得Peer端點的位置
            PeerEndPointCollection pepc = pnm.PeerEndPoints;

            foreach (PeerEndPoint pep in pepc)
            {
                // 回傳System.Net.IPEndPoint物件
                IPEndPoint ipEndPoint = pep.EndPoint;

                // 取得Peer端點的IP位址
                str = str + ", " + ipEndPoint.Address.ToString() + ":";
                // 取得Peer端點的通訊埠
                str = str + ipEndPoint.Port.ToString();
            }

            // 取得PeerNearMe物件所發生的變更類型
            switch (e.PeerChangeType)
            {
            // 當有新的Peer端點登入時
            case PeerChangeType.Added:
                lstPeer.Items.Add(str);
                break;

            // 當Peer端點登出時
            case PeerChangeType.Deleted:
                break;

            // 當Peer端點因相關資訊更新時
            case PeerChangeType.Updated:
                lstPeer.Items.Add(str);
                break;

            default:
                break;
            }
        }
        public static PeerNearMeCollection GetPeersNearMe()
        {
            Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Entering GetPeersNearMeGetPeersNearMe.");
            CollaborationHelperFunctions.Initialize();
            PeerCollaborationPermission.UnrestrictedPeerCollaborationPermission.Demand();

            PeerNearMeCollection pnmc = new PeerNearMeCollection();

            SafeCollabEnum handlePeerEnum = null;
            UInt32 pnmCount = 0;
            int errorCode = 0;

            try{
                //
                // Call native to get the enumeration of peers near
                //
                errorCode = UnsafeCollabNativeMethods.PeerCollabEnumPeopleNearMe(out handlePeerEnum);

                if (errorCode != 0){
                    Logging.P2PTraceSource.TraceEvent(TraceEventType.Error, 0, "PeerCollabEnumPeopleNearMe returned with errorcode {0}", errorCode);
                    throw PeerToPeerException.CreateFromHr(SR.GetString(SR.Collab_GetPeersNearMeFailed), errorCode);
                }

                errorCode = UnsafeCollabNativeMethods.PeerGetItemCount(handlePeerEnum, ref pnmCount);
                if (errorCode != 0){
                    Logging.P2PTraceSource.TraceEvent(TraceEventType.Error, 0, "PeerGetItemCount returned with errorcode {0}", errorCode);
                    throw PeerToPeerException.CreateFromHr(SR.GetString(SR.Collab_GetPeersNearMeFailed), errorCode);
                }

                if (pnmCount == 0){
                    Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "No peers found. \nLeaving GetPeersNearMe()");
                    return pnmc;
                }

                unsafe{
                    SafeCollabData appArray;
                    errorCode = UnsafeCollabNativeMethods.PeerGetNextItem(handlePeerEnum, ref pnmCount, out appArray);

                    IntPtr pPEER_PEOPLE_NEAR_ME = appArray.DangerousGetHandle();
                    IntPtr* pPeersNearMe = (IntPtr*)pPEER_PEOPLE_NEAR_ME;

                    //
                    // Loops through individual native structures and makes peers from them 
                    //
                    for (ulong i = 0; i < pnmCount; i++){
                        IntPtr pContactPtr = (IntPtr)pPeersNearMe[i];
                        PEER_PEOPLE_NEAR_ME pnm = (PEER_PEOPLE_NEAR_ME)Marshal.PtrToStructure(pContactPtr, typeof(PEER_PEOPLE_NEAR_ME));

                        PeerNearMe peerNearMe = new PeerNearMe();
                        peerNearMe.Id = CollaborationHelperFunctions.ConvertGUIDToGuid(pnm.id);
                        peerNearMe.Nickname = Marshal.PtrToStringUni(pnm.pwzNickname); ;

                        PEER_ENDPOINT pe = pnm.endpoint;
                        peerNearMe.PeerEndPoints.Add(CollaborationHelperFunctions.ConvertPEER_ENDPOINTToPeerEndPoint(pe));

                        pnmc.Add(peerNearMe);
                    }
                }
            }
            finally{
                if (handlePeerEnum != null) handlePeerEnum.Dispose();
            }

            Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Leaving GetPeersNearMeGetPeersNearMe with {0} peers.", pnmc.Count);

            return pnmc;
        }
        internal static PeerNearMe PEER_PEOPLE_NEAR_METoPeerNearMe(PEER_PEOPLE_NEAR_ME ppnm)
        {
            PeerNearMe peerNearMe = new PeerNearMe();
            peerNearMe.Id = CollaborationHelperFunctions.ConvertGUIDToGuid(ppnm.id);
            peerNearMe.Nickname = Marshal.PtrToStringUni(ppnm.pwzNickname); ;

            PEER_ENDPOINT pe = ppnm.endpoint;
            PeerEndPoint peerEP = ConvertPEER_ENDPOINTToPeerEndPoint(pe);
            peerNearMe.PeerEndPoints.Add(peerEP);
            
            return peerNearMe;
        }
Exemple #4
0
 void AddLog(PeerNearMe peerNearMe, PeerObject peerObject)
 {
     AddLog(peerNearMe.Nickname, peerObject);
 }
        public void CreateContactAsync(PeerNearMe peerNearMe, Object userToken)
        {
            if (m_Disposed) throw new ObjectDisposedException(this.GetType().FullName);
            
            PeerCollaborationPermission.UnrestrictedPeerCollaborationPermission.Demand();

            if (peerNearMe == null)
                throw new ArgumentNullException("PeerNearMe");

            if ((peerNearMe.PeerEndPoints == null) || (peerNearMe.PeerEndPoints.Count == 0) || (peerNearMe.PeerEndPoints[0].EndPoint == null))
                throw new PeerToPeerException(SR.GetString(SR.Collab_NoEndpointFound));

            if (Logging.P2PTraceSource.Switch.ShouldTrace(TraceEventType.Information)){
                Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Entering CreateContactAsync() with token {0} and following peernearme" , userToken);
                peerNearMe.TracePeerNearMe();
            }

            //
            // Add to list of usertokens 
            //
            lock (CreateContactAsyncListLock){
                if (m_createContactAsyncList.ContainsKey(userToken)){
                    throw new ArgumentException(SR.GetString(SR.DuplicateUserToken));
                }
                AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(userToken);
                m_createContactAsyncList[userToken] = asyncOp;
            }

            ThreadPool.QueueUserWorkItem(new WaitCallback(CreateContactAsyncHelper), new CreateContactAsyncState(peerNearMe, userToken));

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

        }
 internal CreateContactAsyncState(PeerNearMe peerNearMe, Object userToken){
     m_peerNearMe = peerNearMe;
     m_userToken = userToken;
 }
        public PeerContact CreateContact(PeerNearMe peerNearMe) 
        {
            if (m_Disposed) throw new ObjectDisposedException(this.GetType().FullName);
            
            PeerCollaborationPermission.UnrestrictedPeerCollaborationPermission.Demand();

            if (peerNearMe == null)
                throw new ArgumentNullException("peerNearMe");

            if ((peerNearMe.PeerEndPoints == null) || (peerNearMe.PeerEndPoints.Count == 0) || (peerNearMe.PeerEndPoints[0].EndPoint == null))
                throw new PeerToPeerException(SR.GetString(SR.Collab_NoEndpointFound));

            Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Entering CreateContact() with peernearme", peerNearMe.ToString());

            PeerEndPoint peerEndPoint = peerNearMe.PeerEndPoints[0];

            PEER_ENDPOINT pe = new PEER_ENDPOINT();
            pe.peerAddress = CollaborationHelperFunctions.ConvertIPEndpointToPEER_ADDRESS(peerEndPoint.EndPoint);

            //
            // Pin all the data to pass to native
            //
            GCHandle pepName = new GCHandle();

            if (peerEndPoint.Name != null){
                pepName = GCHandle.Alloc(peerEndPoint.Name, GCHandleType.Pinned);
                pe.pwzEndpointName = pepName.AddrOfPinnedObject();
            }
            
            GCHandle peerEP = GCHandle.Alloc(pe, GCHandleType.Pinned);
            IntPtr ptrPeerEP = peerEP.AddrOfPinnedObject();

            string contactData = null;
            int errorCode = 0;
            
            //
            // Refresh end point data if it not subscribed
            //
            peerNearMe.RefreshData();

            errorCode = UnsafeCollabNativeMethods.PeerCollabQueryContactData(ptrPeerEP, ref contactData);
            if (errorCode != 0){
                Logging.P2PTraceSource.TraceEvent(TraceEventType.Error, 0, "PeerCollabGetContact returned with errorcode {0}", errorCode);
                throw PeerToPeerException.CreateFromHr(SR.GetString(SR.Collab_CreateContactFailed), errorCode);
            }

            SafeCollabData contact = null;
            PeerContact peerContact = null;

            try{
                errorCode = UnsafeCollabNativeMethods.PeerCollabParseContact(contactData, out contact);
                if (errorCode != 0){
                    Logging.P2PTraceSource.TraceEvent(TraceEventType.Error, 0, "PeerCollabGetContact returned with errorcode {0}", errorCode);
                    throw PeerToPeerException.CreateFromHr(SR.GetString(SR.Collab_CreateContactFailed), errorCode);
                }

                PEER_CONTACT pc = (PEER_CONTACT)Marshal.PtrToStructure(contact.DangerousGetHandle(), typeof(PEER_CONTACT));
                peerContact = CollaborationHelperFunctions.ConvertPEER_CONTACTToPeerContact(pc);
                
                //
                // Mark it as just created and add the xml. This is used when adding the contact or getting
                // contact xml when contact is not added
                //
                peerContact.JustCreated = true;
                peerContact.ContactXml = contactData;
            }
            finally{
                if (contact != null) contact.Dispose();
                pepName.Free();
                peerEP.Free();
            }
            Logging.P2PTraceSource.TraceEvent(TraceEventType.Information, 0, "Leaving CreateContact().");

            return peerContact;
        }
 void AddLog(PeerNearMe peerNearMe, PeerObject peerObject)
 {
     AddLog(peerNearMe.Nickname, peerObject);
 }