From 1c3e62f35bf9527df9f0a218bd85272644fa4fdb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 1 Sep 2012 14:51:52 +0530 Subject: [PATCH] MTP: Try to get modified date from the device --- src/calibre/devices/mtp/filesystem_cache.py | 10 +++++++++- src/calibre/devices/mtp/unix/libmtp.c | 3 ++- .../devices/mtp/windows/content_enumeration.cpp | 13 +++++++++++++ src/calibre/devices/mtp/windows/driver.py | 4 +++- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/calibre/devices/mtp/filesystem_cache.py b/src/calibre/devices/mtp/filesystem_cache.py index ba2206d191..e4ef8ae898 100644 --- a/src/calibre/devices/mtp/filesystem_cache.py +++ b/src/calibre/devices/mtp/filesystem_cache.py @@ -11,8 +11,10 @@ import weakref, sys from collections import deque from operator import attrgetter from future_builtins import map +from datetime import datetime from calibre import human_readable, prints, force_unicode +from calibre.utils.date import local_tz from calibre.utils.icu import sort_key, lower from calibre.ebooks import BOOK_EXTENSIONS @@ -21,6 +23,8 @@ bexts = frozenset(BOOK_EXTENSIONS) class FileOrFolder(object): def __init__(self, entry, fs_cache): + self.all_storage_ids = fs_cache.all_storage_ids + self.object_id = entry['id'] self.is_folder = entry['is_folder'] self.storage_id = entry['storage_id'] @@ -31,7 +35,11 @@ class FileOrFolder(object): self.name = force_unicode(n, 'utf-8') self.persistent_id = entry.get('persistent_id', self.object_id) self.size = entry.get('size', 0) - self.all_storage_ids = fs_cache.all_storage_ids + md = entry.get('modified', 0) + try: + self.last_modified = datetime.fromtimestamp(md, local_tz) + except: + self.last_modified = datetime.fromtimestamp(0, local_tz) if self.storage_id not in self.all_storage_ids: raise ValueError('Storage id %s not valid for %s, valid values: %s'%(self.storage_id, diff --git a/src/calibre/devices/mtp/unix/libmtp.c b/src/calibre/devices/mtp/unix/libmtp.c index 86c9349d20..bf07c73a35 100644 --- a/src/calibre/devices/mtp/unix/libmtp.c +++ b/src/calibre/devices/mtp/unix/libmtp.c @@ -121,12 +121,13 @@ static uint16_t data_from_python(void *params, void *priv, uint32_t wantlen, uns static PyObject* build_file_metadata(LIBMTP_file_t *nf, uint32_t storage_id) { PyObject *ans = NULL; - ans = Py_BuildValue("{s:s, s:k, s:k, s:k, s:K, s:O}", + ans = Py_BuildValue("{s:s, s:k, s:k, s:k, s:K, s:L, s:O}", "name", (unsigned long)nf->filename, "id", (unsigned long)nf->item_id, "parent_id", (unsigned long)nf->parent_id, "storage_id", (unsigned long)storage_id, "size", nf->filesize, + "modified", (PY_LONG_LONG)nf->modificationdate, "is_folder", (nf->filetype == LIBMTP_FILETYPE_FOLDER) ? Py_True : Py_False ); diff --git a/src/calibre/devices/mtp/windows/content_enumeration.cpp b/src/calibre/devices/mtp/windows/content_enumeration.cpp index e1f439926c..7186bbdcdb 100644 --- a/src/calibre/devices/mtp/windows/content_enumeration.cpp +++ b/src/calibre/devices/mtp/windows/content_enumeration.cpp @@ -34,6 +34,7 @@ static IPortableDeviceKeyCollection* create_filesystem_properties_collection() { ADDPROP(WPD_OBJECT_ISHIDDEN); ADDPROP(WPD_OBJECT_CAN_DELETE); ADDPROP(WPD_OBJECT_SIZE); + ADDPROP(WPD_OBJECT_DATE_MODIFIED); return properties; @@ -81,6 +82,16 @@ static void set_size_property(PyObject *dict, REFPROPERTYKEY key, const char *py } } +static void set_date_property(PyObject *dict, REFPROPERTYKEY key, const char *pykey, IPortableDeviceValues *properties) { + FLOAT val = 0; + PyObject *t; + + if (SUCCEEDED(properties->GetFloatValue(key, &val))) { + t = Py_BuildValue("d", (double)val); + if (t != NULL) { PyDict_SetItemString(dict, pykey, t); Py_DECREF(t); } + } +} + static void set_content_type_property(PyObject *dict, IPortableDeviceValues *properties) { GUID guid = GUID_NULL; BOOL is_folder = 0; @@ -103,6 +114,8 @@ static void set_properties(PyObject *obj, IPortableDeviceValues *values) { set_bool_property(obj, WPD_OBJECT_ISSYSTEM, "is_system", values); set_size_property(obj, WPD_OBJECT_SIZE, "size", values); + set_date_property(obj, WPD_OBJECT_DATE_MODIFIED, "modified", values); + } // }}} diff --git a/src/calibre/devices/mtp/windows/driver.py b/src/calibre/devices/mtp/windows/driver.py index abe38e5f7c..dbcad94fe0 100644 --- a/src/calibre/devices/mtp/windows/driver.py +++ b/src/calibre/devices/mtp/windows/driver.py @@ -248,7 +248,9 @@ class MTP_DEVICE(MTPDeviceBase): self._carda_id = storage[1]['id'] if len(storage) > 2: self._cardb_id = storage[2]['id'] - self.current_friendly_name = devdata.get('friendly_name', None) + self.current_friendly_name = devdata.get('friendly_name', + _('Unknown MTP device')) + self.currently_connected_pnp_id = connected_device @same_thread def get_basic_device_information(self):