1
0
mirror of https://github.com/samba-team/samba.git synced 2025-07-23 20:59:10 +03:00

pidl/python: Support repr() for python types.

(This used to be commit cf3664594d)
This commit is contained in:
Jelmer Vernooij
2008-01-13 18:38:12 +01:00
parent a99dff8660
commit f7a0ef04f0
5 changed files with 855 additions and 8 deletions

View File

@ -214,6 +214,7 @@ sub PythonStruct($$$$)
$self->pidl(".tp_dealloc = py_talloc_dealloc,");
$self->pidl(".tp_getattr = py_$name\_getattr,");
$self->pidl(".tp_setattr = py_$name\_setattr,");
$self->pidl(".tp_repr = py_talloc_default_repr,");
$self->deindent;
$self->pidl("};");
@ -559,6 +560,8 @@ sub ConvertScalarToPython($$$)
{
my ($self, $ctypename, $cvar) = @_;
die("expected string for $cvar, not $ctypename") if (ref($ctypename) eq "HASH");
$ctypename = expandAlias($ctypename);
if ($ctypename =~ /^(int|long|char|u?int[0-9]+|hyper|dlong|udlong|udlongr|time_t|NTTIME_hyper|NTTIME|NTTIME_1sec)$/) {
@ -583,7 +586,7 @@ sub ConvertScalarToPython($$$)
if ($ctypename eq "string_array") { return "FIXME($cvar)"; }
if ($$ctypename eq "ipv4address") { return "FIXME($cvar)"; }
if ($ctypename eq "ipv4address") { return "FIXME($cvar)"; }
if ($ctypename eq "pointer") {
return "PyCObject_FromVoidPtr($cvar, talloc_free)";
}
@ -614,8 +617,15 @@ sub ConvertObjectToPython($$$)
$actual_ctype = $ctype->{DATA};
}
if ($actual_ctype->{TYPE} eq "ENUM" or $actual_ctype->{TYPE} eq "BITMAP" or
($actual_ctype->{TYPE} eq "SCALAR") {
if ($actual_ctype->{TYPE} eq "ENUM") {
return $self->ConvertScalarToPython(Parse::Pidl::Typelist::enum_type_fn($actual_ctype), $cvar);
}
if ($actual_ctype->{TYPE} eq "BITMAP") {
return $self->ConvertScalarToPython(Parse::Pidl::Typelist::bitmap_type_fn($actual_ctype), $cvar);
}
if ($actual_ctype->{TYPE} eq "SCALAR") {
return $self->ConvertScalarToPython($actual_ctype->{NAME}, $cvar);
}
@ -675,18 +685,18 @@ sub Parse($$$$$)
$self->indent;
$self->pidl("PyObject *m;");
$self->pidl("m = Py_InitModule(\"$basename\", $basename\_methods);");
foreach (keys %{$self->{constants}}) {
foreach my $name (keys %{$self->{constants}}) {
my $py_obj;
my ($ctype, $cvar) = @{$self->{constants}->{$_}};
my ($ctype, $cvar) = @{$self->{constants}->{$name}};
if ($cvar =~ /^[0-9]+$/ or $cvar =~ /^0x[0-9a-fA-F]+$/) {
$py_obj = "PyInt_FromLong($cvar)";
} elsif ($cvar =~ /^".*"$/) {
$py_obj = "PyString_FromString($cvar)";
} else {
$py_obj = $self->ConvertScalarToPython($ctype, $cvar);
$py_obj = $self->ConvertObjectToPython($ctype, $cvar);
}
$self->pidl("PyModule_AddObject(m, \"$_\", $py_obj);");
$self->pidl("PyModule_AddObject(m, \"$name\", $py_obj);");
}
$self->deindent;
$self->pidl("}");

818
source4/py_echo.c Normal file
View File

@ -0,0 +1,818 @@
/* Python wrapper functions auto-generated by pidl */
#include "includes.h"
#include <Python.h>
#include "librpc/rpc/dcerpc.h"
#include "scripting/python/pytalloc.h"
#include "./ndr_echo.h"
#include "./ndr_echo_c.h"
#include "./py_echo.h"
staticforward PyTypeObject echo_info1_ObjectType;
static PyObject *py_echo_info1_getattr(PyObject *obj, char *name)
{
struct echo_info1 *object = py_talloc_get_type(obj, struct echo_info1);
if (!strcmp(name, "v")) {
return PyInt_FromLong(object->v);
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return NULL;
}
static int py_echo_info1_setattr(PyObject *py_obj, char *name, PyObject *value)
{
struct echo_info1 *object = py_talloc_get_type(py_obj, struct echo_info1);
if (!strcmp(name, "v")) {
/* FIXME: talloc_free(object->v) if necessary */
object->v = PyInt_AsLong(value);
return 0;
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return -1;
}
static PyTypeObject echo_info1_ObjectType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "echo_info1",
.tp_basicsize = sizeof(py_talloc_Object),
.tp_dealloc = py_talloc_dealloc,
.tp_getattr = py_echo_info1_getattr,
.tp_setattr = py_echo_info1_setattr,
};
static PyObject *py_echo_info1(PyObject *self, PyObject *args)
{
struct echo_info1 *ret = talloc_zero(NULL, struct echo_info1);
return py_talloc_import(&echo_info1_ObjectType, ret);
}
staticforward PyTypeObject echo_info2_ObjectType;
static PyObject *py_echo_info2_getattr(PyObject *obj, char *name)
{
struct echo_info2 *object = py_talloc_get_type(obj, struct echo_info2);
if (!strcmp(name, "v")) {
return PyInt_FromLong(object->v);
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return NULL;
}
static int py_echo_info2_setattr(PyObject *py_obj, char *name, PyObject *value)
{
struct echo_info2 *object = py_talloc_get_type(py_obj, struct echo_info2);
if (!strcmp(name, "v")) {
/* FIXME: talloc_free(object->v) if necessary */
object->v = PyInt_AsLong(value);
return 0;
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return -1;
}
static PyTypeObject echo_info2_ObjectType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "echo_info2",
.tp_basicsize = sizeof(py_talloc_Object),
.tp_dealloc = py_talloc_dealloc,
.tp_getattr = py_echo_info2_getattr,
.tp_setattr = py_echo_info2_setattr,
};
static PyObject *py_echo_info2(PyObject *self, PyObject *args)
{
struct echo_info2 *ret = talloc_zero(NULL, struct echo_info2);
return py_talloc_import(&echo_info2_ObjectType, ret);
}
staticforward PyTypeObject echo_info3_ObjectType;
static PyObject *py_echo_info3_getattr(PyObject *obj, char *name)
{
struct echo_info3 *object = py_talloc_get_type(obj, struct echo_info3);
if (!strcmp(name, "v")) {
return PyInt_FromLong(object->v);
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return NULL;
}
static int py_echo_info3_setattr(PyObject *py_obj, char *name, PyObject *value)
{
struct echo_info3 *object = py_talloc_get_type(py_obj, struct echo_info3);
if (!strcmp(name, "v")) {
/* FIXME: talloc_free(object->v) if necessary */
object->v = PyInt_AsLong(value);
return 0;
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return -1;
}
static PyTypeObject echo_info3_ObjectType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "echo_info3",
.tp_basicsize = sizeof(py_talloc_Object),
.tp_dealloc = py_talloc_dealloc,
.tp_getattr = py_echo_info3_getattr,
.tp_setattr = py_echo_info3_setattr,
};
static PyObject *py_echo_info3(PyObject *self, PyObject *args)
{
struct echo_info3 *ret = talloc_zero(NULL, struct echo_info3);
return py_talloc_import(&echo_info3_ObjectType, ret);
}
staticforward PyTypeObject echo_info4_ObjectType;
static PyObject *py_echo_info4_getattr(PyObject *obj, char *name)
{
struct echo_info4 *object = py_talloc_get_type(obj, struct echo_info4);
if (!strcmp(name, "v")) {
return PyInt_FromLong(object->v);
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return NULL;
}
static int py_echo_info4_setattr(PyObject *py_obj, char *name, PyObject *value)
{
struct echo_info4 *object = py_talloc_get_type(py_obj, struct echo_info4);
if (!strcmp(name, "v")) {
/* FIXME: talloc_free(object->v) if necessary */
object->v = PyInt_AsLong(value);
return 0;
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return -1;
}
static PyTypeObject echo_info4_ObjectType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "echo_info4",
.tp_basicsize = sizeof(py_talloc_Object),
.tp_dealloc = py_talloc_dealloc,
.tp_getattr = py_echo_info4_getattr,
.tp_setattr = py_echo_info4_setattr,
};
static PyObject *py_echo_info4(PyObject *self, PyObject *args)
{
struct echo_info4 *ret = talloc_zero(NULL, struct echo_info4);
return py_talloc_import(&echo_info4_ObjectType, ret);
}
staticforward PyTypeObject echo_info5_ObjectType;
static PyObject *py_echo_info5_getattr(PyObject *obj, char *name)
{
struct echo_info5 *object = py_talloc_get_type(obj, struct echo_info5);
if (!strcmp(name, "v1")) {
return PyInt_FromLong(object->v1);
}
if (!strcmp(name, "v2")) {
return PyInt_FromLong(object->v2);
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return NULL;
}
static int py_echo_info5_setattr(PyObject *py_obj, char *name, PyObject *value)
{
struct echo_info5 *object = py_talloc_get_type(py_obj, struct echo_info5);
if (!strcmp(name, "v1")) {
/* FIXME: talloc_free(object->v1) if necessary */
object->v1 = PyInt_AsLong(value);
return 0;
}
if (!strcmp(name, "v2")) {
/* FIXME: talloc_free(object->v2) if necessary */
object->v2 = PyInt_AsLong(value);
return 0;
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return -1;
}
static PyTypeObject echo_info5_ObjectType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "echo_info5",
.tp_basicsize = sizeof(py_talloc_Object),
.tp_dealloc = py_talloc_dealloc,
.tp_getattr = py_echo_info5_getattr,
.tp_setattr = py_echo_info5_setattr,
};
static PyObject *py_echo_info5(PyObject *self, PyObject *args)
{
struct echo_info5 *ret = talloc_zero(NULL, struct echo_info5);
return py_talloc_import(&echo_info5_ObjectType, ret);
}
staticforward PyTypeObject echo_info6_ObjectType;
static PyObject *py_echo_info6_getattr(PyObject *obj, char *name)
{
struct echo_info6 *object = py_talloc_get_type(obj, struct echo_info6);
if (!strcmp(name, "v1")) {
return PyInt_FromLong(object->v1);
}
if (!strcmp(name, "info1")) {
return py_talloc_import(&echo_info1_ObjectType, object->info1);
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return NULL;
}
static int py_echo_info6_setattr(PyObject *py_obj, char *name, PyObject *value)
{
struct echo_info6 *object = py_talloc_get_type(py_obj, struct echo_info6);
if (!strcmp(name, "v1")) {
/* FIXME: talloc_free(object->v1) if necessary */
object->v1 = PyInt_AsLong(value);
return 0;
}
if (!strcmp(name, "info1")) {
/* FIXME: talloc_free(object->info1) if necessary */
object->info1 = py_talloc_get_type(value, struct echo_info1);
return 0;
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return -1;
}
static PyTypeObject echo_info6_ObjectType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "echo_info6",
.tp_basicsize = sizeof(py_talloc_Object),
.tp_dealloc = py_talloc_dealloc,
.tp_getattr = py_echo_info6_getattr,
.tp_setattr = py_echo_info6_setattr,
};
static PyObject *py_echo_info6(PyObject *self, PyObject *args)
{
struct echo_info6 *ret = talloc_zero(NULL, struct echo_info6);
return py_talloc_import(&echo_info6_ObjectType, ret);
}
staticforward PyTypeObject echo_info7_ObjectType;
static PyObject *py_echo_info7_getattr(PyObject *obj, char *name)
{
struct echo_info7 *object = py_talloc_get_type(obj, struct echo_info7);
if (!strcmp(name, "v1")) {
return PyInt_FromLong(object->v1);
}
if (!strcmp(name, "info4")) {
return py_talloc_import(&echo_info4_ObjectType, object->info4);
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return NULL;
}
static int py_echo_info7_setattr(PyObject *py_obj, char *name, PyObject *value)
{
struct echo_info7 *object = py_talloc_get_type(py_obj, struct echo_info7);
if (!strcmp(name, "v1")) {
/* FIXME: talloc_free(object->v1) if necessary */
object->v1 = PyInt_AsLong(value);
return 0;
}
if (!strcmp(name, "info4")) {
/* FIXME: talloc_free(object->info4) if necessary */
object->info4 = py_talloc_get_type(value, struct echo_info4);
return 0;
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return -1;
}
static PyTypeObject echo_info7_ObjectType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "echo_info7",
.tp_basicsize = sizeof(py_talloc_Object),
.tp_dealloc = py_talloc_dealloc,
.tp_getattr = py_echo_info7_getattr,
.tp_setattr = py_echo_info7_setattr,
};
static PyObject *py_echo_info7(PyObject *self, PyObject *args)
{
struct echo_info7 *ret = talloc_zero(NULL, struct echo_info7);
return py_talloc_import(&echo_info7_ObjectType, ret);
}
PyObject *py_import_echo_Info(int level, union echo_Info *in)
{
switch (level) {
case 1: return py_talloc_import(&echo_info1_ObjectType, in->info1);
case 2: return py_talloc_import(&echo_info2_ObjectType, in->info2);
case 3: return py_talloc_import(&echo_info3_ObjectType, in->info3);
case 4: return py_talloc_import(&echo_info4_ObjectType, in->info4);
case 5: return py_talloc_import(&echo_info5_ObjectType, in->info5);
case 6: return py_talloc_import(&echo_info6_ObjectType, in->info6);
case 7: return py_talloc_import(&echo_info7_ObjectType, in->info7);
}
PyErr_SetString(PyExc_TypeError, "unknown union level");
return NULL;
}
union echo_Info *py_export_echo_Info(TALLOC_CTX *mem_ctx, int level, PyObject *in)
{
union echo_Info *ret = talloc_zero(mem_ctx, union echo_Info);
switch (level) {
case 1:
ret->info1 = py_talloc_get_type(in, struct echo_info1);
break;
case 2:
ret->info2 = py_talloc_get_type(in, struct echo_info2);
break;
case 3:
ret->info3 = py_talloc_get_type(in, struct echo_info3);
break;
case 4:
ret->info4 = py_talloc_get_type(in, struct echo_info4);
break;
case 5:
ret->info5 = py_talloc_get_type(in, struct echo_info5);
break;
case 6:
ret->info6 = py_talloc_get_type(in, struct echo_info6);
break;
case 7:
ret->info7 = py_talloc_get_type(in, struct echo_info7);
break;
default:
PyErr_SetString(PyExc_TypeError, "invalid union level value");
talloc_free(ret);
ret = NULL;
}
return ret;
}
staticforward PyTypeObject echo_Enum2_ObjectType;
static PyObject *py_echo_Enum2_getattr(PyObject *obj, char *name)
{
struct echo_Enum2 *object = py_talloc_get_type(obj, struct echo_Enum2);
if (!strcmp(name, "e1")) {
return PyInt_FromLong(object->e1);
}
if (!strcmp(name, "e2")) {
return PyInt_FromLong(object->e2);
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return NULL;
}
static int py_echo_Enum2_setattr(PyObject *py_obj, char *name, PyObject *value)
{
struct echo_Enum2 *object = py_talloc_get_type(py_obj, struct echo_Enum2);
if (!strcmp(name, "e1")) {
/* FIXME: talloc_free(object->e1) if necessary */
object->e1 = PyInt_AsLong(value);
return 0;
}
if (!strcmp(name, "e2")) {
/* FIXME: talloc_free(object->e2) if necessary */
object->e2 = PyInt_AsLong(value);
return 0;
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return -1;
}
static PyTypeObject echo_Enum2_ObjectType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "echo_Enum2",
.tp_basicsize = sizeof(py_talloc_Object),
.tp_dealloc = py_talloc_dealloc,
.tp_getattr = py_echo_Enum2_getattr,
.tp_setattr = py_echo_Enum2_setattr,
};
static PyObject *py_echo_Enum2(PyObject *self, PyObject *args)
{
struct echo_Enum2 *ret = talloc_zero(NULL, struct echo_Enum2);
return py_talloc_import(&echo_Enum2_ObjectType, ret);
}
PyObject *py_import_echo_Enum3(int level, union echo_Enum3 *in)
{
switch (level) {
case ECHO_ENUM1: return PyInt_FromLong(in->e1);
case ECHO_ENUM2: return py_talloc_import(&echo_Enum2_ObjectType, in->e2);
}
PyErr_SetString(PyExc_TypeError, "unknown union level");
return NULL;
}
union echo_Enum3 *py_export_echo_Enum3(TALLOC_CTX *mem_ctx, int level, PyObject *in)
{
union echo_Enum3 *ret = talloc_zero(mem_ctx, union echo_Enum3);
switch (level) {
case ECHO_ENUM1:
ret->e1 = PyInt_AsLong(in);
break;
case ECHO_ENUM2:
ret->e2 = py_talloc_get_type(in, struct echo_Enum2);
break;
default:
PyErr_SetString(PyExc_TypeError, "invalid union level value");
talloc_free(ret);
ret = NULL;
}
return ret;
}
staticforward PyTypeObject echo_Surrounding_ObjectType;
static PyObject *py_echo_Surrounding_getattr(PyObject *obj, char *name)
{
struct echo_Surrounding *object = py_talloc_get_type(obj, struct echo_Surrounding);
if (!strcmp(name, "x")) {
return PyInt_FromLong(object->x);
}
if (!strcmp(name, "surrounding")) {
return PyInt_FromLong(object->surrounding);
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return NULL;
}
static int py_echo_Surrounding_setattr(PyObject *py_obj, char *name, PyObject *value)
{
struct echo_Surrounding *object = py_talloc_get_type(py_obj, struct echo_Surrounding);
if (!strcmp(name, "x")) {
/* FIXME: talloc_free(object->x) if necessary */
object->x = PyInt_AsLong(value);
return 0;
}
if (!strcmp(name, "surrounding")) {
/* FIXME: talloc_free(object->surrounding) if necessary */
object->surrounding = PyInt_AsLong(value);
return 0;
}
PyErr_SetString(PyExc_AttributeError, "no such attribute");
return -1;
}
static PyTypeObject echo_Surrounding_ObjectType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "echo_Surrounding",
.tp_basicsize = sizeof(py_talloc_Object),
.tp_dealloc = py_talloc_dealloc,
.tp_getattr = py_echo_Surrounding_getattr,
.tp_setattr = py_echo_Surrounding_setattr,
};
static PyObject *py_echo_Surrounding(PyObject *self, PyObject *args)
{
struct echo_Surrounding *ret = talloc_zero(NULL, struct echo_Surrounding);
return py_talloc_import(&echo_Surrounding_ObjectType, ret);
}
staticforward PyTypeObject rpcecho_InterfaceType;
typedef struct {
PyObject_HEAD
struct dcerpc_pipe *pipe;
} rpcecho_InterfaceObject;
static PyObject *py_echo_AddOne(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_AddOne r;
PyObject *result;
PyObject *py_in_data;
ZERO_STRUCT(r.out);
r.in.in_data = PyInt_AsLong(py_in_data);
status = dcerpc_echo_AddOne(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(1);
PyTuple_SetItem(result, 0, PyInt_FromLong(r.out.out_data));
talloc_free(mem_ctx);
return result;
}
static PyObject *py_echo_EchoData(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_EchoData r;
PyObject *result;
PyObject *py_len;
PyObject *py_in_data;
ZERO_STRUCT(r.out);
r.in.len = PyInt_AsLong(py_len);
r.in.in_data = PyInt_AsLong(py_in_data);
status = dcerpc_echo_EchoData(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(1);
PyTuple_SetItem(result, 0, PyInt_FromLong(r.out.out_data));
talloc_free(mem_ctx);
return result;
}
static PyObject *py_echo_SinkData(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_SinkData r;
PyObject *result;
PyObject *py_len;
PyObject *py_data;
r.in.len = PyInt_AsLong(py_len);
r.in.data = PyInt_AsLong(py_data);
status = dcerpc_echo_SinkData(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(0);
talloc_free(mem_ctx);
return result;
}
static PyObject *py_echo_SourceData(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_SourceData r;
PyObject *result;
PyObject *py_len;
ZERO_STRUCT(r.out);
r.in.len = PyInt_AsLong(py_len);
status = dcerpc_echo_SourceData(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(1);
PyTuple_SetItem(result, 0, PyInt_FromLong(r.out.data));
talloc_free(mem_ctx);
return result;
}
static PyObject *py_echo_TestCall(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_TestCall r;
PyObject *result;
PyObject *py_s1;
ZERO_STRUCT(r.out);
r.in.s1 = PyInt_AsLong(py_s1);
status = dcerpc_echo_TestCall(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(1);
PyTuple_SetItem(result, 0, PyInt_FromLong(r.out.s2));
talloc_free(mem_ctx);
return result;
}
static PyObject *py_echo_TestCall2(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_TestCall2 r;
PyObject *result;
PyObject *py_level;
ZERO_STRUCT(r.out);
r.in.level = PyInt_AsLong(py_level);
status = dcerpc_echo_TestCall2(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(2);
PyTuple_SetItem(result, 0, py_import_echo_Info(r.out.info));
PyTuple_SetItem(result, 1, PyInt_FromLong(NT_STATUS_V(r.out.result)));
talloc_free(mem_ctx);
return result;
}
static PyObject *py_echo_TestSleep(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_TestSleep r;
PyObject *result;
PyObject *py_seconds;
r.in.seconds = PyInt_AsLong(py_seconds);
status = dcerpc_echo_TestSleep(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(1);
PyTuple_SetItem(result, 0, PyInt_FromLong(r.out.result));
talloc_free(mem_ctx);
return result;
}
static PyObject *py_echo_TestEnum(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_TestEnum r;
PyObject *result;
PyObject *py_foo1;
PyObject *py_foo2;
PyObject *py_foo3;
ZERO_STRUCT(r.out);
r.in.foo1 = PyInt_AsLong(py_foo1);
r.in.foo2 = py_talloc_get_type(py_foo2, struct echo_Enum2);
r.in.foo3 = py_export_echo_Enum3(py_foo3);
status = dcerpc_echo_TestEnum(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(3);
PyTuple_SetItem(result, 0, PyInt_FromLong(r.out.foo1));
PyTuple_SetItem(result, 1, py_talloc_import(&echo_Enum2_ObjectType, r.out.foo2));
PyTuple_SetItem(result, 2, py_import_echo_Enum3(r.out.foo3));
talloc_free(mem_ctx);
return result;
}
static PyObject *py_echo_TestSurrounding(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_TestSurrounding r;
PyObject *result;
PyObject *py_data;
ZERO_STRUCT(r.out);
r.in.data = py_talloc_get_type(py_data, struct echo_Surrounding);
status = dcerpc_echo_TestSurrounding(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(1);
PyTuple_SetItem(result, 0, py_talloc_import(&echo_Surrounding_ObjectType, r.out.data));
talloc_free(mem_ctx);
return result;
}
static PyObject *py_echo_TestDoublePointer(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *iface = (rpcecho_InterfaceObject *)self;
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(NULL);
struct echo_TestDoublePointer r;
PyObject *result;
PyObject *py_data;
r.in.data = PyInt_AsLong(py_data);
status = dcerpc_echo_TestDoublePointer(iface->pipe, mem_ctx, &r);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
result = PyTuple_New(1);
PyTuple_SetItem(result, 0, PyInt_FromLong(r.out.result));
talloc_free(mem_ctx);
return result;
}
static PyMethodDef interface_rpcecho_methods[] = {
{ "echo_AddOne", (PyCFunction)py_echo_AddOne, METH_VARARGS|METH_KEYWORDS, NULL },
{ "echo_EchoData", (PyCFunction)py_echo_EchoData, METH_VARARGS|METH_KEYWORDS, NULL },
{ "echo_SinkData", (PyCFunction)py_echo_SinkData, METH_VARARGS|METH_KEYWORDS, NULL },
{ "echo_SourceData", (PyCFunction)py_echo_SourceData, METH_VARARGS|METH_KEYWORDS, NULL },
{ "echo_TestCall", (PyCFunction)py_echo_TestCall, METH_VARARGS|METH_KEYWORDS, NULL },
{ "echo_TestCall2", (PyCFunction)py_echo_TestCall2, METH_VARARGS|METH_KEYWORDS, NULL },
{ "echo_TestSleep", (PyCFunction)py_echo_TestSleep, METH_VARARGS|METH_KEYWORDS, NULL },
{ "echo_TestEnum", (PyCFunction)py_echo_TestEnum, METH_VARARGS|METH_KEYWORDS, NULL },
{ "echo_TestSurrounding", (PyCFunction)py_echo_TestSurrounding, METH_VARARGS|METH_KEYWORDS, NULL },
{ "echo_TestDoublePointer", (PyCFunction)py_echo_TestDoublePointer, METH_VARARGS|METH_KEYWORDS, NULL },
{ NULL, NULL, 0, NULL }
};
static void interface_rpcecho_dealloc(PyObject* self)
{
rpcecho_InterfaceObject *interface = (rpcecho_InterfaceObject *)self;
talloc_free(interface->pipe);
PyObject_Del(self);
}
static PyObject *interface_rpcecho_getattr(PyObject *obj, char *name)
{
return Py_FindMethod(interface_rpcecho_methods, obj, name);
}
static PyTypeObject rpcecho_InterfaceType = {
PyObject_HEAD_INIT(NULL) 0,
.tp_name = "rpcecho",
.tp_basicsize = sizeof(rpcecho_InterfaceObject),
.tp_dealloc = (destructor)interface_rpcecho_dealloc,
.tp_getattr = (getattrfunc)interface_rpcecho_getattr,
};
static PyObject *interface_rpcecho(PyObject *self, PyObject *args)
{
rpcecho_InterfaceObject *ret;
const char *binding_string;
struct cli_credentials *credentials;
struct loadparm_context *lp_ctx;
TALLOC_CTX *mem_ctx = NULL;
NTSTATUS status;
ret = PyObject_New(rpcecho_InterfaceObject, &rpcecho_InterfaceType);
status = dcerpc_pipe_connect(NULL, &ret->pipe, binding_string,
&ndr_table_rpcecho, credentials, NULL, lp_ctx);
if (NT_STATUS_IS_ERR(status)) {
PyErr_SetString(PyExc_RuntimeError, nt_errstr(status));
talloc_free(mem_ctx);
return NULL;
}
return (PyObject *)ret;
}
static PyMethodDef echo_methods[] = {
{ "info1", (PyCFunction)py_echo_info1, METH_NOARGS, NULL },
{ "info2", (PyCFunction)py_echo_info2, METH_NOARGS, NULL },
{ "info3", (PyCFunction)py_echo_info3, METH_NOARGS, NULL },
{ "info4", (PyCFunction)py_echo_info4, METH_NOARGS, NULL },
{ "info5", (PyCFunction)py_echo_info5, METH_NOARGS, NULL },
{ "info6", (PyCFunction)py_echo_info6, METH_NOARGS, NULL },
{ "info7", (PyCFunction)py_echo_info7, METH_NOARGS, NULL },
{ "Enum2", (PyCFunction)py_echo_Enum2, METH_NOARGS, NULL },
{ "Surrounding", (PyCFunction)py_echo_Surrounding, METH_NOARGS, NULL },
{ "rpcecho", (PyCFunction)interface_rpcecho, METH_VARARGS|METH_KEYWORDS, NULL },
{ NULL, NULL, 0, NULL }
};
void initecho(void)
{
PyObject *m;
m = Py_InitModule("echo", echo_methods);
PyModule_AddObject(m, "ECHO_ENUM1", PyInt_FromLong(ECHO_ENUM1));
PyModule_AddObject(m, "ECHO_ENUM2_32", PyInt_FromLong(ECHO_ENUM2_32));
PyModule_AddObject(m, "ECHO_ENUM2", PyInt_FromLong(ECHO_ENUM2));
PyModule_AddObject(m, "ECHO_ENUM1_32", PyInt_FromLong(ECHO_ENUM1_32));
}

8
source4/py_echo.h Normal file
View File

@ -0,0 +1,8 @@
/* header auto-generated by pidl */
#ifndef _HEADER_PYTHON_rpcecho
#define _HEADER_PYTHON_rpcecho
#endif /* _HEADER_NDR_rpcecho */

View File

@ -22,7 +22,7 @@
void py_talloc_dealloc(PyObject* self)
{
py_talloc_Object *obj = (py_talloc_Object *)self;
talloc_free(obj->object);
talloc_free(obj->talloc_ptr);
PyObject_Del(self);
}
@ -32,3 +32,11 @@ PyObject *py_talloc_import(PyTypeObject *py_type, void *ptr)
ret->talloc_ptr = talloc_reference(NULL, ptr);
return ret;
}
PyObject *py_talloc_default_repr(PyObject *py_obj)
{
py_talloc_Object *obj = (py_talloc_Object *)py_obj;
return PyString_FromFormat("<talloc: %s>",
talloc_get_name(obj->talloc_ptr));
}

View File

@ -40,4 +40,7 @@ void py_talloc_dealloc(PyObject* self);
PyObject *py_talloc_import(PyTypeObject *py_type, void *ptr);
/* Sane default implementation of reprfunc. */
PyObject *py_talloc_default_repr(PyObject *py_obj);
#endif /* _PY_TALLOC_H_ */