-rw-r--r-- | noncore/settings/packagemanager/ChangeLog | 5 | ||||
-rw-r--r-- | noncore/settings/packagemanager/mainwindow.cpp | 5 | ||||
-rw-r--r-- | noncore/settings/packagemanager/oipkg.cpp | 69 | ||||
-rw-r--r-- | noncore/settings/packagemanager/oipkg.h | 8 | ||||
-rw-r--r-- | noncore/settings/packagemanager/opackage.cpp | 5 | ||||
-rw-r--r-- | noncore/settings/packagemanager/opackage.h | 15 | ||||
-rw-r--r-- | noncore/settings/packagemanager/packageinfodlg.cpp | 96 | ||||
-rw-r--r-- | noncore/settings/packagemanager/packageinfodlg.h | 10 |
8 files changed, 169 insertions, 44 deletions
diff --git a/noncore/settings/packagemanager/ChangeLog b/noncore/settings/packagemanager/ChangeLog index efa75b1..72e6169 100644 --- a/noncore/settings/packagemanager/ChangeLog +++ b/noncore/settings/packagemanager/ChangeLog @@ -1,15 +1,20 @@ +2004-mm-dd Dan Williams <drw@handhelds.org> + + * Package information dialog implemented + * What's This app icon enabled + 2004-01-23 Dan Williams <drw@handhelds.org> * Added package download functionality * Have Opie update links after install/removal so that apps will display properly in Launcher 2004-01-20 Dan Williams <drw@handhelds.org> * Released version 0.2.0 * Converted to use libipkg in place of spawning ipkg process 2004-01-13 Dan Williams <drw@handhelds.org> * Released version 0.1.0 * Initial check-in of new package management client to eventually replace AQPkg diff --git a/noncore/settings/packagemanager/mainwindow.cpp b/noncore/settings/packagemanager/mainwindow.cpp index 05f21bc..8b374ab 100644 --- a/noncore/settings/packagemanager/mainwindow.cpp +++ b/noncore/settings/packagemanager/mainwindow.cpp @@ -36,34 +36,34 @@ #include <qpopupmenu.h> #include <qtimer.h> #include <qtoolbar.h> #include <qwhatsthis.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/qpeapplication.h> #include <qpe/resource.h> #include "mainwindow.h" #include "installdlg.h" #include "filterdlg.h" #include "promptdlg.h" #include "entrydlg.h" #include "packageinfodlg.h" -MainWindow::MainWindow( QWidget *parent, const char *name, WFlags fl ) - : QMainWindow( parent, name, fl || WStyle_ContextHelp ) +MainWindow::MainWindow( QWidget *parent, const char *name, WFlags /*fl*/ ) + : QMainWindow( parent, name, WStyle_ContextHelp ) , m_config( "packman" ) , m_packman( &m_config, this ) , m_menuBar( this ) , m_toolBar( this ) , m_findBar( this ) , m_widgetStack( this ) , m_packageList( this ) , m_statusWidget( this ) , m_statusText( &m_statusWidget ) , m_statusBar( &m_statusWidget ) , m_iconUpdated( Resource::loadPixmap( "packagemanager/updated" ) ) , m_iconInstalled( Resource::loadPixmap( "installed" ) ) , m_iconNull( m_iconUpdated.size() ) , m_filterName( QString::null ) , m_filterServer( QString::null ) , m_filterDest( QString::null ) @@ -662,22 +662,21 @@ void MainWindow::slotFindChanged( const QString &findText ) m_actionFindNext->setEnabled( !findText.isEmpty() ); searchForPackage( findText ); } void MainWindow::slotFindNext() { searchForPackage( m_findEdit->text() ); } void MainWindow::slotDisplayPackageInfo( QListViewItem *packageItem ) { QString packageName( ( static_cast<QCheckListItem*>( packageItem ) )->text() ); // Create package manager output widget PackageInfoDlg *dlg = new PackageInfoDlg( this, &m_packman, packageName ); - connect( dlg, SIGNAL(closeInfoDlg()), this, SLOT(slotCloseDlg()) ); // Display widget m_widgetStack.addWidget( dlg, 3 ); m_widgetStack.raiseWidget( dlg ); } diff --git a/noncore/settings/packagemanager/oipkg.cpp b/noncore/settings/packagemanager/oipkg.cpp index ed9ea10..eb07a61 100644 --- a/noncore/settings/packagemanager/oipkg.cpp +++ b/noncore/settings/packagemanager/oipkg.cpp @@ -18,69 +18,86 @@ =_ + =;=|` MERCHANTABILITY or FITNESS FOR A _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "oipkg.h" +#include <stdio.h> #include <stdlib.h> #include <string.h> #include <qdir.h> #include <qfile.h> #include <qmessagebox.h> #include <qtextstream.h> const QString IPKG_CONF = "/etc/ipkg.conf"; // Fully-qualified name of Ipkg primary configuration file const QString IPKG_CONF_DIR = "/etc/ipkg"; // Directory of secondary Ipkg configuration files const QString IPKG_PKG_PATH = "/usr/lib/ipkg/lists"; // Directory containing server package lists const QString IPKG_STATUS_PATH = "usr/lib/ipkg/status"; // Destination status file location OIpkg *oipkg; -int fIpkgMessage( ipkg_conf_t */*conf*/, message_level_t /*level*/, char *msg ) +// Ipkg callback functions + +int fsignalIpkgMessage( ipkg_conf_t */*conf*/, message_level_t /*level*/, char *msg ) { - oipkg->ipkgOutput( msg ); + oipkg->ipkgMessage( msg ); return 0; } -char* fIpkgResponse( char */*question*/ ) +char *fIpkgResponse( char */*question*/ ) { return 0x0; } +int fIpkgStatus( char */*name*/, int /*status*/, char *desc, void */*userdata*/ ) +{ + oipkg->ipkgStatus( desc ); + return 0; +} + +int fIpkgFiles( char */*name*/, char *desc, char */*version*/, pkg_state_status_t /*status*/, + void */*userdata*/ ) +{ +printf( "*****List*****\n%s\n", desc ); + oipkg->ipkgList( desc ); + return 0; +} + OIpkg::OIpkg( Config *config, QObject *parent, const char *name ) : QObject( parent, name ) , m_config( config ) , m_confInfo( NULL ) , m_ipkgExecOptions( 0 ) , m_ipkgExecVerbosity( 1 ) { oipkg = this; // Initialize libipkg - if ( ipkg_init( &fIpkgMessage, &fIpkgResponse, &m_ipkgArgs ) ) + if ( ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs ) ) QMessageBox::critical( 0, tr( "OIpkg" ), tr( "Error initialing libipkg" ) ); // Default ipkg run-time arguments m_ipkgArgs.noaction = false; m_ipkgArgs.force_defaults = true; } OIpkg::~OIpkg() { // Upon destruction, ensure that items in config list are deleted with list if ( m_confInfo ) m_confInfo->setAutoDelete( true ); // Free up libipkg resources if ( ipkg_deinit( &m_ipkgArgs ) ) QMessageBox::critical( 0, tr( "OIpkg" ), tr( "Error freeing libipkg" ) ); @@ -284,78 +301,108 @@ bool OIpkg::executeCommand( OPackage::Command command, QStringList *parameters, // TODO m_ipkgArgs.force_remove = ( m_ipkgExecOptions & FORCE_REMOVE ); m_ipkgArgs.force_overwrite = ( m_ipkgExecOptions & FORCE_OVERWRITE ); m_ipkgArgs.verbosity = m_ipkgExecVerbosity; if ( m_ipkgArgs.dest ) free( m_ipkgArgs.dest ); if ( !destination.isNull() ) { int len = destination.length() + 1; m_ipkgArgs.dest = (char *)malloc( len ); strncpy( m_ipkgArgs.dest, destination, destination.length() ); m_ipkgArgs.dest[ len - 1 ] = '\0'; } else m_ipkgArgs.dest = 0x0; // Connect output signal to widget + if ( rawOutput ) { - if ( slotOutput ) - connect( this, SIGNAL(execOutput(char *)), receiver, slotOutput ); +// if ( slotOutput ) +// connect( this, SIGNAL(signalIpkgMessage(char *)), receiver, slotOutput ); } else { - // TODO - connect to local slot and parse output before emitting execOutput + // TODO - connect to local slot and parse output before emitting signalIpkgMessage } switch( command ) { - case OPackage::Update : ipkg_lists_update( &m_ipkgArgs ); + case OPackage::Update : { + connect( this, SIGNAL(signalIpkgMessage(char *)), receiver, slotOutput ); + ipkg_lists_update( &m_ipkgArgs ); + }; break; - case OPackage::Upgrade : ipkg_packages_upgrade( &m_ipkgArgs ); + case OPackage::Upgrade : { + connect( this, SIGNAL(signalIpkgMessage(char *)), receiver, slotOutput ); + ipkg_packages_upgrade( &m_ipkgArgs ); + }; break; case OPackage::Install : { + connect( this, SIGNAL(signalIpkgMessage(char *)), receiver, slotOutput ); for ( QStringList::Iterator it = parameters->begin(); it != parameters->end(); ++it ) { ipkg_packages_install( &m_ipkgArgs, (*it) ); } }; break; case OPackage::Remove : { + connect( this, SIGNAL(signalIpkgMessage(char *)), receiver, slotOutput ); for ( QStringList::Iterator it = parameters->begin(); it != parameters->end(); ++it ) { ipkg_packages_remove( &m_ipkgArgs, (*it), true ); } }; break; case OPackage::Download : { + connect( this, SIGNAL(signalIpkgMessage(char *)), receiver, slotOutput ); for ( QStringList::Iterator it = parameters->begin(); it != parameters->end(); ++it ) { ipkg_packages_download( &m_ipkgArgs, (*it) ); } }; break; + case OPackage::Info : { + connect( this, SIGNAL(signalIpkgStatus(char *)), receiver, slotOutput ); + ipkg_packages_info( &m_ipkgArgs, (*parameters->begin()), &fIpkgStatus, 0x0 ); + }; + break; + case OPackage::Files : { + connect( this, SIGNAL(signalIpkgList(char *)), receiver, slotOutput ); + ipkg_package_files( &m_ipkgArgs, (*parameters->begin()), &fIpkgFiles, 0x0 ); + }; + break; default : break; }; return true; } -void OIpkg::ipkgOutput( char *msg ) +void OIpkg::ipkgMessage( char *msg ) +{ + emit signalIpkgMessage( msg ); +} + +void OIpkg::ipkgStatus( char *status ) +{ + emit signalIpkgStatus( status ); +} + +void OIpkg::ipkgList( char *filelist ) { - emit execOutput( msg ); + emit signalIpkgList( filelist ); } void OIpkg::loadConfiguration() { if ( m_confInfo ) delete m_confInfo; // Load configuration item list m_confInfo = new OConfItemList(); QStringList confFiles; QDir confDir( IPKG_CONF_DIR ); if ( confDir.exists() ) { confDir.setNameFilter( "*.conf" ); confDir.setFilter( QDir::Files ); diff --git a/noncore/settings/packagemanager/oipkg.h b/noncore/settings/packagemanager/oipkg.h index 824fa17..ea126cf 100644 --- a/noncore/settings/packagemanager/oipkg.h +++ b/noncore/settings/packagemanager/oipkg.h @@ -69,33 +69,37 @@ public: void setConfigItems( OConfItemList *configList ); void setIpkgExecOptions( int options ) { m_ipkgExecOptions = options; } void setIpkgExecVerbosity( int verbosity ) { m_ipkgExecVerbosity = verbosity; } void saveSettings(); OPackageList *availablePackages( const QString &server = QString::null ); OPackageList *installedPackages( const QString &destName = QString::null, const QString &destPath = QString::null ); bool executeCommand( OPackage::Command command = OPackage::NotDefined, QStringList *parameters = 0x0, const QString &destination = QString::null, const QObject *receiver = 0x0, const char *slotOutput = 0x0, bool rawOutput = true ); void abortCommand(); - void ipkgOutput( char *msg ); + void ipkgMessage( char *msg ); + void ipkgStatus( char *status ); + void ipkgList( char *filelist ); private: Config *m_config; // Pointer to application configuration file args_t m_ipkgArgs; // libipkg configuration arguments OConfItemList *m_confInfo; // Contains info from all Ipkg configuration files int m_ipkgExecOptions; // Bit-mapped flags for Ipkg execution options int m_ipkgExecVerbosity; // Ipkg execution verbosity level void loadConfiguration(); OConfItemList *filterConfItems( OConfItem::Type typefilter = OConfItem::NotDefined ); signals: - void execOutput( char *msg ); + void signalIpkgMessage( char *msg ); + void signalIpkgStatus( char *status ); + void signalIpkgList( char *filelist ); }; #endif diff --git a/noncore/settings/packagemanager/opackage.cpp b/noncore/settings/packagemanager/opackage.cpp index 34717e3..37963fa 100644 --- a/noncore/settings/packagemanager/opackage.cpp +++ b/noncore/settings/packagemanager/opackage.cpp @@ -19,25 +19,28 @@ _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "opackage.h" OPackage::OPackage( const QString &name, const QString &version, const QString &versionInstalled, - const QString &source, const QString &destination, const QString &category ) + const QString &source, const QString &destination, const QString &category, + const QString &information, const QString &files ) : m_name( name ) , m_version( version ) , m_versionInstalled( versionInstalled ) , m_source( source ) , m_destination( destination ) , m_category( category ) + , m_information( information ) + , m_files( files ) { } diff --git a/noncore/settings/packagemanager/opackage.h b/noncore/settings/packagemanager/opackage.h index 1e2e49f..fbd9ec0 100644 --- a/noncore/settings/packagemanager/opackage.h +++ b/noncore/settings/packagemanager/opackage.h @@ -27,48 +27,55 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef OPACKAGE_H #define OPACKAGE_H #include <qlist.h> #include <qstring.h> class OPackage { public: enum Command { Install, Remove, Update, Upgrade, Download, Info, Files, Version, NotDefined }; - OPackage( const QString &name = 0x0, - const QString &version = 0x0, const QString &versionInstalled = 0x0, - const QString &source = 0x0, const QString &destination = 0x0, - const QString &category = "misc" ); + OPackage( const QString &name= QString::null, + const QString &version= QString::null, const QString &versionInstalled= QString::null, + const QString &source= QString::null, const QString &destination= QString::null, + const QString &category = "misc", const QString &information = QString::null, + const QString &files = QString::null ); const QString &name() { return m_name; } const QString &version() { return m_version; } const QString &versionInstalled() { return m_versionInstalled; } const QString &source() { return m_source; } const QString &destination() { return m_destination; } const QString &category() { return m_category; } + const QString &information() { return m_information; } + const QString &files() { return m_files; } void setName( const QString &name ) { m_name = name; } void setVersion( const QString &version ) { m_version = version; } void setVersionInstalled( const QString &version ) { m_versionInstalled = version; } void setSource( const QString &source ) { m_source = source; } void setDestination( const QString &destination ) { m_destination = destination; } void setCategory( const QString &category ) { m_category = category; } + void setInformation( const QString &information ) { m_information = information; } + void setFiles( const QString &files ) { m_files = files; } private: QString m_name; // Name of item QString m_version; // Available version number of item QString m_versionInstalled; // Installed version number of item, null if not installed QString m_source; // Source feed of available version QString m_destination; // Location item is installed to, null if not installed QString m_category; // Item category + QString m_information; // Package information + QString m_files; // File list information }; typedef QList<OPackage> OPackageList; typedef QListIterator<OPackage> OPackageListIterator; #endif diff --git a/noncore/settings/packagemanager/packageinfodlg.cpp b/noncore/settings/packagemanager/packageinfodlg.cpp index 26356b9..7daf336 100644 --- a/noncore/settings/packagemanager/packageinfodlg.cpp +++ b/noncore/settings/packagemanager/packageinfodlg.cpp @@ -15,68 +15,126 @@ + . -:. = 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 file; -_. . . )=. = see the file COPYING. If not, write to the -- :-=` Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "packageinfodlg.h" +#include "opackage.h" +#include "opackagemanager.h" #include <qlayout.h> #include <qpushbutton.h> #include <qpe/resource.h> #include <opie/otabwidget.h> PackageInfoDlg::PackageInfoDlg( QWidget *parent, OPackageManager *pm, const QString &package ) : QWidget( 0x0 ) , m_packman( pm ) , m_information( this ) , m_files( this ) { // Initialize UI if ( parent ) parent->setCaption( package ); - QVBoxLayout *layout = new QVBoxLayout( this, 4, 0 ); + QVBoxLayout *layout = new QVBoxLayout( this, 4, 2 ); OTabWidget *tabWidget = new OTabWidget( this ); layout->addWidget( tabWidget ); - QPushButton *btn = new QPushButton( Resource::loadPixmap( "enter" ), tr( "Close" ), this ); - layout->addWidget( btn ); - connect( btn, SIGNAL(clicked()), this, SLOT(slotBtnClose()) ); - // Information tab m_information.reparent( tabWidget, QPoint( 0, 0 ) ); m_information.setReadOnly( true ); tabWidget->addTab( &m_information, "UtilsIcon", tr( "Information" ) ); - // Files tab - QWidget *filesWidget = new QWidget( tabWidget ); - QVBoxLayout *filesLayout = new QVBoxLayout( filesWidget, 4, 0 ); - m_files.reparent( filesWidget, QPoint( 0, 0 ) ); - m_files.setReadOnly( true ); - filesLayout->addWidget( &m_files ); + // Retrive package information + m_package = m_packman->findPackage( package ); + if ( !m_package ) + { + m_information.setText( tr( "Unable to retrieve package information." ) ); + return; + } + + // Display package information + if ( !m_package->information().isNull() ) + m_information.setText( m_package->information() ); + else + { + // Package information is not cached, retrieve it + QStringList list( package ); + m_packman->executeCommand( OPackage::Info, &list, QString::null, this, SLOT(slotInfo(char*)), true ); + } + + // Files tab (display only if package is installed) + if ( !m_package->versionInstalled().isNull() ) + { + QWidget *filesWidget = new QWidget( tabWidget ); + QVBoxLayout *filesLayout = new QVBoxLayout( filesWidget, 2, 2 ); + m_files.reparent( filesWidget, QPoint( 0, 0 ) ); + m_files.setReadOnly( true ); + filesLayout->addWidget( &m_files ); + + QPushButton *btn = new QPushButton( Resource::loadPixmap( "packagemanager/apply" ), + tr( "Retrieve file list" ), filesWidget ); + filesLayout->addWidget( btn ); + connect( btn, SIGNAL(clicked()), this, SLOT(slotBtnFileScan()) ); + tabWidget->addTab( filesWidget, "binary", tr( "File list" ) ); + + tabWidget->setCurrentTab( tr( "Information" ) ); + + // If file list is already cached, display + if ( !m_package->files().isNull() ) + m_files.setText( m_package->files() ); + } + else + m_files.hide(); +} + +PackageInfoDlg::~PackageInfoDlg() +{ + if ( !m_package ) + return; + + // Cache package information + if ( !m_information.text().isNull() ) + m_package->setInformation( m_information.text() ); - btn = new QPushButton( Resource::loadPixmap( "packagemanager/apply" ), tr( "Retrieve file list" ), - filesWidget ); - filesLayout->addWidget( btn ); -// TODO connect( btn, SIGNAL(clicked()), this, SLOT(slotFileScan()) ); - tabWidget->addTab( filesWidget, "binary", tr( "Files" ) ); + // Cache package file list + if ( !m_files.text().isNull() ) + m_package->setFiles( m_files.text() ); +} - tabWidget->setCurrentTab( tr( "Information" ) ); +void PackageInfoDlg::slotBtnFileScan() +{ + m_files.clear(); + + QStringList list( m_package->name() ); + m_packman->executeCommand( OPackage::Files, &list, QString::null, this, SLOT(slotFiles(char*)), true ); } -void PackageInfoDlg::slotBtnClose() +void PackageInfoDlg::slotInfo( char *info ) { - emit closeInfoDlg(); + m_information.append( info ); +} + +void PackageInfoDlg::slotFiles( char *filelist ) +{ + QString str = filelist; + + // Skip first line of output ("Package xxx is installed...") + if ( str.startsWith( "Package " ) ) + str = str.right( str.length() - str.find( '\n' ) - 1 ); + + m_files.append( str ); } diff --git a/noncore/settings/packagemanager/packageinfodlg.h b/noncore/settings/packagemanager/packageinfodlg.h index 09af6f4..13a15e2 100644 --- a/noncore/settings/packagemanager/packageinfodlg.h +++ b/noncore/settings/packagemanager/packageinfodlg.h @@ -26,40 +26,42 @@ Boston, MA 02111-1307, USA. */ #ifndef PACKAGEINFODLG_H #define PACKAGEINFODLG_H #include <qmultilineedit.h> #include <qwidget.h> #include <opie/oprocess.h> #include "opackage.h" class QPushButton; +class OPackage; class OPackageManager; class PackageInfoDlg : public QWidget { Q_OBJECT public: PackageInfoDlg( QWidget *parent = 0x0, OPackageManager *pm = 0x0, const QString &package = QString::null ); + ~PackageInfoDlg(); private: OPackageManager *m_packman; // Pointer to application instance of package manager + OPackage *m_package; // Pointer to package to display information for // UI controls QMultiLineEdit m_information; // Multi-line edit to display package information QMultiLineEdit m_files; // Multi-line edit to display package file list private slots: - void slotBtnClose(); - -signals: - void closeInfoDlg(); + void slotBtnFileScan(); + void slotInfo( char *info ); + void slotFiles( char *filelist ); }; #endif |