Use the new objecttypeservice in place of typeregistry.
This commit is contained in:
parent
0e4efae7ae
commit
d6bf24e456
@ -20,8 +20,7 @@ sugar_PYTHON = \
|
||||
__init__.py \
|
||||
clipboardobject.py \
|
||||
clipboardservice.py \
|
||||
objecttypeservice.py \
|
||||
typeregistry.py
|
||||
objecttypeservice.py
|
||||
|
||||
bin_SCRIPTS = sugar-clipboard
|
||||
|
||||
|
@ -2,7 +2,10 @@ import os
|
||||
import logging
|
||||
import urlparse
|
||||
|
||||
import typeregistry
|
||||
from sugar.objects import mime
|
||||
from sugar import activity
|
||||
|
||||
import objecttypeservice
|
||||
|
||||
class ClipboardObject:
|
||||
|
||||
@ -20,23 +23,57 @@ class ClipboardObject:
|
||||
return self._id
|
||||
|
||||
def _get_type_info(self):
|
||||
type_registry = typeregistry.get_instance()
|
||||
return type_registry.get_type(self._formats)
|
||||
logging.debug('_get_type_info')
|
||||
type_registry = objecttypeservice.get_instance()
|
||||
return type_registry.GetTypeForMIME(self.get_mime_type())
|
||||
|
||||
def get_name(self):
|
||||
if self._name:
|
||||
return self._name
|
||||
else:
|
||||
return self._get_type_info().get_name()
|
||||
type_info = self._get_type_info()
|
||||
if type_info:
|
||||
return type_info['name']
|
||||
else:
|
||||
return ''
|
||||
|
||||
def get_icon(self):
|
||||
return self._get_type_info().get_icon()
|
||||
type_info = self._get_type_info()
|
||||
if type_info:
|
||||
return type_info['icon']
|
||||
else:
|
||||
return ''
|
||||
|
||||
def get_preview(self):
|
||||
return self._get_type_info().get_preview()
|
||||
# TODO: should previews really be here?
|
||||
#return self._get_type_info().get_preview()
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
return self._get_type_info().get_activity()
|
||||
logging.debug('get_activity')
|
||||
mapping = {'text/html' : 'org.laptop.WebActivity',
|
||||
'image/jpeg' : 'org.laptop.WebActivity',
|
||||
'image/gif' : 'org.laptop.WebActivity',
|
||||
'image/png' : 'org.laptop.WebActivity',
|
||||
'text/plain' : 'org.laptop.AbiWordActivity',
|
||||
'text/rtf' : 'org.laptop.AbiWordActivity',
|
||||
'text/richtext' : 'org.laptop.AbiWordActivity'}
|
||||
mime = self.get_mime_type()
|
||||
if not mime:
|
||||
return ''
|
||||
"""
|
||||
registry = activity.get_registry()
|
||||
activities = registry.get_activities_for_type(self.get_mime_type())
|
||||
# TODO: should we return several activities?
|
||||
if activities:
|
||||
return activities[0]
|
||||
else:
|
||||
return ''
|
||||
"""
|
||||
if mapping.has_key(mime):
|
||||
return mapping[mime]
|
||||
else:
|
||||
return ''
|
||||
|
||||
def get_percent(self):
|
||||
return self._percent
|
||||
@ -46,10 +83,36 @@ class ClipboardObject:
|
||||
|
||||
def add_format(self, format):
|
||||
self._formats[format.get_type()] = format
|
||||
# We want to get the activity early in order to prevent a DBus lockup.
|
||||
activity = self.get_activity()
|
||||
|
||||
def get_formats(self):
|
||||
return self._formats
|
||||
|
||||
def get_mime_type(self):
|
||||
logging.debug('Choosing between %r.' % self._formats.keys())
|
||||
if not self._formats:
|
||||
return ''
|
||||
|
||||
if 'text/uri-list' in self._formats.keys():
|
||||
data = self._formats['text/uri-list'].get_data()
|
||||
uris = data.split('\n')
|
||||
# TODO: could we do better when there are several uris?
|
||||
uri = urlparse.urlparse(uris[0], 'file')
|
||||
if uri.scheme == 'file':
|
||||
logging.debug('Choosed %r!' % mime.get_for_file(uri.path))
|
||||
return mime.get_for_file(uri.path)
|
||||
|
||||
for mime_category in ['image/', 'text/', 'application/']:
|
||||
for mime_type in self._formats.keys():
|
||||
if mime_type.startswith(mime_category):
|
||||
mime_type = mime_type.split(';')[0]
|
||||
logging.debug('Choosed %r!' % mime_type)
|
||||
return mime_type
|
||||
|
||||
logging.debug('Returning first: %r.' % self._formats.keys()[0])
|
||||
return self._formats.keys()[0]
|
||||
|
||||
class Format:
|
||||
|
||||
def __init__(self, type, data, on_disk):
|
||||
|
@ -85,6 +85,7 @@ class ClipboardService(dbus.service.Object):
|
||||
@dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
|
||||
in_signature="s", out_signature="o")
|
||||
def add_object(self, name):
|
||||
logging.debug('ClipboardService.add_object')
|
||||
op = self._CLIPBOARD_OBJECTS_PATH + "%d" % self._get_next_object_id()
|
||||
self._objects[op] = ClipboardObject(op, name)
|
||||
self.object_added(dbus.ObjectPath(op), name)
|
||||
@ -94,6 +95,7 @@ class ClipboardService(dbus.service.Object):
|
||||
@dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
|
||||
in_signature="ssayb", out_signature="", byte_arrays=True)
|
||||
def add_object_format(self, object_path, format_type, data, on_disk):
|
||||
logging.debug('ClipboardService.add_object_format')
|
||||
cb_object = self._objects[str(object_path)]
|
||||
cb_object.add_format(Format(format_type, data, on_disk))
|
||||
|
||||
@ -142,6 +144,7 @@ class ClipboardService(dbus.service.Object):
|
||||
@dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
|
||||
in_signature="o", out_signature="a{sv}")
|
||||
def get_object(self, object_path):
|
||||
logging.debug('ClipboardService.get_object')
|
||||
cb_object = self._objects[str(object_path)]
|
||||
formats = cb_object.get_formats()
|
||||
format_types = dbus.Array([], 's')
|
||||
@ -160,6 +163,7 @@ class ClipboardService(dbus.service.Object):
|
||||
@dbus.service.method(_CLIPBOARD_DBUS_INTERFACE,
|
||||
in_signature="os", out_signature="a{sv}")
|
||||
def get_object_data(self, object_path, format_type):
|
||||
logging.debug('ClipboardService.get_object_data')
|
||||
cb_object = self._objects[str(object_path)]
|
||||
format = cb_object.get_formats()[format_type]
|
||||
result_dict = {TYPE_KEY: format.get_type(),
|
||||
@ -180,3 +184,10 @@ class ClipboardService(dbus.service.Object):
|
||||
def object_state_changed(self, object_path, values):
|
||||
pass
|
||||
|
||||
_instance = None
|
||||
|
||||
def get_instance():
|
||||
global _instance
|
||||
if not _instance:
|
||||
_instance = ClipboardService()
|
||||
return _instance
|
||||
|
@ -63,3 +63,11 @@ class ObjectTypeRegistry(dbus.service.Object):
|
||||
return object_type
|
||||
else:
|
||||
return {}
|
||||
|
||||
_instance = None
|
||||
|
||||
def get_instance():
|
||||
global _instance
|
||||
if not _instance:
|
||||
_instance = ObjectTypeRegistry()
|
||||
return _instance
|
||||
|
@ -2,6 +2,7 @@
|
||||
# vi: ts=4 ai noet
|
||||
#
|
||||
# Copyright (C) 2006, Red Hat, Inc.
|
||||
# Copyright (C) 2007, One Laptop Per Child
|
||||
#
|
||||
# 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
|
||||
@ -34,16 +35,16 @@ from sugar import env
|
||||
|
||||
sys.path.append(env.get_service_path('clipboard'))
|
||||
|
||||
from clipboardservice import ClipboardService
|
||||
from objecttypeservice import ObjectTypeRegistry
|
||||
import clipboardservice
|
||||
import objecttypeservice
|
||||
|
||||
logging.info('Starting clipboard service.')
|
||||
|
||||
gobject.threads_init()
|
||||
dbus.glib.threads_init()
|
||||
|
||||
clipboard_service = ClipboardService()
|
||||
object_type_registry = ObjectTypeRegistry()
|
||||
clipboard_service = clipboardservice.get_instance()
|
||||
object_type_registry = objecttypeservice.get_instance()
|
||||
|
||||
loop = gobject.MainLoop()
|
||||
try:
|
||||
|
@ -1,844 +0,0 @@
|
||||
import logging
|
||||
from gettext import gettext as _
|
||||
import urlparse
|
||||
import posixpath
|
||||
|
||||
class FileType:
|
||||
"""Generic base class for all classes representing clipboard item formats.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item
|
||||
format and not a file type per se. Perhaps it should be renamed to
|
||||
ClipboardItemFormat?
|
||||
"""
|
||||
|
||||
def __init__(self, formats):
|
||||
"""Initializer for this class (and all subclasses).
|
||||
|
||||
formats -- A dictionary of key-value pairs where the keys are MIME type
|
||||
strings and the data values are the clipboard data in each
|
||||
respective format. A reference to this dictionary is stored within
|
||||
the object for possible use later.
|
||||
|
||||
This initializer is invoked when the clipboard item format object is
|
||||
instantiated by the TypeRegistry class's get_type method.
|
||||
|
||||
"""
|
||||
self._formats = formats
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
This base-class implementation raises a NotImplementedError exception.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
This base-class implementation raises a NotImplementedError exception.
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
This base-class implementation raises a NotImplementedError exception.
|
||||
|
||||
returns A string containing the item preview.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
This base-class implementation raises a NotImplementedError exception.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This base-class implementation currently raises a
|
||||
NotImplementedError exception, but could (and should) be rewritten to
|
||||
handle this functionality for *all* subclasses, since the code is
|
||||
identical for all or most subclasses anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class TextFileType(FileType):
|
||||
"""Represents the text clipboard item format.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['text/plain', 'UTF8_STRING', 'STRING'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('Text snippet')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
return 'theme:object-text'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
For the text file format, this returns a text string containing up to
|
||||
49 characters of the actual item's text.
|
||||
|
||||
returns A preview string containing up to 49 characters of the item's
|
||||
text.
|
||||
"""
|
||||
for format, data in self._formats.iteritems():
|
||||
if format in TextFileType._types:
|
||||
text = data.get_data()
|
||||
if len(text) < 50:
|
||||
return text
|
||||
else:
|
||||
return text[0:49] + "..."
|
||||
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
return 'org.laptop.AbiWordActivity'
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class ImageFileType(FileType):
|
||||
"""Represents the "image" clipboard item format.
|
||||
|
||||
This clipboard item format represents *any* image format, including JPEG,
|
||||
GIF, PNG and TIFF formats.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['image/jpeg', 'image/gif', 'image/png', 'image/tiff'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('Image')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
return 'theme:object-image'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
XXX Currently returns an empty string.
|
||||
|
||||
returns A string containing the item preview.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class UriFileType(FileType):
|
||||
"""Represents the URI clipboard item format.
|
||||
|
||||
Not to be confused with the multiple-URI UriListFileType class.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['_NETSCAPE_URL'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('Web Page')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
return 'theme:object-link'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
For the URI clipboard item format, this is the URI itself.
|
||||
|
||||
returns A string containing the item preview, in this case the URI itself.
|
||||
"""
|
||||
for format, data in self._formats.iteritems():
|
||||
if format in UriFileType._types:
|
||||
string = data.get_data()
|
||||
title = string.split("\n")[1]
|
||||
return title
|
||||
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class PdfFileType(FileType):
|
||||
"""Represents the PDF clipboard item format.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['application/pdf', 'application/x-pdf'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('PDF file')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
return 'theme:object-text'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
XXX Currently returns an empty string.
|
||||
|
||||
returns A string containing the item preview.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
return 'org.laptop.sugar.Xbook'
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class MsWordFileType(FileType):
|
||||
"""Represents the MS Word clipboard item format (*cringe*).
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['application/msword'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('MS Word file')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
return 'theme:object-text'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
XXX Currently returns an empty string.
|
||||
|
||||
returns A string containing the item preview.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
return 'org.laptop.AbiWordActivity'
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class RtfFileType(TextFileType):
|
||||
"""Represents the RTF clipboard item format (a subclass of TextFileType).
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['application/rtf', 'text/rtf'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('RTF file')
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class AbiwordFileType(TextFileType):
|
||||
"""Represents the AbiWord clipboard item format.
|
||||
|
||||
(XXX This class's name is misleading; it represents a clipboard item format,
|
||||
not a file type per se.)
|
||||
(XXX AbiWord format is a full word processing format, like the OO Text and MS Word
|
||||
formats, and should not be a subclass of TextFileType! Otherwise the OO Text and
|
||||
MS Word format types should also be made subclasses of TextFileType.)
|
||||
"""
|
||||
|
||||
_types = set(['application/x-abiword'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('Abiword file')
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class SqueakProjectFileType(FileType):
|
||||
"""Represents the Squeak Project clipboard item format.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['application/x-squeak-project'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('Squeak project')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
return 'theme:object-squeak-project'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
XXX Currently returns an empty string.
|
||||
|
||||
returns A string containing the item preview.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
return 'org.vpri.EtoysActivity'
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class OOTextFileType(FileType):
|
||||
"""Represents the OpenDocument Text (OpenOffice.org Writer) clipboard item format.
|
||||
|
||||
Note to the uninitiated: OpenDocument Text is a full word processing format,
|
||||
not a simple text file.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['application/vnd.oasis.opendocument.text'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('OpenOffice text file')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
return 'theme:object-text'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
XXX Currently returns an empty string.
|
||||
|
||||
returns A string containing the item preview.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
return 'org.laptop.AbiWordActivity'
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class UriListFileType(FileType):
|
||||
"""Represents the URI-list clipboard item format.
|
||||
|
||||
Not to be confused with the single-URI UriFileType class.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['text/uri-list'])
|
||||
|
||||
def _is_image(self):
|
||||
"""Determines whether this URI list represents an image.
|
||||
|
||||
Called by the get_name and get_icon methods. For this URI list to be
|
||||
considered to represent an image, it must fulfil two criteria: (1) it
|
||||
must have only one URI in it, and (2) the URI must end with an extension
|
||||
indicating an image type (currently ".jpg", ".jpeg", ".gif", ".png", or
|
||||
".svg").
|
||||
|
||||
returns True if there is one URI in the list and it represents an image,
|
||||
False otherwise.
|
||||
"""
|
||||
uris = self._formats['text/uri-list'].get_data().split('\n')
|
||||
if len(uris) == 1:
|
||||
uri = urlparse.urlparse(uris[0])
|
||||
ext = posixpath.splitext(uri[2])[1]
|
||||
# FIXME: Bad hack, the type registry should treat text/uri-list as a special case.
|
||||
if ext in ['.jpg', '.jpeg', '.gif', '.png', '.svg']:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
if self._is_image():
|
||||
return _('Image')
|
||||
else:
|
||||
return _('File')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
if self._is_image():
|
||||
return 'theme:object-image'
|
||||
else:
|
||||
return 'theme:stock-missing'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
XXX Currently returns an empty string.
|
||||
|
||||
returns A string containing the item preview.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class XoFileType(FileType):
|
||||
"""Represents the "xo" (OLPC package) clipboard item format.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
|
||||
_types = set(['application/vnd.olpc-x-sugar'])
|
||||
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('Activity package')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
return 'theme:stock-missing'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns an appropriate preview of the clipboard item data for this item format.
|
||||
|
||||
XXX Currently returns an empty string.
|
||||
|
||||
returns A string containing the item preview.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
returns A string containing the activity identifier.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
XXX This subclass method is unnecessary; a single base class method
|
||||
in the FileType class would be sufficient to handle all or most
|
||||
subclasses, since the code is identical for all or most subclasses
|
||||
anyway.
|
||||
|
||||
returns True if this class handles the given MIME type, False otherwise.
|
||||
"""
|
||||
return mime_type in cls._types
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class UnknownFileType(FileType):
|
||||
"""Represents an unknown clipboard item format.
|
||||
|
||||
XXX This class's name is misleading; it represents a clipboard item format
|
||||
and not a file type per se.
|
||||
"""
|
||||
def get_name(self):
|
||||
"""Returns a localized human-readable name for this clipboard item format.
|
||||
|
||||
Since this clipboard item format is unknown, the format name will be
|
||||
simply "Object" or something to that effect.
|
||||
|
||||
returns A localized string containing the clipboard item format name.
|
||||
"""
|
||||
return _('Object')
|
||||
|
||||
def get_icon(self):
|
||||
"""XXX Returns a "tag" to be used to get an icon for this clipboard item format (I think).
|
||||
|
||||
returns XXX A string "tag" to be used to get the icon for this clipboard
|
||||
item format (I think).
|
||||
"""
|
||||
return 'theme:stock-missing'
|
||||
|
||||
def get_preview(self):
|
||||
"""Returns a "preview" for this clipboard item format.
|
||||
|
||||
Since this clipboard item format is unknown, there can be no preview for
|
||||
it, so the "preview" will be an empty string.
|
||||
|
||||
returns An empty string, since there can be no preview for an unknown
|
||||
clipboard item format.
|
||||
"""
|
||||
return ''
|
||||
|
||||
def get_activity(self):
|
||||
"""Returns the activity identifier associated with this clipboard item format.
|
||||
|
||||
Since this clipboard item format is unknown, there can be no activity
|
||||
associated with it, so the activity identifier will be an empty string.
|
||||
|
||||
returns A string containing the activity identifier (an empty string in
|
||||
this case).
|
||||
"""
|
||||
return ''
|
||||
|
||||
def matches_mime_type(cls, mime_type):
|
||||
"""Class method to determine whether this class handles a given MIME type.
|
||||
|
||||
mime_type -- A string containing the MIME type.
|
||||
|
||||
Always returns true, since UnknownFileType is the clipboard item format
|
||||
class of last resort and must be used if no other class handles the
|
||||
given MIME type.
|
||||
|
||||
returns True if this class handles the given MIME type (always true in
|
||||
this case).
|
||||
"""
|
||||
return true
|
||||
|
||||
matches_mime_type = classmethod(matches_mime_type)
|
||||
|
||||
|
||||
class TypeRegistry:
|
||||
"""Represents a registry of all clipboard item formats.
|
||||
|
||||
There will be one single global instantiation of this object, accessible via
|
||||
the global typeregistry.get_instance method.
|
||||
"""
|
||||
def __init__(self):
|
||||
"""Initializes the registry.
|
||||
"""
|
||||
self._types = []
|
||||
self._types.append(PdfFileType)
|
||||
self._types.append(MsWordFileType)
|
||||
self._types.append(RtfFileType)
|
||||
self._types.append(OOTextFileType)
|
||||
self._types.append(UriListFileType)
|
||||
self._types.append(UriFileType)
|
||||
self._types.append(ImageFileType)
|
||||
self._types.append(AbiwordFileType)
|
||||
self._types.append(TextFileType)
|
||||
self._types.append(SqueakProjectFileType)
|
||||
self._types.append(XoFileType)
|
||||
|
||||
def get_type(self, formats):
|
||||
"""Returns a matching clipboard item format object for the passed-in clipboard data.
|
||||
|
||||
formats -- A dictionary of key-value pairs where the keys are MIME type
|
||||
strings and the data values are the clipboard data in each
|
||||
respective format.
|
||||
|
||||
A reference to the given clipboard data format dictionary is stored
|
||||
within the returned object for possible use later.
|
||||
|
||||
XXX The order of the clipboard item formats in the TypeRegistry object's
|
||||
internal list matters. For example, if clipboard item data is available
|
||||
in both MS Word and OO Text formats, the MS Word type will currently be
|
||||
matched first, and therefore an MsWordFileType object will be returned.
|
||||
Is this really what is desired? The ordering should definitely be given
|
||||
some thought.
|
||||
|
||||
returns A clipboard item format object of a type matching one of the
|
||||
MIME type keys in the formats dictionary, or an UnknownFileType
|
||||
object if none of the other types is appropriate.
|
||||
"""
|
||||
for file_type in self._types:
|
||||
for format, data in formats.iteritems():
|
||||
if file_type.matches_mime_type(format):
|
||||
return file_type(formats)
|
||||
|
||||
return UnknownFileType(formats)
|
||||
|
||||
_type_registry = None
|
||||
def get_instance():
|
||||
"""Returns the global clipboard item format registry object (global method).
|
||||
|
||||
Returns a reference to the global clipboard item format registry object,
|
||||
instantiating it first if necessary.
|
||||
|
||||
returns A TypeRegistry object representing the global clipboard item format
|
||||
registry.
|
||||
"""
|
||||
global _type_registry
|
||||
if not _type_registry:
|
||||
_type_registry = TypeRegistry()
|
||||
return _type_registry
|
Loading…
Reference in New Issue
Block a user