running = 1; } static void _iptc_thread(void *data, Ecore_Thread *thread __UNUSED__) { Enlil_IPTC_Thread_Data *t_data = data; const char *file = t_data->file; IptcData *d; int i; LOG_INFO("Load IPTC data from the photo %s", file); d = iptc_data_new_from_jpeg(file); if(!d) goto end; for (i = 0; i < (int)d->count; i++) { IptcDataSet *e = d->datasets[i]; Enlil_IPTC *iptc = calloc(1, sizeof(Enlil_IPTC)); t_data->l = eina_list_append(t_data->l, iptc); char buf[256]; iptc->record = e->record; iptc->tag = e->tag; iptc->name = eina_stringshare_add(iptc_tag_get_name(e->record, e->tag)); iptc->title = eina_stringshare_add(iptc_tag_get_title(e->record, e->tag)); iptc->format = eina_stringshare_add(iptc_format_get_name(iptc_dataset_get_format (e)));
/* Function of no arguments returning new Data object */ static PyObject * open_file(PyObject *self, PyObject *args) { char *filename; int fd; DataObject *data_obj; unsigned char file_hdr[2], jpeg_hdr[2] = {0xff,0xd8}; if (!PyArg_ParseTuple(args, "s:new", &filename)) return NULL; /* check if the file exists first. We close this fd just * because, but maybe in the future there is a case for * keeping it around. */ fd = open(filename, O_RDONLY); if (fd < 0) return PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename); /* read the first 2 bytes, and check it looks like a jpeg */ if (read(fd, file_hdr, 2) < 2) { close(fd); return PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename); } if (memcmp(jpeg_hdr, file_hdr, 2) != 0) { close(fd); PyErr_SetString(PyExc_ValueError, "This file does not appear to be a JPEG file\n"); return NULL; } close(fd); data_obj = newDataObject(args); if (data_obj == NULL) return PyErr_NoMemory(); /* save the filename for later */ data_obj->filename = PyString_FromString(filename); if (!data_obj->filename) { Py_DECREF(data_obj); return PyErr_NoMemory(); } /* firstly, try and get the existing data */ data_obj->d = iptc_data_new_from_jpeg(filename); if (data_obj->d) { /* read the existing iptc data into the dataset objects */ int i; for (i=0; i < data_obj->d->count; i++) { IptcDataSet *e = data_obj->d->datasets[i]; DataSetObject *ds = newDataSetObject(e); /* XXX bail out? */ /* dataset objects hold a reference to their * parent dataobject */ ds->parent = data_obj; Py_INCREF(data_obj); ds->state = VALID; PyList_Append(data_obj->DataSet_list, (PyObject *)ds); } } else { /* create a new, empty data object */ data_obj->d = iptc_data_new(); if (!data_obj->d) return PyErr_NoMemory(); } data_obj->state = OPEN; return (PyObject*)data_obj; }