summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2005-04-11 14:19:44 +0000
committerMichael Vogt <michael.vogt@ubuntu.com>2005-04-11 14:19:44 +0000
commita8074615c2bac880bf4fd7d5b15e621b88a20052 (patch)
tree4e929c12c6997452335d5620b5b5208affb83698
parent1b514e848902f609cba9b2247702fc6d714d2456 (diff)
downloadpython-apt-a8074615c2bac880bf4fd7d5b15e621b88a20052.tar.gz
* cdrom interface added
-rw-r--r--doc/examples/cdrom.py27
-rw-r--r--doc/examples/inst.py2
-rw-r--r--doc/examples/progress.py20
-rw-r--r--python/apt_pkgmodule.cc3
-rw-r--r--python/apt_pkgmodule.h4
-rw-r--r--python/cdrom.cc105
-rw-r--r--python/makefile2
-rw-r--r--python/progress.cc69
-rw-r--r--python/progress.h17
9 files changed, 238 insertions, 11 deletions
diff --git a/doc/examples/cdrom.py b/doc/examples/cdrom.py
new file mode 100644
index 00000000..e1873093
--- /dev/null
+++ b/doc/examples/cdrom.py
@@ -0,0 +1,27 @@
+#!/usr/bin/python
+# example how to deal with the depcache
+
+import apt_pkg
+import sys, os
+import copy
+
+from progress import CdromProgress
+
+
+# init
+apt_pkg.init()
+
+cdrom = apt_pkg.GetCdrom()
+print cdrom
+
+progress = CdromProgress()
+apt_pkg.Config.Set("APT::CDROM::Rename", "True")
+
+cdrom.Add(progress)
+
+print "Exiting"
+sys.exit(0)
+
+
+
+
diff --git a/doc/examples/inst.py b/doc/examples/inst.py
index e4c96983..6b3ade25 100644
--- a/doc/examples/inst.py
+++ b/doc/examples/inst.py
@@ -27,7 +27,7 @@ iprogress = InstallProgress()
# can be used to set a custom fork method (like vte.Terminal.forkpty)
#iprogress.fork = os.fork
-iter = cache["3dchess"]
+iter = cache["base-config"]
print "\n%s"%iter
# install or remove, the importend thing is to keep us busy :)
diff --git a/doc/examples/progress.py b/doc/examples/progress.py
index c37de70d..67d39c9c 100644
--- a/doc/examples/progress.py
+++ b/doc/examples/progress.py
@@ -1,6 +1,7 @@
import apt_pkg
import sys
import time
+import string
class OpProgress:
def __init__(self):
@@ -36,6 +37,7 @@ class FetchProgress:
def MediaChange(self, medium, drive):
print "Please insert medium %s in drive %s" % (medium, drive)
sys.stdin.readline()
+ #return False
class InstallProgress:
@@ -48,3 +50,21 @@ class InstallProgress:
def UpdateInterface(self):
# usefull to e.g. redraw a GUI
time.sleep(0.1)
+
+
+class CdromProgress:
+ def __init__(self):
+ pass
+ # update is called regularly so that the gui can be redrawn
+ def Update(self, text, step):
+ # check if we actually have some text to display
+ if text != "":
+ print "Update: %s %s" % (string.strip(text), step)
+ def AskCdromName(self):
+ print "Please enter cd-name: ",
+ cd_name = sys.stdin.readline()
+ return (True, string.strip(cd_name))
+ def ChangeCdrom(self):
+ print "Please insert cdrom and press <ENTER>"
+ answer = sys.stdin.readline()
+ return True
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