From 8ebc71609e5263d096f7331a5e0fa95b41eb1d77 Mon Sep 17 00:00:00 2001 From: andyq Date: Sat, 28 Sep 2002 23:22:41 +0000 Subject: *** empty log message *** --- diff --git a/noncore/settings/aqpkg/aqpkg.pro b/noncore/settings/aqpkg/aqpkg.pro new file mode 100644 index 0000000..01f9eff --- a/dev/null +++ b/noncore/settings/aqpkg/aqpkg.pro @@ -0,0 +1,41 @@ +TEMPLATE = app +CONFIG = qt warn_on debug +HEADERS = global.h \ + mainwin.h \ + datamgr.h \ + settingsimpl.h \ + ipkg.h \ + networkpkgmgr.h \ + package.h \ + progressdlg.h \ + installdlgimpl.h \ + instoptionsimpl.h \ + destination.h \ + utils.h \ + server.h \ + helpwindow.h \ + inputdlg.h +SOURCES = mainwin.cpp \ + datamgr.cpp \ + mem.cpp \ + settingsimpl.cpp \ + ipkg.cpp \ + networkpkgmgr.cpp \ + main.cpp \ + package.cpp \ + progressdlg.cpp \ + installdlgimpl.cpp \ + instoptionsimpl.cpp \ + destination.cpp \ + utils.cpp \ + server.cpp \ + helpwindow.cpp \ + inputdlg.cpp +INTERFACES = settings.ui \ + install.ui \ + instoptions.ui +TARGET = aqpkg +INCLUDEPATH += $(QPEDIR)/include +DEPENDPATH += $(QPEDIR)/include +LIBS += -lqpe -lstdc++ + diff --git a/noncore/settings/aqpkg/datamgr.cpp b/noncore/settings/aqpkg/datamgr.cpp new file mode 100644 index 0000000..7f724af --- a/dev/null +++ b/noncore/settings/aqpkg/datamgr.cpp @@ -0,0 +1,197 @@ +/*************************************************************************** + datamgr.cpp - description + ------------------- + begin : Thu Aug 29 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#include +#include +using namespace std; + +#include + +#include "datamgr.h" +#include "global.h" + + +DataManager::DataManager() +{ + activeServer = ""; +} + +DataManager::~DataManager() +{ +} + +Server *DataManager :: getServer( const char *name ) +{ + Server *s = 0; + vector::iterator it = serverList.begin(); + while ( it != serverList.end() && s == 0 ) + { + if ( it->getServerName() == name ) + s = &(*it); + + ++it; + } + + return s; +} + +Destination *DataManager :: getDestination( const char *name ) +{ + Destination *d = 0; + vector::iterator it = destList.begin(); + while ( it != destList.end() && d == 0 ) + { + if ( it->getDestinationName() == name ) + d = &(*it); + + ++it; + } + + return d; +} + +void DataManager :: loadServers() +{ + // First add our local server - not really a server but + // the local config (which packages are installed) + serverList.push_back( Server( LOCAL_SERVER, "" ) ); + serverList.push_back( Server( LOCAL_IPKGS, "" ) ); + + // Read file from /etc/ipkg.conf + QString ipkg_conf = IPKG_CONF; + FILE *fp; + fp = fopen( ipkg_conf, "r" ); + char line[130]; + QString lineStr; + if ( fp == NULL ) + { + cout << "Couldn't open " << ipkg_conf << "! err = " << fp << endl; + return; + } + else + { + while ( fgets( line, sizeof line, fp) != NULL ) + { + lineStr = line; + if ( lineStr.startsWith( "src" ) || lineStr.startsWith( "#src" ) ) + { + char alias[20]; + char url[100]; + sscanf( lineStr, "%*[^ ] %s %s", alias, url ); + Server s( alias, url ); + serverList.push_back( s ); + + if ( lineStr.startsWith( "src" ) ) + setActiveServer( alias ); + } + else if ( lineStr.startsWith( "dest" ) ) + { + char alias[20]; + char path[50]; + sscanf( lineStr, "%*[^ ] %s %s", alias, path ); + Destination d( alias, path ); + destList.push_back( d ); + } + } + } + fclose( fp ); + + // Go through the server destination list and add root, cf and card if they + // don't already exist + vector::iterator dit; + bool foundRoot = false; + bool foundCF = false; + bool foundCard = false; + for ( dit = destList.begin() ; dit != destList.end() ; ++dit ) + { + if ( dit->getDestinationPath() == "/" ) + foundRoot = true; + if ( dit->getDestinationPath() == "/mnt/cf" ) + foundCF = true; + if ( dit->getDestinationPath() == "/mnt/card" ) + foundCard = true; + } + + // If running on a Zaurus (arm) then if we didn't find root, CF or card + // destinations, add them as default +#ifdef QWS +#ifndef X86 + if ( !foundRoot ) + destList.push_back( Destination( "root", "/" ) ); + if ( !foundCF ) + destList.push_back( Destination( "cf", "/mnt/cf" ) ); + if ( !foundCF ) + destList.push_back( Destination( "card", "/mnt/card" ) ); +#endif +#endif + + vector::iterator it; + for ( it = serverList.begin() ; it != serverList.end() ; ++it ) + reloadServerData( it->getServerName() ); +} + +void DataManager :: reloadServerData( const char *serverName ) +{ + Server *s = getServer( serverName ); + // Now we've read the config file in we need to read the servers + // The local server is a special case. This holds the contents of the + // status files the number of which depends on how many destinations + // we've set up + // The other servers files hold the contents of the server package list + if ( s->getServerName() == LOCAL_SERVER ) + s->readStatusFile( destList ); + else if ( s->getServerName() == LOCAL_IPKGS ) + s->readLocalIpks( getServer( LOCAL_SERVER ) ); + else + s->readPackageFile( getServer( LOCAL_SERVER ) ); + +} + +void DataManager :: writeOutIpkgConf() +{ + QString ipkg_conf = IPKG_CONF; + ofstream out( ipkg_conf ); + + out << "# Written by NetworkPackageManager Package Manager" << endl; + + // Write out servers + vector::iterator it = serverList.begin(); + while ( it != serverList.end() ) + { + QString alias = it->getServerName(); + // Don't write out local as its a dummy + if ( alias != LOCAL_SERVER && alias != LOCAL_IPKGS ) + { + QString url = it->getServerUrl();; + + if ( !activeServer || alias != activeServer ) + out << "#"; + out << "src " << alias << " " << url << endl; + } + + it++; + } + + // Write out destinations + vector::iterator it2 = destList.begin(); + while ( it2 != destList.end() ) + { + out << "dest " << it2->getDestinationName() << " " << it2->getDestinationPath() << endl; + it2++; + } + + out.close(); +} diff --git a/noncore/settings/aqpkg/datamgr.h b/noncore/settings/aqpkg/datamgr.h new file mode 100644 index 0000000..94989a9 --- a/dev/null +++ b/noncore/settings/aqpkg/datamgr.h @@ -0,0 +1,64 @@ +/*************************************************************************** + datamgr.h - description + ------------------- + begin : Thu Aug 29 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DATAMGR_H +#define DATAMGR_H + +#include +using namespace std; + +#include "server.h" +#include "destination.h" + +#define LOCAL_SERVER "local" +#define LOCAL_IPKGS "local IPKG" + +/** + *@author Andy Qua + */ + + +class DataManager +{ +public: + DataManager(); + ~DataManager(); + + void setActiveServer( const QString &act ) { activeServer = act; } + QString &getActiveServer( ) { return activeServer; } + + Server *getLocalServer() { return getServer( LOCAL_SERVER ); } + vector &getServerList() { return serverList; } + Server *getServer( const char *name ); + + vector &getDestinationList() { return destList; } + Destination *getDestination( const char *name ); + + void loadServers(); + void reloadServerData( const char *sn ); + + void writeOutIpkgConf(); + + +private: + QString activeServer; + + vector serverList; + vector destList; +}; + +#endif diff --git a/noncore/settings/aqpkg/destination.cpp b/noncore/settings/aqpkg/destination.cpp new file mode 100644 index 0000000..ff50e6e --- a/dev/null +++ b/noncore/settings/aqpkg/destination.cpp @@ -0,0 +1,29 @@ +/*************************************************************************** + destination.cpp - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "destination.h" +#include "global.h" + +Destination::Destination( const char *name, const char *path ) +{ + destName = name; + destPath = path; +} + +Destination::~Destination() +{ +} diff --git a/noncore/settings/aqpkg/destination.h b/noncore/settings/aqpkg/destination.h new file mode 100644 index 0000000..63999d6 --- a/dev/null +++ b/noncore/settings/aqpkg/destination.h @@ -0,0 +1,41 @@ +/*************************************************************************** + destination.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#ifndef DESTINATION_H +#define DESTINATION_H + +#include + +class Destination +{ +public: + Destination() {} + Destination( const char *name, const char *path ); + ~Destination(); + + void setDestinationName( const QString &name ) { destName = name; } + void setDestinationPath( const QString &path ) { destPath = path; } + QString &getDestinationName() { return destName; } + QString &getDestinationPath() { return destPath; } + +protected: + +private: + QString destName; + QString destPath; +}; + +#endif diff --git a/noncore/settings/aqpkg/doc.txt b/noncore/settings/aqpkg/doc.txt new file mode 100644 index 0000000..7722c07 --- a/dev/null +++ b/noncore/settings/aqpkg/doc.txt @@ -0,0 +1,49 @@ +

Documentation for AQPkg

+AQPkg is a package manager for the Sharp Zaurus.
+Basic Instructions:
+On startup, you will be shown a window. The main part of the window is taken up +by a list box showing packages. The packages shown will depend on the server selected.
+The servers list contains network servers containing feeds of packages that can be downloaded +and installed onto your Zaurus. These are held in the file /etc/ipkg.conf and can be maintained +using AQPkg. In addition to the servers defined in ipkg.conf file, there are two other servers - +local and local IPKGs. These are not network servers but views of yours Zaurus.
+The local server shows all installed packages, and the local IPKGs server shows all ipks +that are stored on your Zaurus.
+On the local server, you can only remove packages. On the local IPKGs server you can only +install and delete packages - removing installed packages is currently not working. On all other +servers you can install, uninstall, upgrade and download packages.
+To get the latest package list for a server (or refresh the view), select the server you +wish to update and click the Refresh List button.
+To download a package from a remote server, select the server (any except local and local IPKGs), +then select the package(s) you wish to download (by tapping in the box next to the package +name so that a tick appears in the box) and click the Download button. Enter the path where you +want the package to be downloaded to and click OK to download the package.
+To install, upgrade or remove a package select the packages you wish to install and click the Apply +button. You will then be shown a dialog which allows you to select which destination you wish +to install the package to, which packages will be installed, removed and upgraded. You can also +set various options. (for the moment, see the documentation for IPKG for more details on these +options). To start the process, click Start. This will perform the necessary operations and +will show you what is happening. Once everything has completed click the Close button.
+Note: Currently, the operation to perform for a package is automatically decided based on the +following rules:
+If a package isn't installed, then it will be installed.
+If a package is installed and there isn't a later version available then it will be removed.
+If a package is installed and a different version is available then it will be upgraded. (Note, +I haven't yet found a way to determine if an available package is newer or older than the one +currently installed so it is possible that a package may be downgraded).
+As previously mentioned, a package can be explicitly removed by using the local server.

+A couple of last notes, in the main window, the following may be useful:
+If a package is installed then it will have (installed) after it.
+If a different version is available then it will have a * after the package name.
+You can view details of a package by tapping twice (quickly) on the package name (NOT the +box next to the package name). This will show you a brief description of the package, the +version installed (if it is installed), and the version available for download/installation +(if a different on is available).


+Well, hope you enjoy using this program. If you have any ideas/suggestions/ideas for improvements +then please let me know at andy.qua@blueyonder.co.uk.

+Thanks for using this. +Andy. +

+ + + diff --git a/noncore/settings/aqpkg/global.h b/noncore/settings/aqpkg/global.h new file mode 100644 index 0000000..be3ede4 --- a/dev/null +++ b/noncore/settings/aqpkg/global.h @@ -0,0 +1,78 @@ +/*************************************************************************** + global.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef __GLOBAL_H +#define __GLOBAL_H + +// Uncomment the below line to run on a Linux box rather than a Zaurus +// box this allows you to change where root is, and where to load config files from +//#define X86 + +// Sets up location of ipkg.conf and root directory +#ifdef QWS + +#ifndef X86 + +// Running QT/Embedded on an arm processor +#define IPKG_CONF "/etc/ipkg.conf" +#define ROOT "/" +#define IPKG_DIR "/usr/lib/ipkg/" + +#else + +// Running QT/Embedded on a X86 linux box +#define IPKG_DIR "/home/andy/projects/aqpkg/aqpkg/data" +#define IPKG_CONF "/home/andy/projects/aqpkg/aqpkg/data/ipkg.conf" +#define ROOT "/home/andy/projects/aqpkg/aqpkg/data/root" + +#endif + +#else + +// Running QT on a X86 linux box +#define IPKG_CONF "/home/andy/projects/aqpkg/aqpkg/data/ipkg.conf" +#define ROOT "/home/andy/projects/aqpkg/aqpkg/data/root" +#define IPKG_DIR "/home/andy/projects/aqpkg/aqpkg/data" + +#endif + + +// Uncomment the below line to turn on memory checking +//#define _DEBUG 1 + +#ifndef __MEMFILE_C +#ifdef _DEBUG +void * operator new(unsigned int size,const char *file, int line); +void operator delete(void *p); +#endif + +#ifdef _DEBUG +#define DEBUG_NEW new(__FILE__, __LINE__) +//#define DEBUG_NEW new +#else +#define DEBUG_NEW new +#endif + +#define new DEBUG_NEW +#endif + + +void AddTrack(long addr, long asize, const char *fname, long lnum); +void RemoveTrack(long addr); +void DumpUnfreed(); + +#endif diff --git a/noncore/settings/aqpkg/helpwindow.cpp b/noncore/settings/aqpkg/helpwindow.cpp new file mode 100644 index 0000000..0302b3f --- a/dev/null +++ b/noncore/settings/aqpkg/helpwindow.cpp @@ -0,0 +1,95 @@ +/*************************************************************************** + helpwindow.cpp - description + ------------------- + begin : Sun Sep 8 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include + +#include "helpwindow.h" +#include "global.h" + + +#define HELP_TEXT \ +"

Documentation for AQPkg

" \ +"AQPkg is a package manager for the Sharp Zaurus.

" \ +"Basic Instructions:

" \ +"On startup, you will be shown a window. The main part of the window is taken up " \ +"by a list box showing packages. The packages shown will depend on the server selected.

" \ +"The servers list contains network servers containing feeds of packages that can be downloaded " \ +"and installed onto your Zaurus. These are held in the file /etc/ipkg.conf and can be maintained " \ +"using AQPkg. In addition to the servers defined in ipkg.conf file, there are two other servers - " \ +"local and local IPKGs. These are not network servers but views of yours Zaurus.

" \ +"The local server shows all installed packages, and the local IPKGs server shows all ipks " \ +"that are stored on your Zaurus.

" \ +"On the local server, you can only remove packages. On the local IPKGs server you can only " \ +"install and delete packages - removing installed packages is currently not working. On all other " \ +"servers you can install, uninstall, upgrade and download packages.

" \ +"To get the latest package list for a server (or refresh the view), select the server you " \ +"wish to update and click the Refresh List button.

" \ +"To download a package from a remote server, select the server (any except local and local IPKGs), " \ +"then select the package(s) you wish to download (by tapping in the box next to the package " \ +"name so that a tick appears in the box) and click the Download button. Enter the path where you " \ +"want the package to be downloaded to and click OK to download the package.

" \ +"To install, upgrade or remove a package select the packages you wish to install and click the Apply " \ +"button. You will then be shown a dialog which allows you to select which destination you wish " \ +"to install the package to, which packages will be installed, removed and upgraded. You can also " \ +"set various options. (for the moment, see the documentation for IPKG for more details on these " \ +"options). To start the process, click Start. This will perform the necessary operations and " \ +"will show you what is happening. Once everything has completed click the Close button.

" \ +"Note: Currently, the operation to perform for a package is automatically decided based on the " \ +"following rules:

" \ +" If a package isn't installed, then it will be installed.
" \ +" If a package is installed and there isn't a later version available then it will be removed.
" \ +" If a package is installed and a different version is available then it will be upgraded. (Note, " \ +"I haven't yet found a way to determine if an available package is newer or older than the one " \ +"currently installed so it is possible that a package may be downgraded).

" \ +"As previously mentioned, a package can be explicitly removed by using the local server.

" \ +"A couple of last notes, in the main window, the following may be useful:

" \ +"If a package is installed then it will have (installed) after it.

" \ +"If a different version is available then it will have a * after the package name.

" \ +"You can view details of a package by tapping twice (quickly) on the package name (NOT the " \ +"box next to the package name). This will show you a brief description of the package, the " \ +"version installed (if it is installed), and the version available for download or installation " \ +"(if a different on is available).

" \ +"Well, hope you enjoy using this program. If you have any ideas/suggestions/ideas for improvements " \ +"then please let me know at andy.qua@blueyonder.co.uk.

" \ +"Thanks for using this. " \ +"Andy. " \ +"

" + + +HelpWindow::HelpWindow( QWidget *parent, const char *name, bool modal, WFlags flags ) + : QDialog( parent, name, modal, flags ) +{ +// resize( 230, 280 ); + + setCaption( "Help for AQPkg" ); + + QVBoxLayout *layout = new QVBoxLayout( this ); + QString text = HELP_TEXT;; + QTextView *view = new QTextView( text, 0, this, "view" ); + layout->insertSpacing( -1, 5 ); + layout->insertWidget( -1, view ); + layout->insertSpacing( -1, 5 ); + + showMaximized(); +} + +HelpWindow::~HelpWindow() +{ +} diff --git a/noncore/settings/aqpkg/helpwindow.h b/noncore/settings/aqpkg/helpwindow.h new file mode 100644 index 0000000..edc1b6e --- a/dev/null +++ b/noncore/settings/aqpkg/helpwindow.h @@ -0,0 +1,34 @@ +/*************************************************************************** + helpwindow.h - description + ------------------- + begin : Sun Sep 8 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef HELPWINDOW_H +#define HELPWINDOW_H + +#include + +/** + *@author Andy Qua + */ + +class HelpWindow : public QDialog +{ +public: + HelpWindow( QWidget *parent = 0, const char *name = 0, bool modal = true, WFlags flags = 0 ); + ~HelpWindow(); +}; + +#endif diff --git a/noncore/settings/aqpkg/inputdlg.cpp b/noncore/settings/aqpkg/inputdlg.cpp new file mode 100644 index 0000000..724a891 --- a/dev/null +++ b/noncore/settings/aqpkg/inputdlg.cpp @@ -0,0 +1,121 @@ +/*************************************************************************** + inputdlg.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "inputdlg.h" +#include "global.h" + + +InputDialog :: InputDialog( const QString &label, QWidget* parent, const char* name, + bool modal ) + : QDialog( parent, name, modal ) +{ + lineEdit = 0; + + QVBoxLayout *vbox = new QVBoxLayout( this, 6, 6 ); + + QLabel* l = new QLabel( label, this ); + vbox->addWidget( l ); + + lineEdit = new QLineEdit( this ); + vbox->addWidget( lineEdit ); + + QHBoxLayout *hbox = new QHBoxLayout( 6 ); + vbox->addLayout( hbox, AlignRight ); + + ok = new QPushButton( tr( "&OK" ), this ); + ok->setDefault( TRUE ); + QPushButton *cancel = new QPushButton( tr( "&Cancel" ), this ); + + QSize bs( ok->sizeHint() ); + if ( cancel->sizeHint().width() > bs.width() ) + bs.setWidth( cancel->sizeHint().width() ); + + ok->setFixedSize( bs ); + cancel->setFixedSize( bs ); + + hbox->addWidget( new QWidget( this ) ); + hbox->addWidget( ok ); + hbox->addWidget( cancel ); + + connect( lineEdit, SIGNAL( returnPressed() ), + this, SLOT( tryAccept() ) ); + connect( lineEdit, SIGNAL( textChanged( const QString & ) ), + this, SLOT( textChanged( const QString & ) ) ); + + connect( ok, SIGNAL( clicked() ), this, SLOT( accept() ) ); + connect( cancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); + + resize( QMAX( sizeHint().width(), 240 ), sizeHint().height() ); +} + +/*! + Destructor. +*/ + +InputDialog::~InputDialog() +{ +} + +void InputDialog :: setText( const QString &text ) +{ + lineEdit->setText( text ); + lineEdit->selectAll(); +} + +QString InputDialog :: getText() +{ + return lineEdit->text(); +} + +QString InputDialog::getText( const QString &caption, const QString &label, + const QString &text, bool *ok, QWidget *parent, + const char *name ) +{ + InputDialog *dlg = new InputDialog( label, parent, name, true ); + dlg->setCaption( caption ); + dlg->setText( text ); + + QString result; + *ok = dlg->exec() == QDialog::Accepted; + if ( *ok ) + result = dlg->getText(); + + delete dlg; + return result; +} + + + +void InputDialog :: textChanged( const QString &s ) +{ + ok->setEnabled( !s.isEmpty() ); +} + +void InputDialog :: tryAccept() +{ + if ( !lineEdit->text().isEmpty() ) + accept(); +} diff --git a/noncore/settings/aqpkg/inputdlg.h b/noncore/settings/aqpkg/inputdlg.h new file mode 100644 index 0000000..1e0c5bc --- a/dev/null +++ b/noncore/settings/aqpkg/inputdlg.h @@ -0,0 +1,50 @@ +/*************************************************************************** + inputdlg.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef INPUTDIALOG_H +#define INPUTDIALOG_H + +#include +#include +#include +#include + +class InputDialog : public QDialog +{ + Q_OBJECT + +public: + static QString getText( const QString &caption, const QString &label, const QString &text = QString::null, + bool *ok = 0, QWidget *parent = 0, const char *name = 0 ); + + InputDialog( const QString &label, QWidget* parent = 0, const char* name = 0, + bool modal = TRUE ); + ~InputDialog(); + + void setText( const QString &text ); + QString getText(); + +private slots: + void textChanged( const QString &s ); + void tryAccept(); + +private: + QLineEdit *lineEdit; + QPushButton *ok; +}; + +#endif // INPUTDIALOG_H diff --git a/noncore/settings/aqpkg/install.ui b/noncore/settings/aqpkg/install.ui new file mode 100644 index 0000000..daa0ff6 --- a/dev/null +++ b/noncore/settings/aqpkg/install.ui @@ -0,0 +1,118 @@ + +InstallDlg + + QDialog + + name + InstallDlg + + + geometry + + 0 + 0 + 196 + 271 + + + + caption + Install + + + + margin + 11 + + + spacing + 6 + + + QLabel + + name + TextLabel1 + + + text + Destination + + + + QComboBox + + name + destination + + + + QGroupBox + + name + GroupBox2 + + + title + Output + + + + margin + 11 + + + spacing + 6 + + + QMultiLineEdit + + name + output + + + + + + QPushButton + + name + btnInstall + + + text + Start + + + + QPushButton + + name + btnOptions + + + text + Options + + + + + + + btnOptions + clicked() + InstallDlg + optionsSelected() + + + btnInstall + clicked() + InstallDlg + installSelected() + + installSelected() + displayText(const QString &) + optionsSelected() + + diff --git a/noncore/settings/aqpkg/installdlgimpl.cpp b/noncore/settings/aqpkg/installdlgimpl.cpp new file mode 100644 index 0000000..31be213 --- a/dev/null +++ b/noncore/settings/aqpkg/installdlgimpl.cpp @@ -0,0 +1,193 @@ +/*************************************************************************** + installdlgimpl.cpp - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifdef QWS +#include +#endif + +#include +#include +#include +#include +#include + + +#include "datamgr.h" +#include "instoptionsimpl.h" +#include "destination.h" +#include "installdlgimpl.h" +#include "global.h" + +InstallDlgImpl::InstallDlgImpl( vector &packageList, DataManager *dataManager, QWidget * parent, const char* name, bool modal, WFlags fl ) + : InstallDlg( parent, name, modal, fl ) +{ + dataMgr = dataManager; + vector::iterator dit; + + QString defaultDest = "root"; +#ifdef QWS + Config cfg( "aqpkg" ); + cfg.setGroup( "settings" ); + defaultDest = cfg.readEntry( "dest", "root" ); + + // Grab flags - Turn MAKE_LINKS on by default (if no flags found) + flags = cfg.readNumEntry( "installFlags", MAKE_LINKS ); +#else + flags = 0; +#endif + + // Output text is read only + output->setReadOnly( true ); + + // setup destination data + int defIndex = 0; + int i; + for ( i = 0 , dit = dataMgr->getDestinationList().begin() ; dit != dataMgr->getDestinationList().end() ; ++dit, ++i ) + { + destination->insertItem( dit->getDestinationName() ); + if ( dit->getDestinationName() == defaultDest ) + defIndex = i; + } + + destination->setCurrentItem( defIndex ); + + vector::iterator it; + // setup package data + QString remove = "Remove\n"; + QString install = "\nInstall\n"; + QString upgrade = "\nUpgrade\n"; + for ( it = packageList.begin() ; it != packageList.end() ; ++it ) + { + QString name = *it; + if ( name.startsWith( "I" ) ) + { + installList.push_back( name.mid(1) ); + install += " " + name.mid(1) + "\n"; + } + else if ( name.startsWith( "D" ) ) + { + removeList.push_back( name.mid(1) ); + remove += " " + name.mid(1) + "\n"; + } + else if ( name.startsWith( "U" ) ) + { + updateList.push_back( name.mid(1) ); + upgrade += " " + name.mid(1) + "\n"; + } + } + + output->setText( remove + install + upgrade ); + + connect( &ipkg, SIGNAL(outputText(const QString &)), this, SLOT(displayText(const QString &))); +} + +InstallDlgImpl::~InstallDlgImpl() +{ +} + +bool InstallDlgImpl :: showDlg() +{ + showMaximized(); + bool ret = exec(); + + return ret; +} + +void InstallDlgImpl :: optionsSelected() +{ + InstallOptionsDlgImpl opt( flags, this, "Option", true ); + opt.exec(); + + // set options selected from dialog + flags = 0; + if ( opt.forceDepends->isChecked() ) + flags |= FORCE_DEPENDS; + if ( opt.forceReinstall->isChecked() ) + flags |= FORCE_REINSTALL; + if ( opt.forceRemove->isChecked() ) + flags |= FORCE_REMOVE; + if ( opt.forceOverwrite->isChecked() ) + flags |= FORCE_OVERWRITE; + if ( opt.makeLinks->isChecked() ) + flags |= MAKE_LINKS; + +#ifdef QWS + Config cfg( "aqpkg" ); + cfg.setGroup( "settings" ); + cfg.writeEntry( "installFlags", flags ); +#endif +} + +void InstallDlgImpl :: installSelected() +{ + if ( btnInstall->text() == "Close" ) + { + done( 1 ); + return; + } + + btnInstall->setEnabled( false ); + + output->setText( "" ); + Destination *d = dataMgr->getDestination( destination->currentText() ); + QString dest = d->getDestinationName(); + QString destDir = d->getDestinationPath(); + +#ifdef QWS + // Save settings + Config cfg( "aqpkg" ); + cfg.setGroup( "settings" ); + cfg.writeEntry( "dest", dest ); +#endif + + // First run through the remove list, then the install list then the upgrade list + vector::iterator it; + ipkg.setOption( "remove" ); + ipkg.setDestination( dest ); + ipkg.setDestinationDir( destDir ); + ipkg.setFlags( flags ); + for ( it = removeList.begin() ; it != removeList.end() ; ++it ) + { + ipkg.setPackage( *it ); + ipkg.runIpkg(); + } + + ipkg.setOption( "install" ); + for ( it = installList.begin() ; it != installList.end() ; ++it ) + { + ipkg.setPackage( *it ); + ipkg.runIpkg(); + } + + flags |= FORCE_REINSTALL; + ipkg.setFlags( flags ); + for ( it = updateList.begin() ; it != updateList.end() ; ++it ) + { + ipkg.setPackage( *it ); + ipkg.runIpkg(); + } + + btnInstall->setEnabled( true ); + btnInstall->setText( tr( "Close" ) ); +} + +void InstallDlgImpl :: displayText(const QString &text ) +{ + QString t = output->text() + "\n" + text; + output->setText( t ); + output->setCursorPosition( output->numLines(), 0 ); +} diff --git a/noncore/settings/aqpkg/installdlgimpl.h b/noncore/settings/aqpkg/installdlgimpl.h new file mode 100644 index 0000000..195616d --- a/dev/null +++ b/noncore/settings/aqpkg/installdlgimpl.h @@ -0,0 +1,54 @@ +/*************************************************************************** + installdlgimpl.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#ifndef INSTALLDLGIMPL_H +#define INSTALLDLGIMPL_H + +#include +using namespace std; + +#include + +#include "ipkg.h" +#include "install.h" + +class InstallDlgImpl : public InstallDlg +{ +public: + InstallDlgImpl( vector &packageList, DataManager *dataManager, QWidget * parent = 0, const char* name = 0, bool modal = false, WFlags fl = 0 ); + ~InstallDlgImpl(); + + bool showDlg(); + bool upgradeServer( QString &server ); + +protected: + +private: + DataManager *dataMgr; + vector installList; + vector removeList; + vector updateList; + int flags; + Ipkg ipkg; + + bool runIpkg( QString &option, const QString& package, const QString& dest, int flags ); + + void optionsSelected(); + void installSelected(); + void displayText(const QString &text ); +}; + +#endif diff --git a/noncore/settings/aqpkg/instoptions.ui b/noncore/settings/aqpkg/instoptions.ui new file mode 100644 index 0000000..d4a3548 --- a/dev/null +++ b/noncore/settings/aqpkg/instoptions.ui @@ -0,0 +1,132 @@ + +InstallOptionsDlg + + QDialog + + name + InstallOptionsDlg + + + geometry + + 0 + 0 + 158 + 205 + + + + caption + Options + + + sizeGripEnabled + false + + + + margin + 11 + + + spacing + 6 + + + QGroupBox + + name + GroupBox1 + + + title + Options + + + + margin + 11 + + + spacing + 6 + + + QCheckBox + + name + forceDepends + + + text + Force Depends + + + + QCheckBox + + name + forceReinstall + + + text + Force Reinstall + + + + QCheckBox + + name + forceRemove + + + text + Force Remove + + + + QCheckBox + + name + forceOverwrite + + + text + Force Overwrite + + + + QCheckBox + + name + makeLinks + + + text + Link to root + + + + + + QPushButton + + name + btnOK + + + text + OK + + + + + + + btnOK + clicked() + InstallOptionsDlg + accept() + + + diff --git a/noncore/settings/aqpkg/instoptionsimpl.cpp b/noncore/settings/aqpkg/instoptionsimpl.cpp new file mode 100644 index 0000000..d9d2be9 --- a/dev/null +++ b/noncore/settings/aqpkg/instoptionsimpl.cpp @@ -0,0 +1,49 @@ +/*************************************************************************** + instoptionsimpl.cpp - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifdef QWS +#include +#endif + +#include +#include + +#include "instoptionsimpl.h" +#include "ipkg.h" +#include "global.h" + +InstallOptionsDlgImpl::InstallOptionsDlgImpl( int flags, QWidget * parent, const char* name, bool modal, WFlags fl ) + : InstallOptionsDlg( parent, name, modal, fl ) +{ + if ( flags & FORCE_DEPENDS ) + forceDepends->setChecked( true ); + if ( flags & FORCE_REINSTALL ) + forceReinstall->setChecked( true ); + if ( flags & FORCE_REMOVE ) + forceRemove->setChecked( true ); + if ( flags & FORCE_OVERWRITE ) + forceOverwrite->setChecked( true ); + if ( flags & MAKE_LINKS ) + makeLinks->setChecked( true ); + + showMaximized(); + +} + +InstallOptionsDlgImpl::~InstallOptionsDlgImpl() +{ +} diff --git a/noncore/settings/aqpkg/instoptionsimpl.h b/noncore/settings/aqpkg/instoptionsimpl.h new file mode 100644 index 0000000..08ec616 --- a/dev/null +++ b/noncore/settings/aqpkg/instoptionsimpl.h @@ -0,0 +1,33 @@ +/*************************************************************************** + installoptionsimpl.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#ifndef INSTALLOPTIONSIMPL_H +#define INSTALLOPTIONSIMPL_H + +#include "instoptions.h" + +class InstallOptionsDlgImpl : public InstallOptionsDlg +{ +public: + InstallOptionsDlgImpl( int flags, QWidget * parent = 0, const char* name = 0, bool modal = false, WFlags fl = 0 ); + ~InstallOptionsDlgImpl(); + +protected: + +private: +}; + +#endif diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp new file mode 100644 index 0000000..d5157eb --- a/dev/null +++ b/noncore/settings/aqpkg/ipkg.cpp @@ -0,0 +1,345 @@ +/*************************************************************************** + ipkg.cpp - description + ------------------- + begin : Sat Aug 31 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +using namespace std; + +#include +#include + +#ifdef QWS +#include +#else +#include +#endif +#include +#include + +#include "utils.h" +#include "ipkg.h" +#include "global.h" + +Ipkg :: Ipkg() +{ +} + +Ipkg :: ~Ipkg() +{ +} + +// Option is what we are going to do - install, upgrade, download +// package is the package name to install - either a fully qualified path and ipk +// file (if stored locally) or just the name of the package (for a network package) +// packageName is the package name - (for a network package this will be the same as +// package parameter) +// dest is the destination alias (from ipk.conf) +// destDir is the dir that the destination alias points to (used to link to root) +// flags is the ipkg options flags +// dir is the directory to run ipkg in (defaults to "") +bool Ipkg :: runIpkg( ) +{ + bool ret = false; + + QDir::setCurrent( "/tmp" ); + QString cmd = ""; + + if ( runtimeDir != "" ) + { + cmd += "cd "; + cmd += runtimeDir; + cmd += " ; "; + } + cmd += "ipkg"; + + if ( option != "update" && option != "download" ) + { + cmd += " -dest "+ destination; + cmd += " -force-defaults"; + + if ( flags & FORCE_DEPENDS ) + cmd += " -force-depends"; + if ( flags & FORCE_REINSTALL ) + cmd += " -force-reinstall"; + if ( flags & FORCE_REMOVE ) + cmd += " -force-removal-of-essential-packages"; + if ( flags & FORCE_OVERWRITE ) + cmd += " -force-overwrite"; + + // Handle make links + // Rules - If make links is switched on, create links to root + // if destDir is NOT / + if ( flags & MAKE_LINKS ) + { + // If destDir == / turn off make links as package is being insalled + // to root already. + if ( destDir == "/" ) + flags ^= MAKE_LINKS; + } + + } + +#ifdef X86 + cmd += " -f "; + cmd += IPKG_CONF; +#endif + + cmd += " " + option + " " + package + " 2>&1"; + + qApp->processEvents(); + + // If we are removing packages and make links option is selected + // create the links + if ( option == "remove" ) + { + createLinks = false; + if ( flags & MAKE_LINKS ) + { + emit outputText( QString( "Removing symbolic links...\n" ) ); + linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); + } + } + + emit outputText( cmd ); + + // Execute command + dependantPackages = new QList; + dependantPackages->setAutoDelete( true ); + ret = executeIpkgCommand( cmd, option ); + + if ( option == "install" ) + { + // If we are not removing packages and make links option is selected + // create the links + createLinks = true; + if ( flags & MAKE_LINKS ) + { + emit outputText( " " ); + emit outputText( QString( "Creating symbolic links for " )+ package ); + + linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); + + // link dependant packages that were installed with this release + QString *pkg; + for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() ) + { + emit outputText( " " ); + emit outputText( QString( "Creating symbolic links for " )+ (*pkg) ); + linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir ); + } + } + } + + delete dependantPackages; + + emit outputText( QString( "Finished - status=" ) + (ret ? "success" : "failure") ); + return ret; +} + + +int Ipkg :: executeIpkgCommand( QString &cmd, const QString option ) +{ + FILE *fp = NULL; + char line[130]; + QString lineStr, lineStrOld; + int ret = false; + + fp = popen( (const char *) cmd, "r"); + if ( fp == NULL ) + { + cout << "Couldn't execute " << cmd << "! err = " << fp << endl; + QString text; + text.sprintf( "Couldn't execute %s! See stdout for error code", (const char *)cmd ); + emit outputText( text ); + } + else + { + while ( fgets( line, sizeof line, fp) != NULL ) + { + lineStr = line; + lineStr=lineStr.left( lineStr.length()-1 ); + + if ( lineStr != lineStrOld ) + { + //See if we're finished + if ( option == "install" ) + { + // Need to keep track of any dependant packages that get installed + // so that we can create links to them as necessary + if ( lineStr.startsWith( "Installing " ) ) + { + cout << "LineStr = " << lineStr << endl; + int start = lineStr.find( " " ) + 1; + int end = lineStr.find( " ", start ); + QString *package = new QString( lineStr.mid( start, end-start ) ); + dependantPackages->append( package ); + cout << "installing dependant package <" << *package << ">" << endl; + } + } + + if ( option == "update" ) + { + if (lineStr.contains("Updated list")) + ret = true; + } + else if ( option == "download" ) + { + if (lineStr.contains("Downloaded")) + ret = true; + } + else + { + if (lineStr.contains("Done")) + ret = true; + } + + emit outputText( lineStr ); + } + lineStrOld = lineStr; + qApp->processEvents(); + } + pclose(fp); + } + + return ret; +} + + +void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) +{ + if ( dest == "root" || dest == "/" ) + return; + + qApp->processEvents(); + QStringList *fileList = getList( packFileName, destDir ); + qApp->processEvents(); + processFileList( fileList, destDir ); + delete fileList; +} + +QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) +{ + QString packageFileDir = destDir+"/usr/lib/ipkg/info/"+packageFilename+".list"; + QFile f( packageFileDir ); + + cout << "Try to open " << packageFileDir.latin1() << endl; + if ( !f.open(IO_ReadOnly) ) + { + // Couldn't open from dest, try from / +// cout << "Could not open:" << packageFileDir << endl; + f.close(); + + packageFileDir = "/usr/lib/ipkg/info/"+packageFilename+".list"; + f.setName( packageFileDir ); +// cout << "Try to open " << packageFileDir.latin1() << endl; + if ( ! f.open(IO_ReadOnly) ) + { + cout << "Could not open:" << packageFileDir << endl; + emit outputText( QString( "Could not open :" ) + packageFileDir ); + return (QStringList*)0; + } + } + QStringList *fileList = new QStringList(); + QTextStream t( &f ); + while ( !t.eof() ) + *fileList += t.readLine(); + + f.close(); + return fileList; +} + +void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir ) +{ + if ( !fileList || fileList->isEmpty() ) + return; + + QString baseDir = ROOT; + + if ( createLinks == true ) + { + for ( uint i=0; i < fileList->count(); i++ ) + { + processLinkDir( (*fileList)[i], baseDir, destDir ); + qApp->processEvents(); + } + } + else + { + for ( int i = fileList->count()-1; i >= 0 ; i-- ) + { + cout << "i = " << i << ", Dealing with " << (*fileList)[i] << endl; + processLinkDir( (*fileList)[i], baseDir, destDir ); + qApp->processEvents(); + } + } +} + +void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir ) +{ + QString sourceFile = baseDir + file; + QString linkFile = destDir + file; + QString text; + if ( createLinks ) + { + // If this file is a directory (ends with a /) and it doesn't exist, + // we need to create it + if ( file.right(1) == "/" ) + { + QFileInfo f( linkFile ); + if ( !f.exists() ) + { + emit outputText( QString( "Creating directory " ) + linkFile ); + QDir d; + d.mkdir( linkFile, true ); + } + else + emit outputText( QString( "Directory " ) + linkFile + " exists" ); + + } + else + { + int rc = symlink( sourceFile, linkFile ); + text = (rc == 0 ? "Linked " : "Failed to link "); + text += sourceFile + " to " + linkFile; + emit outputText( text ); + } + } + else + { + QFileInfo f( linkFile ); + if ( f.exists() ) + { + if ( f.isFile() ) + { + QFile f( linkFile ); + bool rc = f.remove(); + + text = (rc ? "Removed " : "Failed to remove "); + text += linkFile; + emit outputText( text ); + } + else if ( f.isDir() ) + { + QDir d; + bool rc = d.rmdir( linkFile, true ); + text = (rc ? "Removed " : "Failed to remove "); + text += linkFile; + emit outputText( text ); + } + } + } + +} diff --git a/noncore/settings/aqpkg/ipkg.h b/noncore/settings/aqpkg/ipkg.h new file mode 100644 index 0000000..63588c4 --- a/dev/null +++ b/noncore/settings/aqpkg/ipkg.h @@ -0,0 +1,72 @@ +/*************************************************************************** + ipkg.h - description + ------------------- + begin : Sat Aug 31 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef IPKG_H +#define IPKG_H + + +/** + *@author Andy Qua + */ + +#include +#include +#include + +#define FORCE_DEPENDS 0x0001 +#define FORCE_REMOVE 0x0002 +#define FORCE_REINSTALL 0x0004 +#define FORCE_OVERWRITE 0x0008 +#define MAKE_LINKS 0x0010 + +class Ipkg : public QObject +{ + Q_OBJECT +public: + Ipkg(); + ~Ipkg(); + bool runIpkg( ); + + void setOption( const char *opt ) { option = opt; } + void setPackage( const char *pkg ) { package = pkg; } + void setDestination( const char *dest ) { destination = dest; } + void setDestinationDir( const char *dir ) { destDir = dir; } + void setFlags( int fl ) { flags = fl; } + void setRuntimeDirectory( const char *dir ) { runtimeDir = dir; } + +signals: + void outputText( const QString &text ); + +private: + bool createLinks; + QString option; + QString package; + QString destination; + QString destDir; + int flags; + QString runtimeDir; + + QList *dependantPackages; + + int executeIpkgCommand( QString &cmd, const QString option ); + void linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ); + QStringList* getList( const QString &packageFilename, const QString &destDir ); + void processFileList( const QStringList *fileList, const QString &destDir ); + void processLinkDir( const QString &file, const QString &baseDir, const QString &destDir ); +}; + +#endif diff --git a/noncore/settings/aqpkg/main.cpp b/noncore/settings/aqpkg/main.cpp new file mode 100644 index 0000000..e943e49 --- a/dev/null +++ b/noncore/settings/aqpkg/main.cpp @@ -0,0 +1,61 @@ +/*************************************************************************** + main.cpp - description + ------------------- + begin : Mon Aug 26 13:32:30 BST 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifdef QWS +#include +#else +#include +#endif + +#include + +#include "mainwin.h" +#include "server.h" + +#include "global.h" + + +/* +int main2(int argc, char *argv[]) +{ + Server local( "local", "", "status" ); + local.readPackageFile(); + + Server s( "opiecvs", "aaa" ); + s.readPackageFile( &local ); + +} +*/ + +int main(int argc, char *argv[]) +{ +#ifdef QWS + QPEApplication a( argc, argv ); +#else + QApplication a( argc, argv ); +#endif + + MainWindow *win = new MainWindow(); + a.setMainWidget(win); + win->show(); + + a.exec(); + + #ifdef _DEBUG + DumpUnfreed(); + #endif +} diff --git a/noncore/settings/aqpkg/mainwin.cpp b/noncore/settings/aqpkg/mainwin.cpp new file mode 100644 index 0000000..5de4dc9 --- a/dev/null +++ b/noncore/settings/aqpkg/mainwin.cpp @@ -0,0 +1,85 @@ +/*************************************************************************** + mainwin.cpp - description + ------------------- + begin : Mon Aug 26 13:32:30 BST 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include + +#include "mainwin.h" +#include "datamgr.h" +#include "networkpkgmgr.h" +#include "settingsimpl.h" +#include "helpwindow.h" +#include "global.h" + +MainWindow :: MainWindow( QWidget *p, char *name ) + : QMainWindow( p, name ) +{ +#ifdef QWS + showMaximized(); +#endif + + setCaption( "AQPkg - Package Manager" ); + + // Create our menu + QPopupMenu *help = new QPopupMenu( this ); + help->insertItem( "&General", this, SLOT(displayHelp()), Qt::CTRL+Qt::Key_H ); + help->insertItem( "&About", this, SLOT(displayAbout()), Qt::CTRL+Qt::Key_A ); + + QPopupMenu *settings = new QPopupMenu( this ); + settings->insertItem( "&Settings", this, SLOT(displaySettings()), Qt::CTRL+Qt::Key_S ); + + // Create the main menu + QMenuBar *menu = menuBar(); //new QMenuBar( this ); + menu->insertItem( "&Settings", settings ); + menu->insertItem( "&Help", help ); + + mgr = new DataManager(); + mgr->loadServers(); + + stack = new QWidgetStack( this ); + + networkPkgWindow = new NetworkPackageManager( mgr, stack ); + stack->addWidget( networkPkgWindow, 1 ); + + setCentralWidget( stack ); + stack->raiseWidget( networkPkgWindow ); +} + +MainWindow :: ~MainWindow() +{ + delete networkPkgWindow; +} + +void MainWindow :: displaySettings() +{ + SettingsImpl *dlg = new SettingsImpl( mgr, this, "Settings", true ); + if ( dlg->showDlg( 0 ) ) + networkPkgWindow->updateData(); + delete dlg; +} + +void MainWindow :: displayHelp() +{ + HelpWindow *dlg = new HelpWindow( this ); + dlg->exec(); + delete dlg; +} + +void MainWindow :: displayAbout() +{ + +} diff --git a/noncore/settings/aqpkg/mainwin.h b/noncore/settings/aqpkg/mainwin.h new file mode 100644 index 0000000..2a182fc --- a/dev/null +++ b/noncore/settings/aqpkg/mainwin.h @@ -0,0 +1,47 @@ +/*************************************************************************** + mainwin.h - description + ------------------- + begin : Mon Aug 26 13:32:30 BST 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef MAINWIN_H +#define MAINWIN_H + +#include +#include + + +class NetworkPackageManager; +class DataManager; + +class MainWindow :public QMainWindow +{ + Q_OBJECT +public: + + MainWindow( QWidget *p = 0, char *name = 0 ); + ~MainWindow(); + +private: + DataManager *mgr; + + QWidgetStack *stack; + NetworkPackageManager *networkPkgWindow; + +public slots: + void displayHelp(); + void displayAbout(); + void displaySettings(); +}; +#endif diff --git a/noncore/settings/aqpkg/mem.cpp b/noncore/settings/aqpkg/mem.cpp new file mode 100644 index 0000000..76ce35c --- a/dev/null +++ b/noncore/settings/aqpkg/mem.cpp @@ -0,0 +1,105 @@ +/*************************************************************************** + mem.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#include +#include +#include +using namespace std; + +#define __MEMFILE_C +#include "global.h" + +#ifdef _DEBUG + +void __cdecl *operator new( unsigned int size, const char *file, int line ) +{ + void *ptr = (void *)malloc(size); + AddTrack((long)ptr, size, file, line); + return(ptr); +} + +void operator delete(void *p) +{ + RemoveTrack((long)p); + free(p); +} + +#endif + + +typedef struct { + long address; + long size; + char file[64]; + long line; +} ALLOC_INFO; + +typedef list AllocList; + +AllocList allocList; + + + +void AddTrack(long addr, long asize, const char *fname, long lnum) +{ + ALLOC_INFO *info; + + + info = (ALLOC_INFO *)malloc(sizeof( ALLOC_INFO )); + info->address = addr; + strncpy(info->file, fname, 63); + info->line = lnum; + info->size = asize; + allocList.insert(allocList.begin(), info); +}; + +void RemoveTrack(long addr) +{ + AllocList::iterator i; + + bool found = false; + for(i = allocList.begin(); i != allocList.end(); i++) + { + if((*i)->address == addr) + { + allocList.remove((*i)); + found = true; + break; + } + } +} + +void DumpUnfreed() +{ + AllocList::iterator i; + long totalSize = 0; + char buf[1024]; + + +// if(!allocList) +// return; + + for(i = allocList.begin(); i != allocList.end(); i++) { + sprintf(buf, "%-15s: LINE %ld, ADDRESS %ld %ld unfreed", + (*i)->file, (*i)->line, (*i)->address, (*i)->size); + cout <size; + } + sprintf(buf, "-----------------------------------------------------------\n"); + cout < +#include + + + +const char *Aqpkg::className() const +{ + return "Aqpkg"; +} + +QMetaObject *Aqpkg::metaObj = 0; + +void Aqpkg::initMetaObject() +{ + if ( metaObj ) + return; + if ( qstrcmp(QWidget::className(), "QWidget") != 0 ) + badSuperclassWarning("Aqpkg","QWidget"); + (void) staticMetaObject(); +} + +#ifndef QT_NO_TRANSLATION + +QString Aqpkg::tr(const char* s) +{ + return qApp->translate( "Aqpkg", s, 0 ); +} + +QString Aqpkg::tr(const char* s, const char * c) +{ + return qApp->translate( "Aqpkg", s, c ); +} + +#endif // QT_NO_TRANSLATION + +QMetaObject* Aqpkg::staticMetaObject() +{ + if ( metaObj ) + return metaObj; + (void) QWidget::staticMetaObject(); +#ifndef QT_NO_PROPERTIES +#endif // QT_NO_PROPERTIES + typedef void (Aqpkg::*m1_t0)(int); + typedef void (QObject::*om1_t0)(int); + typedef void (Aqpkg::*m1_t1)(); + typedef void (QObject::*om1_t1)(); + typedef void (Aqpkg::*m1_t2)(); + typedef void (QObject::*om1_t2)(); + m1_t0 v1_0 = &Aqpkg::serverSelected; + om1_t0 ov1_0 = (om1_t0)v1_0; + m1_t1 v1_1 = &Aqpkg::applyChanges; + om1_t1 ov1_1 = (om1_t1)v1_1; + m1_t2 v1_2 = &Aqpkg::updateServer; + om1_t2 ov1_2 = (om1_t2)v1_2; + QMetaData *slot_tbl = QMetaObject::new_metadata(3); + QMetaData::Access *slot_tbl_access = QMetaObject::new_metaaccess(3); + slot_tbl[0].name = "serverSelected(int)"; + slot_tbl[0].ptr = (QMember)ov1_0; + slot_tbl_access[0] = QMetaData::Public; + slot_tbl[1].name = "applyChanges()"; + slot_tbl[1].ptr = (QMember)ov1_1; + slot_tbl_access[1] = QMetaData::Public; + slot_tbl[2].name = "updateServer()"; + slot_tbl[2].ptr = (QMember)ov1_2; + slot_tbl_access[2] = QMetaData::Public; + metaObj = QMetaObject::new_metaobject( + "Aqpkg", "QWidget", + slot_tbl, 3, + 0, 0, +#ifndef QT_NO_PROPERTIES + 0, 0, + 0, 0, +#endif // QT_NO_PROPERTIES + 0, 0 ); + metaObj->set_slot_access( slot_tbl_access ); +#ifndef QT_NO_PROPERTIES +#endif // QT_NO_PROPERTIES + return metaObj; +} diff --git a/noncore/settings/aqpkg/moc_qinputdialog.cpp b/noncore/settings/aqpkg/moc_qinputdialog.cpp new file mode 100644 index 0000000..ab98a7e --- a/dev/null +++ b/noncore/settings/aqpkg/moc_qinputdialog.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** +** QInputDialog meta object code from reading C++ file 'qinputdialog.h' +** +** Created: Sun Sep 8 17:28:15 2002 +** by: The Qt MOC ($Id$) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#if !defined(Q_MOC_OUTPUT_REVISION) +#define Q_MOC_OUTPUT_REVISION 9 +#elif Q_MOC_OUTPUT_REVISION != 9 +#error "Moc format conflict - please regenerate all moc files" +#endif + +#include "qinputdialog.h" +#include +#include + + + +const char *QInputDialog::className() const +{ + return "QInputDialog"; +} + +QMetaObject *QInputDialog::metaObj = 0; + +void QInputDialog::initMetaObject() +{ + if ( metaObj ) + return; + if ( qstrcmp(QDialog::className(), "QDialog") != 0 ) + badSuperclassWarning("QInputDialog","QDialog"); + (void) staticMetaObject(); +} + +#ifndef QT_NO_TRANSLATION + +QString QInputDialog::tr(const char* s) +{ + return qApp->translate( "QInputDialog", s, 0 ); +} + +QString QInputDialog::tr(const char* s, const char * c) +{ + return qApp->translate( "QInputDialog", s, c ); +} + +#endif // QT_NO_TRANSLATION + +QMetaObject* QInputDialog::staticMetaObject() +{ + if ( metaObj ) + return metaObj; + (void) QDialog::staticMetaObject(); +#ifndef QT_NO_PROPERTIES +#endif // QT_NO_PROPERTIES + typedef void (QInputDialog::*m1_t0)(const QString&); + typedef void (QObject::*om1_t0)(const QString&); + typedef void (QInputDialog::*m1_t1)(); + typedef void (QObject::*om1_t1)(); + m1_t0 v1_0 = &QInputDialog::textChanged; + om1_t0 ov1_0 = (om1_t0)v1_0; + m1_t1 v1_1 = &QInputDialog::tryAccept; + om1_t1 ov1_1 = (om1_t1)v1_1; + QMetaData *slot_tbl = QMetaObject::new_metadata(2); + QMetaData::Access *slot_tbl_access = QMetaObject::new_metaaccess(2); + slot_tbl[0].name = "textChanged(const QString&)"; + slot_tbl[0].ptr = (QMember)ov1_0; + slot_tbl_access[0] = QMetaData::Private; + slot_tbl[1].name = "tryAccept()"; + slot_tbl[1].ptr = (QMember)ov1_1; + slot_tbl_access[1] = QMetaData::Private; + metaObj = QMetaObject::new_metaobject( + "QInputDialog", "QDialog", + slot_tbl, 2, + 0, 0, +#ifndef QT_NO_PROPERTIES + 0, 0, + 0, 0, +#endif // QT_NO_PROPERTIES + 0, 0 ); + metaObj->set_slot_access( slot_tbl_access ); +#ifndef QT_NO_PROPERTIES +#endif // QT_NO_PROPERTIES + return metaObj; +} diff --git a/noncore/settings/aqpkg/networkpkgmgr.cpp b/noncore/settings/aqpkg/networkpkgmgr.cpp new file mode 100644 index 0000000..91a318c --- a/dev/null +++ b/noncore/settings/aqpkg/networkpkgmgr.cpp @@ -0,0 +1,395 @@ +/*************************************************************************** + networkpkgmgr.cpp - description + ------------------- + begin : Mon Aug 26 13:32:30 BST 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +using namespace std; + +#include +#include + +#ifdef QWS +#include +#include +#include +#else +#include +#endif +#include +#include + +#include "datamgr.h" +#include "networkpkgmgr.h" +#include "installdlgimpl.h" +#include "ipkg.h" +#include "inputdlg.h" + +#include "global.h" + +NetworkPackageManager::NetworkPackageManager( DataManager *dataManager, QWidget *parent, const char *name) + : QWidget(parent, name) +{ + dataMgr = dataManager; + + initGui(); + setupConnections(); + + progressDlg = 0; + timerId = startTimer( 100 ); +} + +NetworkPackageManager::~NetworkPackageManager() +{ +} + +void NetworkPackageManager :: timerEvent ( QTimerEvent * ) +{ + killTimer( timerId ); + +// showProgressDialog(); + // Add server names to listbox + updateData(); + +// progressDlg->hide(); +} + +void NetworkPackageManager :: updateData() +{ + serversList->clear(); + packagesList->clear(); + + vector::iterator it; + int activeItem = -1; + int i; + for ( i = 0, it = dataMgr->getServerList().begin() ; it != dataMgr->getServerList().end() ; ++it, ++i ) + { + serversList->insertItem( it->getServerName() ); + if ( it->getServerName() == dataMgr->getActiveServer() ) + activeItem = i; + } + + // set selected server to be active server + if ( activeItem != -1 ) + serversList->setCurrentItem( activeItem ); + serverSelected( 0 ); +} + + +void NetworkPackageManager :: initGui() +{ + QLabel *l = new QLabel( "Servers", this ); + serversList = new QComboBox( this ); + packagesList = new QListView( this ); + update = new QPushButton( "Refresh List", this ); + download = new QPushButton( "Download", this ); + apply = new QPushButton( "Apply", this ); + + QVBoxLayout *vbox = new QVBoxLayout( this, 0, -1, "VBox" ); + QHBoxLayout *hbox1 = new QHBoxLayout( vbox, -1, "HBox1" ); + hbox1->addWidget( l ); + hbox1->addWidget( serversList ); + + vbox->addWidget( packagesList ); + packagesList->addColumn( "Packages" ); + + QHBoxLayout *hbox2 = new QHBoxLayout( vbox, -1, "HBox2" ); + hbox2->addWidget( update ); + hbox2->addWidget( download ); + hbox2->addWidget( apply ); +} + +void NetworkPackageManager :: setupConnections() +{ + connect( serversList, SIGNAL(activated( int )), this, SLOT(serverSelected( int ))); + connect( apply, SIGNAL(released()), this, SLOT(applyChanges()) ); + connect( download, SIGNAL(released()), this, SLOT(downloadPackage()) ); + connect( update, SIGNAL(released()), this, SLOT(updateServer()) ); +} + +void NetworkPackageManager :: showProgressDialog() +{ + if ( !progressDlg ) + progressDlg = new ProgressDlg( this, "Progress", false ); + progressDlg->setText( "Reading installed packages" ); + progressDlg->show(); +} + + +void NetworkPackageManager :: serverSelected( int ) +{ + packagesList->clear(); + + // display packages + QString serverName = serversList->currentText(); + Server *s = dataMgr->getServer( serverName ); + dataMgr->setActiveServer( serverName ); + + vector &list = s->getPackageList(); + vector::iterator it; + for ( it = list.begin() ; it != list.end() ; ++it ) + { + QString text = ""; + + // If the local server, only display installed packages + if ( serverName == LOCAL_SERVER && !it->isInstalled() ) + continue; + + text += it->getPackageName(); + if ( it->isInstalled() ) + { + text += " (installed)"; + + // If a different version of package is available, postfix it with an * + if ( it->getVersion() != it->getInstalledVersion() ) + text += "*"; + } + + QCheckListItem *item = new QCheckListItem( packagesList, text, QCheckListItem::CheckBox ); + if ( !it->isPackageStoredLocally() ) + new QCheckListItem( item, QString( "Description - " ) + it->getDescription() ); + else + new QCheckListItem( item, QString( "Filename - " ) + it->getFilename() ); + + new QCheckListItem( item, QString( "V. Available - " ) + it->getVersion() ); + if ( it->getLocalPackage() ) + { + if ( it->isInstalled() ) + new QCheckListItem( item, QString( "V. Installed - " ) + it->getInstalledVersion() ); + } + packagesList->insertItem( item ); + } + + // If the local server or the local ipkgs server disable the download button + download->setText( "Download" ); + if ( serverName == LOCAL_SERVER ) + download->setEnabled( false ); + else if ( serverName == LOCAL_IPKGS ) + { + download->setEnabled( true ); + download->setText( "Remove" ); + } + else + download->setEnabled( true ); +} + +void NetworkPackageManager :: updateServer() +{ + QString serverName = serversList->currentText(); + + // Update the current server + // Display dialog + ProgressDlg *dlg = new ProgressDlg( this ); + QString status = "Updating package list for "; + status += serverName; + dlg->show(); + dlg->setText( status ); + + // Disable buttons to stop silly people clicking lots on them :) + + // First, write out ipkg_conf file so that ipkg can use it + dataMgr->writeOutIpkgConf(); + + if ( serverName == LOCAL_SERVER ) + ; + else if ( serverName == LOCAL_IPKGS ) + ; + else + { + QString option = "update"; + QString dummy = ""; + Ipkg ipkg; + connect( &ipkg, SIGNAL(outputText(const QString &)), this, SLOT(displayText(const QString &))); + ipkg.setOption( option ); + + ipkg.runIpkg( ); + } + + // Reload data + dataMgr->reloadServerData( serversList->currentText() ); + serverSelected(-1); + delete dlg; +} + + +void NetworkPackageManager :: downloadPackage() +{ + if ( download->text() == "Download" ) + { + // First, write out ipkg_conf file so that ipkg can use it + dataMgr->writeOutIpkgConf(); + + // Display dialog to user asking where to download the files to + bool ok = FALSE; + QString dir = ""; +#ifdef QWS + // read download directory from config file + Config cfg( "aqpkg" ); + cfg.setGroup( "settings" ); + dir = cfg.readEntry( "downloadDir", "/home/root/Documents/application/ipkg" ); +#endif + + QString text = InputDialog::getText( tr( "Download to where" ), tr( "Enter path to download to" ), dir, &ok, this ); + if ( ok && !text.isEmpty() ) + dir = text; // user entered something and pressed ok + else + return; // user entered nothing or pressed cancel + +#ifdef QWS + // Store download directory in config file + cfg.writeEntry( "downloadDir", dir ); +#endif + + // Get starting directory + char initDir[PATH_MAX]; + getcwd( initDir, PATH_MAX ); + + // Download each package + Ipkg ipkg; + connect( &ipkg, SIGNAL(outputText(const QString &)), this, SLOT(displayText(const QString &))); + + QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); + ipkg.setOption( "download" ); + ipkg.setRuntimeDirectory( initDir ); + do + { + if ( item->isOn() ) + { + QString name = item->text(); + int pos = name.find( "*" ); + name.truncate( pos ); + + // if (there is a (installed), remove it + pos = name.find( "(installed)" ); + if ( pos > 0 ) + name.truncate( pos - 1 ); + + ipkg.setPackage( name ); + ipkg.runIpkg( ); + } + + item = (QCheckListItem *)item->nextSibling(); + } while ( item ); + } + else if ( download->text() == "Remove" ) + { + QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); + do + { + if ( item->isOn() ) + { + QString name = item->text(); + int pos = name.find( "*" ); + name.truncate( pos ); + + // if (there is a (installed), remove it + pos = name.find( "(installed)" ); + if ( pos > 0 ) + name.truncate( pos - 1 ); + + Package *p = dataMgr->getServer( serversList->currentText() )->getPackage( name ); + QFile f( p->getFilename() ); + f.remove(); + } + item = (QCheckListItem *)item->nextSibling(); + } while ( item ); + } + + dataMgr->reloadServerData( LOCAL_IPKGS ); + serverSelected( -1 ); +} + + +void NetworkPackageManager :: applyChanges() +{ + // Disable buttons to stop silly people clicking lots on them :) + + // First, write out ipkg_conf file so that ipkg can use it + dataMgr->writeOutIpkgConf(); + + // Now for each selected item + // deal with it + + vector workingPackages; + QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); + do + { + if ( item->isOn() ) + { + QString p = dealWithItem( item ); + workingPackages.push_back( p ); + } + + item = (QCheckListItem *)item->nextSibling(); + } while ( item ); + + // do the stuff + InstallDlgImpl dlg( workingPackages, dataMgr, this, "Install", true ); + dlg.showDlg(); + + // Reload data + dataMgr->reloadServerData( LOCAL_SERVER ); + dataMgr->reloadServerData( serversList->currentText() ); + serverSelected(-1); + +#ifdef QWS + // Finally let the main system update itself + QCopEnvelope e("QPE/System", "linkChanged(QString)"); + QString lf = QString::null; + e << lf; +#endif +} + +// decide what to do - either remove, upgrade or install +// Current rules: +// If not installed - install +// If installed and different version available - upgrade +// If installed and version up to date - remove +QString NetworkPackageManager :: dealWithItem( QCheckListItem *item ) +{ + QString name = item->text(); + int pos = name.find( "*" ); + name.truncate( pos ); + + // if (there is a (installed), remove it + pos = name.find( "(installed)" ); + if ( pos > 0 ) + name.truncate( pos - 1 ); + + // Get package + Server *s = dataMgr->getServer( serversList->currentText() ); + Package *p = s->getPackage( name ); + + // If the package has a filename then it is a local file + if ( p->isPackageStoredLocally() ) + name = p->getFilename(); + QString option; + QString dest = "root"; + if ( !p->isInstalled() ) + return QString( "I" ) + name; + else + { + if ( p->getVersion() == p->getInstalledVersion() ) + return QString( "D" ) + name; + else + return QString( "U" ) + name; + } +} + +void NetworkPackageManager :: displayText( const QString &t ) +{ + cout << t << endl; +} diff --git a/noncore/settings/aqpkg/networkpkgmgr.h b/noncore/settings/aqpkg/networkpkgmgr.h new file mode 100644 index 0000000..874b1bd --- a/dev/null +++ b/noncore/settings/aqpkg/networkpkgmgr.h @@ -0,0 +1,70 @@ +/*************************************************************************** + networkpkgmgr.h - description + ------------------- + begin : Mon Aug 26 13:32:30 BST 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef NETWORKPKGMGR_H +#define NETWORKPKGMGR_H + +#include +#include +#include +#include +#include + +#include "datamgr.h" +#include "progressdlg.h" + +/** NetworkPackageManager is the base class of the project */ +class NetworkPackageManager : public QWidget +{ + Q_OBJECT +public: + /** construtor */ + NetworkPackageManager( DataManager *dataManager, QWidget* parent=0, const char *name=0); + /** destructor */ + ~NetworkPackageManager(); + + void updateData(); + +private: + DataManager *dataMgr; + + QComboBox *serversList; + QListView *packagesList; + QPushButton *update; + QPushButton *download; + QPushButton *apply; + + ProgressDlg *progressDlg; + + int timerId; + + void timerEvent ( QTimerEvent * ); + + void initGui(); + void setupConnections(); + void showProgressDialog(); + QString dealWithItem( QCheckListItem *item ); + +public slots: + void serverSelected( int index ); + void applyChanges(); + void downloadPackage(); + void updateServer(); + void displayText( const QString &t ); +}; + +#endif diff --git a/noncore/settings/aqpkg/package.cpp b/noncore/settings/aqpkg/package.cpp new file mode 100644 index 0000000..48b6934 --- a/dev/null +++ b/noncore/settings/aqpkg/package.cpp @@ -0,0 +1,109 @@ +/*************************************************************************** + package.cpp - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "package.h" +#include "global.h" + +Package::Package( QString &name ) +{ + packageName = name; + localPackage = 0; + installed = false; + packageStoredLocally = false; + installedToRoot = false; +} + +Package::Package( char *name ) +{ + packageName = name; + localPackage = 0; +} + +Package::~Package() +{ +} + +QString Package :: toString() +{ + QString ret = "Package - " + getPackageName() + + "\n version - " + getVersion(); + + if ( localPackage ) + ret += "\n inst version - " + localPackage->getVersion(); + + + return ret; +} + +void Package :: setStatus( QString &s ) +{ + status = s; + + if ( status.find( "installed" ) != -1 ) + installed = true; +} + +void Package :: setLocalPackage( Package *p ) +{ + localPackage = p; + + if ( localPackage ) + if ( localPackage->getVersion() != getVersion() ) + differentVersionAvailable = true; + else + differentVersionAvailable = false; +} + +void Package :: setVersion( QString &v ) +{ + version = v; + + if ( localPackage ) + if ( localPackage->getVersion() != getVersion() ) + differentVersionAvailable = true; + else + differentVersionAvailable = false; +} + +void Package :: setPackageName( QString &name ) +{ + packageName = name; +} + +void Package :: setDescription( QString &d ) +{ + description = d; +} + +void Package :: setFilename( QString &f ) +{ + filename = f; +} + + +QString Package :: getInstalledVersion() +{ + if ( localPackage ) + return localPackage->getVersion(); + else + return getVersion(); +} + +bool Package :: isInstalled() +{ + return installed || ( localPackage && localPackage->isInstalled() ); +} diff --git a/noncore/settings/aqpkg/package.h b/noncore/settings/aqpkg/package.h new file mode 100644 index 0000000..d885ab6 --- a/dev/null +++ b/noncore/settings/aqpkg/package.h @@ -0,0 +1,75 @@ +/*************************************************************************** + package.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef PACKAGE_H +#define PACKAGE_H + +#include + +/** + *@author Andy Qua + */ + +#include + +class Package +{ +public: + Package( QString &name ); + Package( char *name ); + ~Package(); + + void setLocalPackage( Package *p ); + void setPackageName( QString &name ); + void setVersion( QString &v ); + void setStatus( QString &s ); + void setDescription( QString &d ); + void setFilename( QString &f ); + void setPackageStoredLocally( bool local ) { packageStoredLocally = local; } + void setInstalledToRoot( bool root ) { installedToRoot = root; } + + Package *getLocalPackage() { return localPackage; } + QString getPackageName() { return packageName; } + QString getVersion() { return version; } + QString getStatus() { return status; } + QString getDescription() { return description; } + QString getFilename() { return filename; } + + bool isInstalled(); + bool isPackageStoredLocally() { return packageStoredLocally; } + bool isInstalledToRoot() { return installedToRoot; } + QString getInstalledVersion(); + + QString toString(); + + +private: + Package *localPackage; + + QString packageName; + QString version; + QString status; + QString description; + QString filename; + QString installedTo; + bool packageStoredLocally; + bool installedToRoot; + bool installed; + bool differentVersionAvailable; +}; + +#endif diff --git a/noncore/settings/aqpkg/progressdlg.cpp b/noncore/settings/aqpkg/progressdlg.cpp new file mode 100644 index 0000000..3fa4367 --- a/dev/null +++ b/noncore/settings/aqpkg/progressdlg.cpp @@ -0,0 +1,65 @@ +/*************************************************************************** + progressdlg.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "progressdlg.h" + +#include +#include +#include +#include +#include + +#include "global.h" +/* + * Constructs a ProgressDlg which is a child of 'parent', with the + * name 'name' and widget flags set to 'f' + * + * The dialog will by default be modeless, unless you set 'modal' to + * TRUE to construct a modal dialog. + */ +ProgressDlg::ProgressDlg( QWidget* parent, const char* name, bool modal, WFlags fl ) + : QDialog( parent, name, modal, fl ) +{ + if ( !name ) + setName( "ProgressDlg" ); + resize( 240, 73 ); + setCaption( tr( "Progress" ) ); + + TextLabel2 = new QLabel( this, "TextLabel2" ); + TextLabel2->setGeometry( QRect( 10, 10, 240, 50 ) ); + TextLabel2->setFrameShape( QLabel::Box ); + TextLabel2->setText( tr( "Text" ) ); + TextLabel2->setAlignment( QLabel::WordBreak | QLabel::AlignHCenter | QLabel::AlignVCenter ); +} + +/* + * Destroys the object and frees any allocated resources + */ +ProgressDlg::~ProgressDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + +void ProgressDlg :: setText( QString &text ) +{ + TextLabel2->setText( text ); +} + +void ProgressDlg :: setText( const char *text ) +{ + TextLabel2->setText( text ); +} diff --git a/noncore/settings/aqpkg/progressdlg.h b/noncore/settings/aqpkg/progressdlg.h new file mode 100644 index 0000000..3e83455 --- a/dev/null +++ b/noncore/settings/aqpkg/progressdlg.h @@ -0,0 +1,37 @@ +/*************************************************************************** + progressdlg.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/#ifndef PROGRESSDLG_H +#define PROGRESSDLG_H + +#include + +class QLabel; + +class ProgressDlg : public QDialog +{ + Q_OBJECT + +public: + ProgressDlg( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~ProgressDlg(); + + QLabel* TextLabel2; + + void setText( QString &text ); + void setText( const char *text ); +}; + +#endif // PROGRESSDLG_H diff --git a/noncore/settings/aqpkg/server.cpp b/noncore/settings/aqpkg/server.cpp new file mode 100644 index 0000000..0069a60 --- a/dev/null +++ b/noncore/settings/aqpkg/server.cpp @@ -0,0 +1,266 @@ +/*************************************************************************** + server.cpp - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + description : This class holds details about a server + : e.g. all the packages that contained on the server + : the installation status + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#include +#include +#include + +#include +#include +using namespace std; + +#include "server.h" + +#ifdef QWS +#include +#include +#include +#endif + +#include "utils.h" + +#include "global.h" + +Server :: Server( const char *name, const char *url ) +{ + serverName = name; + serverUrl = url; + packageFile = IPKG_DIR; + packageFile += "lists/" + serverName; +} + +Server :: ~Server() +{ + cleanUp(); +} + +void Server :: cleanUp() +{ + packageList.clear(); +} + +void Server :: readStatusFile( vector &destList ) +{ + cleanUp(); + + vector::iterator dit; + bool rootRead = false; + for ( dit = destList.begin() ; dit != destList.end() ; ++dit ) + { + bool installingToRoot = false; + + QString path = dit->getDestinationPath(); + if ( path.right( 1 ) != "/" ) + path += "/"; + + if ( path == "/" ) + { + rootRead = true; + installingToRoot = true; + } + + packageFile = path + "usr/lib/ipkg/status"; + readPackageFile( 0, false, installingToRoot ); + } + + // Ensure that the root status file is read + if ( !rootRead ) + { + cout << "Reading status file " << "/usr/lib/ipkg/status" << endl; + packageFile = "/usr/lib/ipkg/status"; + readPackageFile( 0, false, true ); + } +} + +void Server :: readLocalIpks( Server *local ) +{ + cleanUp(); + +#ifdef QWS + // First, get any local IPKGs in the documents area + // Only applicable to Qtopie/Opie + + DocLnkSet files; + Global::findDocuments( &files, "application/ipkg" ); + + // Now add the items to the list + QListIterator it( files.children() ); + + for ( ; it.current() ; ++it ) + { + // OK, we have a local IPK file, I think the standard naming conventions + // for these are packagename_version_arm.ipk + QString file = (*it)->file(); + + QString packageName = Utils::getPackageNameFromIpkFilename( file ); + QString ver = Utils::getPackageVersionFromIpkFilename( file ); + packageList.push_back( Package( packageName ) ); + packageList.back().setVersion( ver ); + packageList.back().setFilename( file ); + packageList.back().setPackageStoredLocally( true ); + + } +#else + QString names[] = { "advancedfm_0.9.1-20020811_arm.ipk", "libopie_0.9.1-20020811_arm.ipk", "libopieobex_0.9.1-20020811.1_arm.ipk", "opie-addressbook_0.9.1-20020811_arm.ipk" }; + for ( int i = 0 ; i < 4 ; ++i ) + { + // OK, we have a local IPK file, I think the standard naming conventions + // for these are packagename_version_arm.ipk + QString file = names[i]; + int p = file.find( "_" ); + QString tmp = file.mid( 0, p ); + packageList.push_back( Package( tmp ) ); + int p2 = file.find( "_", p+1 ); + tmp = file.mid( p+1, p2-(p+1) ); + packageList.back().setVersion( tmp ); + packageList.back().setPackageStoredLocally( true ); + } +#endif + + // build local packages + buildLocalPackages( local ); +} + +void Server :: readPackageFile( Server *local, bool clearAll, bool installingToRoot ) +{ + ifstream in( packageFile ); + if ( !in.is_open() ) + return; + + char line[1001]; + char k[21]; + char v[1001]; + QString key; + QString value; + + if ( clearAll ) + cleanUp(); + Package *currPackage = 0; + + bool newPackage = true; + do + { + in.getline( line, 1000 ); + if ( in.eof() ) + continue; + + k[0] = '\0'; + v[0] = '\0'; + + sscanf( line, "%[^:]: %[^\n]", k, v ); + key = k; + value = v; + key.stripWhiteSpace(); + if ( key == "Package" && newPackage ) + { + newPackage = false; + + currPackage = getPackage( value ); + if ( !currPackage ) + { + packageList.push_back( Package( value ) ); + currPackage = &(packageList.back()); + + if ( installingToRoot ) + currPackage->setInstalledToRoot( true ); + } + } + else if ( key == "Version" ) + { + if ( currPackage ) + currPackage->setVersion( value ); + } + else if ( key == "Status" ) + { + if ( currPackage ) + currPackage->setStatus( value ); + } + else if ( key == "Description" ) + { + if ( currPackage ) + currPackage->setDescription( value ); + } + else if ( key == "Filename" ) + { + if ( currPackage ) + currPackage->setFilename( value ); + } + else if ( key == "" ) + { + newPackage = true; + } + } while ( !in.eof() ); + + in.close(); + + // build local packages + buildLocalPackages( local ); +} + +void Server :: buildLocalPackages( Server *local ) +{ + for ( unsigned int i = 0 ; i < packageList.size() ; ++i ) + { + QString name = packageList[i].getPackageName(); + if ( local ) + packageList[i].setLocalPackage( local->getPackage( name ) ); + else + packageList[i].setLocalPackage( 0 ); + } + +} + +Package *Server :: getPackage( QString &name ) +{ + return getPackage( (const char *)name ); +} + +Package *Server :: getPackage( const char *name ) +{ + Package *ret = 0; + + for ( unsigned int i = 0 ; i < packageList.size() && ret == 0; ++i ) + { + if ( packageList[i].getPackageName() == name ) + ret = &packageList[i]; + } + + return ret; +} + +QString Server :: toString() +{ + QString ret = "Server\n name - " + serverName + + "\n url - " + serverUrl + + "\n"; + + for ( unsigned int i = 0 ; i < packageList.size() ; ++i ) + ret += "\n " + packageList[i].toString(); + + + return ret; +} + +vector &Server::getPackageList() +{ + return packageList; +} + diff --git a/noncore/settings/aqpkg/server.h b/noncore/settings/aqpkg/server.h new file mode 100644 index 0000000..8f8d384 --- a/dev/null +++ b/noncore/settings/aqpkg/server.h @@ -0,0 +1,63 @@ +/*************************************************************************** + server.h - description + ------------------- + begin : Mon Aug 26 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +#ifndef SERVER_H +#define SERVER_H + +#include + +#include +using namespace std; + +#include "package.h" +#include "destination.h" + +class Server +{ +public: + Server() {} + Server( const char *name, const char *url ); + Server( const char *name, const char *url, const char *file ); + ~Server(); + + void cleanUp(); + + void readStatusFile( vector &v ); + void readLocalIpks( Server *local ); + void readPackageFile( Server *local = 0, bool clearAll = true, bool installedToRoot= false ); + void buildLocalPackages( Server *local ); + Package *getPackage( const char *name ); + Package *getPackage( QString &name ); + QString toString(); + vector &getPackageList(); + + void setServerName( const QString &name ) { serverName = name; } + void setServerUrl( const QString &url ) { serverUrl = url; } + QString &getServerName() { return serverName; } + QString &getServerUrl() { return serverUrl; } + +protected: + +private: + QString serverName; + QString serverUrl; + QString packageFile; + + + vector packageList; +}; + +#endif diff --git a/noncore/settings/aqpkg/settings.ui b/noncore/settings/aqpkg/settings.ui new file mode 100644 index 0000000..eb99cf7 --- a/dev/null +++ b/noncore/settings/aqpkg/settings.ui @@ -0,0 +1,531 @@ + +SettingsBase + + QDialog + + name + Settings + + + geometry + + 0 + 0 + 331 + 456 + + + + caption + Package Servers + + + layoutMargin + + + layoutSpacing + + + + margin + 11 + + + spacing + 6 + + + QTabWidget + + name + TabWidget + + + enabled + true + + + layoutMargin + + + layoutSpacing + + + QWidget + + name + tab + + + title + Servers + + + + margin + 11 + + + spacing + 6 + + + QLayoutWidget + + name + Layout2 + + + + margin + 0 + + + spacing + 6 + + + QLabel + + name + Servers + + + text + Servers + + + + + name + Spacer2 + + + orientation + Horizontal + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + + + QListBox + + name + servers + + + selectionMode + Extended + + + + QPushButton + + name + removeserver + + + enabled + true + + + text + Remove + + + autoDefault + false + + + + QPushButton + + name + newserver + + + enabled + true + + + text + New + + + autoDefault + false + + + + QLayoutWidget + + name + Layout10 + + + + margin + 0 + + + spacing + 6 + + + QLineEdit + + name + serverurl + + + + QLabel + + name + TextLabel2_3 + + + text + URL: + + + + QLineEdit + + name + servername + + + + QLabel + + name + TextLabel1_3 + + + text + Name: + + + + QPushButton + + name + btnChangeServer + + + text + Change + + + + + + + + QWidget + + name + tab + + + title + Destinations + + + + margin + 11 + + + spacing + 6 + + + QLayoutWidget + + name + Layout3 + + + + margin + 0 + + + spacing + 6 + + + QLabel + + name + Destinations + + + text + Destinations + + + + + name + Spacer2_2 + + + orientation + Horizontal + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + + + QLayoutWidget + + name + Layout5 + + + + margin + 0 + + + spacing + 6 + + + QPushButton + + name + newdestination + + + enabled + true + + + text + New + + + autoDefault + false + + + + QPushButton + + name + removedestination + + + enabled + true + + + text + Remove + + + autoDefault + false + + + + + + + name + Spacer3 + + + orientation + Horizontal + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + QListBox + + name + destinations + + + selectionMode + Single + + + + QLayoutWidget + + name + Layout8 + + + + margin + 0 + + + spacing + 6 + + + QLineEdit + + name + destinationname + + + + QLineEdit + + name + destinationurl + + + + QPushButton + + name + btnChangeDest + + + text + Change + + + + QLabel + + name + TextLabel1_3_2 + + + text + Name: + + + + QLabel + + name + TextLabel1_3_2_2 + + + text + URL: + + + + + + + + + + + + newserver + clicked() + Settings + newServer() + + + removeserver + clicked() + Settings + removeServer() + + + newdestination + clicked() + Settings + newDestination() + + + removedestination + clicked() + Settings + removeDestination() + + + servers + highlighted(int) + Settings + editServer(int) + + + destinations + highlighted(int) + Settings + editDestination(int) + + + btnChangeServer + clicked() + Settings + changeServerDetails() + + + btnChangeDest + clicked() + Settings + changeDestinationDetails() + + activeServerChanged() + changeServerDetails() + createLinksToDest() + destNameChanged(const QString&) + destUrlChanged(const QString&) + editDestination(int) + editServer(int) + installationSettingChange(int) + installationSettingSetName(const QString &) + linkEnabled(bool) + newDestination() + newInstallationSetting() + newServer() + changeDestinationDetails() + removeDestination() + removeInstallationSetting() + removeLinksToDest() + removeServer() + renameInstallationSetting() + serverNameChanged(const QString&) + serverUrlChanged(const QString&) + + diff --git a/noncore/settings/aqpkg/settingsimpl.cpp b/noncore/settings/aqpkg/settingsimpl.cpp new file mode 100644 index 0000000..81e89ed --- a/dev/null +++ b/noncore/settings/aqpkg/settingsimpl.cpp @@ -0,0 +1,195 @@ +/*************************************************************************** + settingsimpl.cpp - description + ------------------- + begin : Thu Aug 29 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +using namespace std; + +#include +#include +#include +#include + +#include "settingsimpl.h" + +#include "global.h" + +SettingsImpl :: SettingsImpl( DataManager *dataManager, QWidget * parent, const char* name, bool modal, WFlags fl ) + : SettingsBase( parent, name, modal, fl ) +{ + dataMgr = dataManager; + + setupData(); + changed = false; + newserver = false; + newdestination = false; +} + +SettingsImpl :: ~SettingsImpl() +{ + +} + +bool SettingsImpl :: showDlg( int i ) +{ + TabWidget->setCurrentPage( i ); + showMaximized(); + exec(); + + if ( changed ) + dataMgr->writeOutIpkgConf(); + + return changed; +} + +void SettingsImpl :: setupData() +{ + // add servers + vector::iterator it; + for ( it = dataMgr->getServerList().begin() ; it != dataMgr->getServerList().end() ; ++it ) + { + if ( it->getServerName() == LOCAL_SERVER || it->getServerName() == LOCAL_IPKGS ) + continue; + + servers->insertItem( it->getServerName() ); + } + + // add destinations + vector::iterator it2; + for ( it2 = dataMgr->getDestinationList().begin() ; it2 != dataMgr->getDestinationList().end() ; ++it2 ) + destinations->insertItem( it2->getDestinationName() ); + +} + +//------------------ Servers tab ---------------------- + +void SettingsImpl :: editServer( int sel ) +{ + currentSelectedServer = sel; + Server *s = dataMgr->getServer( servers->currentText() ); + serverName = s->getServerName(); + servername->setText( s->getServerName() ); + serverurl->setText( s->getServerUrl() ); +} + +void SettingsImpl :: newServer() +{ + newserver = true; + servername->setText( "" ); + serverurl->setText( "" ); + servername->setFocus(); +} + +void SettingsImpl :: removeServer() +{ + changed = true; + Server *s = dataMgr->getServer( servers->currentText() ); + dataMgr->getServerList().erase( s ); + servers->removeItem( currentSelectedServer ); +} + +void SettingsImpl :: changeServerDetails() +{ + changed = true; + + QString newName = servername->text(); + if ( !newserver ) + { + Server *s = dataMgr->getServer( serverName ); + + // Update url + s->setServerUrl( serverurl->text() ); + + // Check if server name has changed, if it has then we need to replace the key in the map + if ( serverName != newName ) + { + // Update server name + s->setServerName( newName ); + + // See if this server is the active server + if ( dataMgr->getActiveServer() == serverName ) + dataMgr->setActiveServer( newName ); + + // Update list box + servers->changeItem( newName, currentSelectedServer ); + } + } + else + { + dataMgr->getServerList().push_back( Server( newName, serverurl->text() ) ); + servers->insertItem( newName ); + servers->setCurrentItem( servers->count() ); + newserver = false; + } +} + +//------------------ Destinations tab ---------------------- + +void SettingsImpl :: editDestination( int sel ) +{ + currentSelectedDestination = sel; + Destination *s = dataMgr->getDestination( destinations->currentText() ); + destinationName = s->getDestinationName(); + destinationname->setText( s->getDestinationName() ); + destinationurl->setText( s->getDestinationPath() ); +} + +void SettingsImpl :: newDestination() +{ + newdestination = true; + destinationname->setText( "" ); + destinationurl->setText( "" ); + destinationname->setFocus(); +} + +void SettingsImpl :: removeDestination() +{ + changed = true; + Destination *d = dataMgr->getDestination( destinations->currentText() ); + dataMgr->getDestinationList().erase( d ); + destinations->removeItem( currentSelectedDestination ); +} + +void SettingsImpl :: changeDestinationDetails() +{ + changed = true; + + QString newName = destinationname->text(); + if ( !newdestination ) + { + Destination *d = dataMgr->getDestination( destinationName ); + + // Update url + d->setDestinationPath( destinationurl->text() ); + + // Check if server name has changed, if it has then we need to replace the key in the map + if ( destinationName != newName ) + { + // Update server name + d->setDestinationName( newName ); + + // Update list box + destinations->changeItem( newName, currentSelectedDestination ); + } + } + else + { + dataMgr->getDestinationList().push_back( Destination( newName, destinationurl->text() ) ); + destinations->insertItem( newName ); + destinations->setCurrentItem( destinations->count() ); + newdestination = false; + } +} diff --git a/noncore/settings/aqpkg/settingsimpl.h b/noncore/settings/aqpkg/settingsimpl.h new file mode 100644 index 0000000..bc231a1 --- a/dev/null +++ b/noncore/settings/aqpkg/settingsimpl.h @@ -0,0 +1,52 @@ +/*************************************************************************** + settingsimpl.h - description + ------------------- + begin : Thu Aug 29 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "settings.h" + +#include "datamgr.h" + +class SettingsImpl : public SettingsBase +{ +public: + SettingsImpl( DataManager *dataManager, QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); + ~SettingsImpl(); + + bool showDlg( int i ); + +private: + DataManager *dataMgr; + QString serverName; + QString destinationName; + int currentSelectedServer; + int currentSelectedDestination; + bool changed; + bool newserver; + bool newdestination; + + void setupConnections(); + void setupData(); + + void editServer( int s ); + void changeServerDetails(); + void newServer(); + void removeServer(); + + void editDestination( int s ); + void changeDestinationDetails(); + void newDestination(); + void removeDestination(); +}; diff --git a/noncore/settings/aqpkg/utils.cpp b/noncore/settings/aqpkg/utils.cpp new file mode 100644 index 0000000..77d82d4 --- a/dev/null +++ b/noncore/settings/aqpkg/utils.cpp @@ -0,0 +1,74 @@ +/*************************************************************************** + utils.cpp - description + ------------------- + begin : Sat Sep 7 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "utils.h" +#include "global.h" + +Utils :: Utils() +{ +} + +Utils :: ~Utils() +{ +} + + +QString Utils :: getPathfromIpkFilename( const QString &file ) +{ + int p = file.findRev( "/" ); + QString path = ""; + if ( p != -1 ) + path = file.left( p ); + + return path; + +} + +QString Utils :: getFilenameFromIpkFilename( const QString &file ) +{ + int p = file.findRev( "/" ); + QString name = file; + if ( p != -1 ) + name = name.mid( p + 1 ); + + + return name; +} + +QString Utils :: getPackageNameFromIpkFilename( const QString &file ) +{ + int p = file.findRev( "/" ); + QString name = file; + if ( p != -1 ) + name = name.mid( p + 1 ); + p = name.find( "_" ); + QString packageName = name.mid( 0, p ); + return packageName; +} + +QString Utils :: getPackageVersionFromIpkFilename( const QString &file ) +{ + int p = file.findRev( "/" ); + QString name = file; + if ( p != -1 ) + name = name.mid( p + 1 ); + p = name.find( "_" ) + 1; + int p2 = name.find( "_", p ); + QString version = name.mid( p, p2 - p ); + return version; +} + diff --git a/noncore/settings/aqpkg/utils.h b/noncore/settings/aqpkg/utils.h new file mode 100644 index 0000000..15ee4e6 --- a/dev/null +++ b/noncore/settings/aqpkg/utils.h @@ -0,0 +1,38 @@ +/*************************************************************************** + utils.h - description + ------------------- + begin : Sat Sep 7 2002 + copyright : (C) 2002 by Andy Qua + email : andy.qua@blueyonder.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef UTILS_H +#define UTILS_H + +#include + +/** + *@author Andy Qua + */ + +class Utils { +public: + Utils(); + ~Utils(); + + static QString getPathfromIpkFilename( const QString &file ); + static QString getFilenameFromIpkFilename( const QString &file ); + static QString getPackageNameFromIpkFilename( const QString &file ); + static QString getPackageVersionFromIpkFilename( const QString &file ); +}; + +#endif -- cgit v0.9.0.2