diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/apt_pkgmodule.cc | 3 | ||||
| -rw-r--r-- | python/apt_pkgmodule.h | 4 | ||||
| -rw-r--r-- | python/cdrom.cc | 105 | ||||
| -rw-r--r-- | python/makefile | 2 | ||||
| -rw-r--r-- | python/progress.cc | 69 | ||||
| -rw-r--r-- | python/progress.h | 17 |
6 files changed, 190 insertions, 10 deletions
diff --git a/python/apt_pkgmodule.cc b/python/apt_pkgmodule.cc index 95201f35..7bf7f3e3 100644 --- a/python/apt_pkgmodule.cc +++ b/python/apt_pkgmodule.cc @@ -336,6 +336,9 @@ static PyMethodDef methods[] = {"GetPkgSrcRecords",GetPkgSrcRecords,METH_VARARGS,"GetPkgSrcRecords() -> PkgSrcRecords"}, {"GetPkgSourceList",GetPkgSourceList,METH_VARARGS,"GetPkgSourceList() -> PkgSourceList"}, + // Cdrom + {"GetCdrom",GetCdrom,METH_VARARGS,"GetCdrom() -> Cdrom"}, + {} }; diff --git a/python/apt_pkgmodule.h b/python/apt_pkgmodule.h index bc4c5509..d0bfbeae 100644 --- a/python/apt_pkgmodule.h +++ b/python/apt_pkgmodule.h @@ -63,6 +63,10 @@ PyObject *TmpGetCache(PyObject *Self,PyObject *Args); extern PyTypeObject PkgDepCacheType; PyObject *GetDepCache(PyObject *Self,PyObject *Args); +// cdrom +extern PyTypeObject PkgCdromType; +PyObject *GetCdrom(PyObject *Self,PyObject *Args); + // PkgRecords Stuff extern PyTypeObject PkgRecordsType; PyObject *GetPkgRecords(PyObject *Self,PyObject *Args); diff --git a/python/cdrom.cc b/python/cdrom.cc new file mode 100644 index 00000000..764110ce --- /dev/null +++ b/python/cdrom.cc @@ -0,0 +1,105 @@ +// Description /*{{{*/ +// $Id: cdrom.cc,v 1.1 2003/06/03 03:03:23 mvo Exp $ +/* ###################################################################### + + Cdrom - Wrapper for the apt-cdrom support + + ##################################################################### */ + +#include "generic.h" +#include "apt_pkgmodule.h" +#include "progress.h" + +#include <apt-pkg/cdrom.h> + + +struct PkgCdromStruct +{ + pkgCdrom cdrom; +}; + +static PyObject *PkgCdromAdd(PyObject *Self,PyObject *Args) +{ + PkgCdromStruct &Struct = GetCpp<PkgCdromStruct>(Self); + + PyObject *pyCdromProgressInst = 0; + if (PyArg_ParseTuple(Args, "O", &pyCdromProgressInst) == 0) { + return 0; + } + + PyCdromProgress progress; + progress.setCallbackInst(pyCdromProgressInst); + + Struct.cdrom.Add(&progress); + + Py_INCREF(Py_None); + return HandleErrors(Py_None); +} + +static PyObject *PkgCdromIdent(PyObject *Self,PyObject *Args) +{ + PkgCdromStruct &Struct = GetCpp<PkgCdromStruct>(Self); + + if (PyArg_ParseTuple(Args,"") == 0) + return 0; + + //pkgFixBroken(*Struct.depcache); + + Py_INCREF(Py_None); + return HandleErrors(Py_None); +} + + +static PyMethodDef PkgCdromMethods[] = +{ + {"Add",PkgCdromAdd,METH_VARARGS,"Add a cdrom"}, + {"Ident",PkgCdromIdent,METH_VARARGS,"Ident a cdrom"}, + {} +}; + + +static PyObject *CdromAttr(PyObject *Self,char *Name) +{ + PkgCdromStruct &Struct = GetCpp<PkgCdromStruct>(Self); + + + return Py_FindMethod(PkgCdromMethods,Self,Name); +} + + + + +PyTypeObject PkgCdromType = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, // ob_size + "Cdrom", // tp_name + sizeof(CppOwnedPyObject<PkgCdromStruct>), // tp_basicsize + 0, // tp_itemsize + // Methods + CppOwnedDealloc<PkgCdromStruct>, // tp_dealloc + 0, // tp_print + CdromAttr, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash +}; + +PyObject *GetCdrom(PyObject *Self,PyObject *Args) +{ + pkgCdrom *cdrom = new pkgCdrom(); + + CppOwnedPyObject<pkgCdrom> *CdromObj = + CppOwnedPyObject_NEW<pkgCdrom>(0,&PkgCdromType, *cdrom); + + return CdromObj; +} + + + + + /*}}}*/ diff --git a/python/makefile b/python/makefile index 29bbaca9..273096a7 100644 --- a/python/makefile +++ b/python/makefile @@ -11,7 +11,7 @@ SLIBS = -lapt-pkg LIB_MAKES = apt-pkg/makefile APT_PKG_SRC = apt_pkgmodule.cc configuration.cc generic.cc tag.cc string.cc \ cache.cc pkgrecords.cc pkgsrcrecords.cc sourcelist.cc \ - depcache.cc progress.cc + depcache.cc progress.cc cdrom.cc SOURCE := $(APT_PKG_SRC) include $(PYTHON_H) progress.h diff --git a/python/progress.cc b/python/progress.cc index 43490247..54e2096e 100644 --- a/python/progress.cc +++ b/python/progress.cc @@ -1,5 +1,5 @@ // Description /*{{{*/ -// $Id: progress.cc,v 1.5 2003/06/03 03:03:23 mdz Exp $ +// $Id: progress.cc,v 1.5 2003/06/03 03:03:23 mvo Exp $ /* ###################################################################### Progress - Wrapper for the progress related functions @@ -13,7 +13,8 @@ // generic bool PyCallbackObj::RunSimpleCallback(const char* method_name, - PyObject *arglist) + PyObject *arglist, + PyObject **res) { if(callbackInst == 0) return false; @@ -35,8 +36,10 @@ bool PyCallbackObj::RunSimpleCallback(const char* method_name, return NULL; } - - Py_XDECREF(result); + if(res != NULL) + *res = result; + else + Py_XDECREF(result); Py_XDECREF(method); return true; @@ -71,10 +74,17 @@ bool PyFetchProgress::MediaChange(string Media, string Drive) { //std::cout << "MediaChange" << std::endl; PyObject *arglist = Py_BuildValue("(ss)", Media.c_str(), Drive.c_str()); - RunSimpleCallback("MediaChange", arglist); - - // FIXME: need to return depending on the python result - return true; + PyObject *result; + RunSimpleCallback("MediaChange", arglist, &result); + + bool res = true; + if(!PyArg_Parse(result, "b", &res)) + std::cerr << "result could not be parsed" << std::endl; + + // FIXME: find out what it should return usually + //std::cerr << "res is: " << res << std::endl; + + return res; } void PyFetchProgress::UpdateStatus(pkgAcquire::ItemDesc &Itm, int status) @@ -223,3 +233,46 @@ pkgPackageManager::OrderResult PyInstallProgress::Run(pkgPackageManager *pm) return res; } + + +//----------------------------------------------------------------------------- +// apt-cdrom interface + +void PyCdromProgress::Update(string text, int current) +{ + PyObject *arglist = Py_BuildValue("(si)", text.c_str(), current); + RunSimpleCallback("Update", arglist); +} + +bool PyCdromProgress::ChangeCdrom() +{ + PyObject *arglist = Py_BuildValue("()"); + PyObject *result; + RunSimpleCallback("ChangeCdrom", arglist, &result); + + bool res = true; + if(!PyArg_Parse(result, "b", &res)) + std::cerr << "ChangeCdrom: result could not be parsed" << std::endl; + + return res; +} + + +bool PyCdromProgress::AskCdromName(string &Name) +{ + PyObject *arglist = Py_BuildValue("()"); + PyObject *result; + RunSimpleCallback("AskCdromName", arglist, &result); + + const char *new_name; + bool res; + if(!PyArg_Parse(result, "(bs)", &res, &new_name)) + std::cerr << "AskCdromName: result could not be parsed" << std::endl; + + //std::cerr << "got: " << res << " " << "name: " << new_name << std::endl; + + // set the new name + Name = string(new_name); + + return res; +} diff --git a/python/progress.h b/python/progress.h index 2514623a..f116c811 100644 --- a/python/progress.h +++ b/python/progress.h @@ -12,6 +12,7 @@ #include <apt-pkg/progress.h> #include <apt-pkg/acquire.h> #include <apt-pkg/packagemanager.h> +#include <apt-pkg/cdrom.h> #include <Python.h> class PyCallbackObj { @@ -24,7 +25,8 @@ class PyCallbackObj { callbackInst = o; } - bool RunSimpleCallback(const char *method, PyObject *arglist=NULL); + bool RunSimpleCallback(const char *method, PyObject *arglist=NULL, + PyObject **result=NULL); PyCallbackObj() : callbackInst(0) {}; ~PyCallbackObj() {Py_DECREF(callbackInst); }; @@ -70,4 +72,17 @@ struct PyInstallProgress : public PyCallbackObj PyInstallProgress() : PyCallbackObj() {}; }; +struct PyCdromProgress : public pkgCdromStatus, public PyCallbackObj +{ + // update steps, will be called regularly as a "pulse" + virtual void Update(string text="", int current=0); + // ask for cdrom insert + virtual bool ChangeCdrom(); + // ask for cdrom name + virtual bool AskCdromName(string &Name); + + PyCdromProgress() : PyCallbackObj() {}; +}; + + #endif |
