[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