public PeerNameResolver(string peerName, int numberOfResultsRequested,
     PnrpResolveCriteria resolveCriteria, uint scopeId, string cloudName, TimeSpan timeout, List<PnrpRegistration> results)
     : base(null, null)
 {
     // pnrp has a hard-coded limit on the timeout value that can be passed to it
     // maximum value is 10 minutes
     if (timeout > MaxTimeout)
     {
         timeout = MaxTimeout;
     }
     timeoutHelper = new TimeoutHelper(timeout);
     PnrpInfo resolveQueryInfo = new PnrpInfo();
     resolveQueryInfo.dwSize = Marshal.SizeOf(typeof(PnrpInfo));
     resolveQueryInfo.nMaxResolve = numberOfResultsRequested;
     resolveQueryInfo.dwTimeout = (int)timeout.TotalSeconds;
     resolveQueryInfo.dwLifetime = 0;
     resolveQueryInfo.enNameState = 0;
     resolveQueryInfo.lpwszIdentity = null;
     resolveQueryInfo.dwFlags = PNRPINFO_HINT;
     IPEndPoint hint = PnrpPeerResolver.GetHint();
     resolveQueryInfo.enResolveCriteria = resolveCriteria;
     resolveQueryInfo.saHint = SOCKET_ADDRESS_SAFE.SocketAddressFromIPEndPoint(hint);
     resolveQuery = new WsaQuerySet();
     resolveQuery.ServiceInstanceName = peerName;
     resolveQuery.ServiceClassId = SvcIdNameV1;
     resolveQuery.NameSpace = NspNamespaces.Name;
     resolveQuery.NSProviderId = NsProviderName;
     resolveQuery.Context = cloudName;
     resolveQuery.Blob = resolveQueryInfo;
     this.results = results;
     this.scopeId = scopeId;
     ActionItem.Schedule(new Action<object>(SyncEnumeration), null);
 }
                public void Register(PnrpRegistration registration, TimeSpan timeout)
                {
                    // fill in the PnrpInfo blob using the defaults
                    PnrpInfo pnrpInfo = new PnrpInfo();
                    pnrpInfo.dwLifetime = RegistrationLifetime;
                    pnrpInfo.lpwszIdentity = null;
                    pnrpInfo.dwSize = Marshal.SizeOf(pnrpInfo);
                    pnrpInfo.dwFlags = PNRPINFO_HINT;
                    IPEndPoint hint = PnrpPeerResolver.GetHint();
                    pnrpInfo.saHint = SOCKET_ADDRESS_SAFE.SocketAddressFromIPEndPoint(hint);

                    // fill in the query set
                    WsaQuerySet registerQuery = new WsaQuerySet();
                    registerQuery.NameSpace = NspNamespaces.Name;
                    registerQuery.NSProviderId = NsProviderName;
                    registerQuery.ServiceClassId = SvcIdNameV1;
                    registerQuery.ServiceInstanceName = registration.PeerName;
                    registerQuery.Comment = registration.Comment;
                    registerQuery.Context = registration.CloudName;

                    // copy over the addresses
                    if (registration.Addresses != null)
                    {
                        Fx.Assert(registration.Addresses.Length <= 4, "Pnrp supports only 4 addresses");
                        registerQuery.CsAddrInfos = new CsAddrInfo[registration.Addresses.Length];
                        for (int i = 0; i < registration.Addresses.Length; i++)
                        {
                            // the only interesting part of the CsAddrInfo is the LocalAddress
                            registerQuery.CsAddrInfos[i].LocalAddr = registration.Addresses[i];
                            registerQuery.CsAddrInfos[i].iProtocol = (int)ProtocolType.Tcp;
                            registerQuery.CsAddrInfos[i].iSocketType = (int)SocketType.Stream;
                        }
                    }

                    // copy the blob
                    registerQuery.Blob = pnrpInfo;
                    RegisterService(registerQuery);
                }
                public void Unregister(string peerName, string cloudName, TimeSpan timeout)
                {
                    // fill in the PnrpInfo with defaults
                    PnrpInfo identityInfo = new PnrpInfo();
                    identityInfo.lpwszIdentity = null;
                    identityInfo.dwSize = Marshal.SizeOf(typeof(PnrpInfo));

                    // fill in the query set
                    WsaQuerySet registerQuery = new WsaQuerySet();
                    registerQuery.NameSpace = NspNamespaces.Name;
                    registerQuery.NSProviderId = NsProviderName;
                    registerQuery.ServiceClassId = SvcIdNameV1;
                    registerQuery.ServiceInstanceName = peerName;
                    registerQuery.Context = cloudName;
                    registerQuery.Blob = identityInfo;

                    DeleteService(registerQuery);
                }
 public PnrpRegisteredIdState enNameState; // state of registered name
 public static void ToPnrpInfoNative(PnrpInfo source, ref PnrpInfoNative target)
 {
     target.dwSize = source.dwSize;
     target.lpwszIdentity = source.lpwszIdentity;
     target.nMaxResolve = source.nMaxResolve;
     target.dwTimeout = source.dwTimeout;
     target.dwLifetime = source.dwLifetime;
     target.enResolveCriteria = source.enResolveCriteria;
     target.dwFlags = source.dwFlags;
     if (source.saHint != null)
     {
         target.saHint.lpSockAddr = source.saHint.lpSockAddr;
         target.saHint.iSockaddrLength = source.saHint.iSockaddrLength;
     }
     else
     {
         target.saHint.lpSockAddr = IntPtr.Zero;
         target.saHint.iSockaddrLength = 0;
     }
     target.enNameState = source.enNameState;
 }