| // Protocol Buffers - Google's data interchange format |
| // Copyright 2008 Google Inc. All rights reserved. |
| // https://developers.google.com/protocol-buffers/ |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above |
| // copyright notice, this list of conditions and the following disclaimer |
| // in the documentation and/or other materials provided with the |
| // distribution. |
| // * Neither the name of Google Inc. nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| #include <Python.h> |
| |
| #include <google/protobuf/message_lite.h> |
| #include <google/protobuf/pyext/descriptor.h> |
| #include <google/protobuf/pyext/descriptor_pool.h> |
| #include <google/protobuf/pyext/message.h> |
| #include <google/protobuf/pyext/message_factory.h> |
| #include <google/protobuf/proto_api.h> |
| |
| namespace { |
| |
| // C++ API. Clients get at this via proto_api.h |
| struct ApiImplementation : google::protobuf::python::PyProto_API { |
| const google::protobuf::Message* GetMessagePointer(PyObject* msg) const override { |
| return google::protobuf::python::PyMessage_GetMessagePointer(msg); |
| } |
| google::protobuf::Message* GetMutableMessagePointer(PyObject* msg) const override { |
| return google::protobuf::python::PyMessage_GetMutableMessagePointer(msg); |
| } |
| const google::protobuf::Descriptor* MessageDescriptor_AsDescriptor( |
| PyObject* desc) const override { |
| return google::protobuf::python::PyMessageDescriptor_AsDescriptor(desc); |
| } |
| const google::protobuf::EnumDescriptor* EnumDescriptor_AsDescriptor( |
| PyObject* enum_desc) const override { |
| return google::protobuf::python::PyEnumDescriptor_AsDescriptor(enum_desc); |
| } |
| |
| const google::protobuf::DescriptorPool* GetDefaultDescriptorPool() const override { |
| return google::protobuf::python::GetDefaultDescriptorPool()->pool; |
| } |
| |
| google::protobuf::MessageFactory* GetDefaultMessageFactory() const override { |
| return google::protobuf::python::GetDefaultDescriptorPool() |
| ->py_message_factory->message_factory; |
| } |
| PyObject* NewMessage(const google::protobuf::Descriptor* descriptor, |
| PyObject* py_message_factory) const override { |
| return google::protobuf::python::PyMessage_New(descriptor, py_message_factory); |
| } |
| PyObject* NewMessageOwnedExternally( |
| google::protobuf::Message* msg, PyObject* py_message_factory) const override { |
| return google::protobuf::python::PyMessage_NewMessageOwnedExternally( |
| msg, py_message_factory); |
| } |
| PyObject* DescriptorPool_FromPool( |
| const google::protobuf::DescriptorPool* pool) const override { |
| return google::protobuf::python::PyDescriptorPool_FromPool(pool); |
| } |
| }; |
| |
| } // namespace |
| |
| static const char module_docstring[] = |
| "python-proto2 is a module that can be used to enhance proto2 Python API\n" |
| "performance.\n" |
| "\n" |
| "It provides access to the protocol buffers C++ reflection API that\n" |
| "implements the basic protocol buffer functions."; |
| |
| static PyMethodDef ModuleMethods[] = { |
| {"SetAllowOversizeProtos", |
| (PyCFunction)google::protobuf::python::cmessage::SetAllowOversizeProtos, METH_O, |
| "Enable/disable oversize proto parsing."}, |
| // DO NOT USE: For migration and testing only. |
| {NULL, NULL}}; |
| |
| #if PY_MAJOR_VERSION >= 3 |
| static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT, |
| "_message", |
| module_docstring, |
| -1, |
| ModuleMethods, /* m_methods */ |
| NULL, |
| NULL, |
| NULL, |
| NULL}; |
| #define INITFUNC PyInit__message |
| #define INITFUNC_ERRORVAL NULL |
| #else // Python 2 |
| #define INITFUNC init_message |
| #define INITFUNC_ERRORVAL |
| #endif |
| |
| PyMODINIT_FUNC INITFUNC() { |
| PyObject* m; |
| #if PY_MAJOR_VERSION >= 3 |
| m = PyModule_Create(&_module); |
| #else |
| m = Py_InitModule3("_message", ModuleMethods, module_docstring); |
| #endif |
| if (m == NULL) { |
| return INITFUNC_ERRORVAL; |
| } |
| |
| if (!google::protobuf::python::InitProto2MessageModule(m)) { |
| Py_DECREF(m); |
| return INITFUNC_ERRORVAL; |
| } |
| |
| // Adds the C++ API |
| if (PyObject* api = PyCapsule_New( |
| new ApiImplementation(), google::protobuf::python::PyProtoAPICapsuleName(), |
| [](PyObject* o) { |
| delete (ApiImplementation*)PyCapsule_GetPointer( |
| o, google::protobuf::python::PyProtoAPICapsuleName()); |
| })) { |
| PyModule_AddObject(m, "proto_API", api); |
| } else { |
| return INITFUNC_ERRORVAL; |
| } |
| |
| #if PY_MAJOR_VERSION >= 3 |
| return m; |
| #endif |
| } |