[Mobies-commit] [commit] r4146 - UDM/trunk/src/UdmPython

ksmyth at redhat1.isis.vanderbilt.edu ksmyth at redhat1.isis.vanderbilt.edu
Thu Dec 27 12:38:27 CST 2012


Author: ksmyth
Date: Thu Dec 27 12:38:27 2012
New Revision: 4146

Log:
Support unicode objects

Modified:
   UDM/trunk/src/UdmPython/UdmPython.cpp

Modified: UDM/trunk/src/UdmPython/UdmPython.cpp
==============================================================================
--- UDM/trunk/src/UdmPython/UdmPython.cpp	Thu Dec 27 12:37:52 2012	(r4145)
+++ UDM/trunk/src/UdmPython/UdmPython.cpp	Thu Dec 27 12:38:27 2012	(r4146)
@@ -17,6 +17,31 @@
 using namespace boost::python;
 using namespace std;
 
+object utf8tostring(const std::string& utf8) {
+#ifdef PY3K
+	PyObject* transcoded = PyUnicode_FromString(utf8.c_str());
+#else
+	PyObject* transcoded = PyUnicode_DecodeUTF8(utf8.c_str(), utf8.length(), "replace");
+	//PyObject* transcoded = PyString_Decode(utf8.c_str(), utf8.length(), "UTF-8", "replace");
+#endif
+	return object(handle<>(transcoded));
+}
+
+std::string stringtoutf8(object& string)
+{
+	if (PyUnicode_Check(string.ptr()))
+	{
+		object encoded(handle<>(PyUnicode_AsEncodedString(string.ptr(), "UTF-8", "replace")));
+#ifdef PY3K
+		return PyBytes_AS_STRING(encoded.ptr());
+#else
+		return PyString_AS_STRING(encoded.ptr());
+#endif
+	}
+	else
+		return PyString_AsString(string.ptr());
+}
+
 #ifdef _WIN32
 // returns borrowed reference
 IUnknown* object2IUnknown(object o) {
@@ -43,9 +68,9 @@
 #endif
 
 void SDN_OpenExisting(Udm::SmartDataNetwork& self, object systemname, const string& metalocator) {
-	extract<std::string> string_systemname(systemname);
-	if (string_systemname.check())
+	if (PyString_Check(systemname.ptr()) || PyUnicode_Check(systemname.ptr()))
 	{
+		std::string string_systemname = stringtoutf8(systemname);
 		self.OpenExisting(string_systemname, metalocator, Udm::CHANGES_LOST_DEFAULT);
 		return;
 	}
@@ -137,7 +162,7 @@
 		return object(self.getIntegerAttr(attr));
 	}
 	if (static_cast<string>(attr.type()) == "String" || static_cast<string>(attr.type()) == "Text") {
-		return object(self.getStringAttr(attr));
+		return utf8tostring(self.getStringAttr(attr));
 	}
 	if (static_cast<string>(attr.type()) == "Real") {
 		return object(self.getRealAttr(attr));
@@ -160,7 +185,7 @@
 		return object();
 	}
 	if (static_cast<string>(attr.type()) == "String" || static_cast<string>(attr.type()) == "Text") {
-		self.setStringAttr(attr, extract<std::string>(value));
+		self.setStringAttr(attr, stringtoutf8(value));
 		return object();
 	}
 	if (static_cast<string>(attr.type()) == "Real") {


More information about the Mobies-commit mailing list