summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt/progress/old.py22
-rw-r--r--python/apt_pkgmodule.cc1
-rw-r--r--python/apt_pkgmodule.h1
-rw-r--r--python/cdrom.cc11
-rw-r--r--python/cdromprogress.cc106
-rw-r--r--python/progress.cc12
-rw-r--r--python/progress.h6
7 files changed, 137 insertions, 22 deletions
diff --git a/apt/progress/old.py b/apt/progress/old.py
index d4ff5815..63fc5d2e 100644
--- a/apt/progress/old.py
+++ b/apt/progress/old.py
@@ -343,27 +343,13 @@ class InstallProgress(DumbInstallProgress):
updateInterface = function_deprecated_by(update_interface)
-class CdromProgress(object):
+class CdromProgress(apt_pkg.CdromProgress):
"""Report the cdrom add progress.
- Subclass this class to implement cdrom add progress reporting.
+ This class has been replaced by apt_pkg.CdromProgress.
"""
-
- def __init__(self):
- pass
-
- def update(self, text, step):
- """Called periodically to update the user interface."""
-
- def ask_cdrom_name(self):
- """Called to ask for the name of the cdrom."""
-
- def change_cdrom(self):
- """Called to ask for the cdrom to be changed."""
-
- if apt_pkg._COMPAT_0_7:
- askCdromName = function_deprecated_by(ask_cdrom_name)
- changeCdrom = function_deprecated_by(change_cdrom)
+ askCdromName = function_deprecated_by(apt_pkg.CdromProgress.ask_cdrom_name)
+ changeCdrom = function_deprecated_by(apt_pkg.CdromProgress.change_cdrom)
class DpkgInstallProgress(InstallProgress):
diff --git a/python/apt_pkgmodule.cc b/python/apt_pkgmodule.cc
index d6b8e3d1..b6ae709e 100644
--- a/python/apt_pkgmodule.cc
+++ b/python/apt_pkgmodule.cc
@@ -651,6 +651,7 @@ extern "C" void initapt_pkg()
ADDTYPE(Module,"OpProgress",&PyOpProgress_Type);
ADDTYPE(Module,"AcquireProgress",&PyAcquireProgress_Type);
ADDTYPE(Module,"AcquireItemDesc",&PyAcquireItemDesc_Type);
+ ADDTYPE(Module,"CdromProgress",&PyCdromProgress_Type);
// Tag file constants
PyModule_AddObject(Module,"REWRITE_PACKAGE_ORDER",
CharCharToList(TFRewritePackageOrder));
diff --git a/python/apt_pkgmodule.h b/python/apt_pkgmodule.h
index ad1fe9fe..1277ab60 100644
--- a/python/apt_pkgmodule.h
+++ b/python/apt_pkgmodule.h
@@ -114,6 +114,7 @@ extern PyTypeObject PyPolicy_Type;
extern PyTypeObject PyHashes_Type;
extern PyTypeObject PyOpProgress_Type;
extern PyTypeObject PyAcquireProgress_Type;
+extern PyTypeObject PyCdromProgress_Type;
extern PyTypeObject PyAcquireItemDesc_Type;
extern PyTypeObject PyAcquireWorker_Type;
#include "python-apt.h"
diff --git a/python/cdrom.cc b/python/cdrom.cc
index 50d1b4b1..6ee3becd 100644
--- a/python/cdrom.cc
+++ b/python/cdrom.cc
@@ -34,9 +34,20 @@ static PyObject *PkgCdromIdent(PyObject *Self,PyObject *Args)
pkgCdrom &Cdrom = GetCpp<pkgCdrom>(Self);
PyObject *pyCdromProgressInst = 0;
+#ifdef COMPAT_0_7
if (PyArg_ParseTuple(Args, "O", &pyCdromProgressInst) == 0) {
+#else
+ if (PyArg_ParseTuple(Args, "O!", &PyCdromProgress_Type,
+ &pyCdromProgressInst) == 0) {
+#endif
return 0;
}
+#ifdef COMPAT_0_7
+ if (!PyObject_TypeCheck(pyCdromProgressInst, &PyCdromProgress_Type)) {
+ PyErr_WarnEx(PyExc_DeprecationWarning, "Argument should be a subclass of"
+ " apt_pkg.CdromProgress.", 1);
+ }
+#endif
PyCdromProgress progress;
progress.setCallbackInst(pyCdromProgressInst);
diff --git a/python/cdromprogress.cc b/python/cdromprogress.cc
new file mode 100644
index 00000000..09c76a2a
--- /dev/null
+++ b/python/cdromprogress.cc
@@ -0,0 +1,106 @@
+/* cdromprogress.cc - Base class for CdromProgress classes.
+ *
+ * Copyright 2009 Julian Andres Klode <jak@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+#include "apt_pkgmodule.h"
+#include "progress.h"
+#include <Python.h>
+#include <structmember.h>
+
+// Takes two arguments (string, int)
+static PyObject *cdromprogress_update(PyObject *self, PyObject *args)
+{
+ Py_RETURN_NONE;
+}
+
+// Takes no arguments
+static PyObject *cdromprogress_change_cdrom(PyObject *self, PyObject *args)
+{
+ Py_RETURN_FALSE;
+}
+
+// Takes a single PyObject argument as *arg
+static PyObject *cdromprogress_ask_cdrom_name(PyObject *self, PyObject *arg)
+{
+ Py_RETURN_FALSE;
+}
+
+static PyMethodDef cdromprogress_methods[] = {
+ {"update",cdromprogress_update,METH_VARARGS,
+ "update(text: str, current: int)\n\nCalled regularly."},
+ {"change_cdrom",cdromprogress_change_cdrom,METH_NOARGS,
+ "change_cdrom() -> bool\n\nAsk for the CD-ROM to be changed.\n"
+ "Return False if the user requested to cancel the action (default)."},
+ {"ask_cdrom_name",cdromprogress_ask_cdrom_name,METH_O,
+ "ask_cdrom_name(name: str) -> bool\n\nAsk for the name of the CD-ROM.\n"
+ "Return False if the user requested to cancel the action (default)."},
+ {NULL}
+};
+
+static PyMemberDef cdromprogress_members[] = {
+ {"total_steps", T_INT, offsetof(PyCdromProgressObject,total_steps), 0,
+ "The number of total steps to be taken."},
+ {NULL}
+};
+
+static char *cdromprogress_doc = "CdromProgress()\n\n"
+ "Base class for reporting the progress of adding a cdrom. Can be used\n"
+ "with apt_pkg.Cdrom to produce an utility like apt-cdrom.";
+
+PyTypeObject PyCdromProgress_Type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "apt_pkg.CdromProgress", // tp_name
+ sizeof(PyCdromProgressObject), // tp_basicsize
+ 0, // tp_itemsize
+ // Methods
+ 0, // tp_dealloc
+ 0, // tp_print
+ 0, // 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
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | // tp_flags
+ Py_TPFLAGS_BASETYPE,
+ cdromprogress_doc, // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ cdromprogress_methods, // tp_methods
+ cdromprogress_members, // tp_members
+ 0, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ 0, // tp_init
+ 0, // tp_alloc
+ PyType_GenericNew, // tp_new
+};
diff --git a/python/progress.cc b/python/progress.cc
index 123a1805..b19ab0c7 100644
--- a/python/progress.cc
+++ b/python/progress.cc
@@ -518,10 +518,14 @@ pkgPackageManager::OrderResult PyInstallProgress::Run(pkgPackageManager *pm)
void PyCdromProgress::Update(string text, int current)
{
PyObject *arglist = Py_BuildValue("(si)", text.c_str(), current);
-
- PyObject *o = Py_BuildValue("i", totalSteps);
- PyObject_SetAttrString(callbackInst, "totalSteps", o);
- Py_XDECREF(o);
+ if (PyObject_TypeCheck(callbackInst, &PyCdromProgress_Type)) {
+ ((PyCdromProgressObject *)callbackInst)->total_steps = totalSteps;
+ }
+ else {
+ PyObject *o = Py_BuildValue("i", totalSteps);
+ PyObject_SetAttrString(callbackInst, "totalSteps", o);
+ Py_XDECREF(o);
+ }
RunSimpleCallback("update", arglist);
}
diff --git a/python/progress.h b/python/progress.h
index e21a5c5a..88bd3552 100644
--- a/python/progress.h
+++ b/python/progress.h
@@ -28,6 +28,12 @@ typedef struct {
float percent;
} PyOpProgressObject;
+
+typedef struct {
+ PyObject_HEAD
+ int total_steps;
+} PyCdromProgressObject;
+
typedef struct {
PyObject_HEAD
double last_bytes;