summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDetlev Casanova <detlev.casanova@gmail.com>2010-07-11 18:28:07 +0200
committerDetlev Casanova <detlev.casanova@gmail.com>2010-07-11 18:28:07 +0200
commitfa75018c1432d0aaaf4674b502fe6cafdfd5156c (patch)
tree9eaa84d075157700f563bbcac11637c3e5323fc2
parent74ee4280886f8adc28b16404c469f63f6aa83e55 (diff)
downloadlayman-fa75018c1432d0aaaf4674b502fe6cafdfd5156c.tar.gz
layman-fa75018c1432d0aaaf4674b502fe6cafdfd5156c.tar.bz2
layman-fa75018c1432d0aaaf4674b502fe6cafdfd5156c.zip
Get the proper layman Python library and fix BareConfig constructor to
take a Message class as first argument.
-rw-r--r--src/config.c67
-rw-r--r--src/config.h18
-rw-r--r--src/laymanapi.c18
-rw-r--r--src/laymanapi.h4
-rw-r--r--src/message.c23
-rw-r--r--src/overlay.c170
-rw-r--r--src/overlay.h20
-rw-r--r--src/stringlist.c18
-rw-r--r--src/stringlist.h2
-rw-r--r--src/tester.c36
10 files changed, 147 insertions, 229 deletions
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 <Python.h>
+
#include "config.h"
#include "interpreter.h"
-#include <Python.h>
-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 <Python.h>
-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 <Python.h>
-
-#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("<overlay type='svn' src='https://overlays.gentoo.org/svn/dev/wrobel' contact='nobody@gentoo.org' name='wrobel' status='official' priorit='10'><description>Test</description></overlay>", "", 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;
}