00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifdef _XOPEN_SOURCE
00012 #undef _XOPEN_SOURCE
00013 #endif
00014
00015 #include <Python.h>
00016 #include <qobject.h>
00017 #include "karamba.h"
00018 #include "karambaapp.h"
00019 #include "meter.h"
00020 #include "meter_python.h"
00021 #include "lineparser.h"
00022
00023 bool checkKaramba(long widget)
00024 {
00025
00026
00027
00028
00029
00030
00031
00032 if (!widget)
00033 {
00034 PyErr_SetString(PyExc_ValueError, "widget pointer was 0.");
00035 return false;
00036 }
00037 if (!karambaApp->hasKaramba((karamba*)widget))
00038 {
00039 QString tmp;
00040
00041 tmp.sprintf("no %x widget found.", (unsigned int)widget);
00042 PyErr_SetString(PyExc_ValueError, tmp.ascii());
00043 return false;
00044 }
00045 return true;
00046 }
00047
00048 bool checkMeter(long widget, long meter, const char* type)
00049 {
00050 if (!meter)
00051 {
00052 PyErr_SetString(PyExc_ValueError, "meter pointer was 0.");
00053 return false;
00054 }
00055 if (!((karamba*)widget)->hasMeter((Meter*)meter))
00056 {
00057 QString tmp;
00058
00059 tmp.sprintf("widget does not have meter %x.", (unsigned int)meter);
00060 PyErr_SetString(PyExc_ValueError, tmp.ascii());
00061 return false;
00062 }
00063 if (!((QObject*)meter)->isA(type))
00064 {
00065 QString tmp;
00066
00067 tmp.sprintf("meter is not type of %s.", type);
00068 PyErr_SetString(PyExc_TypeError, tmp.ascii());
00069 return false;
00070 }
00071 return true;
00072 }
00073
00074 bool checkKarambaAndMeter(long widget, long meter, const char* type)
00075 {
00076 return checkKaramba(widget) && checkMeter(widget, meter, type);
00077 }
00078
00079
00080
00081 QString fromUcs4(Q_UINT32* ucs4)
00082 {
00083 QString result = "";
00084 while(*ucs4 != 0)
00085 {
00086 result += QChar((Q_UINT16)*ucs4);
00087 ++ucs4;
00088 }
00089 return result;
00090 }
00091
00092
00093 QString PyString2QString(PyObject* text)
00094 {
00095 QString qtext;
00096 if (PyString_CheckExact(text))
00097 {
00098 char* t = PyString_AsString(text);
00099 qtext.setAscii(t);
00100 }
00101 else if (PyUnicode_CheckExact(text))
00102 {
00103 Py_UNICODE* t = PyUnicode_AsUnicode(text);
00104 if(sizeof(Py_UNICODE) == 4)
00105 qtext = fromUcs4((Q_UINT32*)t);
00106 else
00107 qtext = QString::fromUcs2((Q_UINT16*)t);
00108 }
00109 else
00110 {
00111
00112 }
00113 return qtext;
00114 }
00115
00116
00117 PyObject* QString2PyString(QString string)
00118 {
00119 PyObject *pyString;
00120
00121 const unsigned short* tmp = string.ucs2();
00122 bool dofree = false;
00123
00124 if(tmp)
00125 {
00126 #if Py_UNICODE_SIZE == 4
00127
00128 Py_UNICODE* buf = new Py_UNICODE[string.length()];
00129
00130 for(unsigned int i = 0; i < string.length(); i++)
00131 {
00132 buf[i] = tmp[i];
00133 }
00134 dofree = true;
00135
00136 #else
00137
00138 Py_UNICODE* buf = (Py_UNICODE*) tmp;
00139
00140 #endif
00141
00142 pyString = PyUnicode_FromUnicode(buf, string.length());
00143
00144 if(dofree)
00145 {
00146 delete [] buf;
00147 }
00148 }
00149
00150 else
00151 pyString = PyString_FromString("");
00152
00153 return pyString;
00154 }
00155
00156
00157 long getMeter(long widget, char* name)
00158 {
00159 karamba* theme = (karamba*)widget;
00160 QObjectListIt it( *theme->meterList );
00161
00162 while ( it != 0 )
00163 {
00164 if (strcmp(((Meter*) *it)->name(), name) == 0)
00165 return (long)*it;
00166 ++it;
00167 }
00168 return 0;
00169 }
00170
00171 PyObject* py_getThemeMeter(PyObject *, PyObject *args, QString type)
00172 {
00173 long widget, meter;
00174 char* name;
00175 if (!PyArg_ParseTuple(args, (char*)"ls", &widget, &name))
00176 return NULL;
00177 if (!checkKaramba(widget))
00178 return NULL;
00179 if(!name)
00180 return NULL;
00181 meter = getMeter(widget, name);
00182 if (!checkMeter(widget, meter, type.ascii()))
00183 return NULL;
00184 return (Py_BuildValue((char*)"l", meter));
00185 }
00186
00187 PyObject* py_getSize(PyObject *, PyObject *args, QString type)
00188 {
00189 long widget;
00190 long meter;
00191 if (!PyArg_ParseTuple(args, (char*)"ll", &widget, &meter))
00192 return NULL;
00193 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00194 return NULL;
00195 return Py_BuildValue((char*)"(i,i)", ((Meter*)meter)->getWidth(),
00196 ((Meter*)meter)->getHeight());
00197 }
00198
00199 PyObject* py_resize(PyObject *, PyObject *args, QString type)
00200 {
00201 long widget, meter, x, y;
00202 if (!PyArg_ParseTuple(args, (char*)"llll", &widget, &meter, &x, &y))
00203 return NULL;
00204 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00205 return NULL;
00206 ((Meter*)meter)->setSize(((Meter*)meter)->getX(), ((Meter*)meter)->getY(),
00207 x, y);
00208 return Py_BuildValue((char*)"l", 1);
00209 }
00210
00211 PyObject* py_getPos(PyObject *, PyObject *args, QString type)
00212 {
00213 long widget, meter;
00214 if (!PyArg_ParseTuple(args, (char*)"ll", &widget, &meter))
00215 return NULL;
00216 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00217 return NULL;
00218 return Py_BuildValue((char*)"(i,i)", ((Meter*)meter)->getX(),
00219 ((Meter*)meter)->getY());
00220 }
00221
00222 PyObject* py_move(PyObject *, PyObject *args, QString type)
00223 {
00224 long widget, meter, x, y;
00225 if (!PyArg_ParseTuple(args, (char*)"llll", &widget, &meter, &x, &y))
00226 return NULL;
00227 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00228 return NULL;
00229 ((Meter*)meter)->setSize(x, y,
00230 ((Meter*)meter)->getWidth(),
00231 ((Meter*)meter)->getHeight());
00232 return Py_BuildValue((char*)"l", 1);
00233 }
00234
00235 PyObject* py_hide(PyObject *, PyObject *args, QString type)
00236 {
00237 long widget, meter;
00238 if (!PyArg_ParseTuple(args, (char*)"ll", &widget, &meter))
00239 return NULL;
00240 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00241 return NULL;
00242 ((Meter*)meter)->hide();
00243 return Py_BuildValue((char*)"l", 1);
00244 }
00245
00246 PyObject* py_show(PyObject *, PyObject *args, QString type)
00247 {
00248 long widget, meter;
00249 if (!PyArg_ParseTuple(args, (char*)"ll", &widget, &meter))
00250 return NULL;
00251 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00252 return NULL;
00253 ((Meter*)meter)->show();
00254 return Py_BuildValue((char*)"l", 1);
00255 }
00256
00257 PyObject* py_getValue(PyObject *, PyObject *args, QString type)
00258 {
00259 long widget, meter;
00260 if (!PyArg_ParseTuple(args, (char*)"ll", &widget, &meter))
00261 return NULL;
00262 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00263 return NULL;
00264 return Py_BuildValue((char*)"l", ((Meter*)meter)->getValue());
00265 }
00266
00267 PyObject* py_setValue(PyObject *, PyObject *args, QString type)
00268 {
00269 long widget, meter, l;
00270 if (!PyArg_ParseTuple(args, (char*)"lll", &widget, &meter, &l))
00271 return NULL;
00272 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00273 return NULL;
00274 ((Meter*)meter)->setValue(l);
00275 return Py_BuildValue((char*)"l", ((long)meter));
00276 }
00277
00278 PyObject* py_getStringValue(PyObject *, PyObject *args, QString type)
00279 {
00280 long widget, meter;
00281 if (!PyArg_ParseTuple(args, (char*)"ll", &widget, &meter))
00282 return NULL;
00283 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00284 return NULL;
00285 return Py_BuildValue((char*)"O",
00286 QString2PyString(((Meter*)meter)->getStringValue()));
00287 }
00288
00289 PyObject* py_setStringValue(PyObject *, PyObject *args, QString type)
00290 {
00291 long widget, meter;
00292 PyObject* s;
00293 if (!PyArg_ParseTuple(args, (char*)"llO", &widget, &meter, &s))
00294 return NULL;
00295 if (!s)
00296 return NULL;
00297 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00298 return NULL;
00299 ((Meter*)meter)->setValue(PyString2QString(s));
00300 return Py_BuildValue((char*)"l", ((long)meter));
00301 }
00302
00303 PyObject* py_getMinMax(PyObject *, PyObject *args, QString type)
00304 {
00305 long widget, meter;
00306 if (!PyArg_ParseTuple(args, (char*)"ll", &widget, &meter))
00307 return NULL;
00308 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00309 return NULL;
00310 return Py_BuildValue((char*)"(i,i)", ((Meter*)meter)->getMin(),
00311 ((Meter*)meter)->getMax());
00312 }
00313
00314 PyObject* py_setMinMax(PyObject *, PyObject *args, QString type)
00315 {
00316 long widget, meter, x, y;
00317 if (!PyArg_ParseTuple(args, (char*)"llll", &widget, &meter, &x, &y))
00318 return NULL;
00319 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00320 return NULL;
00321 ((Meter*)meter)->setMin(x);
00322 ((Meter*)meter)->setMax(y);
00323 return Py_BuildValue((char*)"l", 1);
00324 }
00325
00326 PyObject* py_getSensor(PyObject *, PyObject *args, QString type)
00327 {
00328 long widget, meter;
00329 QString s;
00330 if (!PyArg_ParseTuple(args, (char*)"ll", &widget, &meter))
00331 return NULL;
00332 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00333 return NULL;
00334 return Py_BuildValue((char*)"s",
00335 ((karamba*)widget)->getSensor((Meter*)meter).ascii());
00336 }
00337
00338 PyObject* py_setSensor(PyObject *, PyObject *args, QString type)
00339 {
00340 long widget, meter;
00341 char* s;
00342
00343 if (!PyArg_ParseTuple(args, (char*)"lls", &widget, &meter, &s))
00344 return NULL;
00345 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00346 return NULL;
00347 ((karamba*)widget)->setSensor(LineParser(s), (Meter*)meter);
00348 return Py_BuildValue((char*)"l", 1);
00349 }
00350
00351 PyObject* py_setColor(PyObject *, PyObject *args, QString type)
00352 {
00353 long widget, meter;
00354 long r, g, b;
00355 if (!PyArg_ParseTuple(args, (char*)"lllll", &widget, &meter, &r, &g, &b))
00356 return NULL;
00357 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00358 return NULL;
00359 ((Meter*)meter)->setColor(QColor(r, g, b));
00360 return Py_BuildValue((char*)"l", 1);
00361 }
00362
00363 PyObject* py_getColor(PyObject *, PyObject *args, QString type)
00364 {
00365 long widget, meter;
00366 if (!PyArg_ParseTuple(args, (char*)"ll", &widget, &meter))
00367 return NULL;
00368 if (!checkKarambaAndMeter(widget, meter, type.ascii()))
00369 return NULL;
00370 QColor color = ((Meter*)meter)->getColor();
00371 return Py_BuildValue((char*)"(i,i,i)", color.red(), color.green(), color.blue());
00372 }
00373