/// <summary>
        /// Queries for all instances of a particular service on the local network.
        /// </summary>
        /// <param name="name">The instance to query, for example "My WebServer._http._tcp".</param>
        /// <param name="fields">The details to query.</param>
        /// <returns>The service instance.</returns>
        /// <remarks>Excluding some fields (for example the IP address) may reduce the time taken.</remarks>
        public ServiceInstance LookupInstance(string name, ServiceInstanceFields fields)
        {
            ServiceInstance instance = new ServiceInstance(name);

            if ((fields & ServiceInstanceFields.DisplayName) != 0)
            {
                instance.DisplayName = DecodeDisplayName(name);
            }

            if ((fields & ServiceInstanceFields.Parameters) != 0)
            {
                instance.Parameters = LookupInstanceDetails(name);
            }

            if ((fields & ServiceInstanceFields.DnsAddresses) != 0 ||
                (fields & ServiceInstanceFields.IPAddresses) != 0)
            {
                instance.EndPoints = LookupInstanceEndpoints(name, fields);
            }

            return(instance);
        }
        /// <summary>
        /// Queries for all instances of a particular service on the local network.
        /// </summary>
        /// <param name="name">The instance to query, for example "My WebServer._http._tcp"</param>
        /// <param name="fields">The details to query</param>
        /// <returns>The service instance</returns>
        /// <remarks>Excluding some fields (for example the IP address) may reduce the time taken</remarks>
        public ServiceInstance LookupInstance(string name, ServiceInstanceFields fields)
        {
            ServiceInstance instance = new ServiceInstance(name);

            if ((fields & ServiceInstanceFields.DisplayName) != 0)
            {
                instance.DisplayName = DecodeDisplayName(name);
            }

            if ((fields & ServiceInstanceFields.Parameters) != 0)
            {
                instance.Parameters = LookupInstanceDetails(name);
            }

            if ((fields & ServiceInstanceFields.DnsAddresses) != 0
                || (fields & ServiceInstanceFields.IPAddresses) != 0)
            {
                instance.EndPoints = LookupInstanceEndpoints(name, fields);
            }

            return instance;
        }
 internal OpticalDiscService(ServiceInstance instance, ServiceDiscoveryClient sdClient)
 {
     _sdClient = sdClient;
     _instance = instance;
 }
        /// <summary>
        /// Connects to the service.
        /// </summary>
        /// <param name="userName">The username to use, if the owner of the Mac / PC is prompted.</param>
        /// <param name="computerName">The computer name to use, if the owner of the Mac / PC is prompted.</param>
        /// <param name="maxWaitSeconds">The maximum number of seconds to wait to be granted access.</param>
        public void Connect(string userName, string computerName, int maxWaitSeconds)
        {
            var sysParams = GetParams("sys");

            int volFlags = 0;
            string volFlagsStr;
            if (sysParams.TryGetValue("adVF", out volFlagsStr))
            {
                volFlags = ParseInt(volFlagsStr);
            }

            if ((volFlags & 0x200) != 0)
            {
                _userName = userName;
                AskForAccess(userName, computerName, maxWaitSeconds);

                // Flush any stale mDNS data - the server advertises extra info (such as the discs available)
                // after a client is granted permission to access a disc.
                _sdClient.FlushCache();

                _instance = _sdClient.LookupInstance(_instance.Name, ServiceInstanceFields.All);
            }
        }