From fa75018c1432d0aaaf4674b502fe6cafdfd5156c Mon Sep 17 00:00:00 2001 From: Detlev Casanova Date: Sun, 11 Jul 2010 18:28:07 +0200 Subject: Get the proper layman Python library and fix BareConfig constructor to take a Message class as first argument. --- src/config.c | 67 +++++++++++++++++----- src/config.h | 18 +++++- src/laymanapi.c | 18 +++++- src/laymanapi.h | 4 +- src/message.c | 23 +++++--- src/overlay.c | 170 ------------------------------------------------------- src/overlay.h | 20 ------- src/stringlist.c | 18 +++++- src/stringlist.h | 2 + src/tester.c | 36 ++++++++---- 10 files changed, 147 insertions(+), 229 deletions(-) delete mode 100644 src/overlay.c delete mode 100644 src/overlay.h diff --git a/src/config.c b/src/config.c index db632f2..624f1ab 100644 --- a/src/config.c +++ b/src/config.c @@ -1,33 +1,72 @@ +#include + #include "config.h" #include "interpreter.h" -#include -struct Config +struct BareConfig { PyObject *object; }; -PyObject *_object(Config *c) +PyObject *_bareConfigObject(BareConfig *c) { - return c ? c->object : NULL; + if (c && c->object) + return c->object; + else + Py_RETURN_NONE; } -Config *createConfig(const char *argv[], int argc) +BareConfig *bareConfigCreate(Message *m, FILE* outFd, FILE* inFd, FILE* errFd) { - PyObject *pyargs = PyList_New(argc); - for (int i = 0; i < argc; i++) - { - PyObject *arg = PyBytes_FromString(argv[i]); - PyList_Insert(pyargs, i, arg); - } + PyObject *pyout = PyFile_FromFile(((!outFd || fileno(outFd) <= 0) ? stdout : outFd), + "", "w", 0); + PyObject *pyin = PyFile_FromFile(((!inFd || fileno(inFd) <= 0) ? stdin : inFd), + "", "r", 0); + PyObject *pyerr = PyFile_FromFile(((!errFd || fileno(errFd) <= 0) ? stderr : errFd), + "", "w", 0); + + PyObject *obj = executeFunction("layman.config", "BareConfig", "OOOO", _messageObject(m), pyout, pyin, pyerr); + Py_DECREF(pyout); + Py_DECREF(pyin); + Py_DECREF(pyerr); - PyObject *obj = executeFunction("layman.config", "Config", "O", pyargs); - Py_DECREF(pyargs); if (!obj) return NULL; - Config *ret = malloc(sizeof(Config)); + BareConfig *ret = malloc(sizeof(BareConfig)); ret->object = obj; return ret; } + +void bareConfigFree(BareConfig* cfg) +{ + if (cfg && cfg->object) + { + Py_DECREF(cfg->object); + } + + if (cfg) + free(cfg); +} + +const char* bareConfigGetDefaultValue(BareConfig* cfg, const char* opt) +{ + PyObject *obj = PyObject_CallMethod(cfg->object, "get_defaults", NULL); + if (!obj) + return NULL; + + if (PyDict_Contains(obj, PyBytes_FromString(opt))) + return PyBytes_AsString(PyDict_GetItem(obj, PyBytes_FromString(opt))); + else + return ""; +} + +int bareConfigSetOptionValue(BareConfig* cfg, const char* opt, const char* val) +{ + PyObject *obj = PyObject_CallMethod(cfg->object, "set_option", "(zz)", opt, val); + if (obj) + return 1; + else + return 0; +} diff --git a/src/config.h b/src/config.h index e977cdc..33bfd1e 100644 --- a/src/config.h +++ b/src/config.h @@ -3,10 +3,22 @@ #include -typedef struct Config Config; +#include "stringlist.h" +#include "message.h" -Config *createConfig(const char *argv[], int argc); +typedef struct BareConfig BareConfig; -PyObject *_object(Config*); +BareConfig* bareConfigCreate(Message* m, FILE* outFd, FILE* inFd, FILE* errFd); + +/* + * FIXME : could the Python lib work the same way ? + */ + +const char* bareConfigGetDefaultValue(BareConfig* cfg, const char*); +int bareConfigSetOptionValue(BareConfig* cfg, const char*, const char*); + +PyObject* _bareConfigObject(BareConfig*); + +void bareConfigFree(BareConfig*); #endif diff --git a/src/laymanapi.c b/src/laymanapi.c index ae4b2eb..328a572 100644 --- a/src/laymanapi.c +++ b/src/laymanapi.c @@ -2,6 +2,10 @@ #include "interpreter.h" #include "laymanapi.h" +/* + * FIXME: free memory !!! + */ + struct LaymanAPI { PyObject *object; @@ -13,9 +17,9 @@ OverlayInfo strToInfo(const char* str) return ret; } -LaymanAPI* laymanAPICreate(Config* config, int report_error, int output) +LaymanAPI* laymanAPICreate(BareConfig* config, int report_error, int output) { - PyObject *obj = executeFunction("layman.api", "LaymanAPI", "OII", _configObject(config), report_error, output); + PyObject *obj = executeFunction("layman.api", "LaymanAPI", "OII", _bareConfigObject(config), report_error, output); if (!obj) return NULL; @@ -113,3 +117,13 @@ const char* laymanAPIGetInfo(LaymanAPI* l, const char* overlay) //TODO:also return 'official' an 'supported' (see laymanapi.h) } +void laymanAPIFree(LaymanAPI* l) +{ + if (l && l->object) + { + Py_DECREF(l->object); + } + + if (l) + free(l); +} diff --git a/src/laymanapi.h b/src/laymanapi.h index 42c0058..c89d3a4 100644 --- a/src/laymanapi.h +++ b/src/laymanapi.h @@ -24,7 +24,7 @@ typedef struct OverlayInfo } OverlayInfo; -LaymanAPI* laymanAPICreate(Config*, int, int); +LaymanAPI* laymanAPICreate(BareConfig*, int, int); StringList* laymanAPIGetAvailable(LaymanAPI*); StringList* laymanAPIGetInstalled(LaymanAPI*); @@ -44,4 +44,6 @@ int laymanAPISync(LaymanAPI*, const char*); int laymanAPIFetchRemoteList(LaymanAPI*); const char* laymanAPIGetInfo(LaymanAPI*, const char*); +void laymanAPIFree(LaymanAPI*); + #endif diff --git a/src/message.c b/src/message.c index bc0ee56..85a1717 100644 --- a/src/message.c +++ b/src/message.c @@ -7,6 +7,11 @@ struct Message PyObject *object; }; +/* + * TODO: This constructor is too big. + * Create a little constructor that uses default values + * and add helper functions to set the values + */ Message *messageCreate(const char* module, FILE* out, FILE* err, @@ -22,13 +27,12 @@ Message *messageCreate(const char* module, { PyObject *pyout, *pyerr, *pydbg, *pymth, *pyobj, *pyvar; - pyout = PyFile_FromFile((fileno(out) <= 0 ? stdout : out), - NULL, "w", 0); - pyerr = PyFile_FromFile((fileno(err) <= 0 ? stderr : err), - NULL, "w", 0); - pydbg = PyFile_FromFile((fileno(dbg) <= 0 ? stderr : dbg), - NULL, "w", 0); - + pyout = PyFile_FromFile(((!out || fileno(out) <= 0) ? stdout : out), + "", "w", 0); + pyerr = PyFile_FromFile(((!err || fileno(err) <= 0) <= 0 ? stderr : err), + "", "w", 0); + pydbg = PyFile_FromFile(((!dbg || fileno(dbg) <= 0) ? stderr : dbg), + "", "w", 0); pymth = cListToPyList(mth); pyobj = cListToPyList(obj); @@ -67,5 +71,8 @@ Message *messageCreate(const char* module, PyObject *_messageObject(Message* m) { - return m ? m->object : NULL; + if (m && m->object) + return m->object; + else + Py_RETURN_NONE; } diff --git a/src/overlay.c b/src/overlay.c deleted file mode 100644 index 9b2b2f7..0000000 --- a/src/overlay.c +++ /dev/null @@ -1,170 +0,0 @@ -#include - -#include "interpreter.h" -#include "overlay.h" - -struct Overlay -{ - PyObject *object; -}; - -/* - * FIXME: should the xml argument be an expat element ? - */ -Overlay *createOverlay(const char *xml, const char *config, int ignore, int quiet) -{ - //First argument must be a xml.etree.Element - //PyObject *elem = executeFunction("layman.overlays.overlay", "testfunc", NULL); - PyObject *elem = executeFunction("xml.etree.ElementTree", "fromstring", "(s)", xml); - if (!elem) - return NULL; - - config = config; - PyObject *cfg = PyDict_New(); - if (!cfg) - return NULL; - - PyObject *overlay = executeFunction("layman.overlays.overlay", "Overlay", "(OOIb)", elem, cfg, ignore, quiet); - if (!overlay) - return NULL; - Overlay *ret = malloc(sizeof(Overlay)); - ret->object = overlay; - - return ret; -} - -const char *overlayName(Overlay *o) -{ - if (!o || !o->object) - return NULL; - - PyObject *name = PyObject_GetAttrString(o->object, "name"); - - //TODO:Py_DECREF me ! - - return PyBytes_AsString(name); -} - -const char *overlayOwnerEmail(Overlay *o) -{ - if (!o || !o->object) - return NULL; - - PyObject *ret = PyObject_GetAttrString(o->object, "owner_email"); - - //TODO:Py_DECREF me ! - - return PyBytes_AsString(ret); -} - -int overlayPriority(Overlay *o) -{ - if (!o || !o->object) - return -1; - - PyObject *prio = PyObject_GetAttrString(o->object, "priority"); - - //TODO:Py_DECREF me ! - - return (int) PyLong_AsLong(prio); -} - -const char *overlayDescription(Overlay *o) -{ - if (!o || !o->object) - return NULL; - - PyObject *desc = PyObject_GetAttrString(o->object, "description"); - - //TODO:Py_DECREF me ! - - return PyBytes_AsString(desc); -} - -int overlayIsOfficial(Overlay *o) -{ - if (!o || !o->object) - return -1; - - PyObject *iso = PyObject_CallMethod(o->object, "is_official", NULL); - - //TODO:Py_DECREF me ! - - return (int) PyLong_AsLong(iso); -} - -int overlayIsSupported(Overlay *o) -{ - if (!o || !o->object) - return -1; - - PyObject *iss = PyObject_CallMethod(o->object, "is_supported", NULL); - - //TODO:Py_DECREF me ! - - return (int) PyLong_AsLong(iss); -} - -const char *overlayShortList(Overlay *o) -{ - if (!o || !o->object) - return NULL; - - PyObject *sl = PyObject_CallMethod(o->object, "short_list", NULL); - - //TODO:Py_DECREF me ! - - return PyBytes_AsString(sl); -} - -const char *overlayStr(Overlay *o) -{ - if (!o || !o->object) - return NULL; - - PyObject *str = PyObject_CallMethod(o->object, "str", NULL); - - //TODO:Py_DECREF me ! - - return PyBytes_AsString(str); -} - -const char *overlayToXml(Overlay *o) -{ - if (!o || !o->object) - return NULL; - - PyObject *element = PyObject_CallMethod(o->object, "to_xml", NULL); - PyObject *str = executeFunction("xml.etree.ElementTree", "tostring", "(O)", element); - - Py_DECREF(element); - - return PyBytes_AsString(str); -} - -void overlaySetPriority(Overlay *o, int priority) -{ - if (!o || !o->object) - return; - - PyObject_CallMethod(o->object, "set_priority", "(I)", priority); -} - -int overlaySame(Overlay *o1, Overlay *o2) -{ - PyObject *ret = PyObject_RichCompare(o1->object, o2->object, Py_EQ); - if (!ret) - return 0; - - return PyObject_IsTrue(ret); -} - -void overlayFree(Overlay *o) -{ - if (o && o->object) - { - Py_DECREF(o->object); - } - if (o) - free(o); -} diff --git a/src/overlay.h b/src/overlay.h deleted file mode 100644 index d6b96fd..0000000 --- a/src/overlay.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef OVERLAY_H -#define OVERLAY_H - -//TODO:document me ! - -typedef struct Overlay Overlay; - -Overlay* createOverlay(const char*, const char*, int, int); -const char* overlayName(Overlay*); -const char* overlayOwnerEmail(Overlay*); -const char* overlayDescription(Overlay*); -const char* overlayShortList(Overlay*); -const char* overlayStr(Overlay*); -const char* overlayToXml(Overlay*); -int overlayPriority(Overlay*); -int overlayIsOfficial(Overlay*); -int overlayIsSupported(Overlay*); -void overlayFree(Overlay*); - -#endif diff --git a/src/stringlist.c b/src/stringlist.c index dc2a45d..22d6ef6 100644 --- a/src/stringlist.c +++ b/src/stringlist.c @@ -34,7 +34,7 @@ StringList* listToCList(PyObject* list) PyObject* cListToPyList(StringList* list) { if (!list) - return NULL; + Py_RETURN_NONE; PyObject *ret = PyList_New(list->count); for(int i = 0; i < list->count; i++) @@ -45,6 +45,21 @@ PyObject* cListToPyList(StringList* list) return ret; } +void stringListPrint(StringList* list) +{ + if (!list) + return; + + for(int i = 0; i < list->count; i++) + { + printf("\"%s\"", list->list[i]); + if (i < list->count - 1) + printf(", "); + } + + free(list); +} + void stringListFree(StringList* list) { if (!list) @@ -57,3 +72,4 @@ void stringListFree(StringList* list) free(list); } + diff --git a/src/stringlist.h b/src/stringlist.h index cf1c33a..46151a4 100644 --- a/src/stringlist.h +++ b/src/stringlist.h @@ -8,5 +8,7 @@ typedef struct StringList StringList; StringList* stringListCreate(size_t); StringList* listToCList(PyObject* list); PyObject* cListToPyList(StringList*); +void stringListPrint(StringList*); +void stringListFree(StringList*); #endif diff --git a/src/tester.c b/src/tester.c index 40be2ff..7fc40f9 100644 --- a/src/tester.c +++ b/src/tester.c @@ -1,25 +1,41 @@ -#include "overlay.h" +//#include "overlay.h" #include "interpreter.h" +#include "config.h" +#include "laymanapi.h" +#include "message.h" int main(int argc, char *argv[]) { argc = argc; argv = argv; + int ret = 0; interpreterInit(); - Overlay *o = createOverlay("Test", "", 1, 0); - - if (!o) + Message *msg = messageCreate("layman", 0, 0, 0, 4, 2, 4, 4, 1, NULL, NULL, NULL); + BareConfig *cfg = bareConfigCreate(msg, 0, 0, 0); + if (!bareConfigSetOptionValue(cfg, "local_list", "/home/detlev/srg/gsoc2010/layman/layman/tests/testfiles/global-overlays.xml")) + printf("Error setting config option.\n"); + //printf("config: %s\n", bareConfigGetDefaultValue(cfg, "config")); + //printf("storage: %s\n", bareConfigGetDefaultValue(cfg, "storage")); + //printf("local_list: %s\n", bareConfigGetDefaultValue(cfg, "local_list")); + + LaymanAPI *l = laymanAPICreate(cfg, 0, 0); + if (!laymanAPIFetchRemoteList(l)) { - printf("Error creating overlay.\n"); - return 0; + printf("Unable to fetch the remote list.\n"); + ret = -1; + goto finish; } - - printf("Overlay name = %s, owner email : %s, description : %s, priority : %d, it is %sofficial.\n", overlayName(o), overlayOwnerEmail(o), overlayDescription(o), overlayPriority(o), overlayIsOfficial(o) ? "" : "not "); - printf("xml is %s\n", overlayToXml(o)); + StringList *strs = laymanAPIGetAvailable(l); + + stringListPrint(strs); + +finish: + bareConfigFree(cfg); + laymanAPIFree(l); interpreterFinalize(); - return 0; + return ret; } -- cgit v1.2.3-1-g7c22