Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar
diff options
context:
space:
mode:
authorSimon Schampijer <simon@schampijer.de>2007-10-15 17:04:05 (GMT)
committer Simon Schampijer <simon@schampijer.de>2007-10-15 17:04:05 (GMT)
commit33143f4e0e5c69623d69c8301179e5fed3976cea (patch)
tree1568084c2594439e11a023048483e0d2ac486831 /sugar
parent1ee7191b5dc40a345742766f0125d33609762ca9 (diff)
parenta9a9b4c73346dcbccd2fb218e1a6c19077672f5c (diff)
Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar
Diffstat (limited to 'sugar')
-rw-r--r--sugar/Makefile.am32
-rw-r--r--sugar/__init__.py25
-rw-r--r--sugar/_sugarext.defs41
-rw-r--r--sugar/_sugarext.override32
-rw-r--r--sugar/_sugarextmodule.c42
-rw-r--r--sugar/activity/activity.py10
-rw-r--r--sugar/datastore/datastore.py2
-rw-r--r--sugar/logger.py52
-rw-r--r--sugar/objects/Makefile.am1
-rw-r--r--sugar/objects/__init__.py2
-rw-r--r--sugar/objects/mime.py120
-rw-r--r--sugar/presence/activity.py48
12 files changed, 47 insertions, 360 deletions
diff --git a/sugar/Makefile.am b/sugar/Makefile.am
index 72ddb1b..d54ea93 100644
--- a/sugar/Makefile.am
+++ b/sugar/Makefile.am
@@ -2,9 +2,7 @@ SUBDIRS = activity bundle clipboard graphics objects presence datastore
sugardir = $(pythondir)/sugar
sugar_PYTHON = \
- __init__.py \
env.py \
- logger.py \
ltihooks.py \
network.py \
profile.py \
@@ -13,37 +11,19 @@ sugar_PYTHON = \
pkgpyexecdir = $(pythondir)/sugar
-pkgpyexec_LTLIBRARIES = _sugarext.la _sugaruiext.la
-
-_sugarext_la_CFLAGS = \
- $(LIB_CFLAGS) \
- $(LIB_BINDINGS_CFLAGS) \
- $(PYTHON_INCLUDES) \
- -I$(top_srcdir)/lib
-
-_sugarext_la_LDFLAGS = -module -avoid-version
-_sugarext_la_LIBADD = \
- $(LIB_BINDINGS_LIBS) \
- $(top_builddir)/lib/libsugar.la
-
-_sugarext_la_SOURCES = \
- _sugarextmodule.c
-
-nodist__sugarext_la_SOURCES = _sugarext.c
-
-_sugarext.c: _sugarext.defs _sugarext.override
+pkgpyexec_LTLIBRARIES = _sugaruiext.la
_sugaruiext_la_CFLAGS = \
$(LIBUI_CFLAGS) \
$(LIBUI_BINDINGS_CFLAGS) \
$(PYTHON_INCLUDES) \
- -I$(top_srcdir)/lib/ui
+ -I$(top_srcdir)/lib
_sugaruiext_la_LDFLAGS = -module -avoid-version
_sugaruiext_la_LIBADD = \
$(LIBUI_BINDINGS_LIBS) \
$(LIBUI_LIBS) \
- $(top_builddir)/lib/ui/libsugarui.la
+ $(top_builddir)/lib/libsugarui.la
_sugaruiext_la_SOURCES = \
_sugaruiextmodule.c
@@ -52,13 +32,9 @@ nodist__sugaruiext_la_SOURCES = _sugaruiext.c
_sugaruiext.c: _sugaruiext.defs _sugaruiext.override
-CLEANFILES = \
- _sugarext.c \
- _sugaruiext.c
+CLEANFILES = _sugaruiext.c
EXTRA_DIST = \
- _sugarext.override \
- _sugarext.defs \
_sugaruiext.defs \
_sugaruiext.override
diff --git a/sugar/__init__.py b/sugar/__init__.py
deleted file mode 100644
index 995341d..0000000
--- a/sugar/__init__.py
+++ /dev/null
@@ -1,25 +0,0 @@
-"""OLPC Sugar User Interface"""
-
-# Copyright (C) 2006-2007, Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import os
-
-from sugar import ltihooks
-
-if os.path.isfile(os.path.join(os.path.dirname(__file__), 'Makefile.am')):
- ltihooks.install()
diff --git a/sugar/_sugarext.defs b/sugar/_sugarext.defs
deleted file mode 100644
index d97f8b4..0000000
--- a/sugar/_sugarext.defs
+++ /dev/null
@@ -1,41 +0,0 @@
-; functions
-
-(define-function get_mime_type_from_file_name
- (c-name "sugar_mime_get_mime_type_from_file_name")
- (return-type "const-char*")
- (parameters
- '("const-char*" "filename")
- )
-)
-
-(define-function get_mime_type_for_file
- (c-name "sugar_mime_get_mime_type_for_file")
- (return-type "const-char*")
- (parameters
- '("const-char*" "filename")
- )
-)
-
-(define-function get_prgname
- (c-name "g_get_prgname")
- (return-type "const-char*")
-)
-
-(define-function get_application_name
- (c-name "g_get_application_name")
- (return-type "const-char*")
-)
-
-(define-function set_prgname
- (c-name "g_set_prgname")
- (parameters
- '("const-char*" "name")
- )
-)
-
-(define-function set_application_name
- (c-name "g_set_application_name")
- (parameters
- '("const-char*" "name")
- )
-)
diff --git a/sugar/_sugarext.override b/sugar/_sugarext.override
deleted file mode 100644
index 9fe9826..0000000
--- a/sugar/_sugarext.override
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4 -*- */
-%%
-headers
-#include <Python.h>
-#include "xdgmime.h"
-#include <glib.h>
-%%
-modulename _sugarext
-%%
-ignore-glob
- *_get_type
- _*
-%%
-override sugar_mime_get_mime_type_for_file kwargs
-static PyObject *
-_wrap_sugar_mime_get_mime_type_for_file(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "filename", NULL };
- char *filename;
- const gchar *ret;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs,"s:get_mime_type_for_file", kwlist, &filename))
- return NULL;
-
- ret = sugar_mime_get_mime_type_for_file(filename, NULL);
-
- if (ret)
- return PyString_FromString(ret);
- Py_INCREF(Py_None);
- return Py_None;
-}
-%%
diff --git a/sugar/_sugarextmodule.c b/sugar/_sugarextmodule.c
deleted file mode 100644
index 41d21bd..0000000
--- a/sugar/_sugarextmodule.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2006-2007, Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* include this first, before NO_IMPORT_PYGOBJECT is defined */
-#include <pygobject.h>
-
-extern PyMethodDef py_sugarext_functions[];
-
-DL_EXPORT(void)
-init_sugarext(void)
-{
- PyObject *m, *d;
-
- init_pygobject ();
-
- m = Py_InitModule ("_sugarext", py_sugarext_functions);
- d = PyModule_GetDict (m);
-
- if (PyErr_Occurred ()) {
- Py_FatalError ("can't initialise module _sugarext");
- }
-}
diff --git a/sugar/activity/activity.py b/sugar/activity/activity.py
index a7ae905..e659be0 100644
--- a/sugar/activity/activity.py
+++ b/sugar/activity/activity.py
@@ -42,7 +42,7 @@ from sugar.graphics.toolcombobox import ToolComboBox
from sugar.datastore import datastore
from sugar import wm
from sugar import profile
-from sugar import _sugarext
+from sugar import _sugarbaseext
SCOPE_PRIVATE = "private"
SCOPE_INVITE_ONLY = "invite" # shouldn't be shown in UI, it's implicit when you invite somebody
@@ -261,6 +261,7 @@ class Activity(Window, gtk.Container):
self.connect('realize', self._realize_cb)
self.connect('delete-event', self._delete_event_cb)
+ self.connect('window-state-event', self._window_state_event_cb)
self._active = False
self._activity_id = handle.activity_id
@@ -344,6 +345,9 @@ class Activity(Window, gtk.Container):
else:
logging.debug("Unknown share scope %r" % share_scope)
+ def _window_state_event_cb(self, window, event):
+ logging.info(event.new_window_state)
+
def do_set_property(self, pspec, value):
if pspec.name == 'active':
if self._active != value:
@@ -363,7 +367,7 @@ class Activity(Window, gtk.Container):
return self._activity_id
def get_bundle_id(self):
- return _sugarext.get_prgname()
+ return _sugarbaseext.get_prgname()
def set_canvas(self, canvas):
Window.set_canvas(self, canvas)
@@ -634,7 +638,7 @@ class Activity(Window, gtk.Container):
def get_bundle_name():
"""Return the bundle name for the current process' bundle
"""
- return _sugarext.get_application_name()
+ return _sugarbaseext.get_application_name()
def get_bundle_path():
"""Return the bundle path for the current process' bundle
diff --git a/sugar/datastore/datastore.py b/sugar/datastore/datastore.py
index 7c57414..a865c30 100644
--- a/sugar/datastore/datastore.py
+++ b/sugar/datastore/datastore.py
@@ -28,7 +28,7 @@ from sugar.activity.activityhandle import ActivityHandle
from sugar.bundle.contentbundle import ContentBundle
from sugar.bundle.activitybundle import ActivityBundle
from sugar.bundle.contentbundle import ContentBundle
-from sugar.objects import mime
+from sugar import mime
class DSMetadata(gobject.GObject):
__gsignals__ = {
diff --git a/sugar/logger.py b/sugar/logger.py
deleted file mode 100644
index d1c9080..0000000
--- a/sugar/logger.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright (C) 2007 Red Hat, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import sys
-import os
-import logging
-import time
-
-# Let's keep this self contained so that it can be easily
-# pasted in external sugar service like the datastore.
-
-def get_logs_dir():
- profile = os.environ.get('SUGAR_PROFILE', 'default')
- logs_dir = os.path.join(os.path.expanduser('~'),
- '.sugar', profile, 'logs')
- return logs_dir
-
-def set_level(level):
- levels = { 'error' : logging.ERROR,
- 'warning' : logging.WARNING,
- 'debug' : logging.DEBUG,
- 'info' : logging.INFO }
- if levels.has_key(level):
- logging.getLogger('').setLevel(levels[level])
-
-def start(log_filename=None):
- logging.basicConfig(level=logging.WARNING,
- format="%(created)f %(levelname)s %(message)s")
-
- if os.environ.has_key('SUGAR_LOGGER_LEVEL'):
- set_level(os.environ['SUGAR_LOGGER_LEVEL'])
-
- if log_filename and not sys.stdin.isatty():
- log_path = os.path.join(get_logs_dir(), log_filename + '.log')
- log_file = open(log_path, 'w')
-
- os.dup2(log_file.fileno(), sys.stdout.fileno())
- os.dup2(log_file.fileno(), sys.stderr.fileno())
diff --git a/sugar/objects/Makefile.am b/sugar/objects/Makefile.am
index fedb749..0f89830 100644
--- a/sugar/objects/Makefile.am
+++ b/sugar/objects/Makefile.am
@@ -1,6 +1,5 @@
sugardir = $(pythondir)/sugar/objects
sugar_PYTHON = \
__init__.py \
- mime.py \
objecttype.py
diff --git a/sugar/objects/__init__.py b/sugar/objects/__init__.py
index 14e93d4..85ebced 100644
--- a/sugar/objects/__init__.py
+++ b/sugar/objects/__init__.py
@@ -14,5 +14,3 @@
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
-
-from sugar.objects import mime
diff --git a/sugar/objects/mime.py b/sugar/objects/mime.py
deleted file mode 100644
index 62a6f53..0000000
--- a/sugar/objects/mime.py
+++ /dev/null
@@ -1,120 +0,0 @@
-# Copyright (C) 2006-2007, Red Hat, Inc.
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import logging
-
-from sugar import _sugarext
-
-def get_for_file(file_name):
- mime_type = _sugarext.get_mime_type_for_file(file_name)
- if mime_type == 'application/octet-stream':
- if _file_looks_like_text(file_name):
- return 'text/plain'
- else:
- return 'application/octet-stream'
- return mime_type
-
-def get_from_file_name(file_name):
- return _sugarext.get_mime_type_from_file_name(file_name)
-
-_extensions_cache = {}
-def get_primary_extension(mime_type):
- if _extensions_cache.has_key(mime_type):
- return _extensions_cache[mime_type]
-
- f = open('/etc/mime.types')
- while True:
- line = f.readline()
- if not line:
- break
- cols = line.replace('\t', ' ').split(' ')
- if mime_type == cols[0]:
- for col in cols[1:]:
- if col:
- col = col.replace('\n', '')
- _extensions_cache[mime_type] = col
- return col
-
- _extensions_cache[mime_type] = None
- return None
-
-def choose_most_significant(mime_types):
- logging.debug('Choosing between %r.' % mime_types)
- if not mime_types:
- return ''
-
- if 'text/uri-list' in mime_types:
- return 'text/uri-list'
-
- for mime_category in ['image/', 'application/']:
- for mime_type in mime_types:
-
- if mime_type.startswith(mime_category):
- # skip mozilla private types (second component starts with '_'
- # or ends with '-priv')
- if mime_type.split('/')[1].startswith('_') or \
- mime_type.split('/')[1].endswith('-priv'):
- continue
-
- # take out the specifier after ';' that mozilla likes to add
- mime_type = mime_type.split(';')[0]
- logging.debug('Choosed %r!' % mime_type)
- return mime_type
-
- if 'text/x-moz-url' in mime_types:
- logging.debug('Choosed text/x-moz-url!')
- return 'text/x-moz-url'
-
- if 'text/html' in mime_types:
- logging.debug('Choosed text/html!')
- return 'text/html'
-
- if 'text/plain' in mime_types:
- logging.debug('Choosed text/plain!')
- return 'text/plain'
-
- logging.debug('Returning first: %r.' % mime_types[0])
- return mime_types[0]
-
-def split_uri_list(uri_list):
- result = []
-
- splitted = uri_list.split('\n')
- for uri in splitted:
- result.append(uri.strip())
-
- return result
-
-def _file_looks_like_text(file_name):
- f = open(file_name, 'r')
- try:
- sample = f.read(256)
- finally:
- f.close()
-
- if '\000' in sample:
- return False
-
- for encoding in ('ascii', 'latin_1', 'utf_8', 'utf_16'):
- try:
- string = unicode(sample, encoding)
- return True
- except Exception, e:
- pass
-
- return False
diff --git a/sugar/presence/activity.py b/sugar/presence/activity.py
index c4c0a47..c37b63a 100644
--- a/sugar/presence/activity.py
+++ b/sugar/presence/activity.py
@@ -26,9 +26,8 @@ _logger = logging.getLogger('sugar.presence.activity')
class Activity(gobject.GObject):
"""UI interface for an Activity in the presence service
- Activities in the presence service represent other user's
- shared activities and your own activities (XXX shared or
- otherwise?)
+ Activities in the presence service represent your and other user's
+ shared activities.
Properties:
id
@@ -69,8 +68,10 @@ class Activity(gobject.GObject):
self._ps_del_object = del_obj_cb
bobj = bus.get_object(self._PRESENCE_SERVICE, object_path)
self._activity = dbus.Interface(bobj, self._ACTIVITY_DBUS_INTERFACE)
- self._activity.connect_to_signal('BuddyJoined', self._buddy_joined_cb)
- self._activity.connect_to_signal('BuddyLeft', self._buddy_left_cb)
+ self._activity.connect_to_signal('BuddyHandleJoined',
+ self._buddy_handle_joined_cb)
+ self._activity.connect_to_signal('BuddyLeft',
+ self._buddy_left_cb)
self._activity.connect_to_signal('NewChannel', self._new_channel_cb)
self._activity.connect_to_signal('PropertiesChanged',
self._properties_changed_cb,
@@ -90,6 +91,9 @@ class Activity(gobject.GObject):
self._tags = None
self._private = True
self._joined = False
+ # Cache for get_buddy_by_handle, maps handles to buddy object paths
+ self._handle_to_buddy_path = {}
+ self._buddy_path_to_handle = {}
def _get_properties_reply_cb(self, new_props):
self._properties_changed_cb(new_props)
@@ -178,8 +182,10 @@ class Activity(gobject.GObject):
self.emit('buddy-joined', self._ps_new_object(object_path))
return False
- def _buddy_joined_cb(self, object_path):
+ def _buddy_handle_joined_cb(self, object_path, handle):
gobject.idle_add(self._emit_buddy_joined_signal, object_path)
+ self._handle_to_buddy_path[handle] = object_path
+ self._buddy_path_to_handle[object_path] = handle
def _emit_buddy_left_signal(self, object_path):
"""Generate buddy-left GObject signal with presence Buddy object
@@ -191,6 +197,8 @@ class Activity(gobject.GObject):
def _buddy_left_cb(self, object_path):
gobject.idle_add(self._emit_buddy_left_signal, object_path)
+ handle = self._buddy_path_to_handle.pop(object_path)
+ self._handle_to_buddy_path.pop(handle, None)
def _emit_new_channel_signal(self, object_path):
"""Generate new-channel GObject signal with channel object path
@@ -214,6 +222,18 @@ class Activity(gobject.GObject):
buddies.append(self._ps_new_object(item))
return buddies
+ def get_buddy_by_handle(self, handle):
+ """Retrieve the Buddy object given a telepathy handle.
+
+ buddy object paths are cached in self._handle_to_buddy_path,
+ so we can get the buddy without calling PS.
+ """
+ object_path = self._handle_to_buddy_path.get(handle, None)
+ if object_path:
+ buddy = self._ps_new_object(object_path)
+ return buddy
+ return None
+
def invite(self, buddy, message, response_cb):
"""Invite the given buddy to join this activity.
@@ -244,9 +264,13 @@ class Activity(gobject.GObject):
def get_channels(self):
"""Retrieve communications channel descriptions for the activity
- Returns (bus name, connection, channels) for the activity
-
- XXX what are those values?
+ Returns a tuple containing:
+ - the D-Bus well-known service name of the connection
+ (FIXME: this is redundant; in Telepathy it can be derived
+ from that of the connection)
+ - the D-Bus object path of the connection
+ - a list of D-Bus object paths representing the channels
+ associated with this activity
"""
(bus_name, connection, channels) = self._activity.GetChannels()
return bus_name, connection, channels
@@ -256,10 +280,8 @@ class Activity(gobject.GObject):
self.emit("joined", False, "left activity")
def _leave_error_cb(self, err):
- """Callback for error in async leaving of shared activity.
-
- XXX Add logging!"""
- pass
+ """Callback for error in async leaving of shared activity."""
+ _logger.debug('Failed to leave activity: %s', err)
def leave(self):
"""Leave this shared activity"""