source: branches/uq/lang/python/Rappture/PyRpEncode.cc @ 5679

Last change on this file since 5679 was 5679, checked in by ldelgass, 9 years ago

Full merge 1.3 branch to uq branch to sync. Fixed partial subdirectory merge
by removing mergeinfo from lang/python/Rappture directory.

  • Property svn:eol-style set to native
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.