Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/sugar/activity/activity.py3
-rw-r--r--src/sugar/activity/activityfactory.py3
-rw-r--r--src/sugar/datastore/datastore.py46
-rw-r--r--src/sugar/graphics/palette.py2
-rw-r--r--src/sugar/profile.py6
5 files changed, 54 insertions, 6 deletions
diff --git a/src/sugar/activity/activity.py b/src/sugar/activity/activity.py
index 9043a3c..c948bda 100644
--- a/src/sugar/activity/activity.py
+++ b/src/sugar/activity/activity.py
@@ -984,7 +984,8 @@ class Activity(Window, gtk.Container):
if not self.can_close():
return
- if skip_save or self.metadata.get('title_set_by_user', '0') == '1':
+ if skip_save or self._jobject is None or \
+ self.metadata.get('title_set_by_user', '0') == '1':
if not self._closing:
if not self._prepare_close(skip_save):
return
diff --git a/src/sugar/activity/activityfactory.py b/src/sugar/activity/activityfactory.py
index e218a7c..2a6e4a9 100644
--- a/src/sugar/activity/activityfactory.py
+++ b/src/sugar/activity/activityfactory.py
@@ -153,8 +153,7 @@ def open_log_file(activity):
while True:
path = env.get_logs_path('%s-%s.log' % (activity.get_bundle_id(), i))
try:
- fd = os.open(path, os.O_EXCL | os.O_CREAT \
- | os.O_SYNC | os.O_WRONLY, 0644)
+ fd = os.open(path, os.O_EXCL | os.O_CREAT | os.O_WRONLY, 0644)
f = os.fdopen(fd, 'w', 0)
return (path, f)
except OSError, e:
diff --git a/src/sugar/datastore/datastore.py b/src/sugar/datastore/datastore.py
index d174bd4..6ff10de 100644
--- a/src/sugar/datastore/datastore.py
+++ b/src/sugar/datastore/datastore.py
@@ -27,11 +27,29 @@ import tempfile
import gobject
import gconf
import gio
+import dbus
from sugar import env
from sugar.datastore import dbus_helpers
from sugar import mime
+DS_DBUS_SERVICE = "org.laptop.sugar.DataStore"
+DS_DBUS_INTERFACE = "org.laptop.sugar.DataStore"
+DS_DBUS_PATH = "/org/laptop/sugar/DataStore"
+
+_data_store = None
+
+def _get_data_store():
+ global _data_store
+
+ if not _data_store:
+ _bus = dbus.SessionBus()
+ _data_store = dbus.Interface(_bus.get_object(DS_DBUS_SERVICE,
+ DS_DBUS_PATH),
+ DS_DBUS_INTERFACE)
+ return _data_store
+
+
class DSMetadata(gobject.GObject):
__gsignals__ = {
'updated': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
@@ -83,13 +101,39 @@ class DSMetadata(gobject.GObject):
else:
return default
+ def update(self, properties):
+ """Update all of the metadata"""
+ for (key, value) in properties.items():
+ self[key] = value
+
+
class DSObject(object):
def __init__(self, object_id, metadata=None, file_path=None):
- self.object_id = object_id
+ self.set_object_id(object_id)
self._metadata = metadata
self._file_path = file_path
self._destroyed = False
self._owns_file = False
+ self._update_signal_match = None
+
+ def get_object_id(self):
+ return self._object_id
+
+ def set_object_id(self, object_id):
+ if object_id is not None:
+ if self._update_signal_match is not None:
+ self._update_signal_match.remove()
+ self._update_signal_match = _get_data_store().connect_to_signal( \
+ 'Updated', self.__object_updated_cb, arg0=object_id)
+
+ self._object_id = object_id
+
+ object_id = property(get_object_id, set_object_id)
+
+ def __object_updated_cb(self, object_id):
+ properties = _get_data_store().get_properties(self.object_id,
+ byte_arrays=True)
+ self._metadata.update(properties)
def get_metadata(self):
if self._metadata is None and not self.object_id is None:
diff --git a/src/sugar/graphics/palette.py b/src/sugar/graphics/palette.py
index 1c668b6..9867ebc 100644
--- a/src/sugar/graphics/palette.py
+++ b/src/sugar/graphics/palette.py
@@ -654,7 +654,7 @@ class Palette(gtk.Window):
def __hide_cb(self, widget):
logging.debug('__hide_cb')
self.menu.set_active(False)
-
+ self.menu.cancel()
self._secondary_anim.stop()
if self._invoker:
diff --git a/src/sugar/profile.py b/src/sugar/profile.py
index d5012bd..df9237e 100644
--- a/src/sugar/profile.py
+++ b/src/sugar/profile.py
@@ -97,14 +97,18 @@ class Profile(object):
return None
key = ""
+ begin_found = False
+ end_found = False
for l in lines:
l = l.strip()
if l.startswith("-----BEGIN DSA PRIVATE KEY-----"):
+ begin_found = True
continue
if l.startswith("-----END DSA PRIVATE KEY-----"):
+ end_found = True
continue
key += l
- if not len(key):
+ if not (len(key) and begin_found and end_found):
logging.error("Error parsing public key.")
return None