-rw-r--r-- | noncore/settings/packagemanager/oipkg.cpp | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/noncore/settings/packagemanager/oipkg.cpp b/noncore/settings/packagemanager/oipkg.cpp index 5c79ba9..b9c82df 100644 --- a/noncore/settings/packagemanager/oipkg.cpp +++ b/noncore/settings/packagemanager/oipkg.cpp @@ -107,48 +107,117 @@ OConfItemList *OIpkg::configItems() OConfItemList *OIpkg::servers() { // Retrieve only servers return filterConfItems( OConfItem::Source ); } OConfItemList *OIpkg::destinations() { // Retrieve only destinations return filterConfItems( OConfItem::Destination ); } OConfItemList *OIpkg::options() { // Retrieve only destinations return filterConfItems( OConfItem::Option ); } void OIpkg::setConfigItems( OConfItemList *configList ) { if ( m_confInfo ) delete m_confInfo; m_confInfo = configList; + + // Write out new /etc/ipkg.conf + QFile confFile( IPKG_CONF ); + if ( confFile.open( IO_WriteOnly ) ) + { + QTextStream confStream( &confFile ); + confStream << "# Generated by Opie Package Manager\n\n"; + + OConfItemListIterator it( *m_confInfo ); + for ( ; it.current(); ++it ) + { + OConfItem *item = it.current(); + + // Only write out valid conf items + if ( item->type() != OConfItem::NotDefined ) + { + QString confLine; + if ( !item->active() ) + confLine = "#"; + + switch ( item->type() ) + { + case OConfItem::Source : confLine.append( "src " ); break; + case OConfItem::Destination : confLine.append( "dest " ); break; + case OConfItem::Option : confLine.append( "option " ); break; + case OConfItem::Arch : confLine.append( "arch " ); break; + default : break; + }; + + confStream << confLine << " " << item->name() << " " << item->value() << "\n"; + } + } + + confFile.close(); + } + else + { + // Problem writing to /etc/ipkg.conf, exit before removing other conf files + return; + } + + // Delete /etc/ipkg/*.conf files (/etc/ipkg.conf should now have all settings + QStringList confFiles; + QDir confDir( IPKG_CONF_DIR ); + if ( confDir.exists() ) + { + confDir.setNameFilter( "*.conf" ); + confDir.setFilter( QDir::Files ); + confFiles = confDir.entryList( "*.conf", QDir::Files ); + + QStringList::Iterator lastFile = confFiles.end(); + for ( QStringList::Iterator it = confFiles.begin(); it != lastFile; ++it ) + { + // Create absolute file path if necessary + QString absFile = (*it); + if ( !absFile.startsWith( "/" ) ) + absFile.prepend( QString( IPKG_CONF_DIR ) + "/" ); + + // Delete file +printf( "Deleting: \'%s\'\n", absFile.latin1() ); + QFile::remove( absFile ); + } + } + + // Reinitialize libipkg to pick up new configuration + ipkg_deinit( &m_ipkgArgs ); + ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs ); + m_ipkgArgs.noaction = false; + m_ipkgArgs.force_defaults = true; } void OIpkg::saveSettings() { // Save Ipkg execution options to application configuration file if ( m_config ) { m_config->setGroup( "Ipkg" ); m_config->writeEntry( "ExecOptions", m_ipkgExecOptions ); m_config->writeEntry( "Verbosity", m_ipkgExecVerbosity ); } } OPackageList *OIpkg::availablePackages( const QString &server ) { // Load Ipkg configuration info if not already cached if ( !m_confInfo ) loadConfiguration(); // Build new server list (caller is responsible for deleting) OPackageList *pl = new OPackageList; // Open package list file QFile f( IPKG_PKG_PATH + "/" + server ); @@ -383,49 +452,50 @@ void OIpkg::ipkgStatus( char *status ) } void OIpkg::ipkgList( char *filelist ) { emit signalIpkgList( filelist ); } void OIpkg::loadConfiguration() { if ( m_confInfo ) delete m_confInfo; // Load configuration item list m_confInfo = new OConfItemList(); QStringList confFiles; QDir confDir( IPKG_CONF_DIR ); if ( confDir.exists() ) { confDir.setNameFilter( "*.conf" ); confDir.setFilter( QDir::Files ); confFiles = confDir.entryList( "*.conf", QDir::Files ); confFiles << IPKG_CONF; - for ( QStringList::Iterator it = confFiles.begin(); it != confFiles.end(); ++it ) + QStringList::Iterator lastFile = confFiles.end(); + for ( QStringList::Iterator it = confFiles.begin(); it != lastFile; ++it ) { // Create absolute file path if necessary QString absFile = (*it); if ( !absFile.startsWith( "/" ) ) absFile.prepend( QString( IPKG_CONF_DIR ) + "/" ); // Read in file QFile f( absFile ); if ( f.open( IO_ReadOnly ) ) { QTextStream s( &f ); while ( !s.eof() ) { QString line = s.readLine().simplifyWhiteSpace(); // Parse line and save info to the conf options list if ( !line.isEmpty() ) { if ( !line.startsWith( "#" ) || line.startsWith( "#src" ) || line.startsWith( "#dest" ) || line.startsWith( "#arch" ) || line.startsWith( "#option" ) ) |