From 1f5b6e20747bba3c6b4f11b11b97f1b25c211057 Mon Sep 17 00:00:00 2001 From: codestation Date: Sun, 4 May 2014 22:11:48 -0430 Subject: [PATCH] Fix multimedia directory copy from pc. --- src/cmaclient.cpp | 1 + src/cmaevent.cpp | 56 ++++++++++++++++++++++++++++++++++++------- src/cmarootobject.cpp | 13 +++++----- src/qlistdb.cpp | 9 ++++--- 4 files changed, 61 insertions(+), 18 deletions(-) diff --git a/src/cmaclient.cpp b/src/cmaclient.cpp index ce1d6c6..606a91b 100644 --- a/src/cmaclient.cpp +++ b/src/cmaclient.cpp @@ -93,6 +93,7 @@ void CmaClient::connectWireless() setActive(true); do { + qDebug("Waiting for wireless connection"); if((vita = VitaMTP_Get_First_Wireless_Vita(&host, 0, CC::deviceRegistered, CC::generatePin, CC::registrationComplete)) != NULL) { qDebug("Starting new wireless connection"); processNewConnection(vita); diff --git a/src/cmaevent.cpp b/src/cmaevent.cpp index ad37cb2..ae77839 100644 --- a/src/cmaevent.cpp +++ b/src/cmaevent.cpp @@ -265,17 +265,55 @@ void CmaEvent::vitaEventSendCopyConfirmationInfo(vita_event_t *event, int eventI QMutexLocker locker(&m_db->mutex); - qint64 size; qint64 total_size = 0; - for(quint32 i = 0; i < info->count; i++) { - if((size = m_db->getObjectSize(info->ohfi[i])) < 0) { - qWarning("Cannot find OHFI %d", info->ohfi[i]); - free(info); - return; - } + // check if the item is a single folder + if(info->count == 1) { + metadata_t meta; + if(m_db->getObjectMetadata(info->ohfi[0], meta)) { + // got a folder + if(meta.dataType & Folder) { + metadata_t *meta_list = NULL; + if(m_db->getObjectList(info->ohfi[0], &meta_list)) { + int count = 0; + metadata_t *meta = meta_list; + // count files + while(meta) { + if(meta->dataType & File) { + count++; + } + meta = meta->next_metadata; + } + // create struct to hold all the file identifiers + info = (copy_confirmation_info_t *)malloc(sizeof(uint32_t) * count + sizeof(copy_confirmation_info_t)); + meta = meta_list; + info->count = 0; + // copy all the file ohfi + while(meta) { + if(meta->dataType & File) { + info->ohfi[info->count] = meta->ohfi; + total_size += meta->size; + info->count++; + } + meta = meta->next_metadata; + } - total_size += size; + } + m_db->freeMetadata(meta_list); + } + } + } else { + qint64 size; + + for(quint32 i = 0; i < info->count; i++) { + if((size = m_db->getObjectSize(info->ohfi[i])) < 0) { + qWarning("Cannot find OHFI %d", info->ohfi[i]); + free(info); + return; + } + + total_size += size; + } } if(VitaMTP_SendCopyConfirmationInfo(device, eventId, info, total_size) != PTP_RC_OK) { @@ -440,7 +478,7 @@ void CmaEvent::vitaEventSendObject(vita_event_t *event, int eventId) // send the data over qDebug("Sending %s of %lu bytes to device", metadata->name, len); - qDebug("OHFI %d with handle 0x%08X", ohfi, parentHandle); + qDebug("OHFI %d with handle 0x%08X", metadata->ohfi, parentHandle); VitaMTP_RegisterCancelEventId(eventId); quint16 ret = VitaMTP_SendObject_Callback(device, &parentHandle, &handle, metadata, &CmaEvent::readCallback); diff --git a/src/cmarootobject.cpp b/src/cmarootobject.cpp index 7e22b4e..b97faa3 100644 --- a/src/cmarootobject.cpp +++ b/src/cmarootobject.cpp @@ -49,10 +49,11 @@ void CMARootObject::initObject(const QString &path) case VITA_OHFI_PHOTO: metadata.dataType = Photo; this->path = path; - num_filters = 2; - filters = new metadata_t[2]; - createFilter(&filters[0], "Folders", VITA_DIR_TYPE_MASK_PHOTO | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_REGULAR); - createFilter(&filters[1], "All", VITA_DIR_TYPE_MASK_PHOTO | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_ALL); + num_filters = 3; + filters = new metadata_t[3]; + createFilter(&filters[0], "All", VITA_DIR_TYPE_MASK_PHOTO | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_ALL); + createFilter(&filters[1], "Month", VITA_DIR_TYPE_MASK_PHOTO | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_MONTH); + createFilter(&filters[2], "Folders", VITA_DIR_TYPE_MASK_PHOTO | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_REGULAR); break; case VITA_OHFI_VIDEO: @@ -60,8 +61,8 @@ void CMARootObject::initObject(const QString &path) this->path = path; num_filters = 2; filters = new metadata_t[2]; - createFilter(&filters[0], "Folders", VITA_DIR_TYPE_MASK_VIDEO | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_REGULAR); - createFilter(&filters[1], "All", VITA_DIR_TYPE_MASK_VIDEO | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_ALL); + createFilter(&filters[0], "All", VITA_DIR_TYPE_MASK_VIDEO | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_ALL); + createFilter(&filters[1], "Folders", VITA_DIR_TYPE_MASK_VIDEO | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_REGULAR); break; case VITA_OHFI_VITAAPP: diff --git a/src/qlistdb.cpp b/src/qlistdb.cpp index 06e76f2..2632ddc 100644 --- a/src/qlistdb.cpp +++ b/src/qlistdb.cpp @@ -327,13 +327,16 @@ int QListDB::acceptFilteredObject(const CMAObject *parent, const CMAObject *curr result = (current->metadata.dataType & Music); } - if(type == (VITA_DIR_TYPE_MASK_MUSIC | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_ARTISTS)) { + if(MASK_SET(type, VITA_DIR_TYPE_MASK_ARTISTS)) { // unimplemented return 0; - } else if(type == (VITA_DIR_TYPE_MASK_MUSIC | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_GENRES)) { + } else if(MASK_SET(type, VITA_DIR_TYPE_MASK_GENRES)) { // unimplemented return 0; - } else if(type == (VITA_DIR_TYPE_MASK_MUSIC | VITA_DIR_TYPE_MASK_ROOT | VITA_DIR_TYPE_MASK_PLAYLISTS)) { + } else if(MASK_SET(type, VITA_DIR_TYPE_MASK_PLAYLISTS)) { + // unimplemented + return 0; + } else if(MASK_SET(type, VITA_DIR_TYPE_MASK_MONTH)) { // unimplemented return 0; } else if(type & (VITA_DIR_TYPE_MASK_ALL | VITA_DIR_TYPE_MASK_SONGS)) {