diff options
Diffstat (limited to 'src/utilities/cameragui/gpcamera.cpp')
-rw-r--r-- | src/utilities/cameragui/gpcamera.cpp | 1223 |
1 files changed, 1223 insertions, 0 deletions
diff --git a/src/utilities/cameragui/gpcamera.cpp b/src/utilities/cameragui/gpcamera.cpp new file mode 100644 index 00000000..e03d92d0 --- /dev/null +++ b/src/utilities/cameragui/gpcamera.cpp @@ -0,0 +1,1223 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2003-01-21 + * Description : Gphoto2 camera interface + * + * Copyright (C) 2003-2005 by Renchi Raju <[email protected]> + * Copyright (C) 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com> + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +// C++ includes. + +#include <cstdio> +#include <iostream> + +// TQt includes. + +#include <tqstring.h> +#include <tqstringlist.h> +#include <tqimage.h> +#include <tqpixmap.h> +#include <tqdom.h> +#include <tqfile.h> + +// KDE includes. + +#include <tdelocale.h> + +// C Ansi includes. +extern "C" +{ +#include <gphoto2.h> +} + +// Local includes. + +#include "ddebug.h" +#include "gpcamera.h" + +namespace Digikam +{ + +class GPCameraPrivate +{ + +public: + + GPCameraPrivate() + { + camera = 0; + } + + bool cameraInitialized; + + bool thumbnailSupport; + bool deleteSupport; + bool uploadSupport; + bool mkDirSupport; + bool delDirSupport; + + TQString model; + TQString port; + TQString globalPath; + + Camera *camera; + CameraAbilities cameraAbilities; +}; + +class GPStatus +{ + +public: + + GPStatus() + { + context = gp_context_new(); + cancel = false; + gp_context_set_cancel_func(context, cancel_func, 0); + } + + ~GPStatus() + { + gp_context_unref(context); + cancel = false; + } + + GPContext *context; + static bool cancel; + + static GPContextFeedback cancel_func(GPContext *, void *) + { + return (cancel ? GP_CONTEXT_FEEDBACK_CANCEL : + GP_CONTEXT_FEEDBACK_OK); + } +}; + +bool GPStatus::cancel = false; + +GPCamera::GPCamera(const TQString& title, const TQString& model, const TQString& port, const TQString& path) + : DKCamera(title, model, port, path) +{ + m_status = 0; + + d = new GPCameraPrivate; + d->camera = 0; + d->model = model; + d->port = port; + d->globalPath = path; + d->cameraInitialized = false; + d->thumbnailSupport = false; + d->deleteSupport = false; + d->uploadSupport = false; + d->mkDirSupport = false; + d->delDirSupport = false; +} + +GPCamera::~GPCamera() +{ + if (d->camera) + { + gp_camera_unref(d->camera); + d->camera = 0; + } + + delete d; +} + +TQString GPCamera::model() const +{ + return d->model; +} + +TQString GPCamera::port() const +{ + return d->port; +} + +TQString GPCamera::path() const +{ + return d->globalPath; +} + +bool GPCamera::thumbnailSupport() +{ + return d->thumbnailSupport; +} + +bool GPCamera::deleteSupport() +{ + return d->deleteSupport; +} + +bool GPCamera::uploadSupport() +{ + return d->uploadSupport; +} + +bool GPCamera::mkDirSupport() +{ + return d->mkDirSupport; +} + +bool GPCamera::delDirSupport() +{ + return d->delDirSupport; +} + +bool GPCamera::doConnect() +{ + int errorCode; + // -- first step - setup the camera -------------------- + + if (d->camera) + { + gp_camera_unref(d->camera); + d->camera = 0; + } + + CameraAbilitiesList *abilList; + GPPortInfoList *infoList; + GPPortInfo info; + + gp_camera_new(&d->camera); + + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus(); + + gp_abilities_list_new(&abilList); + gp_abilities_list_load(abilList, m_status->context); + gp_port_info_list_new(&infoList); + gp_port_info_list_load(infoList); + + delete m_status; + m_status = 0; + + int modelNum = -1, portNum = -1; + modelNum = gp_abilities_list_lookup_model(abilList, d->model.latin1()); + portNum = gp_port_info_list_lookup_path (infoList, d->port.latin1()); + + gp_abilities_list_get_abilities(abilList, modelNum, &d->cameraAbilities); + + errorCode = gp_camera_set_abilities(d->camera, d->cameraAbilities); + if (errorCode != GP_OK) + { + DDebug() << "Failed to set camera Abilities!" << endl; + printGphotoErrorDescription(errorCode); + gp_camera_unref(d->camera); + d->camera = 0; + gp_abilities_list_free(abilList); + gp_port_info_list_free(infoList); + return false; + } + + if (d->model != "Directory Browse") + { + gp_port_info_list_get_info(infoList, portNum, &info); + errorCode = gp_camera_set_port_info(d->camera, info); + if (errorCode != GP_OK) + { + DDebug() << "Failed to set camera port!" << endl; + printGphotoErrorDescription(errorCode); + gp_camera_unref(d->camera); + d->camera = 0; + gp_abilities_list_free (abilList); + gp_port_info_list_free (infoList); + return false; + } + } + + gp_abilities_list_free (abilList); + gp_port_info_list_free (infoList); + + if (d->cameraAbilities.file_operations & + GP_FILE_OPERATION_PREVIEW) + d->thumbnailSupport = true; + + if (d->cameraAbilities.file_operations & + GP_FILE_OPERATION_DELETE) + d->deleteSupport = true; + + if (d->cameraAbilities.folder_operations & + GP_FOLDER_OPERATION_PUT_FILE) + d->uploadSupport = true; + + if (d->cameraAbilities.folder_operations & + GP_FOLDER_OPERATION_MAKE_DIR) + d->mkDirSupport = true; + + if (d->cameraAbilities.folder_operations & + GP_FOLDER_OPERATION_REMOVE_DIR) + d->delDirSupport = true; + + // -- Now try to initialize the camera ----------------- + + m_status = new GPStatus(); + + // Try and initialize the camera to see if its connected + errorCode = gp_camera_init(d->camera, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to initialize camera!" << endl; + printGphotoErrorDescription(errorCode); + gp_camera_unref(d->camera); + d->camera = 0; + delete m_status; + m_status = 0; + return false; + } + + delete m_status; + m_status = 0; + + d->cameraInitialized = true; + return true; +} + +void GPCamera::cancel() +{ + if (!m_status) + return; + m_status->cancel = true; +} + +void GPCamera::getAllFolders(const TQString& rootFolder, + TQStringList& folderList) +{ + TQStringList subfolders; + getSubFolders(rootFolder, subfolders); + + for (TQStringList::iterator it = subfolders.begin(); + it != subfolders.end(); ++it) + { + *it = rootFolder + TQString(rootFolder.endsWith("/") ? "" : "/") + (*it); + folderList.append(*it); + } + + for (TQStringList::iterator it = subfolders.begin(); + it != subfolders.end(); ++it) + { + getAllFolders(*it, folderList); + } +} + +bool GPCamera::getSubFolders(const TQString& folder, TQStringList& subFolderList) +{ + int errorCode; + CameraList *clist; + gp_list_new(&clist); + + if (m_status) + { + delete m_status; + m_status = 0; + } + m_status = new GPStatus(); + + errorCode = gp_camera_folder_list_folders(d->camera, TQFile::encodeName(folder), clist, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get folders list from camera!" << endl; + printGphotoErrorDescription(errorCode); + gp_list_unref(clist); + delete m_status; + m_status = 0; + return false; + } + + delete m_status; + m_status = 0; + + int count = gp_list_count(clist); + for (int i = 0 ; i < count ; i++) + { + const char* subFolder; + errorCode = gp_list_get_name(clist, i, &subFolder); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get folder name from camera!" << endl; + printGphotoErrorDescription(errorCode); + gp_list_unref(clist); + return false; + } + + subFolderList.append(TQFile::decodeName(subFolder)); + } + + gp_list_unref(clist); + return true; +} + +bool GPCamera::getItemsList(const TQString& folder, TQStringList& itemsList) +{ + int errorCode; + CameraList *clist; + const char *cname; + + if (m_status) + { + delete m_status; + m_status = 0; + } + m_status = new GPStatus; + + gp_list_new(&clist); + + errorCode = gp_camera_folder_list_files(d->camera, TQFile::encodeName(folder), clist, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get folder files list from camera!" << endl; + printGphotoErrorDescription(errorCode); + gp_list_unref(clist); + delete m_status; + m_status = 0; + return false; + } + + int count = gp_list_count(clist); + for (int i = 0 ; i < count ; i++) + { + errorCode = gp_list_get_name(clist, i, &cname); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get file name from camera!" << endl; + printGphotoErrorDescription(errorCode); + gp_list_unref(clist); + delete m_status; + m_status = 0; + return false; + } + + itemsList.append(TQFile::decodeName(cname)); + } + + gp_list_unref(clist); + + delete m_status; + m_status = 0; + + return true; +} + +bool GPCamera::getItemsInfoList(const TQString& folder, GPItemInfoList& items, bool /*getImageDimensions*/) +{ + int errorCode; + CameraList *clist; + const char *cname; + + if (m_status) + { + delete m_status; + m_status = 0; + } + m_status = new GPStatus; + + gp_list_new(&clist); + + errorCode = gp_camera_folder_list_files(d->camera, TQFile::encodeName(folder), clist, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get folder files list from camera!" << endl; + printGphotoErrorDescription(errorCode); + gp_list_unref(clist); + delete m_status; + m_status = 0; + return false; + } + + int count = gp_list_count(clist); + for (int i = 0 ; i < count ; i++) + { + errorCode = gp_list_get_name(clist, i, &cname); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get file name from camera!" << endl; + printGphotoErrorDescription(errorCode); + gp_list_unref(clist); + delete m_status; + m_status = 0; + return false; + } + + GPItemInfo itemInfo; + + itemInfo.name = TQFile::decodeName(cname); + itemInfo.folder = folder; + + CameraFileInfo info; + gp_camera_file_get_info(d->camera, TQFile::encodeName(folder), + cname, &info, m_status->context); + + itemInfo.mtime = -1; + itemInfo.mime = ""; + itemInfo.size = -1; + itemInfo.width = -1; + itemInfo.height = -1; + itemInfo.downloaded = GPItemInfo::DownloadUnknow; + itemInfo.readPermissions = -1; + itemInfo.writePermissions = -1; + + /* The mime type returned by Gphoto2 is dummy with all RAW files. + if (info.file.fields & GP_FILE_INFO_TYPE) + itemInfo.mime = info.file.type;*/ + + itemInfo.mime = mimeType(TQString(itemInfo.name.section('.', -1)).lower()); + + if (info.file.fields & GP_FILE_INFO_MTIME) + itemInfo.mtime = info.file.mtime; + + if (info.file.fields & GP_FILE_INFO_SIZE) + itemInfo.size = info.file.size; + + if (info.file.fields & GP_FILE_INFO_WIDTH) + itemInfo.width = info.file.width; + + if (info.file.fields & GP_FILE_INFO_HEIGHT) + itemInfo.height = info.file.height; + + if (info.file.fields & GP_FILE_INFO_STATUS) + { + if (info.file.status == GP_FILE_STATUS_DOWNLOADED) + itemInfo.downloaded = GPItemInfo::DownloadedYes; + } + + if (info.file.fields & GP_FILE_INFO_PERMISSIONS) + { + if (info.file.permissions & GP_FILE_PERM_READ) + itemInfo.readPermissions = 1; + else + itemInfo.readPermissions = 0; + if (info.file.permissions & GP_FILE_PERM_DELETE) + itemInfo.writePermissions = 1; + else + itemInfo.writePermissions = 0; + } + + items.append(itemInfo); + } + + gp_list_unref(clist); + + delete m_status; + m_status = 0; + + return true; +} + +bool GPCamera::getThumbnail(const TQString& folder, const TQString& itemName, TQImage& thumbnail) +{ + int errorCode; + CameraFile *cfile; + const char *data; + unsigned long int size; + + gp_file_new(&cfile); + + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + + errorCode = gp_camera_file_get(d->camera, TQFile::encodeName(folder), + TQFile::encodeName(itemName), + GP_FILE_TYPE_PREVIEW, + cfile, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get camera item!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + delete m_status; + m_status = 0; + return false; + } + + delete m_status; + m_status = 0; + + errorCode = gp_file_get_data_and_size(cfile, &data, &size); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get thumbnail from camera item!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + return false; + } + + thumbnail.loadFromData((const uchar*) data, (uint) size); + + gp_file_unref(cfile); + return true; +} + +bool GPCamera::getExif(const TQString& folder, const TQString& itemName, + char **edata, int& esize) +{ + int errorCode; + CameraFile *cfile; + const char *data; + unsigned long int size; + + gp_file_new(&cfile); + + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + + errorCode = gp_camera_file_get(d->camera, TQFile::encodeName(folder), + TQFile::encodeName(itemName), + GP_FILE_TYPE_EXIF, + cfile, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get camera item!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + delete m_status; + m_status = 0; + return false; + } + + delete m_status; + m_status = 0; + + errorCode = gp_file_get_data_and_size(cfile, &data, &size); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get Exif data from camera item!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + return false; + } + + *edata = new char[size]; + esize = size; + memcpy(*edata, data, size); + + gp_file_unref(cfile); + return true; +} + +bool GPCamera::downloadItem(const TQString& folder, const TQString& itemName, + const TQString& saveFile) +{ + int errorCode; + CameraFile *cfile; + + gp_file_new(&cfile); + + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + + errorCode = gp_camera_file_get(d->camera, TQFile::encodeName(folder), + TQFile::encodeName(itemName), + GP_FILE_TYPE_NORMAL, cfile, + m_status->context); + if ( errorCode != GP_OK) + { + DDebug() << "Failed to get camera item!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + delete m_status; + m_status = 0; + return false; + } + + delete m_status; + m_status = 0; + + errorCode = gp_file_save(cfile, TQFile::encodeName(saveFile)); + if (errorCode != GP_OK) + { + DDebug() << "Failed to save camera item!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + return false; + } + + gp_file_unref(cfile); + return true; +} + +bool GPCamera::setLockItem(const TQString& folder, const TQString& itemName, bool lock) +{ + int errorCode; + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + + CameraFileInfo info; + errorCode = gp_camera_file_get_info(d->camera, TQFile::encodeName(folder), + TQFile::encodeName(itemName), &info, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get camera item properties!" << endl; + printGphotoErrorDescription(errorCode); + delete m_status; + m_status = 0; + return false; + } + + if (info.file.fields & GP_FILE_INFO_PERMISSIONS) + { + if (lock) + { + // Lock the file to set read only flag + info.file.permissions = (CameraFilePermissions)GP_FILE_PERM_READ; + } + else + { + // Unlock the file to set read/write flag + info.file.permissions = (CameraFilePermissions)(GP_FILE_PERM_READ | GP_FILE_PERM_DELETE); + } + } + + // Some gphoto2 drivers need to have only the right flag at on to process properties update in camera. + info.file.fields = GP_FILE_INFO_PERMISSIONS; + info.preview.fields = GP_FILE_INFO_NONE; + info.audio.fields = GP_FILE_INFO_NONE; + + errorCode = gp_camera_file_set_info(d->camera, TQFile::encodeName(folder), + TQFile::encodeName(itemName), info, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to set camera item lock properties!" << endl; + printGphotoErrorDescription(errorCode); + delete m_status; + m_status = 0; + return false; + } + + delete m_status; + m_status = 0; + return true; +} + +bool GPCamera::deleteItem(const TQString& folder, const TQString& itemName) +{ + int errorCode; + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + + errorCode = gp_camera_file_delete(d->camera, TQFile::encodeName(folder), + TQFile::encodeName(itemName), + m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to delete camera item!" << endl; + printGphotoErrorDescription(errorCode); + delete m_status; + m_status = 0; + return false; + } + + delete m_status; + m_status = 0; + + return true; +} + +// recursively delete all items +bool GPCamera::deleteAllItems(const TQString& folder) +{ + int errorCode; + TQStringList folderList; + + // Get all subfolders in this folder + getSubFolders(folder, folderList); + + if (folderList.count() > 0) + { + for (unsigned int i = 0 ; i < folderList.count() ; i++) + { + TQString subFolder(folder); + + if (!subFolder.endsWith("/")) + subFolder += '/'; + + subFolder += folderList[i]; + deleteAllItems(subFolder); + } + } + + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + + errorCode = gp_camera_folder_delete_all(d->camera, TQFile::encodeName(folder), + m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to delete camera folder!" << endl; + printGphotoErrorDescription(errorCode); + delete m_status; + m_status = 0; + return false; + } + + delete m_status; + m_status = 0; + + return true; +} + +bool GPCamera::uploadItem(const TQString& folder, const TQString& itemName, const TQString& localFile, + GPItemInfo& itemInfo, bool /*getImageDimensions*/) +{ + int errorCode; + CameraFile *cfile; + + errorCode = gp_file_new(&cfile); + if (errorCode != GP_OK) + { + DDebug() << "Failed to init new camera file instance!" << endl; + printGphotoErrorDescription(errorCode); + return false; + } + + errorCode = gp_file_open(cfile, TQFile::encodeName(localFile)); + if (errorCode != GP_OK) + { + DDebug() << "Failed to open file!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + return false; + } + + errorCode = gp_file_set_name(cfile, TQFile::encodeName(itemName)); + if (errorCode != GP_OK) + { + DDebug() << "Failed to rename item from camera!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + return false; + } + + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + +#ifdef HAVE_GPHOTO25 + errorCode = gp_camera_folder_put_file(d->camera, + TQFile::encodeName(folder), + TQFile::encodeName(itemName), + GP_FILE_TYPE_NORMAL, + cfile, + m_status->context); +#else + errorCode = gp_camera_folder_put_file(d->camera, + TQFile::encodeName(folder), + cfile, + m_status->context); +#endif + if (errorCode != GP_OK) + { + DDebug() << "Failed to upload item to camera!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + delete m_status; + m_status = 0; + return false; + } + + // Get new camera item information. + + itemInfo.name = itemName; + itemInfo.folder = folder; + + CameraFileInfo info; + errorCode = gp_camera_file_get_info(d->camera, TQFile::encodeName(folder), + TQFile::encodeName(itemName), &info, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get camera item information!" << endl; + printGphotoErrorDescription(errorCode); + gp_file_unref(cfile); + delete m_status; + m_status = 0; + return false; + } + + itemInfo.mtime = -1; + itemInfo.mime = ""; + itemInfo.size = -1; + itemInfo.width = -1; + itemInfo.height = -1; + itemInfo.downloaded = GPItemInfo::DownloadUnknow; + itemInfo.readPermissions = -1; + itemInfo.writePermissions = -1; + + /* The mime type returned by Gphoto2 is dummy with all RAW files. + if (info.file.fields & GP_FILE_INFO_TYPE) + itemInfo.mime = info.file.type;*/ + + itemInfo.mime = mimeType(TQString(itemInfo.name.section('.', -1)).lower()); + + if (info.file.fields & GP_FILE_INFO_MTIME) + itemInfo.mtime = info.file.mtime; + + if (info.file.fields & GP_FILE_INFO_SIZE) + itemInfo.size = info.file.size; + + if (info.file.fields & GP_FILE_INFO_WIDTH) + itemInfo.width = info.file.width; + + if (info.file.fields & GP_FILE_INFO_HEIGHT) + itemInfo.height = info.file.height; + + if (info.file.fields & GP_FILE_INFO_STATUS) + { + if (info.file.status == GP_FILE_STATUS_DOWNLOADED) + itemInfo.downloaded = GPItemInfo::DownloadedYes; + else + itemInfo.downloaded = GPItemInfo::DownloadedNo; + } + + if (info.file.fields & GP_FILE_INFO_PERMISSIONS) + { + if (info.file.permissions & GP_FILE_PERM_READ) + itemInfo.readPermissions = 1; + else + itemInfo.readPermissions = 0; + if (info.file.permissions & GP_FILE_PERM_DELETE) + itemInfo.writePermissions = 1; + else + itemInfo.writePermissions = 0; + } + + gp_file_unref(cfile); + delete m_status; + m_status = 0; + return true; +} + +bool GPCamera::cameraSummary(TQString& summary) +{ + int errorCode; + CameraText sum; + + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + + errorCode = gp_camera_get_summary(d->camera, &sum, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get camera summary!" << endl; + printGphotoErrorDescription(errorCode); + delete m_status; + m_status = 0; + return false; + } + + summary = i18n("Title: %1\n" + "Model: %2\n" + "Port: %3\n" + "Path: %4\n\n" + "Thumbnails: %5\n" + "Delete items: %6\n" + "Upload items: %7\n" + "Create directories: %8\n" + "Delete directories: %9\n\n") + .arg(title()) + .arg(model()) + .arg(port()) + .arg(path()) + .arg(thumbnailSupport() ? i18n("yes") : i18n("no")) + .arg(deleteSupport() ? i18n("yes") : i18n("no")) + .arg(uploadSupport() ? i18n("yes") : i18n("no")) + .arg(mkDirSupport() ? i18n("yes") : i18n("no")) + .arg(delDirSupport() ? i18n("yes") : i18n("no")); + + summary.append(TQString(sum.text)); + + delete m_status; + m_status = 0; + return true; +} + +bool GPCamera::cameraManual(TQString& manual) +{ + int errorCode; + CameraText man; + + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + + errorCode = gp_camera_get_manual(d->camera, &man, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get camera manual!" << endl; + printGphotoErrorDescription(errorCode); + delete m_status; + m_status = 0; + return false; + } + + manual = TQString(man.text); + + delete m_status; + m_status = 0; + return true; +} + +bool GPCamera::cameraAbout(TQString& about) +{ + int errorCode; + CameraText abt; + + if (m_status) + { + delete m_status; + m_status = 0; + } + + m_status = new GPStatus; + + errorCode = gp_camera_get_about(d->camera, &abt, m_status->context); + if (errorCode != GP_OK) + { + DDebug() << "Failed to get information about camera!" << endl; + printGphotoErrorDescription(errorCode); + delete m_status; + m_status = 0; + return false; + } + + about = TQString(abt.text); + about.append(i18n("\n\nTo report problems about this driver, please contact " + "the gphoto2 team at:\n\nhttp://gphoto.org/bugs")); + + delete m_status; + m_status = 0; + return true; +} + +// -- Static methods --------------------------------------------------------------------- + +void GPCamera::printGphotoErrorDescription(int errorCode) +{ + DDebug() << "Libgphoto2 error: " << gp_result_as_string(errorCode) + << " (" << errorCode << ")" << endl; +} + +void GPCamera::getSupportedCameras(int& count, TQStringList& clist) +{ + clist.clear(); + count = 0; + + CameraAbilitiesList *abilList; + CameraAbilities abil; + GPContext *context; + + context = gp_context_new(); + + gp_abilities_list_new( &abilList ); + gp_abilities_list_load( abilList, context ); + + count = gp_abilities_list_count( abilList ); + if ( count < 0 ) + { + DDebug() << "Failed to get list of cameras!" << endl; + printGphotoErrorDescription(count); + gp_context_unref( context ); + return; + } + else + { + for (int i = 0 ; i < count ; i++) + { + gp_abilities_list_get_abilities( abilList, i, &abil ); + const char *cname = abil.model; + clist.append( TQString( cname ) ); + } + } + + gp_abilities_list_free( abilList ); + gp_context_unref( context ); +} + +void GPCamera::getSupportedPorts(TQStringList& plist) +{ + GPPortInfoList *list; + GPPortInfo info; + + plist.clear(); + + gp_port_info_list_new( &list ); + gp_port_info_list_load( list ); + + int numPorts = gp_port_info_list_count( list ); + if ( numPorts < 0) + { + DDebug() << "Failed to get list of port!" << endl; + printGphotoErrorDescription(numPorts); + gp_port_info_list_free( list ); + return; + } + else + { + for (int i = 0 ; i < numPorts ; i++) + { + gp_port_info_list_get_info( list, i, &info ); +#ifdef HAVE_GPHOTO25 + char *xpath; + gp_port_info_get_name( info, &xpath ); + plist.append( xpath ); +#else + plist.append( info.path ); +#endif + } + } + + gp_port_info_list_free( list ); +} + +void GPCamera::getCameraSupportedPorts(const TQString& model, TQStringList& plist) +{ + int i = 0; + plist.clear(); + + CameraAbilities abilities; + CameraAbilitiesList *abilList; + GPContext *context; + + context = gp_context_new(); + + gp_abilities_list_new (&abilList); + gp_abilities_list_load (abilList, context); + i = gp_abilities_list_lookup_model (abilList, model.local8Bit().data()); + gp_abilities_list_get_abilities (abilList, i, &abilities); + gp_abilities_list_free (abilList); + + if (abilities.port & GP_PORT_SERIAL) + plist.append("serial"); + + if (abilities.port & GP_PORT_USB) + plist.append("usb"); + + gp_context_unref( context ); +} + +int GPCamera::autoDetect(TQString& model, TQString& port) +{ + CameraList *camList; + CameraAbilitiesList *abilList; + GPPortInfoList *infoList; + const char *camModel_, *camPort_; + GPContext *context; + + context = gp_context_new(); + gp_list_new(&camList); + + gp_abilities_list_new(&abilList); + gp_abilities_list_load(abilList, context); + gp_port_info_list_new(&infoList); + gp_port_info_list_load(infoList); + gp_abilities_list_detect(abilList, infoList, camList, context); + gp_abilities_list_free(abilList); + gp_port_info_list_free(infoList); + + gp_context_unref(context); + + int count = gp_list_count(camList); + + if (count <= 0) + { + DDebug() << "Failed to autodetect camera!" << endl; + printGphotoErrorDescription(count); + gp_list_free(camList); + return -1; + } + + camModel_ = 0; + camPort_ = 0; + + for (int i = 0; i < count; i++) + { + if (gp_list_get_name(camList, i, &camModel_) != GP_OK) + { + DDebug() << "Failed to autodetect camera!" << endl; + gp_list_free(camList); + return -1; + } + + if (gp_list_get_value(camList, i, &camPort_) != GP_OK) + { + DDebug() << "Failed to autodetect camera!" << endl; + gp_list_free(camList); + return -1; + } + + if (camModel_ && camPort_) + { + model = TQString::fromLatin1(camModel_); + port = TQString::fromLatin1(camPort_); + gp_list_free(camList); + return 0; + } + } + + DDebug() << "Failed to autodetect camera!" << endl; + gp_list_free(camList); + return -1; +} + +} // namespace Digikam |