// 自訂當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; }
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; }