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.
This commit is contained in:
codestation
2014-01-28 18:05:43 -04:30
parent b7ad2b13f4
commit a021c5db8f
9 changed files with 62 additions and 54 deletions

View File

@@ -172,9 +172,9 @@ quint16 CmaEvent::processAllObjects(metadata_t &parent_metadata, quint32 handle)
} }
int ohfi = db->getPathId(name, parent_metadata.ohfi); int ohfi = db->getPathId(name, parent_metadata.ohfi);
const QString fullpath = db->getAbsolutePath(ohfi);
if(ohfi > 0) { if(ohfi > 0) {
const QString fullpath = db->getAbsolutePath(ohfi);
qDebug() << "Deleting" << fullpath; qDebug() << "Deleting" << fullpath;
removeRecursively(fullpath); removeRecursively(fullpath);
db->deleteEntry(ohfi); db->deleteEntry(ohfi);
@@ -382,7 +382,7 @@ void CmaEvent::vitaEventSendObjectMetadata(vita_event_t *event, int eventId)
metadata_t *meta = NULL; 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); 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 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); qDebug("Searching object with OHFI %d", ohfi);
metadata_t *metadata = NULL; metadata_t *metadata = NULL;
if(!db->getObjectMetadatas(ohfi, metadata)) { if(!db->getObjectMetadatas(ohfi, &metadata)) {
qWarning("Failed to find OHFI %d", ohfi); qWarning("Failed to find OHFI %d", ohfi);
VitaMTP_ReportResult(device, eventId, PTP_RC_VITA_Invalid_OHFI); VitaMTP_ReportResult(device, eventId, PTP_RC_VITA_Invalid_OHFI);
return; return;

View File

@@ -181,15 +181,6 @@ void CMAObject::initObject(const QFileInfo &file, int file_type)
updateObjectSize(file.size()); updateObjectSize(file.size());
} }
bool CMAObject::removeReferencedObject()
{
if(metadata.dataType & Folder) {
return removeRecursively(path);
} else {
return QFile::remove(path);
}
}
void CMAObject::updateObjectSize(qint64 size) void CMAObject::updateObjectSize(qint64 size)
{ {
if(parent) { if(parent) {

View File

@@ -34,7 +34,6 @@ public:
~CMAObject(); ~CMAObject();
void refreshPath(); void refreshPath();
bool removeReferencedObject();
void rename(const QString &name); void rename(const QString &name);
void updateObjectSize(qint64 size); void updateObjectSize(qint64 size);
bool hasParent(const CMAObject *obj); bool hasParent(const CMAObject *obj);
@@ -61,9 +60,6 @@ protected:
private: private:
void loadSfoMetadata(const QString &path); void loadSfoMetadata(const QString &path);
void loadMusicMetadata(const QString &path);
void loadVideoMetadata(const QString &path);
void loadPhotoMetadata(const QString &path);
}; };
#endif // CMAOBJECT_H #endif // CMAOBJECT_H

View File

@@ -45,12 +45,13 @@ public:
virtual QString getAbsolutePath(int ohfi) = 0; virtual QString getAbsolutePath(int ohfi) = 0;
virtual QString getRelativePath(int ohfi) = 0; virtual QString getRelativePath(int ohfi) = 0;
virtual bool getObjectMetadata(int ohfi, metadata_t &metadata) = 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 qint64 getObjectSize(int ohfi) = 0;
virtual int getPathId(const char *name, int ohfi) = 0; virtual int getPathId(const char *name, int ohfi) = 0;
virtual int insertObjectEntry(const QString &path, int parent_ohfi) = 0; virtual int insertObjectEntry(const QString &path, int parent_ohfi) = 0;
virtual bool renameObject(int ohfi, const QString &name) = 0; virtual bool renameObject(int ohfi, const QString &name) = 0;
virtual void setObjectSize(int ohfi, qint64 size) = 0; virtual void setObjectSize(int ohfi, qint64 size) = 0;
virtual int getParentId(int ohfi) = 0;
virtual int getRootId(int ohfi) = 0; virtual int getRootId(int ohfi) = 0;
static int checkFileType(const QString path, int ohfi_root); static int checkFileType(const QString path, int ohfi_root);

View File

@@ -66,11 +66,8 @@ void BackupManagerForm::removeEntry(BackupItem *item)
QMutexLocker locker(&db->mutex); QMutexLocker locker(&db->mutex);
metadata meta; int parent_ohfi = db->getParentId(item->ohfi);
if(db->getObjectMetadata(item->ohfi, meta)) { removeRecursively(db->getAbsolutePath(item->ohfi));
setBackupUsage(db->getObjectSize(meta.ohfiParent));
}
db->deleteEntry(item->ohfi); db->deleteEntry(item->ohfi);
for(int i = 0; i < ui->tableWidget->rowCount(); ++i) { for(int i = 0; i < ui->tableWidget->rowCount(); ++i) {
@@ -80,6 +77,10 @@ void BackupManagerForm::removeEntry(BackupItem *item)
break; break;
} }
} }
if(parent_ohfi > 0) {
setBackupUsage(db->getObjectSize(parent_ohfi));
}
} }
void BackupManagerForm::setBackupUsage(quint64 size) void BackupManagerForm::setBackupUsage(quint64 size)
@@ -143,8 +144,8 @@ void BackupManagerForm::loadBackupListing(int index)
db->mutex.lock(); db->mutex.lock();
// get the item list // get the item list
metadata_t *meta; metadata_t *meta = NULL;
int row_count = db->getObjectMetadatas(ohfi, meta); int row_count = db->getObjectMetadatas(ohfi, &meta);
ui->tableWidget->setRowCount(row_count); ui->tableWidget->setRowCount(row_count);
// exit if there aren't any items // exit if there aren't any items

View File

@@ -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) 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) { for(map_list::iterator root = object_list.begin(); root != object_list.end(); ++root) {
if(findInternal(*root, ohfi, data)) { if(findInternal(*root, ohfi, data)) {
return true; return true;
@@ -313,7 +311,6 @@ bool QListDB::find(int ohfi, QListDB::find_data &data)
CMAObject *QListDB::ohfiToObject(int ohfi) CMAObject *QListDB::ohfiToObject(int ohfi)
{ {
QMutexLocker locker(&mutex);
find_data data; find_data data;
return find(ohfi, data) ? *data.it : NULL; 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) void QListDB::dumpMetadataList(const metadata_t *p_head)
{ {
QMutexLocker locker(&mutex);
while(p_head) { while(p_head) {
qDebug("Metadata: %s with OHFI %d", p_head->name, p_head->ohfi); qDebug("Metadata: %s with OHFI %d", p_head->name, p_head->ohfi);
p_head = p_head->next_metadata; p_head = p_head->next_metadata;
@@ -386,8 +385,7 @@ bool QListDB::getObjectMetadata(int ohfi, metadata_t &metadata)
int QListDB::childObjectCount(int parent_ohfi) int QListDB::childObjectCount(int parent_ohfi)
{ {
metadata_t *metadata = NULL; return getObjectMetadatas(parent_ohfi, NULL);
return getObjectMetadatas(parent_ohfi, metadata);
} }
bool QListDB::deleteEntry(int ohfi, int root_ohfi) bool QListDB::deleteEntry(int ohfi, int root_ohfi)
@@ -406,7 +404,7 @@ bool QListDB::deleteEntry(int ohfi, int root_ohfi)
return false; 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); QMutexLocker locker(&mutex);
CMARootObject *parent = static_cast<CMARootObject *>(ohfiToObject(parent_ohfi)); CMARootObject *parent = static_cast<CMARootObject *>(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->metadata.ohfi < OHFI_OFFSET && parent->filters) { // if we have filters
if(parent_ohfi == parent->metadata.ohfi) { // if we are looking at root 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 } else { // we are looking at a filter
for(int j = 0; j < parent->num_filters; j++) { for(int j = 0; j < parent->num_filters; j++) {
if(parent->filters[j].ohfi == parent_ohfi) { 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; tail->next_metadata = NULL;
if(metadata != NULL) { if(metadata != NULL) {
metadata = temp.next_metadata; *metadata = temp.next_metadata;
} }
return numObjects; return numObjects;
@@ -494,15 +492,21 @@ int QListDB::insertObjectEntry(const QString &path, int parent_ohfi)
{ {
QMutexLocker locker(&mutex); 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) { for(map_list::iterator root = object_list.begin(); root != object_list.end(); ++root) {
root_list *cat_list = &(*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()) { if(it != cat_list->end()) {
CMAObject *newobj = new CMAObject(parent); CMAObject *newobj = new CMAObject(parent_obj);
newobj->initObject(path);
// get the root object
while(parent_obj->parent) {
parent_obj = parent_obj->parent;
}
newobj->initObject(path, parent_obj->metadata.dataType);
cat_list->append(newobj); cat_list->append(newobj);
return newobj->metadata.ohfi; return newobj->metadata.ohfi;
} }
@@ -577,3 +581,11 @@ int QListDB::getRootId(int ohfi)
return obj->metadata.ohfi; return obj->metadata.ohfi;
} }
int QListDB::getParentId(int ohfi)
{
QMutexLocker locker(&mutex);
CMAObject *obj = ohfiToObject(ohfi);
return obj ? obj->metadata.ohfiParent : 0;
}

View File

@@ -45,8 +45,9 @@ public:
bool deleteEntry(int ohfi, int root_ohfi = 0); bool deleteEntry(int ohfi, int root_ohfi = 0);
QString getAbsolutePath(int ohfi); QString getAbsolutePath(int ohfi);
bool getObjectMetadata(int ohfi, metadata_t &metadata); 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); qint64 getObjectSize(int ohfi);
int getParentId(int ohfi);
int getPathId(const char *name, int ohfi); int getPathId(const char *name, int ohfi);
QString getRelativePath(int ohfi); QString getRelativePath(int ohfi);
int getRootId(int ohfi); int getRootId(int ohfi);

View File

@@ -52,31 +52,37 @@ bool getDiskSpace(const QString &dir, quint64 *free, quint64 *total)
return false; 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) #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
return QDir(dirName).removeRecursively(); return QDir(path).removeRecursively();
#else #else
bool result = false; bool result = false;
QDir dir(dirName); QDir dir(path);
if(dir.exists(dirName)) { if(dir.exists(path)) {
Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) { Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) {
if(info.isDir()) { if(info.isDir()) {
result = removeRecursively(info.absoluteFilePath()); result = removeRecursively(info.absoluteFilePath());
} else { } else {
result = QFile::remove(info.absoluteFilePath()); result = QFile::remove(info.absoluteFilePath());
} }
if(!result) { if(!result) {
return result; return result;
}
} }
result = dir.rmdir(path);
} }
result = dir.rmdir(dirName);
}
return result; return result;
#endif #endif
} else {
return QFile::remove(path);
}
} }
QByteArray findFolderAlbumArt(const QString path, metadata_t *metadata) QByteArray findFolderAlbumArt(const QString path, metadata_t *metadata)

View File

@@ -45,7 +45,7 @@ public:
}; };
#endif #endif
bool removeRecursively(const QString &dirName); bool removeRecursively(const QString &path);
QString readable_size(quint64 size, bool use_gib = false); QString readable_size(quint64 size, bool use_gib = false);
bool getDiskSpace(const QString &dir, quint64 *free, quint64 *total); bool getDiskSpace(const QString &dir, quint64 *free, quint64 *total);
QByteArray getThumbnail(const QString &path, DataType type, metadata_t *metadata); QByteArray getThumbnail(const QString &path, DataType type, metadata_t *metadata);