[Mobies-commit] [commit] r3991 - in UDM/trunk: include src/UdmPython

ksmyth at redhat1.isis.vanderbilt.edu ksmyth at redhat1.isis.vanderbilt.edu
Thu Jan 19 11:44:09 CST 2012


Author: ksmyth
Date: Thu Jan 19 11:44:09 2012
New Revision: 3991

Log:
Add Python udm.SmartDataNetwork.open support for IDispatch GME projects

Modified:
   UDM/trunk/include/UdmBase.h
   UDM/trunk/src/UdmPython/UdmPython.cpp

Modified: UDM/trunk/include/UdmBase.h
==============================================================================
--- UDM/trunk/include/UdmBase.h	Mon Jan 16 10:31:25 2012	(r3990)
+++ UDM/trunk/include/UdmBase.h	Thu Jan 19 11:44:09 2012	(r3991)
@@ -3360,6 +3360,13 @@
 		dn = dn1.release();
 	}
 
+	template<class CreateF>
+	void CreateNew(CreateF& f) {
+		if(dn)
+			throw udm_exception("DataNetwork is already open"); 
+		dn = f(metaroot, pr);
+	}
+
 	virtual void OpenExisting(const string &systemname, 
 									const string &metalocator = "", 
 									enum BackendSemantics sem = CHANGES_PERSIST_ALWAYS) {
@@ -3370,6 +3377,14 @@
 		dn1->OpenExisting(systemname, metalocator, sem);
 		dn = dn1.release();
 	}
+
+	template<class OpenF>
+	void OpenExisting(OpenF& f) {
+		if(dn)
+			throw udm_exception("DataNetwork is already open"); 
+		dn = f(metaroot, pr);
+	}
+
 	virtual void CloseWithUpdate() 
 	{
 		testdn()->CloseWithUpdate();

Modified: UDM/trunk/src/UdmPython/UdmPython.cpp
==============================================================================
--- UDM/trunk/src/UdmPython/UdmPython.cpp	Mon Jan 16 10:31:25 2012	(r3990)
+++ UDM/trunk/src/UdmPython/UdmPython.cpp	Thu Jan 19 11:44:09 2012	(r3991)
@@ -15,8 +15,50 @@
 using namespace boost::python;
 using namespace std;
 
-void SDN_OpenExisting(Udm::SmartDataNetwork& self, const string &systemname, const string& metalocator) {
-	self.OpenExisting(systemname, metalocator, Udm::CHANGES_LOST_DEFAULT);
+// returns borrowed reference
+IUnknown* object2IUnknown(object o) {
+	//	oleobj = disp._oleobj_
+	//	addr = repr(oleobj).split()[-1][2:-1]
+	//	val = int(addr, 16)
+	object oleobj;
+	if (PyObject_HasAttrString(o.ptr(), "_oleobj_") )
+		oleobj = o.attr("_oleobj_");
+	else
+		oleobj = o;
+	object addr = import("__builtin__").attr("repr")(oleobj).attr("split")()[-1].slice(2, -1);
+	object val = import("__builtin__").attr("int")(addr, 16);
+	return (IUnknown*)(void*)static_cast<const size_t>(extract<size_t>(val));
+}
+
+Udm::Object SDN_Gme2Udm(Udm::SmartDataNetwork& self, object o) {
+	IUnknown* punk = object2IUnknown(o);
+	UdmGme::GmeDataNetwork* gmedn = dynamic_cast<UdmGme::GmeDataNetwork*>(self.testdn());
+	if (!gmedn)
+		throw std::runtime_error("self is not a GmeDataNetwork");
+	return gmedn->Gme2Udm(punk);
+}
+
+void SDN_OpenExisting(Udm::SmartDataNetwork& self, object systemname, const string& metalocator) {
+	extract<std::string> string_systemname(systemname);
+	if (string_systemname.check())
+	{
+		self.OpenExisting(string_systemname, metalocator, Udm::CHANGES_LOST_DEFAULT);
+		return;
+	}
+	if (PyObject_HasAttrString(systemname.ptr(), "_oleobj_") 
+		|| PyObject_HasAttrString(systemname.ptr(), "GetIDsOfNames"))
+	{
+		// OpenExisting calls AddRef
+		IUnknown* punk = object2IUnknown(systemname);
+
+		self.OpenExisting([&](const Udm::UdmDiagram &metaroot, Udm::UdmProject* pr) -> Udm::DataNetwork* {
+			std::auto_ptr<UdmGme::GmeDataNetwork> dn1(new UdmGme::GmeDataNetwork(metaroot, pr));
+			dn1->OpenExisting(punk, Udm::CHANGES_LOST_DEFAULT, true);
+			return dn1.release();
+		});
+		return;
+	}
+	throw runtime_error("Unrecognized type for systemname");
 }
 
 void SDN_CreateNew(Udm::SmartDataNetwork& self, const string &systemname, const string& metalocator, const Udm::Object rootclass) {
@@ -545,10 +587,13 @@
 		.def("close_no_update", &Udm::SmartDataNetwork::CloseNoUpdate)
 		.def("save_as", &Udm::SmartDataNetwork::SaveAs)
 		.add_property("root", &Udm::SmartDataNetwork::GetRootObject)
+		.def("convert_gme2udm", SDN_Gme2Udm)
 	;
 	scope().attr("SmartDataNetwork").attr("__init__") = eval("lambda self, *args: None");
 	exec(
 "def map_uml_names(diagram):\n"
+"    import sys\n"
+"    udm = sys.modules['udm']\n"
 "    class_meta = filter(lambda class_: class_.name == 'Class', udm.uml_diagram().children())[0]\n"
 "    namespace_meta = filter(lambda class_: class_.name == 'Namespace', udm.uml_diagram().children())[0]\n"
 "    class ClassMap(object):\n"


More information about the Mobies-commit mailing list