return PyUnicode_FromString(str);
}
+PyObject *PyBytes_FromUtf16StringOrNULL(const uint16_t *str)
+{
+ size_t len;
+
+ if (str == NULL) {
+ Py_RETURN_NONE;
+ }
+
+ len = utf16_len(str);
+ return PyBytes_FromStringAndSize((const char *)str, len);
+}
+
+uint16_t *PyUtf16String_FromBytes(TALLOC_CTX *mem_ctx, PyObject *value)
+{
+ char *bytes = NULL;
+ Py_ssize_t len = 0;
+ uint16_t *utf16_string = NULL;
+ int ret;
+
+ ret = PyBytes_AsStringAndSize(value, &bytes, &len);
+ if (ret) {
+ return NULL;
+ }
+
+ if (len < 0) {
+ PyErr_SetString(PyExc_ValueError, "bytes length is negative");
+ return NULL;
+ }
+
+ /* Ensure that the bytes object contains no embedded null terminator. */
+ if ((size_t)len != utf16_len_n(bytes, len)) {
+ PyErr_SetString(PyExc_ValueError,
+ "value contains an embedded null terminator");
+ return NULL;
+ }
+
+ utf16_string = talloc_utf16_strlendup(mem_ctx, bytes, len);
+ if (utf16_string == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ return utf16_string;
+}
+
PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
const void *in, const char *typename)
{
PyObject *PyString_FromStringOrNULL(const char *str);
+PyObject *PyBytes_FromUtf16StringOrNULL(const uint16_t *str);
+
+uint16_t *PyUtf16String_FromBytes(TALLOC_CTX *mem_ctx, PyObject *value);
+
PyObject *pyrpc_import_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,
const void *in, const char *typename);
void *pyrpc_export_union(PyTypeObject *type, TALLOC_CTX *mem_ctx, int level,