From a021c5db8f5186175f41eb0e61a5ac7bc1ee2f5a Mon Sep 17 00:00:00 2001 From: codestation Date: Tue, 28 Jan 2014 18:05:43 -0430 Subject: [PATCH] Modify removeRecursively to be able to delete a file. Added getParentId func. Add the datatype for newly inserted items. Pass a double pointer instead of a pointer reference so the metadata_t can be optional. Make sure to delete the files after deleting an entry in the backup manager. --- src/cmaevent.cpp | 6 +++--- src/cmaobject.cpp | 9 -------- src/cmaobject.h | 4 ---- src/database.h | 3 ++- src/forms/backupmanagerform.cpp | 15 +++++++------ src/qlistdb.cpp | 36 ++++++++++++++++++++----------- src/qlistdb.h | 3 ++- src/utils.cpp | 38 +++++++++++++++++++-------------- src/utils.h | 2 +- 9 files changed, 62 insertions(+), 54 deletions(-) diff --git a/src/cmaevent.cpp b/src/cmaevent.cpp index 8e0dc0e..73f9cb9 100644 --- a/src/cmaevent.cpp +++ b/src/cmaevent.cpp @@ -172,9 +172,9 @@ quint16 CmaEvent::processAllObjects(metadata_t &parent_metadata, quint32 handle) } int ohfi = db->getPathId(name, parent_metadata.ohfi); - const QString fullpath = db->getAbsolutePath(ohfi); if(ohfi > 0) { + const QString fullpath = db->getAbsolutePath(ohfi); qDebug() << "Deleting" << fullpath; removeRecursively(fullpath); db->deleteEntry(ohfi); @@ -382,7 +382,7 @@ void CmaEvent::vitaEventSendObjectMetadata(vita_event_t *event, int eventId) metadata_t *meta = NULL; - int count = db->getObjectMetadatas(browse.ohfiParent, meta, browse.index, browse.numObjects); // if meta is null, will return empty XML + int count = db->getObjectMetadatas(browse.ohfiParent, &meta, browse.index, browse.numObjects); // if meta is null, will return empty XML qDebug("Sending %i metadata filtered objects for OHFI %d", count, browse.ohfiParent); if(VitaMTP_SendObjectMetadata(device, eventId, meta) != PTP_RC_OK) { // send all objects with OHFI parent @@ -403,7 +403,7 @@ void CmaEvent::vitaEventSendObject(vita_event_t *event, int eventId) qDebug("Searching object with OHFI %d", ohfi); metadata_t *metadata = NULL; - if(!db->getObjectMetadatas(ohfi, metadata)) { + if(!db->getObjectMetadatas(ohfi, &metadata)) { qWarning("Failed to find OHFI %d", ohfi); VitaMTP_ReportResult(device, eventId, PTP_RC_VITA_Invalid_OHFI); return; diff --git a/src/cmaobject.cpp b/src/cmaobject.cpp index a7783bc..68856a9 100644 --- a/src/cmaobject.cpp +++ b/src/cmaobject.cpp @@ -181,15 +181,6 @@ void CMAObject::initObject(const QFileInfo &file, int file_type) updateObjectSize(file.size()); } -bool CMAObject::removeReferencedObject() -{ - if(metadata.dataType & Folder) { - return removeRecursively(path); - } else { - return QFile::remove(path); - } -} - void CMAObject::updateObjectSize(qint64 size) { if(parent) { diff --git a/src/cmaobject.h b/src/cmaobject.h index e5c0953..4f36a07 100644 --- a/src/cmaobject.h +++ b/src/cmaobject.h @@ -34,7 +34,6 @@ public: ~CMAObject(); void refreshPath(); - bool removeReferencedObject(); void rename(const QString &name); void updateObjectSize(qint64 size); bool hasParent(const CMAObject *obj); @@ -61,9 +60,6 @@ protected: private: void loadSfoMetadata(const QString &path); - void loadMusicMetadata(const QString &path); - void loadVideoMetadata(const QString &path); - void loadPhotoMetadata(const QString &path); }; #endif // CMAOBJECT_H diff --git a/src/database.h b/src/database.h index 29daf8c..3086711 100644 --- a/src/database.h +++ b/src/database.h @@ -45,12 +45,13 @@ public: virtual QString getAbsolutePath(int ohfi) = 0; virtual QString getRelativePath(int ohfi) = 0; virtual bool getObjectMetadata(int ohfi, metadata_t &metadata) = 0; - virtual int getObjectMetadatas(int parent_ohfi, metadata_t *&metadata, int index = 0, int max_number = 0) = 0; + virtual int getObjectMetadatas(int parent_ohfi, metadata_t **metadata, int index = 0, int max_number = 0) = 0; virtual qint64 getObjectSize(int ohfi) = 0; virtual int getPathId(const char *name, int ohfi) = 0; virtual int insertObjectEntry(const QString &path, int parent_ohfi) = 0; virtual bool renameObject(int ohfi, const QString &name) = 0; virtual void setObjectSize(int ohfi, qint64 size) = 0; + virtual int getParentId(int ohfi) = 0; virtual int getRootId(int ohfi) = 0; static int checkFileType(const QString path, int ohfi_root); diff --git a/src/forms/backupmanagerform.cpp b/src/forms/backupmanagerform.cpp index 72c825b..23bbace 100644 --- a/src/forms/backupmanagerform.cpp +++ b/src/forms/backupmanagerform.cpp @@ -66,11 +66,8 @@ void BackupManagerForm::removeEntry(BackupItem *item) QMutexLocker locker(&db->mutex); - metadata meta; - if(db->getObjectMetadata(item->ohfi, meta)) { - setBackupUsage(db->getObjectSize(meta.ohfiParent)); - } - + int parent_ohfi = db->getParentId(item->ohfi); + removeRecursively(db->getAbsolutePath(item->ohfi)); db->deleteEntry(item->ohfi); for(int i = 0; i < ui->tableWidget->rowCount(); ++i) { @@ -80,6 +77,10 @@ void BackupManagerForm::removeEntry(BackupItem *item) break; } } + + if(parent_ohfi > 0) { + setBackupUsage(db->getObjectSize(parent_ohfi)); + } } void BackupManagerForm::setBackupUsage(quint64 size) @@ -143,8 +144,8 @@ void BackupManagerForm::loadBackupListing(int index) db->mutex.lock(); // get the item list - metadata_t *meta; - int row_count = db->getObjectMetadatas(ohfi, meta); + metadata_t *meta = NULL; + int row_count = db->getObjectMetadatas(ohfi, &meta); ui->tableWidget->setRowCount(row_count); // exit if there aren't any items diff --git a/src/qlistdb.cpp b/src/qlistdb.cpp index 0fc1a23..ef08e70 100644 --- a/src/qlistdb.cpp +++ b/src/qlistdb.cpp @@ -301,8 +301,6 @@ bool QListDB::findInternal(const root_list &list, int ohfi, find_data &data) bool QListDB::find(int ohfi, QListDB::find_data &data) { - QMutexLocker locker(&mutex); - for(map_list::iterator root = object_list.begin(); root != object_list.end(); ++root) { if(findInternal(*root, ohfi, data)) { return true; @@ -313,7 +311,6 @@ bool QListDB::find(int ohfi, QListDB::find_data &data) CMAObject *QListDB::ohfiToObject(int ohfi) { - QMutexLocker locker(&mutex); find_data data; return find(ohfi, data) ? *data.it : NULL; } @@ -365,6 +362,8 @@ int QListDB::acceptFilteredObject(const CMAObject *parent, const CMAObject *curr void QListDB::dumpMetadataList(const metadata_t *p_head) { + QMutexLocker locker(&mutex); + while(p_head) { qDebug("Metadata: %s with OHFI %d", p_head->name, p_head->ohfi); p_head = p_head->next_metadata; @@ -386,8 +385,7 @@ bool QListDB::getObjectMetadata(int ohfi, metadata_t &metadata) int QListDB::childObjectCount(int parent_ohfi) { - metadata_t *metadata = NULL; - return getObjectMetadatas(parent_ohfi, metadata); + return getObjectMetadatas(parent_ohfi, NULL); } bool QListDB::deleteEntry(int ohfi, int root_ohfi) @@ -406,7 +404,7 @@ bool QListDB::deleteEntry(int ohfi, int root_ohfi) return false; } -int QListDB::getObjectMetadatas(int parent_ohfi, metadata_t *&metadata, int index, int max_number) +int QListDB::getObjectMetadatas(int parent_ohfi, metadata_t **metadata, int index, int max_number) { QMutexLocker locker(&mutex); CMARootObject *parent = static_cast(ohfiToObject(parent_ohfi)); @@ -419,7 +417,7 @@ int QListDB::getObjectMetadatas(int parent_ohfi, metadata_t *&metadata, int inde if(parent->metadata.ohfi < OHFI_OFFSET && parent->filters) { // if we have filters if(parent_ohfi == parent->metadata.ohfi) { // if we are looking at root - return parent->getFilters(&metadata); + return parent->getFilters(metadata); } else { // we are looking at a filter for(int j = 0; j < parent->num_filters; j++) { if(parent->filters[j].ohfi == parent_ohfi) { @@ -458,7 +456,7 @@ int QListDB::getObjectMetadatas(int parent_ohfi, metadata_t *&metadata, int inde tail->next_metadata = NULL; if(metadata != NULL) { - metadata = temp.next_metadata; + *metadata = temp.next_metadata; } return numObjects; @@ -494,15 +492,21 @@ int QListDB::insertObjectEntry(const QString &path, int parent_ohfi) { QMutexLocker locker(&mutex); - CMAObject *parent = ohfiToObject(parent_ohfi); + CMAObject *parent_obj = ohfiToObject(parent_ohfi); for(map_list::iterator root = object_list.begin(); root != object_list.end(); ++root) { root_list *cat_list = &(*root); - root_list::const_iterator it = qBinaryFind(cat_list->begin(), cat_list->end(), parent, QListDB::lessThanComparator); + root_list::const_iterator it = qBinaryFind(cat_list->begin(), cat_list->end(), parent_obj, QListDB::lessThanComparator); if(it != cat_list->end()) { - CMAObject *newobj = new CMAObject(parent); - newobj->initObject(path); + CMAObject *newobj = new CMAObject(parent_obj); + + // get the root object + while(parent_obj->parent) { + parent_obj = parent_obj->parent; + } + + newobj->initObject(path, parent_obj->metadata.dataType); cat_list->append(newobj); return newobj->metadata.ohfi; } @@ -577,3 +581,11 @@ int QListDB::getRootId(int ohfi) return obj->metadata.ohfi; } + +int QListDB::getParentId(int ohfi) +{ + QMutexLocker locker(&mutex); + CMAObject *obj = ohfiToObject(ohfi); + + return obj ? obj->metadata.ohfiParent : 0; +} diff --git a/src/qlistdb.h b/src/qlistdb.h index ac8144b..6f32707 100644 --- a/src/qlistdb.h +++ b/src/qlistdb.h @@ -45,8 +45,9 @@ public: bool deleteEntry(int ohfi, int root_ohfi = 0); QString getAbsolutePath(int ohfi); bool getObjectMetadata(int ohfi, metadata_t &metadata); - int getObjectMetadatas(int parent_ohfi, metadata_t *&metadata, int index = 0, int max_number = 0); + int getObjectMetadatas(int parent_ohfi, metadata_t **metadata, int index = 0, int max_number = 0); qint64 getObjectSize(int ohfi); + int getParentId(int ohfi); int getPathId(const char *name, int ohfi); QString getRelativePath(int ohfi); int getRootId(int ohfi); diff --git a/src/utils.cpp b/src/utils.cpp index 22059f0..3e1680b 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -52,31 +52,37 @@ bool getDiskSpace(const QString &dir, quint64 *free, quint64 *total) return false; } -bool removeRecursively(const QString &dirName) +bool removeRecursively(const QString &path) { + QFileInfo info(path); + + if(info.isDir()) { #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - return QDir(dirName).removeRecursively(); + return QDir(path).removeRecursively(); #else - bool result = false; - QDir dir(dirName); + bool result = false; + QDir dir(path); - if(dir.exists(dirName)) { - Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) { - if(info.isDir()) { - result = removeRecursively(info.absoluteFilePath()); - } else { - result = QFile::remove(info.absoluteFilePath()); - } + if(dir.exists(path)) { + Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) { + if(info.isDir()) { + result = removeRecursively(info.absoluteFilePath()); + } else { + result = QFile::remove(info.absoluteFilePath()); + } - if(!result) { - return result; + if(!result) { + return result; + } } + result = dir.rmdir(path); } - result = dir.rmdir(dirName); - } - return result; + return result; #endif + } else { + return QFile::remove(path); + } } QByteArray findFolderAlbumArt(const QString path, metadata_t *metadata) diff --git a/src/utils.h b/src/utils.h index 8d8deba..35f690f 100644 --- a/src/utils.h +++ b/src/utils.h @@ -45,7 +45,7 @@ public: }; #endif -bool removeRecursively(const QString &dirName); +bool removeRecursively(const QString &path); QString readable_size(quint64 size, bool use_gib = false); bool getDiskSpace(const QString &dir, quint64 *free, quint64 *total); QByteArray getThumbnail(const QString &path, DataType type, metadata_t *metadata);