[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