From 70bb12ccf8a86e3531826ae7bc2211061da8880a Mon Sep 17 00:00:00 2001 From: Detlev Casanova Date: Fri, 16 Jul 2010 22:23:57 +0200 Subject: Use correct value when using PyObject_IsTrue Add function laymanAPIGetAllInfo() Make use of _laymanAPIGetAllInfos() as a common base for both laymanAPIGetAllInfo() and laymanAPIGetAllInfos() Add function laymanAPIAddRepo and laymanAPIDeleteRepo --- src/laymanapi.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++--------- src/laymanapi.h | 8 ++-- src/tester.c | 27 +++++++++--- 3 files changed, 138 insertions(+), 32 deletions(-) diff --git a/src/laymanapi.c b/src/laymanapi.c index f524ce8..9048921 100644 --- a/src/laymanapi.c +++ b/src/laymanapi.c @@ -2,6 +2,8 @@ #include "interpreter.h" #include "laymanapi.h" +int _laymanAPIGetAllInfos(LaymanAPI* l, StringList* overlays, OverlayInfo *results, const char *overlay); + struct LaymanAPI { PyObject *object; @@ -12,7 +14,6 @@ struct LaymanAPI * * The BareConfig argument must not be NULL. */ - LaymanAPI* laymanAPICreate(BareConfig* config, int report_error, int output) { assert(NULL != config); @@ -41,7 +42,7 @@ int laymanAPIIsRepo(LaymanAPI *l, const char* repo) Py_DECREF(obj); - return ret; + return !ret; } int laymanAPIIsInstalled(LaymanAPI *l, const char* repo) @@ -59,7 +60,7 @@ int laymanAPIIsInstalled(LaymanAPI *l, const char* repo) Py_DECREF(obj); - return ret; + return !ret; } /* @@ -206,9 +207,9 @@ int laymanAPIGetInfosStr(LaymanAPI* l, StringList* overlays, OverlayInfo* result assert(NULL != tmp); results[k].text = strdup(tmp); - results[k].official = PyObject_IsTrue(official); + results[k].official = !PyObject_IsTrue(official); assert(-1 != results[k].official); - results[k].supported = PyObject_IsTrue(supported); + results[k].supported = !PyObject_IsTrue(supported); assert(-1 != results[k].supported); k++; @@ -243,6 +244,26 @@ OverlayInfo *laymanAPIGetInfoStr(LaymanAPI* l, const char* overlay) return oi; } +OverlayInfo *laymanAPIGetAllInfo(LaymanAPI* l, const char* overlay) +{ + // Check input data. + if (!l || !l->object || !overlay) + return NULL; + + // Prepare the structure to be returned. + OverlayInfo *ret = calloc(1, sizeof(OverlayInfo)); + + // Fill it in. + if (0 == _laymanAPIGetAllInfos(l, NULL, ret, overlay)) + { + free(ret); + return NULL; + } + + // Return it + return ret; +} + /* * Gives a list of OverlayInfo's from the overaly names found in the overlays StringList. * results must be allocated and initialized with zeroes. @@ -253,17 +274,43 @@ OverlayInfo *laymanAPIGetInfoStr(LaymanAPI* l, const char* overlay) * Returns the number of OverlayInfo structures filled. */ int laymanAPIGetAllInfos(LaymanAPI* l, StringList* overlays, OverlayInfo *results) +{ + return _laymanAPIGetAllInfos(l, overlays, results, NULL); +} + +/* + * Gives a list of OverlayInfo's from the overaly names found in the overlays StringList if it's not NULL + * If it's NULL, and overlay is not NULL, the information for Overlay will be fetched. + * results must be allocated and initialized with zeroes. + * + * If an information is unavailable (no owner email for example), + * the correpsonding field will stay to NULL + * + * Returns the number of OverlayInfo structures filled. + */ +int _laymanAPIGetAllInfos(LaymanAPI* l, StringList* overlays, OverlayInfo *results, const char *overlay) { // Check input data. - if (!l || !l->object || !overlays || !results) + if (!l || !l->object || !results || (!overlays && !overlay)) return 0; - // Convert the StringList to a Python list object. - PyObject *list = cListToPyList(overlays); + PyObject *obj = NULL; - // Call the method - PyObject *obj = PyObject_CallMethod(l->object, "get_all_info", "(O)", list); - Py_DECREF(list); + // First case : overlay list + if (overlays != NULL) + { + // Convert the StringList to a Python list object. + PyObject *list = cListToPyList(overlays); + + // Call the method + obj = PyObject_CallMethod(l->object, "get_all_info", "(O)", list); + Py_DECREF(list); + } + // Second case : overlay name + else if (overlay != NULL) + { + obj = PyObject_CallMethod(l->object, "get_all_info", "(s)", overlay); + } // Check if the returned value is a dict as expected. if (!obj || !PyDict_Check(obj)) @@ -335,9 +382,9 @@ int laymanAPIGetAllInfos(LaymanAPI* l, StringList* overlays, OverlayInfo *result results[k].srcUris = listToCList(srcUris); // If official or supported is neither True or False, abort. - results[k].official = PyObject_IsTrue(official); + results[k].official = !PyObject_IsTrue(official); assert(-1 != results[k].official); - results[k].supported = PyObject_IsTrue(supported); + results[k].supported = !PyObject_IsTrue(supported); assert(-1 != results[k].supported); k++; @@ -349,9 +396,26 @@ int laymanAPIGetAllInfos(LaymanAPI* l, StringList* overlays, OverlayInfo *result return k; } -/* - * TODO:implement the same for only 1 repo - */ +int laymanAPIAddRepo(LaymanAPI* l, const char *repo) +{ + if (!l || !l->object || !repo) + return 0; + + // Call the method + PyObject *obj = PyObject_CallMethod(l->object, "delete_repos", "(s)", repo); + + // If the call returned NULL, it failed. + int ret; + if (!obj) + ret = 0; + else + ret = 1; + + Py_DECREF(obj); + + return ret; +} + int laymanAPIAddRepos(LaymanAPI* l, StringList *repos) { if (!l || !l->object || !repos) @@ -365,15 +429,37 @@ int laymanAPIAddRepos(LaymanAPI* l, StringList *repos) Py_DECREF(pyrepos); // If the call returned NULL, it failed. + int ret; if (!obj) + ret = 0; + else + ret = 1; + + Py_DECREF(obj); + + return ret; +} + +int laymanAPIDeleteRepo(LaymanAPI* l, const char *repo) +{ + if (!l || !l->object || !repo) return 0; - return 1; + // Call the method + PyObject *obj = PyObject_CallMethod(l->object, "delete_repos", "(s)", repo); + + // If the call returned NULL, it failed. + int ret; + if (!obj) + ret = 0; + else + ret = 1; + + Py_DECREF(obj); + + return ret; } -/* - * TODO:implement the same for only 1 repo - */ int laymanAPIDeleteRepos(LaymanAPI* l, StringList *repos) { if (!l || !l->object || !repos) @@ -387,10 +473,15 @@ int laymanAPIDeleteRepos(LaymanAPI* l, StringList *repos) Py_DECREF(pyrepos); // If the call returned NULL, it failed. + int ret; if (!obj) - return 0; + ret = 0; + else + ret = 1; + + Py_DECREF(obj); - return 1; + return ret; } /* diff --git a/src/laymanapi.h b/src/laymanapi.h index f18d588..94b0591 100644 --- a/src/laymanapi.h +++ b/src/laymanapi.h @@ -23,8 +23,8 @@ typedef struct OverlayInfo } OverlayInfo; LaymanAPI* laymanAPICreate(BareConfig*, int, int); -int laymanAPIIsRepo(LaymanAPI *l, const char* repo) -int laymanAPIIsInstalled(LaymanAPI *l, const char* repo) +int laymanAPIIsRepo(LaymanAPI *l, const char* repo); +int laymanAPIIsInstalled(LaymanAPI *l, const char* repo); StringList* laymanAPIGetAvailable(LaymanAPI*, int reload); StringList* laymanAPIGetInstalled(LaymanAPI*, int reload); int laymanAPISync(LaymanAPI* l, const char* overlay, int verbose); @@ -32,8 +32,10 @@ int laymanAPIFetchRemoteList(LaymanAPI*); int laymanAPIGetInfosStr(LaymanAPI* l, StringList* overlays, OverlayInfo* results); OverlayInfo* laymanAPIGetInfoStr(LaymanAPI* l, const char* overlay); int laymanAPIGetAllInfos(LaymanAPI* l, StringList*, OverlayInfo*); -//OverlayInfo* laymanAPIGetAllInfo(LaymanAPI* l, const char*); +OverlayInfo* laymanAPIGetAllInfo(LaymanAPI* l, const char*); +int laymanAPIAddRepo(LaymanAPI* l, const char *repo); int laymanAPIAddRepos(LaymanAPI* l, StringList *repos); +int laymanAPIDeleteRepo(LaymanAPI* l, const char *repo); int laymanAPIDeleteRepos(LaymanAPI* l, StringList *repos); OverlayInfo* laymanAPIGetInfo(LaymanAPI* l, const char* overlay); void laymanAPIFree(LaymanAPI*); diff --git a/src/tester.c b/src/tester.c index 3a80ec2..3268f66 100644 --- a/src/tester.c +++ b/src/tester.c @@ -35,19 +35,32 @@ int main(int argc, char *argv[]) printf("\n"); unsigned int len = stringListCount(strs); - OverlayInfo *infos = calloc(len, sizeof(OverlayInfo)); - int count = laymanAPIGetAllInfos(l, strs, infos); + //OverlayInfo *infos = calloc(len, sizeof(OverlayInfo)); + //int count = laymanAPIGetAllInfos(l, strs, infos); - for (unsigned int i = 0; i < count; i++) + OverlayInfo *oi = laymanAPIGetAllInfo(l, "enlightenment"); + if (oi) { - printf("%s\n~~~~~~~~~~~~~~~~~~~~\n", infos[i].name); - printf("%s\n\n", infos[i].description); - overlayInfoFree(infos[i]); + printf("%s\n~~~~~~~~~~~~~~~~~~~~\n", oi->name); + printf("%s\n\n", oi->description); + overlayInfoFree(*oi); + free(oi); + } + + for (unsigned int i = 0; i < len; i++) + { + OverlayInfo *oi = laymanAPIGetAllInfo(l, stringListGetAt(strs, i)); + if (!oi) + continue; + printf("%s\n~~~~~~~~~~~~~~~~~~~~\n", oi->name); + printf("%s\n\n", oi->description); + overlayInfoFree(*oi); + free(oi); } printf("\n"); - free(infos); + //free(infos); bareConfigFree(cfg); laymanAPIFree(l); -- cgit v1.2.3-1-g7c22