util/discovery.py
changeset 768 fe47069f214c
parent 763 c1104099c151
--- a/util/discovery.py	Mon Jun 11 01:24:18 2012 +0200
+++ b/util/discovery.py	Mon Jun 11 02:34:23 2012 +0200
@@ -28,6 +28,8 @@
 
 import connectors
 
+service_type = '_PYRO._tcp.local.'
+
 class AutoWidthListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
     def __init__(self, parent, id, name, pos=wx.DefaultPosition,
                  size=wx.DefaultSize, style=0):
@@ -36,8 +38,8 @@
 
 [ID_DISCOVERYDIALOG, ID_DISCOVERYDIALOGSTATICTEXT1, 
  ID_DISCOVERYDIALOGSERVICESLIST, ID_DISCOVERYDIALOGREFRESHBUTTON, 
- ID_DISCOVERYDIALOGLOCALBUTTON, 
-] = [wx.NewId() for _init_ctrls in range(5)]
+ ID_DISCOVERYDIALOGLOCALBUTTON, ID_DISCOVERYDIALOGIPBUTTON, 
+] = [wx.NewId() for _init_ctrls in range(6)]
 
 class DiscoveryDialog(wx.Dialog, listmix.ColumnSorterMixin):
     
@@ -53,6 +55,7 @@
     def _init_coll_ButtonGridSizer_Items(self, parent):
         parent.AddWindow(self.RefreshButton, 0, border=0, flag=0)
         parent.AddWindow(self.LocalButton, 0, border=0, flag=0)
+        parent.AddWindow(self.IpButton, 0, border=0, flag=0)
         parent.AddSizer(self.ButtonSizer, 0, border=0, flag=0)
         
     def _init_coll_ButtonGridSizer_Growables(self, parent):
@@ -62,7 +65,7 @@
     
     def _init_sizers(self):
         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
-        self.ButtonGridSizer = wx.FlexGridSizer(cols=3, hgap=5, rows=1, vgap=0)
+        self.ButtonGridSizer = wx.FlexGridSizer(cols=4, hgap=5, rows=1, vgap=0)
         
         self._init_coll_MainSizer_Items(self.MainSizer)
         self._init_coll_MainSizer_Growables(self.MainSizer)
@@ -107,6 +110,11 @@
               label=_('Local'), name='LocalButton', parent=self,
               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
         self.Bind(wx.EVT_BUTTON, self.OnLocalButton, id=ID_DISCOVERYDIALOGLOCALBUTTON)
+
+        self.IpButton = wx.Button(id=ID_DISCOVERYDIALOGIPBUTTON,
+              label=_('Add IP'), name='IpButton', parent=self,
+              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+        self.Bind(wx.EVT_BUTTON, self.OnIpButton, id=ID_DISCOVERYDIALOGIPBUTTON)
         
         self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTER)
         
@@ -119,23 +127,19 @@
         self.nextItemId = 0
         
         self.URI = None
-        self.Browsers = []
+        self.Browser = None
         
         self.ZeroConfInstance = Zeroconf()
         self.RefreshList()
+        self.LatestSelection=None
         
     def __del__(self):
-        for browser in self.Browsers:
-            browser.cancel()
+        if self.Browser is not None : self.Browser.cancel()
         self.ZeroConfInstance.close()
         
     def RefreshList(self):
-        for browser in self.Browsers:
-            browser.cancel()
-        
-        self.Browsers = []
-        for t in connectors.dnssd_connectors.keys():
-            self.Browsers.append(ServiceBrowser(self.ZeroConfInstance, t, self))
+        if self.Browser is not None : self.Browser.cancel()
+        self.Browser = ServiceBrowser(self.ZeroConfInstance, service_type, self)
 
     def OnRefreshButton(self, event):
         self.ServicesList.DeleteAllItems()
@@ -146,6 +150,13 @@
         self.EndModal(wx.ID_OK)
         event.Skip()
 
+    def OnIpButton(self, event):
+        if self.LatestSelection is not None:
+            l = lambda col : self.getColumnText(self.LatestSelection,col)
+            self.URI = "%s://%s:%s"%tuple(map(l,(1,2,3)))
+            self.EndModal(wx.ID_OK)
+        event.Skip()
+
     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
     def GetListCtrl(self):
         return self.ServicesList
@@ -163,17 +174,23 @@
         self.EndModal(wx.ID_OK)
         event.Skip()
 
+#    def SetURI(self, idx):
+#        connect_type = self.getColumnText(idx, 1)
+#        connect_address = self.getColumnText(idx, 2)
+#        connect_port = self.getColumnText(idx, 3)
+#        
+#        self.URI = "%s://%s:%s"%(connect_type, connect_address, connect_port)
+
     def SetURI(self, idx):
+        self.LatestSelection = idx
+        svcname = self.getColumnText(idx, 0) 
         connect_type = self.getColumnText(idx, 1)
-        connect_address = self.getColumnText(idx, 2)
-        connect_port = self.getColumnText(idx, 3)
-        
-        self.URI = "%s://%s:%s"%(connect_type, connect_address, connect_port)
-
+        self.URI = "%s://%s"%(connect_type, svcname + '.' + service_type)
+        
     def GetURI(self):
         return self.URI
         
-    def removeService(self, zeroconf, type, name):
+    def removeService(self, zeroconf, _type, name):
         wx.CallAfter(self._removeService, name)
 
 
@@ -194,17 +211,17 @@
                 self.ServicesList.DeleteItem(idx)
                 break
         
-    def addService(self, zeroconf, type, name):
-        wx.CallAfter(self._addService, type, name)
-
-    def _addService(self, type, name):
+    def addService(self, zeroconf, _type, name):
+        wx.CallAfter(self._addService, _type, name)
+
+    def _addService(self, _type, name):
         '''
         called when a service with the desired type is discovered.
         '''
-        info = self.ZeroConfInstance.getServiceInfo(type, name)
+        info = self.ZeroConfInstance.getServiceInfo(_type, name)
 
         svcname  = name.split(".")[0]
-        typename = type.split(".")[0][1:]
+        typename = _type.split(".")[0][1:]
         ip       = str(socket.inet_ntoa(info.getAddress()))
         port     = info.getPort()