static gboolean parse_iptc (const unsigned char *buffer, size_t len, const gchar *uri, TrackerIptcData *data) { #ifdef HAVE_LIBIPTCDATA IptcData *iptc; #endif /* HAVE_LIBIPTCDATA */ memset (data, 0, sizeof (TrackerIptcData)); #ifdef HAVE_LIBIPTCDATA /* FIXME According to valgrind this is leaking (together with the unref). * Problem in libiptc (I replaced this with the _free equivalent) */ iptc = iptc_data_new (); if (!iptc) return FALSE; if (iptc_data_load (iptc, buffer, len) < 0) { iptc_data_free (iptc); return FALSE; } iptc_data_foreach_dataset (iptc, foreach_dataset, data); iptc_data_free (iptc); #endif /* HAVE_LIBIPTCDATA */ return TRUE; }
/* 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; }