Blame ibus/serializable.py

Packit Service 1d8f1c
# vim:set et sts=4 sw=4:
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# ibus - The Input Bus
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# Copyright (c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
# Copyright (c) 2007-2010 Red Hat, Inc.
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# This library is free software; you can redistribute it and/or
Packit Service 1d8f1c
# modify it under the terms of the GNU Lesser General Public
Packit Service 1d8f1c
# License as published by the Free Software Foundation; either
Packit Service 1d8f1c
# version 2.1 of the License, or (at your option) any later version.
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# This library is distributed in the hope that it will be useful,
Packit Service 1d8f1c
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 1d8f1c
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 1d8f1c
# Lesser General Public License for more details.
Packit Service 1d8f1c
#
Packit Service 1d8f1c
# You should have received a copy of the GNU Lesser General Public
Packit Service 1d8f1c
# License along with this library; if not, write to the Free Software
Packit Service 1d8f1c
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
Packit Service 1d8f1c
# USA
Packit Service 1d8f1c
Packit Service 1d8f1c
__all__ = (
Packit Service 1d8f1c
        "Serializable",
Packit Service 1d8f1c
        "serialize_object",
Packit Service 1d8f1c
        "deserialize_object",
Packit Service 1d8f1c
    )
Packit Service 1d8f1c
Packit Service 1d8f1c
from object import Object
Packit Service 1d8f1c
import dbus
Packit Service 1d8f1c
import gobject
Packit Service 1d8f1c
Packit Service 1d8f1c
__serializable_name_dict = dict()
Packit Service 1d8f1c
Packit Service 1d8f1c
def serializable_register(classobj):
Packit Service 1d8f1c
    # if not issubclass(classobj, Serializable):
Packit Service 1d8f1c
    #     raise "%s is not a sub-class of Serializable" % str(classobj)
Packit Service 1d8f1c
    __serializable_name_dict[classobj.__NAME__] = classobj
Packit Service 1d8f1c
Packit Service 1d8f1c
def serialize_object(o):
Packit Service 1d8f1c
    if isinstance(o, Serializable):
Packit Service 1d8f1c
        l = [o.__NAME__]
Packit Service 1d8f1c
        o.serialize(l)
Packit Service 1d8f1c
        return dbus.Struct(l)
Packit Service 1d8f1c
    else:
Packit Service 1d8f1c
        return o
Packit Service 1d8f1c
Packit Service 1d8f1c
def deserialize_object(v):
Packit Service 1d8f1c
    if isinstance(v, tuple):
Packit Service 1d8f1c
        struct = list(v)
Packit Service 1d8f1c
        type_name = struct.pop(0)
Packit Service 1d8f1c
        type_class = __serializable_name_dict[type_name]
Packit Service 1d8f1c
        o = type_class()
Packit Service 1d8f1c
        o.deserialize (struct)
Packit Service 1d8f1c
        return o
Packit Service 1d8f1c
    return v
Packit Service 1d8f1c
Packit Service 1d8f1c
class SerializableMeta(gobject.GObjectMeta):
Packit Service 1d8f1c
    def __init__(cls, name, bases, dict_):
Packit Service 1d8f1c
        super(SerializableMeta, cls).__init__(name, bases, dict_)
Packit Service 1d8f1c
        if "__NAME__" in cls.__dict__:
Packit Service 1d8f1c
            serializable_register(cls)
Packit Service 1d8f1c
Packit Service 1d8f1c
class Serializable(Object):
Packit Service 1d8f1c
    __metaclass__ = SerializableMeta
Packit Service 1d8f1c
    __gtype_name__ = "PYIBusSerializable"
Packit Service 1d8f1c
    __NAME__ = "IBusSerializable"
Packit Service 1d8f1c
    def __init__(self):
Packit Service 1d8f1c
        super(Serializable, self).__init__()
Packit Service 1d8f1c
        self.__attachments = dict()
Packit Service 1d8f1c
Packit Service 1d8f1c
    def set_attachment(self, name, value):
Packit Service 1d8f1c
        self.__attachments[name] = value
Packit Service 1d8f1c
Packit Service 1d8f1c
    def get_attachment(self, name):
Packit Service 1d8f1c
        return self.__attachments.get(name, None)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def serialize(self, struct):
Packit Service 1d8f1c
        d = dbus.Dictionary(signature="sv")
Packit Service 1d8f1c
        for k, v in self.__attachments.items():
Packit Service 1d8f1c
            d[k] = serialize_object(v)
Packit Service 1d8f1c
        struct.append(d)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def deserialize(self, struct):
Packit Service 1d8f1c
        d = struct.pop(0)
Packit Service 1d8f1c
        self.__attachments = dict()
Packit Service 1d8f1c
        for k, v in d.items():
Packit Service 1d8f1c
            self.__attachments[k] = deserialize_object(v)
Packit Service 1d8f1c
Packit Service 1d8f1c
    def do_destroy(self):
Packit Service 1d8f1c
        self.__attachments = None
Packit Service 1d8f1c
        super(Serializable, self).do_destroy()
Packit Service 1d8f1c
Packit Service 1d8f1c
__serializable_name_dict["IBusSerializable"] = Serializable