summaryrefslogtreecommitdiff
path: root/python/modules/IcePy/Properties.cpp
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2015-03-21 15:35:40 -0230
committerMatthew Newhook <matthew@zeroc.com>2015-03-21 15:35:40 -0230
commit630a37d2fe66f24518299e705f958b571803c522 (patch)
tree969723791bdc4d73bb099c19d45554d0ca241ad9 /python/modules/IcePy/Properties.cpp
parentFix some README.md markdown formatting (diff)
downloadice-630a37d2fe66f24518299e705f958b571803c522.tar.bz2
ice-630a37d2fe66f24518299e705f958b571803c522.tar.xz
ice-630a37d2fe66f24518299e705f958b571803c522.zip
py -> python
rb -> ruby objc -> objective-c cs -> csharp
Diffstat (limited to 'python/modules/IcePy/Properties.cpp')
-rw-r--r--python/modules/IcePy/Properties.cpp804
1 files changed, 804 insertions, 0 deletions
diff --git a/python/modules/IcePy/Properties.cpp b/python/modules/IcePy/Properties.cpp
new file mode 100644
index 00000000000..d990e2500ec
--- /dev/null
+++ b/python/modules/IcePy/Properties.cpp
@@ -0,0 +1,804 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifdef _WIN32
+# include <IceUtil/Config.h>
+#endif
+#include <Properties.h>
+#include <Util.h>
+#include <Ice/Initialize.h>
+#include <Ice/Properties.h>
+
+using namespace std;
+using namespace IcePy;
+
+namespace IcePy
+{
+
+struct PropertiesObject
+{
+ PyObject_HEAD
+ Ice::PropertiesPtr* properties;
+};
+
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PropertiesObject*
+propertiesNew(PyTypeObject* type, PyObject* /*args*/, PyObject* /*kwds*/)
+{
+ PropertiesObject* self = reinterpret_cast<PropertiesObject*>(type->tp_alloc(type, 0));
+ if(!self)
+ {
+ return 0;
+ }
+ self->properties = 0;
+ return self;
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static int
+propertiesInit(PropertiesObject* self, PyObject* args, PyObject* /*kwds*/)
+{
+ PyObject* arglist = 0;
+ PyObject* defaultsObj = 0;
+
+ if(!PyArg_ParseTuple(args, STRCAST("|OO"), &arglist, &defaultsObj))
+ {
+ return -1;
+ }
+
+ Ice::StringSeq seq;
+ if(arglist)
+ {
+ PyTypeObject* listType = &PyList_Type; // Necessary to prevent GCC's strict-alias warnings.
+ if(PyObject_IsInstance(arglist, reinterpret_cast<PyObject*>(listType)))
+ {
+ if(!listToStringSeq(arglist, seq))
+ {
+ return -1;
+ }
+ }
+ else if(arglist != Py_None)
+ {
+ PyErr_Format(PyExc_ValueError, STRCAST("args must be None or a list"));
+ return -1;
+ }
+ }
+
+ Ice::PropertiesPtr defaults;
+ if(defaultsObj)
+ {
+ PyObject* propType = lookupType("Ice.PropertiesI");
+ assert(propType);
+ if(PyObject_IsInstance(defaultsObj, propType))
+ {
+ PyObjectHandle impl = PyObject_GetAttrString(defaultsObj, STRCAST("_impl"));
+ defaults = getProperties(impl.get());
+ }
+ else if(defaultsObj != Py_None)
+ {
+ PyErr_Format(PyExc_ValueError, STRCAST("defaults must be None or a Ice.Properties"));
+ return -1;
+ }
+ }
+
+ Ice::PropertiesPtr props;
+ try
+ {
+ if(defaults || (arglist && arglist != Py_None))
+ {
+ props = Ice::createProperties(seq, defaults);
+ }
+ else
+ {
+ props = Ice::createProperties();
+ }
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return -1;
+ }
+
+ //
+ // Replace the contents of the given argument list with the filtered arguments.
+ //
+ if(arglist && arglist != Py_None)
+ {
+ if(PyList_SetSlice(arglist, 0, PyList_Size(arglist), 0) < 0)
+ {
+ return -1;
+ }
+ if(!stringSeqToList(seq, arglist))
+ {
+ return -1;
+ }
+ }
+
+ self->properties = new Ice::PropertiesPtr(props);
+
+ return 0;
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static void
+propertiesDealloc(PropertiesObject* self)
+{
+ delete self->properties;
+ Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesStr(PropertiesObject* self)
+{
+ assert(self->properties);
+
+ Ice::PropertyDict dict;
+ try
+ {
+ dict = (*self->properties)->getPropertiesForPrefix("");
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ string str;
+ for(Ice::PropertyDict::const_iterator p = dict.begin(); p != dict.end(); ++p)
+ {
+ if(p != dict.begin())
+ {
+ str.append("\n");
+ }
+ str.append(p->first + "=" + p->second);
+ }
+
+ return createString(str);
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesGetProperty(PropertiesObject* self, PyObject* args)
+{
+ PyObject* keyObj;
+ if(!PyArg_ParseTuple(args, STRCAST("O"), &keyObj))
+ {
+ return 0;
+ }
+
+ string key;
+ if(!getStringArg(keyObj, "key", key))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ string value;
+ try
+ {
+ value = (*self->properties)->getProperty(key);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ return createString(value);
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesGetPropertyWithDefault(PropertiesObject* self, PyObject* args)
+{
+ PyObject* keyObj;
+ PyObject* defObj;
+ if(!PyArg_ParseTuple(args, STRCAST("OO"), &keyObj, &defObj))
+ {
+ return 0;
+ }
+
+ string key;
+ string def;
+ if(!getStringArg(keyObj, "key", key))
+ {
+ return 0;
+ }
+ if(!getStringArg(defObj, "value", def))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ string value;
+ try
+ {
+ value = (*self->properties)->getPropertyWithDefault(key, def);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ return createString(value);
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesGetPropertyAsInt(PropertiesObject* self, PyObject* args)
+{
+ PyObject* keyObj;
+ if(!PyArg_ParseTuple(args, STRCAST("O"), &keyObj))
+ {
+ return 0;
+ }
+
+ string key;
+ if(!getStringArg(keyObj, "key", key))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ Ice::Int value;
+ try
+ {
+ value = (*self->properties)->getPropertyAsInt(key);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ return PyLong_FromLong(value);
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesGetPropertyAsIntWithDefault(PropertiesObject* self, PyObject* args)
+{
+ PyObject* keyObj;
+ int def;
+ if(!PyArg_ParseTuple(args, STRCAST("Oi"), &keyObj, &def))
+ {
+ return 0;
+ }
+
+ string key;
+ if(!getStringArg(keyObj, "key", key))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ Ice::Int value;
+ try
+ {
+ value = (*self->properties)->getPropertyAsIntWithDefault(key, def);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ return PyLong_FromLong(value);
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesGetPropertyAsList(PropertiesObject* self, PyObject* args)
+{
+ PyObject* keyObj;
+ if(!PyArg_ParseTuple(args, STRCAST("O"), &keyObj))
+ {
+ return 0;
+ }
+
+ string key;
+ if(!getStringArg(keyObj, "key", key))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ Ice::StringSeq value;
+ try
+ {
+ value = (*self->properties)->getPropertyAsList(key);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ PyObject* list = PyList_New(0);
+ if(!list)
+ {
+ return 0;
+ }
+ if(!stringSeqToList(value, list))
+ {
+ return 0;
+ }
+
+ return list;
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesGetPropertyAsListWithDefault(PropertiesObject* self, PyObject* args)
+{
+ PyObject* keyObj;
+ PyObject* defList;
+ if(!PyArg_ParseTuple(args, STRCAST("OO!"), &keyObj, &PyList_Type, &defList))
+ {
+ return 0;
+ }
+
+ string key;
+ if(!getStringArg(keyObj, "key", key))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ Ice::StringSeq def;
+ if(!listToStringSeq(defList, def))
+ {
+ return 0;
+ }
+
+ Ice::StringSeq value;
+ try
+ {
+ value = (*self->properties)->getPropertyAsListWithDefault(key, def);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ PyObject* list = PyList_New(0);
+ if(!list)
+ {
+ return 0;
+ }
+ if(!stringSeqToList(value, list))
+ {
+ return 0;
+ }
+
+ return list;
+}
+
+
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesGetPropertiesForPrefix(PropertiesObject* self, PyObject* args)
+{
+ PyObject* prefixObj;
+ if(!PyArg_ParseTuple(args, STRCAST("O"), &prefixObj))
+ {
+ return 0;
+ }
+
+ string prefix;
+ if(!getStringArg(prefixObj, "prefix", prefix))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ Ice::PropertyDict dict;
+ try
+ {
+ dict = (*self->properties)->getPropertiesForPrefix(prefix);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ PyObjectHandle result = PyDict_New();
+ if(result.get())
+ {
+ for(Ice::PropertyDict::iterator p = dict.begin(); p != dict.end(); ++p)
+ {
+ PyObjectHandle key = createString(p->first);
+ PyObjectHandle val = createString(p->second);
+ if(!val.get() || PyDict_SetItem(result.get(), key.get(), val.get()) < 0)
+ {
+ return 0;
+ }
+ }
+ }
+
+ return result.release();
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesSetProperty(PropertiesObject* self, PyObject* args)
+{
+ PyObject* keyObj;
+ PyObject* valueObj;
+ if(!PyArg_ParseTuple(args, STRCAST("OO"), &keyObj, &valueObj))
+ {
+ return 0;
+ }
+
+ string key;
+ string value;
+ if(!getStringArg(keyObj, "key", key))
+ {
+ return 0;
+ }
+ if(!getStringArg(valueObj, "value", value))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ try
+ {
+ (*self->properties)->setProperty(key, value);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesGetCommandLineOptions(PropertiesObject* self)
+{
+ Ice::StringSeq options;
+ assert(self->properties);
+ try
+ {
+ options = (*self->properties)->getCommandLineOptions();
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ PyObject* list = PyList_New(0);
+ if(!list)
+ {
+ return 0;
+ }
+ if(!stringSeqToList(options, list))
+ {
+ return 0;
+ }
+
+ return list;
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesParseCommandLineOptions(PropertiesObject* self, PyObject* args)
+{
+ PyObject* prefixObj;
+ PyObject* options;
+ if(!PyArg_ParseTuple(args, STRCAST("OO!"), &prefixObj, &PyList_Type, &options))
+ {
+ return 0;
+ }
+
+ Ice::StringSeq seq;
+ if(!listToStringSeq(options, seq))
+ {
+ return 0;
+ }
+
+ string prefix;
+ if(!getStringArg(prefixObj, "prefix", prefix))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ Ice::StringSeq filteredSeq;
+ try
+ {
+ filteredSeq = (*self->properties)->parseCommandLineOptions(prefix, seq);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ PyObject* list = PyList_New(0);
+ if(!list)
+ {
+ return 0;
+ }
+ if(!stringSeqToList(filteredSeq, list))
+ {
+ return 0;
+ }
+
+ return list;
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesParseIceCommandLineOptions(PropertiesObject* self, PyObject* args)
+{
+ PyObject* options;
+ if(!PyArg_ParseTuple(args, STRCAST("O!"), &PyList_Type, &options))
+ {
+ return 0;
+ }
+
+ Ice::StringSeq seq;
+ if(!listToStringSeq(options, seq))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ Ice::StringSeq filteredSeq;
+ try
+ {
+ filteredSeq = (*self->properties)->parseIceCommandLineOptions(seq);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ PyObject* list = PyList_New(0);
+ if(!list)
+ {
+ return 0;
+ }
+ if(!stringSeqToList(filteredSeq, list))
+ {
+ return 0;
+ }
+
+ return list;
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesLoad(PropertiesObject* self, PyObject* args)
+{
+ PyObject* fileObj;
+ if(!PyArg_ParseTuple(args, STRCAST("O"), &fileObj))
+ {
+ return 0;
+ }
+
+ string file;
+ if(!getStringArg(fileObj, "file", file))
+ {
+ return 0;
+ }
+
+ assert(self->properties);
+ try
+ {
+ (*self->properties)->load(file);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+#ifdef WIN32
+extern "C"
+#endif
+static PyObject*
+propertiesClone(PropertiesObject* self)
+{
+ Ice::PropertiesPtr properties;
+ assert(self->properties);
+ try
+ {
+ properties = (*self->properties)->clone();
+ }
+ catch(const Ice::Exception& ex)
+ {
+ setPythonException(ex);
+ return 0;
+ }
+
+ return createProperties(properties);
+}
+
+static PyMethodDef PropertyMethods[] =
+{
+ { STRCAST("getProperty"), reinterpret_cast<PyCFunction>(propertiesGetProperty), METH_VARARGS,
+ PyDoc_STR(STRCAST("getProperty(key) -> string")) },
+ { STRCAST("getPropertyWithDefault"), reinterpret_cast<PyCFunction>(propertiesGetPropertyWithDefault), METH_VARARGS,
+ PyDoc_STR(STRCAST("getPropertyWithDefault(key, default) -> string")) },
+ { STRCAST("getPropertyAsInt"), reinterpret_cast<PyCFunction>(propertiesGetPropertyAsInt), METH_VARARGS,
+ PyDoc_STR(STRCAST("getPropertyAsInt(key) -> int")) },
+ { STRCAST("getPropertyAsIntWithDefault"), reinterpret_cast<PyCFunction>(propertiesGetPropertyAsIntWithDefault),
+ METH_VARARGS, PyDoc_STR(STRCAST("getPropertyAsIntWithDefault(key, default) -> int")) },
+ { STRCAST("getPropertyAsList"), reinterpret_cast<PyCFunction>(propertiesGetPropertyAsList), METH_VARARGS,
+ PyDoc_STR(STRCAST("getPropertyAsList(key) -> list")) },
+ { STRCAST("getPropertyAsListWithDefault"), reinterpret_cast<PyCFunction>(propertiesGetPropertyAsListWithDefault),
+ METH_VARARGS, PyDoc_STR(STRCAST("getPropertyAsListWithDefault(key, default) -> list")) },
+ { STRCAST("getPropertiesForPrefix"), reinterpret_cast<PyCFunction>(propertiesGetPropertiesForPrefix), METH_VARARGS,
+ PyDoc_STR(STRCAST("getPropertiesForPrefix(prefix) -> dict")) },
+ { STRCAST("setProperty"), reinterpret_cast<PyCFunction>(propertiesSetProperty), METH_VARARGS,
+ PyDoc_STR(STRCAST("setProperty(key, value) -> None")) },
+ { STRCAST("getCommandLineOptions"), reinterpret_cast<PyCFunction>(propertiesGetCommandLineOptions), METH_NOARGS,
+ PyDoc_STR(STRCAST("getCommandLineOptions() -> list")) },
+ { STRCAST("parseCommandLineOptions"), reinterpret_cast<PyCFunction>(propertiesParseCommandLineOptions),
+ METH_VARARGS, PyDoc_STR(STRCAST("parseCommandLineOptions(prefix, options) -> list")) },
+ { STRCAST("parseIceCommandLineOptions"), reinterpret_cast<PyCFunction>(propertiesParseIceCommandLineOptions),
+ METH_VARARGS, PyDoc_STR(STRCAST("parseIceCommandLineOptions(prefix, options) -> list")) },
+ { STRCAST("load"), reinterpret_cast<PyCFunction>(propertiesLoad), METH_VARARGS,
+ PyDoc_STR(STRCAST("load(file) -> None")) },
+ { STRCAST("clone"), reinterpret_cast<PyCFunction>(propertiesClone), METH_NOARGS,
+ PyDoc_STR(STRCAST("clone() -> Ice.Properties")) },
+ { 0, 0 } /* sentinel */
+};
+
+namespace IcePy
+{
+
+PyTypeObject PropertiesType =
+{
+ /* The ob_type field must be initialized in the module init function
+ * to be portable to Windows without using C++. */
+ PyVarObject_HEAD_INIT(0, 0)
+ STRCAST("IcePy.Properties"), /* tp_name */
+ sizeof(PropertiesObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ reinterpret_cast<destructor>(propertiesDealloc), /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ reinterpret_cast<reprfunc>(propertiesStr), /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ PropertyMethods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ reinterpret_cast<initproc>(propertiesInit), /* tp_init */
+ 0, /* tp_alloc */
+ reinterpret_cast<newfunc>(propertiesNew), /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+};
+
+}
+
+bool
+IcePy::initProperties(PyObject* module)
+{
+ if(PyType_Ready(&PropertiesType) < 0)
+ {
+ return false;
+ }
+ PyTypeObject* type = &PropertiesType; // Necessary to prevent GCC's strict-alias warnings.
+ if(PyModule_AddObject(module, STRCAST("Properties"), reinterpret_cast<PyObject*>(type)) < 0)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+PyObject*
+IcePy::createProperties(const Ice::PropertiesPtr& props)
+{
+ PropertiesObject* obj = propertiesNew(&PropertiesType, 0, 0);
+ if(obj)
+ {
+ obj->properties = new Ice::PropertiesPtr(props);
+ }
+ return reinterpret_cast<PyObject*>(obj);
+}
+
+Ice::PropertiesPtr
+IcePy::getProperties(PyObject* p)
+{
+ PropertiesObject* obj = reinterpret_cast<PropertiesObject*>(p);
+ if(obj->properties)
+ {
+ return *obj->properties;
+ }
+ return 0;
+}
+
+extern "C"
+PyObject*
+IcePy_createProperties(PyObject* /*self*/, PyObject* args)
+{
+ //
+ // Currently the same as "p = Ice.Properties()".
+ //
+ PyTypeObject* type = &PropertiesType; // Necessary to prevent GCC's strict-alias warnings.
+ return PyObject_Call(reinterpret_cast<PyObject*>(type), args, 0);
+}