Ejemplo n.º 1
0
    def OnExpandItem(self,event):
    
        item = event.GetItem()
        if item == self.tree.GetRootItem():
            return
            
        
        data = self.tree.GetPyData(item)
        if not data:    
            return
        self.tree.DeleteChildren(item)
        name,regtype,replyDomain = data
        
        self.resolvingItem = item
        sdRef2 = bonjour.AllocateDNSServiceRef()
        ret = bonjour.pyDNSServiceResolve(sdRef2,
                                          0,
                                          0,
                                          name,
                                          regtype,
                                          replyDomain,
                                          ResolveCallback,
                                          None)

        bonjour.DNSServiceProcessResult(sdRef2)
Ejemplo n.º 2
0
def QueryCallback(sdRef,flags,interfaceIndex,
                    errorCode,fullname,rrtype,
                    rrclass,rdlen,rdata,
                    ttl,userdata):
    # This is very ugly; should understand resource records better
    st = struct.unpack('%dc' % (rdlen-1), rdata)
    l1 = ord(st[0])
    l2 = ord(st[l1+1])
    typ = ''.join(st[1:l1+1])
    klass = ''.join(st[l1+2:l1+l2+2])
    serviceType = typ + '.' + klass

    if flags & SERVICE_ADD:
    
        # Add the service type to the browser
        app.frame.AddServiceType(serviceType)

        serviceRef = bonjour.AllocateDNSServiceRef()
        ret = bonjour.pyDNSServiceBrowse(  serviceRef,   # DNSServiceRef         *sdRef,
                                      0,                    # DNSServiceFlags       flags,                        
                                      0,                    # uint32_t              interfaceIndex,               
                                      serviceType,          # const char            *regtype,                     
                                      'local.',             # const char            *domain,    /* may be NULL */ 
                                      BrowseCallback,       # DNSServiceBrowseReply callBack,    
                                      None)                 
        if ret:
            print "ret = %d; exiting" % ret
            sys.exit(1)
        fd = bonjour.DNSServiceRefSockFD(serviceRef)
        serviceRefDict[fd] = serviceRef
    elif flags == 0:
        app.frame.RemoveServiceType(serviceType)
Ejemplo n.º 3
0
    def startResolving(self):
        """Advertise the service with Bonjour.
        
        This method returns a deferred.  Upon success, the result
        is a dictionary of information about the service.  Upon failure,
        the result is a Failure object that knows the BonjourError code.
        """

        # Allocate a Bonjour Service Reference
        self.sdRef = bonjour.AllocateDNSServiceRef()

        # Initiate Registration of the service
        ret = bonjour.pyDNSServiceResolve(self.sdRef, self.flags,
                                          self.interfaceIndex, self.name,
                                          self.regtype, self.domain,
                                          self.callback, self.context)

        # Error check for immediate failure
        if ret != bonjour.kDNSServiceErr_NoError:
            raise BonjourResolveError(ret)

        # Get the file descriptor and integrate with twisted
        self.fd = bonjour.DNSServiceRefSockFD(self.sdRef)
        self.bonjourDesc = BonjourDescriptor(self.fd, self.sdRef)
        self.reactor.addReader(self.bonjourDesc)

        return None
        def __init__(self, serviceName, regtype, url, port=9999):

            if port == 0:
                raise PublisherError(
                    'Service registered with invalid port %d' % (port, ))

            self.serviceRef = None
            self.registerFlag = threading.Event()

            # Create a text record
            txtRecordTxt = 'url=' + url
            txtRecord = chr(len(txtRecordTxt)) + txtRecordTxt
            txtRecordLen = len(txtRecord)

            # Allocate a service discovery reference and register the specified service
            self.serviceRef = bonjour.AllocateDNSServiceRef()
            ret = bonjour.pyDNSServiceRegister(self.serviceRef, 0, 0,
                                               serviceName, regtype, 'local.',
                                               None, port, txtRecordLen,
                                               txtRecord,
                                               self.__RegisterCallback, None)

            if ret != bonjour.kDNSServiceErr_NoError:
                raise PublisherError(ret)

            # Get the socket and loop
            fd = bonjour.DNSServiceRefSockFD(self.serviceRef)
            ret = select.select([fd], [], [])
            if ret[0]:
                ret = bonjour.DNSServiceProcessResult(self.serviceRef)
        def Run(self):

            self.running = 1

            # Allocate a service discovery ref and browse for the specified service type
            self.serviceRef = bonjour.AllocateDNSServiceRef()
            ret = bonjour.pyDNSServiceBrowse(self.serviceRef, 0, 0,
                                             self.serviceType, 'local.',
                                             self.__BrowseCallback, None)
            if ret != bonjour.kDNSServiceErr_NoError:
                print "ret = %d; exiting" % ret
                raise BrowserError('browse', ret)

            # Get socket descriptor
            fd = bonjour.DNSServiceRefSockFD(self.serviceRef)

            if fd <= 0:
                raise BrowserError('fd', fd)

            # Loop
            while self.IsRunning():
                # print "do select"
                ret = select.select([fd], [], [], self.timeout)
                if ret[0]:
                    #print "do process result"
                    ret = bonjour.DNSServiceProcessResult(self.serviceRef)
                    if ret != bonjour.kDNSServiceErr_NoError:
                        raise BrowserError('processresult', ret)
Ejemplo n.º 6
0
def BrowseCallback(sdRef, flags, interfaceIndex, errorCode, serviceName,
                   regtype, replyDomain, userdata):
    if flags & bonjour.kDNSServiceFlagsAdd:
        sdRef2 = bonjour.AllocateDNSServiceRef()
        ret = bonjour.pyDNSServiceResolve(sdRef2, 0, 0, serviceName, regtype,
                                          replyDomain, ResolveCallback, None)

        bonjour.DNSServiceProcessResult(sdRef2)

    elif flags == 0:
        print "Service removed: ", serviceName, regtype
Ejemplo n.º 7
0
def BrowseCallback(sdRef, flags, interfaceIndex, errorCode, serviceName,
                   regtype, replyDomain, userdata):
    if serviceName == servicename and flags & bonjour.kDNSServiceFlagsAdd:
        sys.stderr.write("Found service; resolving...\n")

        waitEvent.set()

        sdRef2 = bonjour.AllocateDNSServiceRef()
        ret = bonjour.pyDNSServiceResolve(sdRef2, 0, 0, serviceName, regtype,
                                          replyDomain, ResolveCallback, None)

        resolveEvent.clear()
        while not resolveEvent.isSet():
            bonjour.DNSServiceProcessResult(sdRef2)
        def __BrowseCallback(self, sdRef, flags, interfaceIndex, errorCode,
                             serviceName, regtype, replyDomain, userdata):

            if flags & bonjour.kDNSServiceFlagsAdd:
                sdRef2 = bonjour.AllocateDNSServiceRef()
                ret = bonjour.pyDNSServiceResolve(sdRef2, 0, 0, serviceName,
                                                  regtype, replyDomain,
                                                  self.__ResolveCallback,
                                                  serviceName)

                bonjour.DNSServiceProcessResult(sdRef2)
                bonjour.DNSServiceRefDeallocate(sdRef2)

            elif flags == 0:
                self.lock.acquire()
                del self.serviceUrls[serviceName]
                self.lock.release()

                # Call callback (if registered) to signal delete
                if self.browseCallback:
                    self.browseCallback(self.DELETE, serviceName)
Ejemplo n.º 9
0
def BrowseServices():

    # Allocate a service discovery ref and browse for the specified service type
    serviceRef = bonjour.AllocateDNSServiceRef()
    ret   = bonjour.pyDNSServiceQueryRecord(serviceRef,
                                        0,  # no flags
                                        0,  # all network interfaces
                                        "_services._dns-sd._udp.local.",  # meta-query record name
                                        PTR_RECORD_TYPE,
                                        INTERNET_CLASS_TYPE, 
                                        QueryCallback,  # callback function ptr
                                        None)
    if ret != bonjour.kDNSServiceErr_NoError:
        print "ret = %d; exiting" % ret
        sys.exit(1)

    # Get socket descriptor and loop                       
    fd = bonjour.DNSServiceRefSockFD(serviceRef)
    while 1:
        ret = select.select([fd],[],[])
        ret = bonjour.DNSServiceProcessResult(serviceRef)

    # Deallocate the service discovery ref
    bonjour.DNSServiceRefDeallocate(serviceRef)
Ejemplo n.º 10
0
if len(sys.argv) < 4:
    print "Usage: register.py servicename regtype port"
    sys.exit(1)

servicename = sys.argv[1]
regtype = sys.argv[2]
port = int(sys.argv[3])
userdata = None
if len(sys.argv) > 4:
    userdata = sys.argv[4]

hostname = socket.gethostname()

# Allocate a service discovery reference and register the specified service
serviceRef = bonjour.AllocateDNSServiceRef()
ret = bonjour.pyDNSServiceRegister(
    serviceRef,  # DNSServiceRef           *sdRef,
    0,  # DNSServiceFlags         flags,         /* may be 0 */
    0,  # uint32_t                interfaceIndex,/* may be 0 */
    servicename,  # const char              *name,         /* may be NULL */
    regtype,  # const char              *regtype,
    'local.',  # const char              *domain,       /* may be NULL */
    hostname,  # const char              *host,         /* may be NULL */
    port,  # uint16_t                port,
    0,  # uint16_t                txtLen,
    "",  # const void              *txtRecord,    /* may be NULL */
    RegisterCallback,  # DNSServiceRegisterReply callBack,      /* may be NULL */
    userdata)

if ret != bonjour.kDNSServiceErr_NoError: