1
/* ============================================================
2
* Author: Renchi Raju <renchi@pooh.tam.uiuc.edu>
6
* Copyright 2003 by Renchi Raju
8
* This program is free software; you can redistribute it
9
* and/or modify it under the terms of the GNU General
10
* Public License as published by the Free Software Foundation;
11
* either version 2, or (at your option)
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* ============================================================ */
22
#include <qstringlist.h>
41
CameraAbilities cameraAbilities;
47
bool cameraInitialized;
49
bool thumbnailSupport;
62
context = gp_context_new();
64
gp_context_set_cancel_func(context, cancel_func, 0);
68
gp_context_unref(context);
75
static GPContextFeedback cancel_func(GPContext *,
77
return (cancel ? GP_CONTEXT_FEEDBACK_CANCEL :
78
GP_CONTEXT_FEEDBACK_OK);
82
bool GPStatus::cancel = false;
84
GPCamera::GPCamera(const QString& model,
87
: DKCamera(model, port, path)
91
d = new GPCameraPrivate;
98
d->cameraInitialized = false;
100
d->thumbnailSupport = false;
101
d->deleteSupport = false;
102
d->uploadSupport = false;
103
d->mkDirSupport = false;
104
d->delDirSupport = false;
107
GPCamera::~GPCamera()
110
gp_camera_unref(d->camera);
117
bool GPCamera::connect()
119
// -- first step - setup the camera --------------------
122
gp_camera_unref(d->camera);
126
CameraAbilitiesList *abilList;
127
GPPortInfoList *infoList;
130
gp_camera_new(&d->camera);
137
status = new GPStatus();
139
gp_abilities_list_new(&abilList);
140
gp_abilities_list_load(abilList, status->context);
141
gp_port_info_list_new(&infoList);
142
gp_port_info_list_load(infoList);
147
int modelNum = -1, portNum = -1;
148
modelNum = gp_abilities_list_lookup_model(abilList,
150
portNum = gp_port_info_list_lookup_path (infoList,
153
gp_abilities_list_get_abilities(abilList, modelNum,
154
&d->cameraAbilities);
156
if (gp_camera_set_abilities(d->camera, d->cameraAbilities)
158
gp_camera_unref(d->camera);
160
gp_abilities_list_free(abilList);
161
gp_port_info_list_free(infoList);
165
if (d->model != "Directory Browse") {
166
gp_port_info_list_get_info(infoList, portNum, &info);
167
if (gp_camera_set_port_info(d->camera, info) != GP_OK) {
168
gp_camera_unref(d->camera);
170
gp_abilities_list_free (abilList);
171
gp_port_info_list_free (infoList);
176
gp_abilities_list_free (abilList);
177
gp_port_info_list_free (infoList);
179
if (d->cameraAbilities.file_operations &
180
GP_FILE_OPERATION_PREVIEW)
181
d->thumbnailSupport = true;
183
if (d->cameraAbilities.file_operations &
184
GP_FILE_OPERATION_DELETE)
185
d->deleteSupport = true;
187
if (d->cameraAbilities.folder_operations &
188
GP_FOLDER_OPERATION_PUT_FILE)
189
d->uploadSupport = true;
191
if (d->cameraAbilities.folder_operations &
192
GP_FOLDER_OPERATION_MAKE_DIR)
193
d->mkDirSupport = true;
195
if (d->cameraAbilities.folder_operations &
196
GP_FOLDER_OPERATION_REMOVE_DIR)
197
d->delDirSupport = true;
199
// -- Now try to initialize the camera -----------------
202
status = new GPStatus();
204
// Try and initialize the camera to see if its connected
205
if (gp_camera_init(d->camera, status->context) != GP_OK) {
206
gp_camera_unref(d->camera);
216
d->cameraInitialized = true;
220
void GPCamera::cancel()
224
status->cancel = true;
227
bool GPCamera::thumbnailSupport()
229
return d->thumbnailSupport;
232
bool GPCamera::deleteSupport()
234
return d->deleteSupport;
237
bool GPCamera::uploadSupport()
239
return d->uploadSupport;
242
bool GPCamera::mkDirSupport()
244
return d->mkDirSupport;
247
bool GPCamera::delDirSupport()
249
return d->delDirSupport;
252
void GPCamera::getAllFolders(const QString& rootFolder,
253
QStringList& folderList)
255
QStringList subfolders;
256
getSubFolders(rootFolder, subfolders);
258
for (QStringList::iterator it = subfolders.begin();
259
it != subfolders.end(); ++it)
261
*it = rootFolder + QString(rootFolder.endsWith("/") ? "" : "/")
263
folderList.append(*it);
266
for (QStringList::iterator it = subfolders.begin();
267
it != subfolders.end(); ++it)
269
getAllFolders(*it, folderList);
273
bool GPCamera::getSubFolders(const QString& folder,
274
QStringList& subFolderList)
283
status = new GPStatus();
285
if (gp_camera_folder_list_folders(d->camera,
286
QFile::encodeName(folder),
287
clist, status->context)
290
gp_list_unref(clist);
299
int count = gp_list_count(clist);
300
for (int i=0; i<count; i++) {
302
const char* subFolder;
304
if (gp_list_get_name(clist, i, &subFolder) != GP_OK) {
305
gp_list_unref(clist);
309
subFolderList.append(QString(subFolder));
313
gp_list_unref(clist);
317
bool GPCamera::getItemsList(const QString& folder, QStringList& itemsList)
326
status = new GPStatus;
329
if (gp_camera_folder_list_files(d->camera, QFile::encodeName(folder),
331
status->context) != GP_OK) {
332
gp_list_unref(clist);
338
int count = gp_list_count(clist);
340
for (int i=0; i<count; i++)
342
if (gp_list_get_name(clist, i, &cname) != GP_OK)
344
gp_list_unref(clist);
350
itemsList.append(cname);
353
gp_list_unref(clist);
361
bool GPCamera::getItemsInfoList(const QString& folder, GPItemInfoList& items)
370
status = new GPStatus;
373
if (gp_camera_folder_list_files(d->camera, QFile::encodeName(folder),
375
status->context) != GP_OK) {
376
gp_list_unref(clist);
382
int count = gp_list_count(clist);
384
for (int i=0; i<count; i++)
386
if (gp_list_get_name(clist, i, &cname) != GP_OK)
388
gp_list_unref(clist);
396
itemInfo.name = cname;
397
itemInfo.folder = folder;
400
gp_camera_file_get_info(d->camera, QFile::encodeName(folder),
401
cname, &info, status->context);
407
itemInfo.height = -1;
408
itemInfo.downloaded = -1;
409
itemInfo.readPermissions = -1;
410
itemInfo.writePermissions = -1;
412
if (info.file.fields & GP_FILE_INFO_MTIME)
413
itemInfo.mtime = info.file.mtime;
415
if (info.file.fields & GP_FILE_INFO_TYPE)
416
itemInfo.mime = info.file.type;
418
if (info.file.fields & GP_FILE_INFO_SIZE)
419
itemInfo.size = info.file.size;
421
if (info.file.fields & GP_FILE_INFO_WIDTH)
422
itemInfo.width = info.file.width;
424
if (info.file.fields & GP_FILE_INFO_HEIGHT)
425
itemInfo.height = info.file.height;
427
if (info.file.fields & GP_FILE_INFO_STATUS) {
428
if (info.file.status == GP_FILE_STATUS_DOWNLOADED)
429
itemInfo.downloaded = 1;
431
itemInfo.downloaded = 0;
434
if (info.file.fields & GP_FILE_INFO_PERMISSIONS) {
435
if (info.file.permissions & GP_FILE_PERM_READ)
436
itemInfo.readPermissions = 1;
438
itemInfo.readPermissions = 0;
439
if (info.file.permissions & GP_FILE_PERM_DELETE)
440
itemInfo.writePermissions = 1;
442
itemInfo.writePermissions = 0;
445
items.append(itemInfo);
448
gp_list_unref(clist);
456
bool GPCamera::getThumbnail(const QString& folder,
457
const QString& itemName,
462
unsigned long int size;
471
status = new GPStatus;
473
if (gp_camera_file_get(d->camera, QFile::encodeName(folder),
474
QFile::encodeName(itemName),
475
GP_FILE_TYPE_PREVIEW,
476
cfile, status->context) != GP_OK) {
477
gp_file_unref(cfile);
486
gp_file_get_data_and_size(cfile, &data, &size);
487
thumbnail.loadFromData((const uchar*) data, (uint) size);
489
gp_file_unref (cfile);
493
bool GPCamera::getExif(const QString& folder,
494
const QString& itemName,
495
char **edata, int& esize)
499
unsigned long int size;
508
status = new GPStatus;
510
if (gp_camera_file_get(d->camera, QFile::encodeName(folder),
511
QFile::encodeName(itemName),
513
cfile, status->context) != GP_OK) {
514
gp_file_unref(cfile);
523
gp_file_get_data_and_size(cfile, &data, &size);
525
*edata = new char[size];
528
memcpy(*edata, data, size);
530
gp_file_unref(cfile);
535
bool GPCamera::downloadItem(const QString& folder,
536
const QString& itemName,
537
const QString& saveFile)
546
status = new GPStatus;
548
if (gp_camera_file_get(d->camera, QFile::encodeName(folder),
549
QFile::encodeName(itemName),
550
GP_FILE_TYPE_NORMAL, cfile,
551
status->context) != GP_OK) {
552
gp_file_unref(cfile);
560
if (gp_file_save(cfile, QFile::encodeName(saveFile)) != GP_OK) {
561
gp_file_unref(cfile);
564
gp_file_unref(cfile);
569
bool GPCamera::deleteItem(const QString& folder,
570
const QString& itemName)
576
status = new GPStatus;
578
if (gp_camera_file_delete(d->camera, QFile::encodeName(folder),
579
QFile::encodeName(itemName),
580
status->context) != GP_OK) {
592
// recursively delete all items
593
bool GPCamera::deleteAllItems(const QString& folder)
595
QStringList folderList;
597
// Get all subfolders in this folder
598
getSubFolders(folder, folderList);
600
if (folderList.count() > 0) {
601
for (unsigned int i=0; i<folderList.count(); i++) {
602
QString subFolder(folder);
603
if (!subFolder.endsWith("/"))
605
subFolder += folderList[i];
607
deleteAllItems(subFolder);
615
status = new GPStatus;
617
if (gp_camera_folder_delete_all(d->camera, QFile::encodeName(folder),
618
status->context) != GP_OK) {
629
bool GPCamera::uploadItem(const QString& folder,
630
const QString& itemName,
631
const QString& localFile)
636
if (gp_file_open(cfile, QFile::encodeName(localFile)) != GP_OK) {
637
gp_file_unref(cfile);
641
gp_file_set_name(cfile, QFile::encodeName(itemName));
647
status = new GPStatus;
649
if (gp_camera_folder_put_file(d->camera,
650
QFile::encodeName(folder),
652
status->context) != GP_OK) {
653
gp_file_unref(cfile);
659
gp_file_unref(cfile);
666
void GPCamera::cameraSummary(QString& summary)
675
status = new GPStatus;
676
gp_camera_get_summary(d->camera, &sum, status->context);
677
summary = QString(sum.text);
683
void GPCamera::cameraManual(QString& manual)
692
status = new GPStatus;
693
gp_camera_get_manual(d->camera, &man, status->context);
694
manual = QString(man.text);
700
void GPCamera::cameraAbout(QString& about)
709
status = new GPStatus;
710
gp_camera_get_about(d->camera, &abt, status->context);
711
about = QString(abt.text);
720
void GPCamera::getSupportedCameras(int& count, QStringList& clist)
725
CameraAbilitiesList *abilList;
726
CameraAbilities abil;
729
context = gp_context_new ();
731
gp_abilities_list_new( &abilList );
732
gp_abilities_list_load( abilList, context );
734
count = gp_abilities_list_count( abilList );
736
gp_context_unref( context );
737
qWarning("failed to get list of cameras");
741
for (int i=0; i<count; i++) {
743
gp_abilities_list_get_abilities( abilList, i, &abil );
745
clist.append( QString( cname ) );
749
gp_abilities_list_free( abilList );
750
gp_context_unref( context );
754
void GPCamera::getSupportedPorts(QStringList& plist)
756
GPPortInfoList *list;
761
gp_port_info_list_new( &list );
762
gp_port_info_list_load( list );
764
int numPorts = gp_port_info_list_count( list );
766
for (int i = 0; i < numPorts; i++) {
767
gp_port_info_list_get_info( list, i, &info );
768
plist.append( info.path );
771
gp_port_info_list_free( list );
775
void GPCamera::getCameraSupportedPorts(const QString& model,
781
CameraAbilities abilities;
782
CameraAbilitiesList *abilList;
785
context = gp_context_new ();
787
gp_abilities_list_new (&abilList);
788
gp_abilities_list_load (abilList, context);
789
i = gp_abilities_list_lookup_model (abilList,
790
model.local8Bit().data());
791
gp_abilities_list_get_abilities (abilList, i, &abilities);
792
gp_abilities_list_free (abilList);
794
if (abilities.port & GP_PORT_SERIAL)
795
plist.append("serial");
796
if (abilities.port & GP_PORT_USB)
799
gp_context_unref( context );
803
int GPCamera::autoDetect(QString& model, QString& port)
806
CameraAbilitiesList *abilList;
807
GPPortInfoList *infoList;
808
const char *camModel_, *camPort_;
811
context = gp_context_new ();
813
gp_abilities_list_new (&abilList);
814
gp_abilities_list_load (abilList, context);
815
gp_port_info_list_new (&infoList);
816
gp_port_info_list_load (infoList);
817
gp_abilities_list_detect (abilList, infoList,
819
gp_abilities_list_free (abilList);
820
gp_port_info_list_free (infoList);
822
gp_context_unref( context );
824
int count = gp_list_count (&camList);
830
for (int i = 0; i < count; i++) {
831
gp_list_get_name (&camList, i, &camModel_);
832
gp_list_get_value (&camList, i, &camPort_);
841
QString GPCamera::model() const
846
QString GPCamera::port() const
851
QString GPCamera::path() const
853
return d->globalPath;