diff options
author | Justus Winter <[email protected]> | 2016-05-24 14:45:39 +0000 |
---|---|---|
committer | Justus Winter <[email protected]> | 2016-05-24 16:00:16 +0000 |
commit | 0ebd6a1b43a96bffa78da89dc8629edac0a74d35 (patch) | |
tree | 4d7a1fede73aa0db8eb39d2c8167004a2d5e0a79 /lang/python/pyme/core.py | |
parent | python: Support status callbacks. (diff) | |
download | gpgme-0ebd6a1b43a96bffa78da89dc8629edac0a74d35.tar.gz gpgme-0ebd6a1b43a96bffa78da89dc8629edac0a74d35.zip |
python: Move the base wrapper class.
* python/lang/pyme/util.py (GpgmeWrapper): Move...
* python/lang/pyme/core.py: ... here.
Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to 'lang/python/pyme/core.py')
-rw-r--r-- | lang/python/pyme/core.py | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py index f15444be..aca5ec2d 100644 --- a/lang/python/pyme/core.py +++ b/lang/python/pyme/core.py @@ -22,7 +22,83 @@ from . import pygpgme from .errors import errorcheck, GPGMEError from . import errors -from .util import GpgmeWrapper + +class GpgmeWrapper(object): + """Base class all Pyme wrappers for GPGME functionality. Not to be + instantiated directly.""" + + def __init__(self, wrapped): + self._callback_excinfo = None + self.wrapped = wrapped + + def __repr__(self): + return '<instance of %s.%s with GPG object at %s>' % \ + (__name__, self.__class__.__name__, + self.wrapped) + + def __str__(self): + return repr(self) + + def __hash__(self): + return hash(repr(self.wrapped)) + + def __eq__(self, other): + if other == None: + return False + else: + return repr(self.wrapped) == repr(other.wrapped) + + def _getctype(self): + """Must be implemented by child classes. + + Must return the name of the c type.""" + raise NotImplementedError() + + def _getnameprepend(self): + """Must be implemented by child classes. + + Must return the prefix of all c functions mapped to methods of + this class.""" + raise NotImplementedError() + + def _errorcheck(self, name): + """Must be implemented by child classes. + + This function must return a trueish value for all c functions + returning gpgme_error_t.""" + raise NotImplementedError() + + def __getattr__(self, key): + """On-the-fly function generation.""" + if key[0] == '_' or self._getnameprepend() == None: + return None + name = self._getnameprepend() + key + func = getattr(pygpgme, name) + + if self._errorcheck(name): + def _funcwrap(slf, *args, **kwargs): + result = func(slf.wrapped, *args, **kwargs) + if slf._callback_excinfo: + pygpgme.pygpgme_raise_callback_exception(slf) + return errorcheck(result, "Invocation of " + name) + else: + def _funcwrap(slf, *args, **kwargs): + result = func(slf.wrapped, *args, **kwargs) + if slf._callback_excinfo: + pygpgme.pygpgme_raise_callback_exception(slf) + return result + + _funcwrap.__doc__ = getattr(func, "__doc__") + + # Monkey-patch the class. + setattr(self.__class__, key, _funcwrap) + + # Bind the method to 'self'. + def wrapper(*args, **kwargs): + return _funcwrap(self, *args, **kwargs) + _funcwrap.__doc__ = getattr(func, "__doc__") + + return wrapper class Context(GpgmeWrapper): """From the GPGME C documentation: |