void Camera::for_each_file(const FileFunc& func) { std::lock_guard<std::mutex> g(mutex); int ret; CameraStorageInformation *storage_info; int len; if ((ret = gp_camera_get_storageinfo(camera, &storage_info, &len, ctx->context)) < GP_OK) { throw Exception("gp_camera_get_storageinfo", ret); } for (int i = 0; i < len; ++i) { CameraStorageInformation& info = storage_info[i]; if (info.fields & GP_STORAGEINFO_BASE) { for_each_file_in_folder(func, info.basedir); } } free(storage_info); }
bool GPCamera::getFreeSpace(unsigned long& kBSize, unsigned long& kBAvail) { #ifdef HAVE_GPHOTO2 // NOTE: This method depends of libgphoto2 2.4.0 int nrofsinfos; CameraStorageInformation* sinfos = 0; d->status->cancel = false; int errorCode = gp_camera_get_storageinfo(d->camera, &sinfos, &nrofsinfos, d->status->context); if (errorCode != GP_OK) { qCDebug(DIGIKAM_IMPORTUI_LOG) << "Getting storage information not supported for this camera!"; printGphotoErrorDescription(errorCode); return false; } for (int i = 0 ; i < nrofsinfos ; ++i) { if (sinfos[i].fields & GP_STORAGEINFO_FILESYSTEMTYPE) { switch(sinfos[i].fstype) { case GP_STORAGEINFO_FST_UNDEFINED: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage fstype: undefined"; break; case GP_STORAGEINFO_FST_GENERICFLAT: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage fstype: flat, all in one directory"; break; case GP_STORAGEINFO_FST_GENERICHIERARCHICAL: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage fstype: generic tree hierarchy"; break; case GP_STORAGEINFO_FST_DCF: qCDebug(DIGIKAM_IMPORTUI_LOG) << "DCIM style storage"; break; } } if (sinfos[i].fields & GP_STORAGEINFO_LABEL) { qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage label: " << QString::fromUtf8(sinfos[i].label); } if (sinfos[i].fields & GP_STORAGEINFO_DESCRIPTION) { qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage description: " << QString::fromUtf8(sinfos[i].description); } if (sinfos[i].fields & GP_STORAGEINFO_BASE) { qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage base-dir: " << QString::fromUtf8(sinfos[i].basedir); // TODO in order for this to work, the upload dialog needs to be fixed. /* if(nrofsinfos == 1) { qCDebug(DIGIKAM_IMPORTUI_LOG) << "Only one storage, so setting storage directory to" << sinfos[i].basedir; m_path = QString(sinfos[i].basedir); } */ } if (sinfos[i].fields & GP_STORAGEINFO_ACCESS) { switch (sinfos[i].access) { case GP_STORAGEINFO_AC_READWRITE: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage access: R/W"; break; case GP_STORAGEINFO_AC_READONLY: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage access: RO"; break; case GP_STORAGEINFO_AC_READONLY_WITH_DELETE: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage access: RO + Del"; break; default: break; } } if (sinfos[i].fields & GP_STORAGEINFO_STORAGETYPE) { switch (sinfos[i].type) { case GP_STORAGEINFO_ST_FIXED_ROM: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage type: fixed ROM"; break; case GP_STORAGEINFO_ST_REMOVABLE_ROM: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage type: removable ROM"; break; case GP_STORAGEINFO_ST_FIXED_RAM: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage type: fixed RAM"; break; case GP_STORAGEINFO_ST_REMOVABLE_RAM: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage type: removable RAM"; break; case GP_STORAGEINFO_ST_UNKNOWN: default: qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage type: unknown"; break; } } if (sinfos[i].fields & GP_STORAGEINFO_MAXCAPACITY) { kBSize += sinfos[i].capacitykbytes; qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage capacity: " << kBSize; } if (sinfos[i].fields & GP_STORAGEINFO_FREESPACEKBYTES) { kBAvail += sinfos[i].freekbytes; qCDebug(DIGIKAM_IMPORTUI_LOG) << "Storage free-space: " << kBAvail; } } return true; #else Q_UNUSED(kBSize); Q_UNUSED(kBAvail); return false; #endif /* HAVE_GPHOTO2 */ }