[Spambayes-checkins] spambayes/windows pop3proxy_tray.py,1.8,1.9

Adam Walker xenogeist at users.sourceforge.net
Sun Sep 14 21:35:06 EDT 2003


Update of /cvsroot/spambayes/spambayes/windows
In directory sc8-pr-cvs1:/tmp/cvs-serv16419/windows

Modified Files:
	pop3proxy_tray.py 
Log Message:
Support for service from Romain GUY.

Index: pop3proxy_tray.py
===================================================================
RCS file: /cvsroot/spambayes/spambayes/windows/pop3proxy_tray.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** pop3proxy_tray.py	15 Sep 2003 01:00:18 -0000	1.8
--- pop3proxy_tray.py	15 Sep 2003 01:35:04 -0000	1.9
***************
*** 43,46 ****
--- 43,47 ----
  from win32gui import *
  from win32api import error as win32api_error
+ from win32service import *
  
  # If we are not running in a console, redirect all print statements to the
***************
*** 102,105 ****
--- 103,109 ----
  
  START_STOP_ID = 1024
+ runningStatus = (SERVICE_START_PENDING, SERVICE_RUNNING, SERVICE_CONTINUE_PENDING)
+ stoppedStatus = (SERVICE_PAUSED, SERVICE_STOP_PENDING, SERVICE_STOPPED)
+ serviceName = "pop3proxy"
  
  class MainWindow(object):
***************
*** 113,118 ****
                                    1026 : ("View information ...", self.OpenInterface),
                                    1027 : ("Configure ...", self.OpenConfig),
!                                   1027 : ("Check for latest version", self.CheckVersion),
!                                   1028 : ("-", None),
                                    1099 : ("Exit SpamBayes", self.OnExit),
                                    }
--- 117,122 ----
                                    1026 : ("View information ...", self.OpenInterface),
                                    1027 : ("Configure ...", self.OpenConfig),
!                                   1028 : ("Check for latest version", self.CheckVersion),
!                                   1029 : ("-", None),
                                    1099 : ("Exit SpamBayes", self.OnExit),
                                    }
***************
*** 122,125 ****
--- 126,131 ----
              WM_TASKBAR_NOTIFY : self.OnTaskbarNotify,
          }
+         self.use_service = True
+         #self.use_service = False
  
          # Create the Window.
***************
*** 160,167 ****
  
          flags = NIF_ICON | NIF_MESSAGE | NIF_TIP
!         nid = (self.hwnd, 0, flags, WM_TASKBAR_NOTIFY, self.hstartedicon, "SpamBayes")
          Shell_NotifyIcon(NIM_ADD, nid)
          self.started = False
          self.tip = None
  
          # Start up sb_server
--- 166,187 ----
  
          flags = NIF_ICON | NIF_MESSAGE | NIF_TIP
!         nid = (self.hwnd, 0, flags, WM_TASKBAR_NOTIFY, self.hstartedicon, 
!             "SpamBayes")
          Shell_NotifyIcon(NIM_ADD, nid)
          self.started = False
          self.tip = None
+       
+         try:
+             if self.use_service and self.IsServiceAvailable():
+                 if self.GetServiceStatus() in runningStatus:
+                     self.started = True
+             else:
+                 print "Service not availible. Using thread."
+                 self.use_service = False
+                 self.started = False
+         except:
+             print "Usage of service failed. Reverting to thread."
+             self.use_service = False
+             self.started = False
  
          # Start up sb_server
***************
*** 169,182 ****
          # XXX This should determine if we are using the service, and if so
          # XXX start that, and if not kick sb_server off in a separate thread.
!         sb_server.prepare(state=sb_server.state)
!         self.StartStop()
  
      def BuildToolTip(self):
          tip = None
!         if self.started == True:
!             #%i spam %i unsure %i session %i active
!             tip = "SpamBayes %i spam %i ham %i unsure %i sessions %i active" %\
!             (sb_server.state.numSpams, sb_server.state.numHams, sb_server.state.numUnsure,
!              sb_server.state.totalSessions, sb_server.state.activeSessions)
          else:
              tip = "SpamBayes is not running"
--- 189,207 ----
          # XXX This should determine if we are using the service, and if so
          # XXX start that, and if not kick sb_server off in a separate thread.
!         if not self.use_service:
!             sb_server.prepare(state=sb_server.state)
!         if not self.started:
!             self.StartStop()
  
      def BuildToolTip(self):
          tip = None
!         if self.started:
!             if self.use_service:
!                 tip = "SpamBayes running."
!             else:
!                 tip = "SpamBayes %i spam %i ham %i unsure %i sessions %i active" %\
!                       (sb_server.state.numSpams, sb_server.state.numHams,
!                        sb_server.state.numUnsure, sb_server.state.totalSessions,
!                        sb_server.state.activeSessions)
          else:
              tip = "SpamBayes is not running"
***************
*** 184,197 ****
              
  
!     def UpdateIcon(self, hicon=None):
!         flags = NIF_TIP
!         if hicon is not None:
!             flags |= NIF_ICON
          else:
!             hicon = 0
          self.tip = self.BuildToolTip()
          nid = (self.hwnd, 0, flags, WM_TASKBAR_NOTIFY, hicon, self.tip)
          Shell_NotifyIcon(NIM_MODIFY, nid)
  
      def OnDestroy(self, hwnd, msg, wparam, lparam):
          nid = (self.hwnd, 0)
--- 209,315 ----
              
  
!     def UpdateIcon(self):
!         flags = NIF_TIP | NIF_ICON
!         if self.started:
!             hicon = self.hstartedicon 
          else:
!             hicon = self.hstoppedicon
          self.tip = self.BuildToolTip()
          nid = (self.hwnd, 0, flags, WM_TASKBAR_NOTIFY, hicon, self.tip)
          Shell_NotifyIcon(NIM_MODIFY, nid)
  
+     def IsServiceAvailable(self):
+         schSCManager = OpenSCManager(None, None, SC_MANAGER_CONNECT)
+         schService   = OpenService(schSCManager, serviceName,
+                                    SERVICE_QUERY_STATUS)
+         if schService:
+             CloseServiceHandle(schService)
+         return schService != None
+ 
+     def GetServiceStatus(self):
+         schSCManager = OpenSCManager(None, None, SC_MANAGER_CONNECT)
+         schService   = OpenService(schSCManager, serviceName,
+                                    SERVICE_QUERY_STATUS)
+         ssStatus     = QueryServiceStatus(schService)
+         CloseServiceHandle(schService)
+         return ssStatus[1]
+ 
+     def StartService(self):
+         schSCManager = OpenSCManager(None, None, SC_MANAGER_CONNECT)
+         schService   = OpenService(schSCManager, serviceName, SERVICE_START |
+                                    SERVICE_QUERY_STATUS)
+         # we assume IsServiceAvailable() was called before
+         ssStatus     = QueryServiceStatus(schService)
+         if ssStatus[1] in runningStatus:
+             self.started = True
+             CloseServiceHandle(schService)
+             return
+ 
+         StartService(schService, None)
+ 
+         ssStatus         = QueryServiceStatus(schService)
+         dwStartTickCount = GetTickCount()
+         dwOldCheckPoint  = ssStatus[5]
+ 
+         while ssStatus[1] == SERVICE_START_PENDING:
+             dwWaitTime = ssStatus[6] / 10;
+ 
+             if dwWaitTime < 1000:
+                 dwWaitTime = 1000
+             elif dwWaitTime > 10000:
+                 dwWaitTime = 10000
+     
+             Sleep(dwWaitTime);
+             ssStatus = QueryServiceStatus(schService)
+      
+             if ssStatus[5] > dwOldCheckPoint:
+                 dwStartTickCount = GetTickCount()
+                 dwOldCheckPoint = ssStatus[5]
+             else:
+                 if GetTickCount() - dwStartTickCount > ssStatus[6]:
+                     break
+ 
+         self.started = ssStatus[1] == SERVICE_RUNNING
+         CloseServiceHandle(schService)
+         self.started = True
+ 
+     def StopService(self):
+         schSCManager = OpenSCManager(None, None, SC_MANAGER_CONNECT)
+         schService   = OpenService(schSCManager, serviceName, SERVICE_STOP |
+                                    SERVICE_QUERY_STATUS)
+         # we assume IsServiceAvailable() was called before
+         ssStatus     = QueryServiceStatus(schService)
+         if ssStatus[1] in stoppedStatus:
+             self.started = False
+             CloseServiceHandle(schService)
+             return
+         
+         ControlService(schService, SERVICE_CONTROL_STOP)
+ 
+         ssStatus         = QueryServiceStatus(schService)
+         dwStartTickCount = GetTickCount()
+         dwOldCheckPoint  = ssStatus[5]
+ 
+         while ssStatus[1] == SERVICE_STOP_PENDING:
+             dwWaitTime = ssStatus[6] / 10;
+ 
+             if dwWaitTime < 1000:
+                 dwWaitTime = 1000
+             elif dwWaitTime > 10000:
+                 dwWaitTime = 10000
+     
+             Sleep(dwWaitTime);
+             ssStatus = QueryServiceStatus(schService)
+      
+             if ssStatus[5] > dwOldCheckPoint:
+                 dwStartTickCount = GetTickCount()
+                 dwOldCheckPoint = ssStatus[5]
+             else:
+                 if GetTickCount() - dwStartTickCount > ssStatus[6]:
+                     break
+ 
+         CloseServiceHandle(schService)
+         self.started = False
+         
      def OnDestroy(self, hwnd, msg, wparam, lparam):
          nid = (self.hwnd, 0)
***************
*** 239,243 ****
  
      def OnExit(self):
!         if self.started:
              sb_server.stop(sb_server.state)
              self.started = False
--- 357,361 ----
  
      def OnExit(self):
!         if self.started and not self.use_service:
              sb_server.stop(sb_server.state)
              self.started = False
***************
*** 255,278 ****
          # XXX start/stop that, and if not kick sb_server off in a separate
          # XXX thread, or stop the thread that was started.
!         if self.started:
!             sb_server.stop(sb_server.state)
!             self.started = False
!             self.control_functions[START_STOP_ID] = ("Start SpamBayes",
!                                                      self.StartStop)
!             self.UpdateIcon(self.hstoppedicon)
          else:
!             self.StartProxyThread()
              self.control_functions[START_STOP_ID] = ("Stop SpamBayes",
                                                       self.StartStop)
!             self.UpdateIcon(self.hstartedicon)
  
      def OpenInterface(self):
!         webbrowser.open_new("http://localhost:%d/" % \
!                             (options["html_ui", "port"],))
  
      def OpenConfig(self):		
!         webbrowser.open_new("http://localhost:%d/config" % \
!                             (options["html_ui", "port"],))
! 
      def CheckVersion(self):
          # Stolen, with few modifications, from addin.py
--- 373,411 ----
          # XXX start/stop that, and if not kick sb_server off in a separate
          # XXX thread, or stop the thread that was started.
!         if self.use_service:
!             if self.GetServiceStatus() in stoppedStatus:
!                 self.StartService()
!             else:
!                 self.StopService()
          else:
!             if self.started:
!                 sb_server.stop(sb_server.state)
!                 self.started = False
!             else:
!                 self.StartProxyThread()
!         self.UpdateIcon()
!         if self.started:
              self.control_functions[START_STOP_ID] = ("Stop SpamBayes",
                                                       self.StartStop)
!         else:
!             self.control_functions[START_STOP_ID] = ("Start SpamBayes",
!                                          self.StartStop)
! 
! 
  
      def OpenInterface(self):
!         if self.started:
!             webbrowser.open_new("http://localhost:%d/" % \
!                                 (options["html_ui", "port"],))
!         else:
!             self.ShowMessage("SpamBayes is not running.")
  
      def OpenConfig(self):		
!         if self.started:
!             webbrowser.open_new("http://localhost:%d/config" % \
!                                 (options["html_ui", "port"],))
!         else:
!             self.ShowMessage("SpamBayes is not running.")
!             
      def CheckVersion(self):
          # Stolen, with few modifications, from addin.py
***************
*** 299,307 ****
                                                  version_dict=latest)
          except:
!             print "Error checking the latest version"
              traceback.print_exc()
              return
  
!         print "Current version is %s, latest is %s." % (cur_ver_num, latest_ver_num)
          if latest_ver_num > cur_ver_num:
              url = get_version_string(app_name, "Download Page", version_dict=latest)
--- 432,440 ----
                                                  version_dict=latest)
          except:
!             self.ShowMessage("Error checking the latest version")
              traceback.print_exc()
              return
  
!         self.ShowMessage("Current version is %s, latest is %s." % (cur_ver_num, latest_ver_num))
          if latest_ver_num > cur_ver_num:
              url = get_version_string(app_name, "Download Page", version_dict=latest)
***************
*** 309,312 ****
--- 442,448 ----
  ##                os.startfile(url)
        
+     def ShowMessage(self, msg):
+         MessageBox(self.hwnd, msg, "SpamBayes", win32con.MB_OK)
+ 
  
  def main():





More information about the Spambayes-checkins mailing list