1 /******************************************************************************
2  *
3  * Project:  GDAL Core
4  * Purpose:  Python interface
5  * Author:   Even Rouault, <even dot rouault at spatialys dot com>
6  *
7  ******************************************************************************
8  * Copyright (c) 2017-2019, Even Rouault, <even dot rouault at spatialys dot com>
9  *
10  * Permission is hereby granted, free of charge, to any person obtaining a
11  * copy of this software and associated documentation files (the "Software"),
12  * to deal in the Software without restriction, including without limitation
13  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14  * and/or sell copies of the Software, and to permit persons to whom the
15  * Software is furnished to do so, subject to the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be included
18  * in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26  * DEALINGS IN THE SOFTWARE.
27  ****************************************************************************/
28 
29 #ifndef GDALPYTHON_H_INCLUDED
30 #define GDALPYTHON_H_INCLUDED
31 
32 #include "cpl_string.h"
33 
34 bool GDALPythonInitialize();
35 
36 void GDALPythonFinalize();
37 
38 //! @cond Doxygen_Suppress
39 
40 // Subset of Python API defined as function pointers
41 // Only use the below function pointers if GDALPythonInitialize() succeeds
42 namespace GDALPy
43 {
44     typedef struct _object PyObject;
45     typedef size_t Py_ssize_t;
46 
47     extern int (*Py_IsInitialized)(void);
48     extern void (*Py_SetProgramName)(const char*);
49     extern PyObject* (*PyObject_Type)(PyObject*);
50     extern int (*PyObject_IsInstance)(PyObject*, PyObject*);
51     extern PyObject* (*PyTuple_New)(size_t);
52     extern PyObject* (*PyBool_FromLong)(long);
53     extern PyObject* (*PyLong_FromLong)(long);
54     extern long (*PyLong_AsLong)(PyObject *);
55     extern PyObject* (*PyLong_FromLongLong)(GIntBig);
56     extern GIntBig (*PyLong_AsLongLong)(PyObject *);
57     extern PyObject* (*PyFloat_FromDouble)(double);
58     extern double (*PyFloat_AsDouble)(PyObject*);
59     extern PyObject* (*PyObject_Call)(PyObject*, PyObject*, PyObject*);
60     extern PyObject* (*PyObject_GetIter)(PyObject*);
61     extern PyObject* (*PyIter_Next)(PyObject*);
62     extern void (*Py_IncRef)(PyObject*);
63     extern void (*Py_DecRef)(PyObject*);
64     extern PyObject* (*PyErr_Occurred)(void);
65     extern void (*PyErr_Print)(void);
66 
67     extern PyObject* (*Py_CompileString)(const char*, const char*, int);
68     extern PyObject* (*PyImport_ExecCodeModule)(const char*, PyObject*);
69     extern int (*PyObject_HasAttrString)(PyObject*, const char*);
70     extern PyObject* (*PyObject_GetAttrString)(PyObject*, const char*);
71     extern int (*PyObject_SetAttrString)(PyObject*, const char*, PyObject*);
72     extern int (*PyTuple_SetItem)(PyObject *, size_t, PyObject *);
73     extern void (*PyObject_Print)(PyObject*,FILE*,int);
74 
75     extern Py_ssize_t (*PyBytes_Size)(PyObject *);
76     extern const char* (*PyBytes_AsString)(PyObject*);
77     extern PyObject* (*PyBytes_FromStringAndSize)(const void*, size_t);
78 
79     extern PyObject* (*PyUnicode_FromString)(const char*);
80     extern PyObject* (*PyUnicode_AsUTF8String)(PyObject *);
81     extern PyObject* (*PyImport_ImportModule)(const char*);
82     extern int (*PyCallable_Check)(PyObject*);
83     extern PyObject* (*PyDict_New)(void);
84     extern int (*PyDict_SetItemString)(PyObject *p, const char *key,
85                                     PyObject *val);
86     extern int (*PyDict_Next)(PyObject *p, size_t *, PyObject **, PyObject **);
87     extern PyObject* (*PyDict_GetItemString)(PyObject *p, const char *key);
88     extern PyObject* (*PyList_New)(Py_ssize_t);
89     extern int (*PyList_SetItem)(PyObject *, Py_ssize_t , PyObject *);
90     extern int (*PyArg_ParseTuple)(PyObject *, const char *, ...);
91 
92     extern int (*PySequence_Check)(PyObject *o);
93     extern Py_ssize_t (*PySequence_Size)(PyObject *o);
94     extern PyObject* (*PySequence_GetItem)(PyObject *o, Py_ssize_t i);
95 
96     extern void (*PyErr_Fetch)(PyObject **poPyType, PyObject **poPyValue,
97                             PyObject **poPyTraceback);
98     extern void (*PyErr_Clear)(void);
99     extern const char* (*Py_GetVersion)(void);
100 
101     typedef struct
102     {
103         //cppcheck-suppress unusedStructMember
104         char big_enough[256];
105     } Py_buffer;
106     extern int (*PyBuffer_FillInfo)(Py_buffer *view, PyObject *obj, void *buf,
107                                     size_t len, int readonly, int infoflags);
108     extern PyObject* (*PyMemoryView_FromBuffer)(Py_buffer *view);
109 
110 
111     typedef PyObject* (*PyCFunction)(PyObject*, PyObject*, PyObject*);
112 
113     typedef struct PyMethodDef PyMethodDef;
114     struct PyMethodDef
115     {
116         const char* name;
117         PyCFunction function;
118         int flags;
119         const char* help;
120     };
121     extern PyObject * (*PyModule_Create2)(struct PyModuleDef*, int);
122 
123     #define PYTHON_API_VERSION 1013
124 
125     /* Flag passed to newmethodobject */
126     #define METH_VARARGS  0x0001
127     #define METH_KEYWORDS 0x0002
128 
129     #define _PyObject_HEAD_EXTRA
130 
131     struct _object {
132         _PyObject_HEAD_EXTRA
133         Py_ssize_t ob_refcnt;
134         void /*struct _typeobject*/ *ob_type;
135     };
136 
137     #define PyObject_HEAD PyObject ob_base;
138 
139     #define _PyObject_EXTRA_INIT
140 
141     #define PyObject_HEAD_INIT(type)        \
142         { _PyObject_EXTRA_INIT              \
143         1, type },
144 
145 
146     #define PyModuleDef_HEAD_INIT { \
147         PyObject_HEAD_INIT(nullptr)    \
148         nullptr, /* m_init */          \
149         0,    /* m_index */         \
150         nullptr, /* m_copy */          \
151     }
152 
153     typedef struct PyModuleDef_Base {
154         PyObject_HEAD
155         PyObject* (*m_init)(void);
156         Py_ssize_t m_index;
157         PyObject* m_copy;
158     } PyModuleDef_Base;
159 
160     typedef void* traverseproc;
161     typedef void* inquiry;
162     typedef void* freefunc;
163 
164     typedef struct PyModuleDef{
165         PyModuleDef_Base m_base;
166         const char* m_name;
167         const char* m_doc;
168         Py_ssize_t m_size;
169         const PyMethodDef *m_methods;
170         struct PyModuleDef_Slot* m_slots;
171         traverseproc m_traverse;
172         inquiry m_clear;
173         freefunc m_free;
174     } PyModuleDef;
175 
176     #define Py_file_input 257
177 
178     typedef int PyGILState_STATE;
179     class GIL_Holder
180     {
181             bool             m_bExclusiveLock;
182             PyGILState_STATE m_eState = 0;
183 
184         public:
185 
186             explicit GIL_Holder(bool bExclusiveLock);
187             virtual ~GIL_Holder();
188     };
189 
190     CPLString GetString(PyObject* obj, bool bEmitError = true);
191     CPLString GetPyExceptionString();
192     bool ErrOccurredEmitCPLError();
193 
194 } // namespace GDALPy
195 
196 //! @endcond
197 
198 #endif
199