meter_python.cpp
00001 /*************************************************************************** 00002 * Copyright (C) 2003-2004 Adam Geitgey <adam@rootnode.org> * 00003 * Copyright (C) 2003 Hans Karlsson <karlsson.h@home.se> * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the GNU General Public License as published by * 00007 * the Free Software Foundation; either version 2 of the License, or * 00008 * (at your option) any later version. * 00009 ***************************************************************************/ 00010 00011 #ifdef _XOPEN_SOURCE 00012 #undef _XOPEN_SOURCE 00013 #endif 00014 00015 #include <Python.h> 00016 #include <tqobject.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 if (!karambaApp) 00027 { 00028 PyErr_SetString(PyExc_ValueError, "app pointer was 0."); 00029 return false; 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 TQString 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 TQString 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 (!((TQObject*)meter)->isA(type)) 00064 { 00065 TQString 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 // This just throws awya extra bytes. 00080 // I guess there is a better way to do this... 00081 TQString fromUcs4(TQ_UINT32* ucs4) 00082 { 00083 TQString result = ""; 00084 while(*ucs4 != 0) 00085 { 00086 result += TQChar((TQ_UINT16)*ucs4); 00087 ++ucs4; 00088 } 00089 return result; 00090 } 00091 00092 // Converts a Python String to a TQString with Unicode support 00093 TQString PyString2TQString(PyObject* text) 00094 { 00095 TQString qtext; 00096 if (PyBytes_CheckExact(text)) 00097 { 00098 char* t = PyBytes_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((TQ_UINT32*)t); 00106 else 00107 qtext = TQString::fromUcs2((TQ_UINT16*)t); 00108 } 00109 else 00110 { 00111 // Error raise execption ... 00112 } 00113 return qtext; 00114 } 00115 00116 // Converts a TQString to a Python String with Unicode support 00117 PyObject* TQString2PyString(TQString 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 = PyBytes_FromString(""); 00152 00153 return pyString; 00154 } 00155 00156 00157 long getMeter(long widget, char* name) 00158 { 00159 karamba* theme = (karamba*)widget; 00160 TQObjectListIt it( *theme->meterList ); // iterate over meters 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, TQString 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, TQString 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, TQString 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, TQString 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, TQString 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, TQString 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, TQString 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, TQString 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, TQString 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, TQString 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 TQString2PyString(((Meter*)meter)->getStringValue())); 00287 } 00288 00289 PyObject* py_setStringValue(PyObject *, PyObject *args, TQString 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(PyString2TQString(s)); 00300 return Py_BuildValue((char*)"l", ((long)meter)); 00301 } 00302 00303 PyObject* py_getMinMax(PyObject *, PyObject *args, TQString 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, TQString 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, TQString type) 00327 { 00328 long widget, meter; 00329 TQString 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, TQString 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, TQString 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(TQColor(r, g, b)); 00360 return Py_BuildValue((char*)"l", 1); 00361 } 00362 00363 PyObject* py_getColor(PyObject *, PyObject *args, TQString 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 TQColor color = ((Meter*)meter)->getColor(); 00371 return Py_BuildValue((char*)"(i,i,i)", color.red(), color.green(), color.blue()); 00372 } 00373