source: trunk/lang/python/Rappture/PyRpEncode.cc @ 3177

Last change on this file since 3177 was 3177, checked in by mmc, 12 years ago

Updated all of the copyright notices to reference the transfer to
the new HUBzero Foundation, LLC.

File size: 4.7 KB
Line 
1
2/*
3 * Rappture Encode Python Interface
4 *
5 * ======================================================================
6 *  Derrick S. Kearney, Purdue University
7 *  Copyright (c) 2004-2012  HUBzero Foundation, LLC
8 *
9 *  See the file "license.terms" for information on usage and
10 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
11 * ======================================================================
12 */
13#include <Python.h>
14#include <RpEncode.h>
15
16static PyObject *ErrorObject;
17
18PyDoc_STRVAR(RpEncode_isbinary_doc,
19"isbinary(data)\n\
20\n\
21Check to see if there are binary characters\n\
22in the provided data.");
23
24static PyObject*
25RpEncode_isbinary(PyObject *self, PyObject *args, PyObject *keywds)
26{
27    const char* data = NULL;
28    int dlen = 0;
29    PyObject* rv = NULL;
30
31    static char *kwlist[] = {
32        (char *)"data",
33        NULL
34    };
35
36    if (PyTuple_Size(args) != 1) {
37        PyErr_SetString(PyExc_TypeError,"isbinary() takes exactly 1 argument");
38        return NULL;
39    }
40
41    if (!PyArg_ParseTupleAndKeywords(args, keywds, "s#",
42            kwlist, &data, &dlen)) {
43        PyErr_SetString(PyExc_TypeError,"isbinary() takes exactly 1 argument");
44        return NULL;
45    }
46
47    rv = PyFloat_FromDouble(Rappture::encoding::isBinary(data,dlen));
48    return rv;
49}
50
51PyDoc_STRVAR(RpEncode_encode_doc,
52"encode(data,flags)\n\
53\n\
54Encode the provided data with gzip compression and base64 \n\
55according to the provided flags");
56
57static PyObject*
58RpEncode_encode(PyObject *self, PyObject *args, PyObject *keywds)
59{
60    const char* data = NULL;
61    int dlen = 0;
62    int flags = 0;
63    PyObject* rv = NULL;
64    Rappture::Outcome err;
65
66    static char *kwlist[] = {
67        (char *)"data",
68        (char *)"flags",
69        NULL
70    };
71
72    if (PyTuple_Size(args) != 2) {
73        PyErr_SetString(PyExc_TypeError,"encode() takes exactly 2 arguments");
74        return NULL;
75    }
76
77    if (!PyArg_ParseTupleAndKeywords(args, keywds, "s#i",
78            kwlist, &data, &dlen, &flags)) {
79        PyErr_SetString(PyExc_TypeError,"encode() takes exactly 2 arguments");
80        return NULL;
81    }
82
83    Rappture::Buffer buf(data, dlen);
84    if (!Rappture::encoding::encode(err, buf, flags)) {
85        std::string outStr;
86
87        outStr = err.remark();
88        outStr += "\n";
89        outStr += err.context();
90        PyErr_SetString(PyExc_RuntimeError, outStr.c_str());
91        buf.clear();
92        return NULL;
93    }
94    rv = PyString_FromStringAndSize(buf.bytes(),buf.size());
95    return rv;
96}
97
98PyDoc_STRVAR(RpEncode_decode_doc,
99"decode(data,flags)\n\
100\n\
101Decode the provided data with gzip compression and base64 \n\
102according to the provided flags");
103
104static PyObject*
105RpEncode_decode(PyObject *self, PyObject *args, PyObject *keywds)
106{
107    const char* data = NULL;
108    int dlen = 0;
109    int flags = 0;
110    PyObject* rv = NULL;
111    Rappture::Outcome err;
112
113    static char *kwlist[] = {
114        (char *)"data",
115        (char *)"flags",
116        NULL
117    };
118
119    if (PyTuple_Size(args) != 2) {
120        PyErr_SetString(PyExc_TypeError,"decode() takes exactly 2 arguments");
121        return NULL;
122    }
123
124    if (!PyArg_ParseTupleAndKeywords(args, keywds, "s#i",
125            kwlist, &data, &dlen, &flags)) {
126        PyErr_SetString(PyExc_TypeError,"decode() takes exactly 2 arguments");
127        return NULL;
128    }
129
130    Rappture::Buffer buf(data, dlen);
131    if (!Rappture::encoding::decode(err, buf, flags)) {
132        std::string outStr;
133
134        outStr = err.remark();
135        outStr += "\n";
136        outStr += err.context();
137        PyErr_SetString(PyExc_RuntimeError,outStr.c_str());
138        return NULL;
139    }
140    rv = PyString_FromStringAndSize(buf.bytes(),buf.size());
141    return rv;
142}
143
144/* ---------- */
145
146
147/* List of functions defined in the module */
148
149static PyMethodDef RpEncode_Methods[] = {
150
151    {"isbinary", (PyCFunction)RpEncode_isbinary, METH_VARARGS|METH_KEYWORDS,
152        RpEncode_isbinary_doc},
153    {"encode", (PyCFunction)RpEncode_encode, METH_VARARGS|METH_KEYWORDS,
154        RpEncode_encode_doc},
155    {"decode", (PyCFunction)RpEncode_decode, METH_VARARGS|METH_KEYWORDS,
156        RpEncode_decode_doc},
157
158    {NULL,        NULL}        /* sentinel */
159};
160
161PyDoc_STRVAR(module_doc, "Rappture Encode Module for Python.");
162
163/* Initialization function for the module */
164
165PyMODINIT_FUNC
166initencoding(void)
167{
168    PyObject *m;
169
170    /* Create the module and add the functions */
171    m = Py_InitModule3("encoding", RpEncode_Methods, module_doc);
172
173    if (ErrorObject == NULL) {
174        ErrorObject = PyErr_NewException((char *)"Rappture.encoding.error",
175                NULL, NULL);
176        if (ErrorObject == NULL) {
177            return;
178        }
179    }
180    Py_INCREF(ErrorObject);
181    PyModule_AddObject(m, "error", ErrorObject);
182
183    return;
184}
Note: See TracBrowser for help on using the repository browser.