[Mobies-commit] [commit] r4162 - UDM/trunk/src/UdmPython
ksmyth at redhat1.isis.vanderbilt.edu
ksmyth at redhat1.isis.vanderbilt.edu
Fri Feb 22 16:17:27 CST 2013
Author: ksmyth
Date: Fri Feb 22 16:17:27 2013
New Revision: 4162
Log:
Add convert_udm2gme method
Modified:
UDM/trunk/src/UdmPython/UdmPython.cpp
Modified: UDM/trunk/src/UdmPython/UdmPython.cpp
==============================================================================
--- UDM/trunk/src/UdmPython/UdmPython.cpp Thu Feb 14 16:54:06 2013 (r4161)
+++ UDM/trunk/src/UdmPython/UdmPython.cpp Fri Feb 22 16:17:27 2013 (r4162)
@@ -58,6 +58,35 @@
return (IUnknown*)(void*)static_cast<const size_t>(extract<size_t>(val));
}
+// PythonCOM.h: PYCOM_EXPORT PyObject *PyCom_PyObjectFromIUnknown(IUnknown *punk, REFIID riid, BOOL bAddRef = FALSE);
+typedef PyObject *(*PyCom_PyObjectFromIUnknown_t)(IUnknown *punk, REFIID riid, BOOL bAddRef);
+object SDN_Udm2Gme(Udm::SmartDataNetwork& self, const Udm::Object o) {
+ if (o == Udm::null)
+ return object();
+ UdmGme::GmeDataNetwork* gmedn = dynamic_cast<UdmGme::GmeDataNetwork*>(self.testdn());
+ if (!gmedn)
+ throw std::runtime_error("self is not a GmeDataNetwork");
+ object win32comclient = import("win32com.client"); // also loads pythoncomxx.dll
+ LPUNKNOWN punk = UdmGme::Udm2Gme(o);
+ if (punk == NULL)
+ return object();
+ IDispatchPtr pdispatch = punk;
+ punk->Release();
+ if (pdispatch == NULL)
+ return object();
+ char pythoncomname[40];
+ sprintf_s(pythoncomname, "pythoncom%d%d.dll", PY_MAJOR_VERSION, PY_MINOR_VERSION);
+ HMODULE pythoncom = GetModuleHandle(pythoncomname);
+ if (pythoncom == NULL)
+ throw std::runtime_error(std::string("Could not load ") + pythoncomname);
+ PyCom_PyObjectFromIUnknown_t PyCom_PyObjectFromIUnknown = (PyCom_PyObjectFromIUnknown_t)GetProcAddress(pythoncom, "PyCom_PyObjectFromIUnknown");
+ if (PyCom_PyObjectFromIUnknown == NULL)
+ throw std::runtime_error(std::string("Could not load PyCom_PyObjectFromIUnknown from ") + pythoncomname);
+ PyObject* obj = (*PyCom_PyObjectFromIUnknown)(pdispatch, IID_IDispatch, TRUE);
+ object pyidispatch = object(handle<>(obj));
+ return win32comclient.attr("Dispatch")(pyidispatch);
+}
+
Udm::Object SDN_Gme2Udm(Udm::SmartDataNetwork& self, object o) {
IUnknown* punk = object2IUnknown(o);
UdmGme::GmeDataNetwork* gmedn = dynamic_cast<UdmGme::GmeDataNetwork*>(self.testdn());
@@ -631,6 +660,7 @@
.add_property("root", &Udm::SmartDataNetwork::GetRootObject)
#ifdef _WIN32
.def("convert_gme2udm", SDN_Gme2Udm)
+ .def("convert_udm2gme", SDN_Udm2Gme)
#endif
;
scope().attr("SmartDataNetwork").attr("__init__") = eval("lambda self, *args: None");
More information about the Mobies-commit
mailing list