X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=cnotmuch%2Fglobals.py;h=d9f8d1b465b74b4eff2b3b214fac30e5ba557e8a;hp=ff765167a7974ec0bd0ade1c102e128fbe920533;hb=b00c892c65ee57d6503b4bafe8fd666a6a274e47;hpb=b4fdf0ae30e0847a759c01524898d0b9d803c43b diff --git a/cnotmuch/globals.py b/cnotmuch/globals.py index ff765167..d9f8d1b4 100644 --- a/cnotmuch/globals.py +++ b/cnotmuch/globals.py @@ -1,32 +1,53 @@ from ctypes import CDLL, c_char_p, c_int +from ctypes.util import find_library + +#----------------------------------------------------------------------------- #package-global instance of the notmuch library #TODO: lazy load this on first access? -nmlib = CDLL('/usr/local/lib/libnotmuch.so') - -class STATUS(object): - SUCCESS = 0 - OUT_OF_MEMORY = 1 - READ_ONLY_DATABASE = 2 - XAPIAN_EXCEPTION = 3 - FILE_ERROR = 4 - FILE_NOT_EMAIL = 5 - DUPLICATE_MESSAGE_ID = 6 - NULL_POINTER = 7 - TAG_TOO_LONG = 8 - UNBALANCED_FREEZE_THAW = 9 - LAST_STATUS = 10 - - """Get a string representation of a notmuch_status_t value.""" - status2str = nmlib.notmuch_status_to_string - status2str.restype = c_char_p - status2str.argtypes = [c_int] - - def __init__(self, status): - self._status = status - - def __str__(self): - """Get a string representation of a notmuch_status_t value.""" - return str(STATUS.status2str(self._status)) +so = find_library('notmuch') +if so is None: + raise ImportError("Could not find shared 'notmuch' library.") +nmlib = CDLL(so) +#----------------------------------------------------------------------------- +class Enum(object): + """Provides ENUMS as "code=Enum(['a','b','c'])" where code.a=0 etc...""" + def __init__(self, names): + for number, name in enumerate(names): + setattr(self, name, number) + +#----------------------------------------------------------------------------- +class Status(Enum): + """Enum with a string representation of a notmuch_status_t value.""" + __name__="foo" + _status2str = nmlib.notmuch_status_to_string + _status2str.restype = c_char_p + _status2str.argtypes = [c_int] + + def __init__(self, statuslist): + """It is initialized with a list of strings that are available as + Status().string1 - Status().stringn attributes. + """ + super(Status, self).__init__(statuslist) + + def status2str(self, status): + """Get a string representation of a notmuch_status_t value.""" + # define strings for custom error messages + if status == STATUS.NOT_INITIALIZED: + return "Operation on uninitialized object impossible." + return str(Status._status2str(status)) + +STATUS = Status(['SUCCESS', + 'OUT_OF_MEMORY', + 'READ_ONLY_DATABASE', + 'XAPIAN_EXCEPTION', + 'FILE_ERROR', + 'FILE_NOT_EMAIL', + 'DUPLICATE_MESSAGE_ID', + 'NULL_POINTER', + 'TAG_TOO_LONG', + 'UNBALANCED_FREEZE_THAW', + 'NOT_INITIALIZED']) + class NotmuchError(Exception): def __init__(self, status=None, message=None): @@ -35,4 +56,5 @@ class NotmuchError(Exception): def __str__(self): if self.args[0] is not None: return self.args[0] - else: return str(STATUS(self.args[1])) + else: return STATUS.status2str(self.args[1]) +