--- gamin-0.1.10/python/gamin.py.orig 2007-07-04 15:36:48.000000000 +0000
|
+++ gamin-0.1.10/python/gamin.py 2023-01-25 17:45:14.040421915 +0000
|
@@ -36,7 +36,7 @@
|
|
def GaminErrmsg(err = None):
|
if err == None:
|
- err = _gamin.Errno()
|
+ err = _gamin.Errno()
|
if err == GAM_ARG:
|
msg = "bad argument error"
|
elif err == GAM_FILE:
|
@@ -58,199 +58,199 @@
|
class GaminException(Exception):
|
def __init__(self, value):
|
Exception.__init__(self)
|
- self.value = value
|
- self.errno = GaminErrno()
|
+ self.value = value
|
+ self.errno = GaminErrno()
|
|
def __str__(self):
|
str = GaminErrmsg(self.errno)
|
- if str != "":
|
+ if str != "":
|
return repr(self.value) + ': ' + str
|
return repr(self.value)
|
|
class WatchMonitor:
|
"""This is a wrapper for a FAM connection. It uses a single connection
|
- to the gamin server, over a socket. Use get_fd() to get the file
|
- descriptor which allows to plug it in an usual event loop. The
|
- watch_directory(), watch_file() and stop_watch() are direct mapping
|
- to the FAM API. The event raised are also a direct mapping of the
|
- FAM API events."""
|
+ to the gamin server, over a socket. Use get_fd() to get the file
|
+ descriptor which allows to plug it in an usual event loop. The
|
+ watch_directory(), watch_file() and stop_watch() are direct mapping
|
+ to the FAM API. The event raised are also a direct mapping of the
|
+ FAM API events."""
|
|
class WatchObject:
|
- def __init__ (self, monitor, mon_no, path, dir, callback, data=None):
|
- self.monitor = monitor
|
- self.callback = callback
|
- self.data = data
|
- self.path = path
|
- self.__mon_no = mon_no
|
- if dir == 1:
|
- ret = _gamin.MonitorDirectory(self.__mon_no, path, self);
|
- if ret < 0:
|
- raise(GaminException("Failed to monitor directory %s" %
|
- (path)))
|
- elif dir == 0:
|
- ret = _gamin.MonitorFile(self.__mon_no, path, self);
|
- if ret < 0:
|
- raise(GaminException("Failed to monitor file %s" %
|
- (path)))
|
- elif dir == -1:
|
- ret = _gamin.MonitorDebug(self.__mon_no, path, self);
|
- if ret < 0:
|
- raise(GaminException("Failed to debug %s" %
|
- (path)))
|
- self.__req_no = ret
|
+ def __init__ (self, monitor, mon_no, path, dir, callback, data=None):
|
+ self.monitor = monitor
|
+ self.callback = callback
|
+ self.data = data
|
+ self.path = path
|
+ self.__mon_no = mon_no
|
+ if dir == 1:
|
+ ret = _gamin.MonitorDirectory(self.__mon_no, path, self);
|
+ if ret < 0:
|
+ raise(GaminException("Failed to monitor directory %s" %
|
+ (path)))
|
+ elif dir == 0:
|
+ ret = _gamin.MonitorFile(self.__mon_no, path, self);
|
+ if ret < 0:
|
+ raise(GaminException("Failed to monitor file %s" %
|
+ (path)))
|
+ elif dir == -1:
|
+ ret = _gamin.MonitorDebug(self.__mon_no, path, self);
|
+ if ret < 0:
|
+ raise(GaminException("Failed to debug %s" %
|
+ (path)))
|
+ self.__req_no = ret
|
|
- def _internal_callback(self, path, event):
|
+ def _internal_callback(self, path, event):
|
# it is very important here to catch all exception which may
|
# arise in the client callback code.
|
- try:
|
- if self.data != None:
|
- self.callback (path, event, self.data)
|
- else:
|
- self.callback (path, event)
|
- except:
|
- import traceback
|
- traceback.print_exc()
|
-
|
- if event == GAMAcknowledge:
|
- try:
|
- self.monitor.cancelled.remove(self)
|
- except:
|
- print "gamin failed to remove from cancelled"
|
- pass
|
-
|
- def cancel(self):
|
- ret = _gamin.MonitorCancel(self.__mon_no, self.__req_no);
|
- if ret < 0:
|
- raise(GaminException("Failed to stop monitor on %s" %
|
- (self.path)))
|
- try:
|
- self.monitor.cancelled.append(self)
|
- except:
|
- print "gamin cancel() failed to add to cancelled"
|
+ try:
|
+ if self.data != None:
|
+ self.callback (path, event, self.data)
|
+ else:
|
+ self.callback (path, event)
|
+ except:
|
+ import traceback
|
+ traceback.print_exc()
|
+
|
+ if event == GAMAcknowledge:
|
+ try:
|
+ self.monitor.cancelled.remove(self)
|
+ except:
|
+ print("gamin failed to remove from cancelled")
|
+ pass
|
+
|
+ def cancel(self):
|
+ ret = _gamin.MonitorCancel(self.__mon_no, self.__req_no);
|
+ if ret < 0:
|
+ raise(GaminException("Failed to stop monitor on %s" %
|
+ (self.path)))
|
+ try:
|
+ self.monitor.cancelled.append(self)
|
+ except:
|
+ print("gamin cancel() failed to add to cancelled")
|
|
def __init__ (self):
|
self.__no = _gamin.MonitorConnect()
|
- if self.__no < 0:
|
- raise(GaminException("Failed to connect to gam_server"))
|
- self.objects = {}
|
- self.__fd = _gamin.GetFd(self.__no)
|
- if self.__fd < 0:
|
- _gamin.MonitorClose(self.__no)
|
- raise(GaminException("Failed to get file descriptor"))
|
- self.cancelled = []
|
+ if self.__no < 0:
|
+ raise(GaminException("Failed to connect to gam_server"))
|
+ self.objects = {}
|
+ self.__fd = _gamin.GetFd(self.__no)
|
+ if self.__fd < 0:
|
+ _gamin.MonitorClose(self.__no)
|
+ raise(GaminException("Failed to get file descriptor"))
|
+ self.cancelled = []
|
|
def __del__ (self):
|
self.disconnect()
|
|
def __raise_disconnected():
|
- raise(GaminException("Already disconnected"))
|
+ raise(GaminException("Already disconnected"))
|
|
def _debug_object(self, value, callback, data = None):
|
if has_debug_api == 0:
|
- return;
|
+ return;
|
|
if (self.__no < 0):
|
- self.__raise_disconnected();
|
+ self.__raise_disconnected();
|
obj = self.WatchObject(self, self.__no, value, -1, callback, data)
|
# persistency need to be insured
|
- self.objects["debug"] = obj
|
- return obj
|
+ self.objects["debug"] = obj
|
+ return obj
|
|
def disconnect(self):
|
if (self.__no >= 0):
|
- _gamin.MonitorClose(self.__no)
|
- self.__no = -1;
|
+ _gamin.MonitorClose(self.__no)
|
+ self.__no = -1;
|
|
def watch_directory(self, directory, callback, data = None):
|
if (self.__no < 0):
|
- self.__raise_disconnected();
|
+ self.__raise_disconnected();
|
directory = os.path.abspath(directory)
|
|
obj = self.WatchObject(self, self.__no, directory, 1, callback, data)
|
if self.objects.has_key(directory):
|
- self.objects[directory].append(obj)
|
- else:
|
- self.objects[directory] = [obj]
|
- return obj
|
+ self.objects[directory].append(obj)
|
+ else:
|
+ self.objects[directory] = [obj]
|
+ return obj
|
|
def watch_file(self, file, callback, data = None):
|
if (self.__no < 0):
|
- self.__raise_disconnected();
|
+ self.__raise_disconnected();
|
file = os.path.abspath(file)
|
|
obj = self.WatchObject(self, self.__no, file, 0, callback, data)
|
if self.objects.has_key(file):
|
- self.objects[file].append(obj)
|
- else:
|
- self.objects[file] = [obj]
|
- return obj
|
+ self.objects[file].append(obj)
|
+ else:
|
+ self.objects[file] = [obj]
|
+ return obj
|
|
def no_exists(self):
|
if (self.__no < 0):
|
- return
|
- ret = _gamin.MonitorNoExists(self.__no)
|
- return ret
|
+ return
|
+ ret = _gamin.MonitorNoExists(self.__no)
|
+ return ret
|
|
def stop_watch(self, path):
|
if (self.__no < 0):
|
- return
|
+ return
|
path = os.path.abspath(path)
|
- try:
|
- list = self.objects[path]
|
- except:
|
- raise(GaminException("Resource %s is not monitored" % (path)))
|
- for obj in list:
|
- obj.cancel()
|
- self.objects[path] = []
|
-
|
+ try:
|
+ list = self.objects[path]
|
+ except:
|
+ raise(GaminException("Resource %s is not monitored" % (path)))
|
+ for obj in list:
|
+ obj.cancel()
|
+ self.objects[path] = []
|
+
|
def get_fd(self):
|
if (self.__no < 0):
|
- self.__raise_disconnected();
|
+ self.__raise_disconnected();
|
return self.__fd
|
|
def event_pending(self):
|
if (self.__no < 0):
|
- self.__raise_disconnected();
|
+ self.__raise_disconnected();
|
ret = _gamin.EventPending(self.__no);
|
- if ret < 0:
|
- raise(GaminException("Failed to check pending events"))
|
- return ret
|
+ if ret < 0:
|
+ raise(GaminException("Failed to check pending events"))
|
+ return ret
|
|
def handle_one_event(self):
|
if (self.__no < 0):
|
- self.__raise_disconnected();
|
+ self.__raise_disconnected();
|
ret = _gamin.ProcessOneEvent(self.__no);
|
- if ret < 0:
|
- raise(GaminException("Failed to process one event"))
|
- return ret
|
+ if ret < 0:
|
+ raise(GaminException("Failed to process one event"))
|
+ return ret
|
|
def handle_events(self):
|
if (self.__no < 0):
|
- self.__raise_disconnected();
|
+ self.__raise_disconnected();
|
ret = _gamin.ProcessEvents(self.__no);
|
- if ret < 0:
|
- raise(GaminException("Failed to process events"))
|
- return ret
|
+ if ret < 0:
|
+ raise(GaminException("Failed to process events"))
|
+ return ret
|
|
def run_unit_tests():
|
def callback(path, event):
|
- print "Got callback: %s, %s" % (path, event)
|
+ print("Got callback: %s, %s") % (path, event)
|
mon = WatchMonitor()
|
- print "watching current directory"
|
+ print("watching current directory")
|
mon.watch_directory(".", callback)
|
import time
|
time.sleep(1)
|
- print "fd: ", mon.get_fd()
|
+ print("fd: "), mon.get_fd()
|
ret = mon.event_pending()
|
- print "pending: ", ret
|
+ print("pending: "), ret
|
if ret > 0:
|
ret = mon.handle_one_event()
|
- print "processed %d event" % (ret)
|
- ret = mon.handle_events()
|
- print "processed %d remaining events" % (ret)
|
- print "stop watching current directory"
|
+ print("processed %d event") % (ret)
|
+ ret = mon.handle_events()
|
+ print("processed %d remaining events") % (ret)
|
+ print("stop watching current directory")
|
mon.stop_watch(".")
|
- print "disconnecting"
|
+ print("disconnecting")
|
del mon
|
|
if __name__ == '__main__':
|