Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/services/shell/objecttypeservice.py
blob: c4910f78d74e375d46b793a54c2f4b4aeadac3a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# Copyright (C) 2007, Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

import dbus
import dbus.service
import gnomevfs
import gtk

from gettext import gettext as _

import bundleregistry

_REGISTRY_IFACE = "org.laptop.ObjectTypeRegistry"
_REGISTRY_PATH = "/org/laptop/ObjectTypeRegistry"

class ObjectTypeRegistry(dbus.service.Object):
    def __init__(self):
        bus = dbus.SessionBus()
        bus_name = dbus.service.BusName(_REGISTRY_IFACE, bus=bus)
        dbus.service.Object.__init__(self, bus_name, _REGISTRY_PATH)

        self._types = {}

        self._add_primitive('Text', _('Text'), 'text-x-generic',
                            ['text/plain', 'text/rtf', 'application/pdf',
                              'application/x-pdf', 'text/html',
                              'application/vnd.oasis.opendocument.text',
                              'application/rtf', 'text/rtf'])

        self._add_primitive('Image', _('Image'), 'image-x-generic',
                            ['image/png', 'image/gif', 'image/jpeg'])

        self._add_primitive('Audio', _('Audio'), 'audio-x-generic',
                            ['audio/ogg', 'audio/x-wav', 'audio/wav'])

        self._add_primitive('Video', _('Video'), 'video-x-generic',
                            ['video/ogg', 'application/ogg'])

        self._add_primitive('Etoys project', _('Etoys project'),
                            'application-x-squeak-project',
                            ['application/x-squeak-project'])

        self._add_primitive('Link', _('Link'),
                            'text-uri-list',
                            ['text/x-moz-url', 'text/uri-list'])

        self._activity_registry = bundleregistry.get_registry()
        for bundle in self._activity_registry:
            self._add_activity(self._activity_registry, bundle)
        self._activity_registry.connect('bundle-added', self._add_activity)

    def _add_primitive(self, type_id, name, icon, mime_types):
        object_type = {'type_id': type_id, 
                       'name': name,
                       'icon': icon,
                       'mime_types': mime_types}
        self._types[type_id] = object_type

    def _add_activity(self, activity_registry, bundle):
        mime_types = bundle.get_mime_types()
        if mime_types is None:
            return

        icon_theme = gtk.icon_theme_get_default()
        for mime_type in mime_types:
            if self._get_type_for_mime(mime_type) is not None:
                continue

            name = gnomevfs.mime_get_description(mime_type)
            if name is None:
                continue

            icon = mime_type.replace('/', '-')
            if icon_theme.lookup_icon(icon, gtk.ICON_SIZE_BUTTON, 0) is None:
                continue

            object_type = {'type_id': mime_type, 
                           'name': name,
                           'icon': icon,
                           'mime_types': [mime_type]}
            self._types[mime_type] = object_type

    def _get_type_for_mime(self, mime_type):
        for object_type in self._types.values():
            if mime_type in object_type['mime_types']:
                return object_type
        return None

    @dbus.service.method(_REGISTRY_IFACE,
                         in_signature="s", out_signature="a{sv}")
    def GetType(self, type_id):
        if self._types.has_key(type_id):
            return self._types[type_id]
        else:
            return {}

    @dbus.service.method(_REGISTRY_IFACE,
                         in_signature="s", out_signature="a{sv}")
    def GetTypeForMIME(self, mime_type):
        object_type = self._get_type_for_mime(mime_type)
        if object_type:
            return object_type
        else:
            return {}

_instance = None

def get_instance():
    global _instance
    if not _instance:
        _instance = ObjectTypeRegistry()
    return _instance