Skip to content

Commit 742b190

Browse files
Define ErrorCode at compile time
This allows extra members added in newer versions of libexiv2 to be used when built against a newer version, and ignored when built against an older version.
1 parent 84b1a55 commit 742b190

15 files changed

Lines changed: 681 additions & 230 deletions

src/interface/error.i

Lines changed: 176 additions & 153 deletions
Large diffs are not rendered by default.

src/interface/shared/enum.i

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,17 @@ static PyObject* py_from_enum_%mangle(pattern)(long value) {
107107
}
108108
%enddef // _ENUM_COMMON
109109

110+
// Function to append a name, value pair to a list of enum members
111+
%fragment("extend_enum_list", "header") {
112+
static void extend_enum_list(PyObject* list, const char* label, int value) {
113+
PyObject* py_obj = Py_BuildValue("(si)", label, value);
114+
PyList_Append(list, py_obj);
115+
Py_DECREF(py_obj);
116+
};
117+
}
118+
110119
// Function to return enum members as Python list
111-
%fragment("get_enum_list", "header") {
120+
%fragment("get_enum_list", "header", fragment="extend_enum_list") {
112121
#include <cstdarg>
113122
static PyObject* _get_enum_list(int dummy, ...) {
114123
va_list args;
@@ -118,9 +127,7 @@ static PyObject* _get_enum_list(int dummy, ...) {
118127
PyObject* result = PyList_New(0);
119128
label = va_arg(args, char*);
120129
while (label) {
121-
py_obj = Py_BuildValue("(si)", label, va_arg(args, int));
122-
PyList_Append(result, py_obj);
123-
Py_DECREF(py_obj);
130+
extend_enum_list(result, label, va_arg(args, int));
124131
label = va_arg(args, char*);
125132
}
126133
va_end(args);
@@ -162,6 +169,16 @@ static PyObject* get_enum_typeobject_%mangle(Exiv2::name)() {
162169
}
163170
%enddef // IMPORT_ENUM
164171

172+
%define DEFINE_ENUM_FROM_FUNC(name, doc, func)
173+
IMPORT_ENUM(name)
174+
// Add enum to module during init
175+
%fragment("_create_enum_object"{Exiv2::name});
176+
%fragment("get_enum_list");
177+
%constant PyObject* name = _create_enum_%mangle(Exiv2::name)(
178+
"name", doc, func());
179+
%ignore Exiv2::name;
180+
%enddef // DEFINE_ENUM_FROM_FUNC
181+
165182
%define DEFINE_ENUM(name, doc, contents...)
166183
IMPORT_ENUM(name)
167184
// Add enum to module during init

src/swig-0_27_7/basicio_wrap.cxx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4420,6 +4420,13 @@ static void releasebuffer_Exiv2_BasicIo(
44204420
};
44214421

44224422

4423+
static void extend_enum_list(PyObject* list, const char* label, int value) {
4424+
PyObject* py_obj = Py_BuildValue("(si)", label, value);
4425+
PyList_Append(list, py_obj);
4426+
Py_DECREF(py_obj);
4427+
};
4428+
4429+
44234430

44244431
static PyObject* _get_enum_list(int dummy, ...) {
44254432
va_list args;
@@ -4429,9 +4436,7 @@ static PyObject* _get_enum_list(int dummy, ...) {
44294436
PyObject* result = PyList_New(0);
44304437
label = va_arg(args, char*);
44314438
while (label) {
4432-
py_obj = Py_BuildValue("(si)", label, va_arg(args, int));
4433-
PyList_Append(result, py_obj);
4434-
Py_DECREF(py_obj);
4439+
extend_enum_list(result, label, va_arg(args, int));
44354440
label = va_arg(args, char*);
44364441
}
44374442
va_end(args);

src/swig-0_27_7/error_wrap.cxx

Lines changed: 198 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4258,6 +4258,203 @@ static void log_to_python(int level, const char* msg) {
42584258
};
42594259

42604260

4261+
static void extend_enum_list(PyObject* list, const char* label, int value) {
4262+
PyObject* py_obj = Py_BuildValue("(si)", label, value);
4263+
PyList_Append(list, py_obj);
4264+
Py_DECREF(py_obj);
4265+
};
4266+
4267+
4268+
4269+
static PyObject* _get_enum_list(int dummy, ...) {
4270+
va_list args;
4271+
va_start(args, dummy);
4272+
char* label;
4273+
PyObject* py_obj = NULL;
4274+
PyObject* result = PyList_New(0);
4275+
label = va_arg(args, char*);
4276+
while (label) {
4277+
extend_enum_list(result, label, va_arg(args, int));
4278+
label = va_arg(args, char*);
4279+
}
4280+
va_end(args);
4281+
return result;
4282+
};
4283+
4284+
4285+
static PyObject* error_code_list() {
4286+
4287+
4288+
4289+
4290+
4291+
4292+
4293+
4294+
4295+
4296+
4297+
4298+
4299+
4300+
4301+
4302+
4303+
4304+
4305+
4306+
4307+
4308+
4309+
4310+
4311+
4312+
4313+
4314+
4315+
4316+
4317+
4318+
4319+
4320+
4321+
4322+
4323+
4324+
4325+
4326+
4327+
4328+
4329+
4330+
4331+
4332+
4333+
4334+
4335+
4336+
4337+
4338+
4339+
4340+
4341+
4342+
4343+
4344+
4345+
4346+
4347+
4348+
4349+
4350+
4351+
4352+
4353+
4354+
4355+
4356+
4357+
4358+
4359+
4360+
4361+
4362+
4363+
4364+
4365+
4366+
4367+
4368+
4369+
4370+
4371+
4372+
4373+
4374+
PyObject* result = _get_enum_list(
4375+
0,
4376+
"kerGeneralError", Exiv2::kerGeneralError,
4377+
"kerSuccess", Exiv2::kerSuccess,
4378+
"kerErrorMessage", Exiv2::kerErrorMessage,
4379+
"kerCallFailed", Exiv2::kerCallFailed,
4380+
"kerNotAnImage", Exiv2::kerNotAnImage,
4381+
"kerInvalidDataset", Exiv2::kerInvalidDataset,
4382+
"kerInvalidRecord", Exiv2::kerInvalidRecord,
4383+
"kerInvalidKey", Exiv2::kerInvalidKey,
4384+
"kerInvalidTag", Exiv2::kerInvalidTag,
4385+
"kerValueNotSet", Exiv2::kerValueNotSet,
4386+
"kerDataSourceOpenFailed", Exiv2::kerDataSourceOpenFailed,
4387+
"kerFileOpenFailed", Exiv2::kerFileOpenFailed,
4388+
"kerFileContainsUnknownImageType",
4389+
Exiv2::kerFileContainsUnknownImageType,
4390+
"kerMemoryContainsUnknownImageType",
4391+
Exiv2::kerMemoryContainsUnknownImageType,
4392+
"kerUnsupportedImageType", Exiv2::kerUnsupportedImageType,
4393+
"kerFailedToReadImageData", Exiv2::kerFailedToReadImageData,
4394+
"kerNotAJpeg", Exiv2::kerNotAJpeg,
4395+
"kerFailedToMapFileForReadWrite",
4396+
Exiv2::kerFailedToMapFileForReadWrite,
4397+
"kerFileRenameFailed", Exiv2::kerFileRenameFailed,
4398+
"kerTransferFailed", Exiv2::kerTransferFailed,
4399+
"kerMemoryTransferFailed", Exiv2::kerMemoryTransferFailed,
4400+
"kerInputDataReadFailed", Exiv2::kerInputDataReadFailed,
4401+
"kerImageWriteFailed", Exiv2::kerImageWriteFailed,
4402+
"kerNoImageInInputData", Exiv2::kerNoImageInInputData,
4403+
"kerInvalidIfdId", Exiv2::kerInvalidIfdId,
4404+
"kerValueTooLarge", Exiv2::kerValueTooLarge,
4405+
"kerDataAreaValueTooLarge", Exiv2::kerDataAreaValueTooLarge,
4406+
"kerOffsetOutOfRange", Exiv2::kerOffsetOutOfRange,
4407+
"kerUnsupportedDataAreaOffsetType",
4408+
Exiv2::kerUnsupportedDataAreaOffsetType,
4409+
"kerInvalidCharset", Exiv2::kerInvalidCharset,
4410+
"kerUnsupportedDateFormat", Exiv2::kerUnsupportedDateFormat,
4411+
"kerUnsupportedTimeFormat", Exiv2::kerUnsupportedTimeFormat,
4412+
"kerWritingImageFormatUnsupported",
4413+
Exiv2::kerWritingImageFormatUnsupported,
4414+
"kerInvalidSettingForImage", Exiv2::kerInvalidSettingForImage,
4415+
"kerNotACrwImage", Exiv2::kerNotACrwImage,
4416+
"kerFunctionNotSupported", Exiv2::kerFunctionNotSupported,
4417+
"kerNoNamespaceInfoForXmpPrefix",
4418+
Exiv2::kerNoNamespaceInfoForXmpPrefix,
4419+
"kerNoPrefixForNamespace", Exiv2::kerNoPrefixForNamespace,
4420+
"kerTooLargeJpegSegment", Exiv2::kerTooLargeJpegSegment,
4421+
"kerUnhandledXmpdatum", Exiv2::kerUnhandledXmpdatum,
4422+
"kerUnhandledXmpNode", Exiv2::kerUnhandledXmpNode,
4423+
"kerXMPToolkitError", Exiv2::kerXMPToolkitError,
4424+
"kerDecodeLangAltPropertyFailed",
4425+
Exiv2::kerDecodeLangAltPropertyFailed,
4426+
"kerDecodeLangAltQualifierFailed",
4427+
Exiv2::kerDecodeLangAltQualifierFailed,
4428+
"kerEncodeLangAltPropertyFailed",
4429+
Exiv2::kerEncodeLangAltPropertyFailed,
4430+
"kerPropertyNameIdentificationFailed",
4431+
Exiv2::kerPropertyNameIdentificationFailed,
4432+
"kerSchemaNamespaceNotRegistered",
4433+
Exiv2::kerSchemaNamespaceNotRegistered,
4434+
"kerNoNamespaceForPrefix", Exiv2::kerNoNamespaceForPrefix,
4435+
"kerAliasesNotSupported", Exiv2::kerAliasesNotSupported,
4436+
"kerInvalidXmpText", Exiv2::kerInvalidXmpText,
4437+
"kerTooManyTiffDirectoryEntries",
4438+
Exiv2::kerTooManyTiffDirectoryEntries,
4439+
"kerMultipleTiffArrayElementTagsInDirectory",
4440+
Exiv2::kerMultipleTiffArrayElementTagsInDirectory,
4441+
"kerWrongTiffArrayElementTagType",
4442+
Exiv2::kerWrongTiffArrayElementTagType,
4443+
"kerInvalidKeyXmpValue", Exiv2::kerInvalidKeyXmpValue,
4444+
"kerInvalidIccProfile", Exiv2::kerInvalidIccProfile,
4445+
"kerInvalidXMP", Exiv2::kerInvalidXMP,
4446+
"kerTiffDirectoryTooLarge", Exiv2::kerTiffDirectoryTooLarge,
4447+
"kerInvalidTypeValue", Exiv2::kerInvalidTypeValue,
4448+
"kerInvalidMalloc", Exiv2::kerInvalidMalloc,
4449+
"kerCorruptedMetadata", Exiv2::kerCorruptedMetadata,
4450+
"kerArithmeticOverflow", Exiv2::kerArithmeticOverflow,
4451+
"kerMallocFailed", Exiv2::kerMallocFailed,
4452+
NULL);
4453+
4454+
return result;
4455+
}
4456+
4457+
42614458
static PyObject* Py_IntEnum = NULL;
42624459

42634460

@@ -4286,25 +4483,6 @@ static PyObject* _create_enum_Exiv2_ErrorCode(
42864483
};
42874484

42884485

4289-
4290-
static PyObject* _get_enum_list(int dummy, ...) {
4291-
va_list args;
4292-
va_start(args, dummy);
4293-
char* label;
4294-
PyObject* py_obj = NULL;
4295-
PyObject* result = PyList_New(0);
4296-
label = va_arg(args, char*);
4297-
while (label) {
4298-
py_obj = Py_BuildValue("(si)", label, va_arg(args, int));
4299-
PyList_Append(result, py_obj);
4300-
Py_DECREF(py_obj);
4301-
label = va_arg(args, char*);
4302-
}
4303-
va_end(args);
4304-
return result;
4305-
};
4306-
4307-
43084486
static PyObject* PyEnum_Exiv2_LogMsg_Level = NULL;
43094487

43104488

@@ -5407,7 +5585,7 @@ SWIG_init(void) {
54075585
}
54085586

54095587
SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "ErrorCode",_create_enum_Exiv2_ErrorCode(
5410-
"ErrorCode", "Complete list of all Exiv2 error codes.", _get_enum_list(0, "kerGeneralError",Exiv2::kerGeneralError,"kerSuccess",Exiv2::kerSuccess,"kerErrorMessage",Exiv2::kerErrorMessage,"kerCallFailed",Exiv2::kerCallFailed,"kerNotAnImage",Exiv2::kerNotAnImage,"kerInvalidDataset",Exiv2::kerInvalidDataset,"kerInvalidRecord",Exiv2::kerInvalidRecord,"kerInvalidKey",Exiv2::kerInvalidKey,"kerInvalidTag",Exiv2::kerInvalidTag,"kerValueNotSet",Exiv2::kerValueNotSet,"kerDataSourceOpenFailed",Exiv2::kerDataSourceOpenFailed,"kerFileOpenFailed",Exiv2::kerFileOpenFailed,"kerFileContainsUnknownImageType",Exiv2::kerFileContainsUnknownImageType,"kerMemoryContainsUnknownImageType",Exiv2::kerMemoryContainsUnknownImageType,"kerUnsupportedImageType",Exiv2::kerUnsupportedImageType,"kerFailedToReadImageData",Exiv2::kerFailedToReadImageData,"kerNotAJpeg",Exiv2::kerNotAJpeg,"kerFailedToMapFileForReadWrite",Exiv2::kerFailedToMapFileForReadWrite,"kerFileRenameFailed",Exiv2::kerFileRenameFailed,"kerTransferFailed",Exiv2::kerTransferFailed,"kerMemoryTransferFailed",Exiv2::kerMemoryTransferFailed,"kerInputDataReadFailed",Exiv2::kerInputDataReadFailed,"kerImageWriteFailed",Exiv2::kerImageWriteFailed,"kerNoImageInInputData",Exiv2::kerNoImageInInputData,"kerInvalidIfdId",Exiv2::kerInvalidIfdId,"kerValueTooLarge",Exiv2::kerValueTooLarge,"kerDataAreaValueTooLarge",Exiv2::kerDataAreaValueTooLarge,"kerOffsetOutOfRange",Exiv2::kerOffsetOutOfRange,"kerUnsupportedDataAreaOffsetType",Exiv2::kerUnsupportedDataAreaOffsetType,"kerInvalidCharset",Exiv2::kerInvalidCharset,"kerUnsupportedDateFormat",Exiv2::kerUnsupportedDateFormat,"kerUnsupportedTimeFormat",Exiv2::kerUnsupportedTimeFormat,"kerWritingImageFormatUnsupported",Exiv2::kerWritingImageFormatUnsupported,"kerInvalidSettingForImage",Exiv2::kerInvalidSettingForImage,"kerNotACrwImage",Exiv2::kerNotACrwImage,"kerFunctionNotSupported",Exiv2::kerFunctionNotSupported,"kerNoNamespaceInfoForXmpPrefix",Exiv2::kerNoNamespaceInfoForXmpPrefix,"kerNoPrefixForNamespace",Exiv2::kerNoPrefixForNamespace,"kerTooLargeJpegSegment",Exiv2::kerTooLargeJpegSegment,"kerUnhandledXmpdatum",Exiv2::kerUnhandledXmpdatum,"kerUnhandledXmpNode",Exiv2::kerUnhandledXmpNode,"kerXMPToolkitError",Exiv2::kerXMPToolkitError,"kerDecodeLangAltPropertyFailed",Exiv2::kerDecodeLangAltPropertyFailed,"kerDecodeLangAltQualifierFailed",Exiv2::kerDecodeLangAltQualifierFailed,"kerEncodeLangAltPropertyFailed",Exiv2::kerEncodeLangAltPropertyFailed,"kerPropertyNameIdentificationFailed",Exiv2::kerPropertyNameIdentificationFailed,"kerSchemaNamespaceNotRegistered",Exiv2::kerSchemaNamespaceNotRegistered,"kerNoNamespaceForPrefix",Exiv2::kerNoNamespaceForPrefix,"kerAliasesNotSupported",Exiv2::kerAliasesNotSupported,"kerInvalidXmpText",Exiv2::kerInvalidXmpText,"kerTooManyTiffDirectoryEntries",Exiv2::kerTooManyTiffDirectoryEntries,"kerMultipleTiffArrayElementTagsInDirectory",Exiv2::kerMultipleTiffArrayElementTagsInDirectory,"kerWrongTiffArrayElementTagType",Exiv2::kerWrongTiffArrayElementTagType,"kerInvalidKeyXmpValue",Exiv2::kerInvalidKeyXmpValue,"kerInvalidIccProfile",Exiv2::kerInvalidIccProfile,"kerInvalidXMP",Exiv2::kerInvalidXMP,"kerTiffDirectoryTooLarge",Exiv2::kerTiffDirectoryTooLarge,"kerInvalidTypeValue",Exiv2::kerInvalidTypeValue,"kerInvalidMalloc",Exiv2::kerInvalidMalloc,"kerCorruptedMetadata",Exiv2::kerCorruptedMetadata,"kerArithmeticOverflow",Exiv2::kerArithmeticOverflow,"kerMallocFailed",Exiv2::kerMallocFailed, NULL)));
5588+
"ErrorCode", "Complete list of all Exiv2 error codes.", error_code_list()));
54115589

54125590
/* type 'Exiv2::LogMsg' */
54135591
d = PyDict_New();

src/swig-0_27_7/image_wrap.cxx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4604,6 +4604,13 @@ static PyObject* _create_enum_Exiv2_ImageType(
46044604
};
46054605

46064606

4607+
static void extend_enum_list(PyObject* list, const char* label, int value) {
4608+
PyObject* py_obj = Py_BuildValue("(si)", label, value);
4609+
PyList_Append(list, py_obj);
4610+
Py_DECREF(py_obj);
4611+
};
4612+
4613+
46074614

46084615
static PyObject* _get_enum_list(int dummy, ...) {
46094616
va_list args;
@@ -4613,9 +4620,7 @@ static PyObject* _get_enum_list(int dummy, ...) {
46134620
PyObject* result = PyList_New(0);
46144621
label = va_arg(args, char*);
46154622
while (label) {
4616-
py_obj = Py_BuildValue("(si)", label, va_arg(args, int));
4617-
PyList_Append(result, py_obj);
4618-
Py_DECREF(py_obj);
4623+
extend_enum_list(result, label, va_arg(args, int));
46194624
label = va_arg(args, char*);
46204625
}
46214626
va_end(args);

src/swig-0_27_7/properties_wrap.cxx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4380,6 +4380,13 @@ static PyObject* _create_enum_Exiv2_XmpCategory(
43804380
};
43814381

43824382

4383+
static void extend_enum_list(PyObject* list, const char* label, int value) {
4384+
PyObject* py_obj = Py_BuildValue("(si)", label, value);
4385+
PyList_Append(list, py_obj);
4386+
Py_DECREF(py_obj);
4387+
};
4388+
4389+
43834390

43844391
static PyObject* _get_enum_list(int dummy, ...) {
43854392
va_list args;
@@ -4389,9 +4396,7 @@ static PyObject* _get_enum_list(int dummy, ...) {
43894396
PyObject* result = PyList_New(0);
43904397
label = va_arg(args, char*);
43914398
while (label) {
4392-
py_obj = Py_BuildValue("(si)", label, va_arg(args, int));
4393-
PyList_Append(result, py_obj);
4394-
Py_DECREF(py_obj);
4399+
extend_enum_list(result, label, va_arg(args, int));
43954400
label = va_arg(args, char*);
43964401
}
43974402
va_end(args);

src/swig-0_27_7/types_wrap.cxx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4487,6 +4487,13 @@ static PyObject* _create_enum_Exiv2_AccessMode(
44874487
};
44884488

44894489

4490+
static void extend_enum_list(PyObject* list, const char* label, int value) {
4491+
PyObject* py_obj = Py_BuildValue("(si)", label, value);
4492+
PyList_Append(list, py_obj);
4493+
Py_DECREF(py_obj);
4494+
};
4495+
4496+
44904497

44914498
static PyObject* _get_enum_list(int dummy, ...) {
44924499
va_list args;
@@ -4496,9 +4503,7 @@ static PyObject* _get_enum_list(int dummy, ...) {
44964503
PyObject* result = PyList_New(0);
44974504
label = va_arg(args, char*);
44984505
while (label) {
4499-
py_obj = Py_BuildValue("(si)", label, va_arg(args, int));
4500-
PyList_Append(result, py_obj);
4501-
Py_DECREF(py_obj);
4506+
extend_enum_list(result, label, va_arg(args, int));
45024507
label = va_arg(args, char*);
45034508
}
45044509
va_end(args);

0 commit comments

Comments
 (0)