summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/packagemanager/oipkg.cpp1
1 files changed, 0 insertions, 1 deletions
diff --git a/noncore/settings/packagemanager/oipkg.cpp b/noncore/settings/packagemanager/oipkg.cpp
index b9c82df..696a64a 100644
--- a/noncore/settings/packagemanager/oipkg.cpp
+++ b/noncore/settings/packagemanager/oipkg.cpp
@@ -1,574 +1,573 @@
1/* 1/*
2                This file is part of the Opie Project 2                This file is part of the Opie Project
3 3
4              Copyright (c) 2003 Dan Williams <drw@handhelds.org> 4              Copyright (c) 2003 Dan Williams <drw@handhelds.org>
5 =. 5 =.
6 .=l. 6 .=l.
7           .>+-= 7           .>+-=
8 _;:,     .>    :=|. This program is free software; you can 8 _;:,     .>    :=|. This program is free software; you can
9.> <`_,   >  .   <= redistribute it and/or modify it under 9.> <`_,   >  .   <= redistribute it and/or modify it under
10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
11.="- .-=="i,     .._ License as published by the Free Software 11.="- .-=="i,     .._ License as published by the Free Software
12 - .   .-<_>     .<> Foundation; either version 2 of the License, 12 - .   .-<_>     .<> Foundation; either version 2 of the License,
13     ._= =}       : or (at your option) any later version. 13     ._= =}       : or (at your option) any later version.
14    .%`+i>       _;_. 14    .%`+i>       _;_.
15    .i_,=:_.      -<s. This program is distributed in the hope that 15    .i_,=:_.      -<s. This program is distributed in the hope that
16     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 16     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
17    : ..    .:,     . . . without even the implied warranty of 17    : ..    .:,     . . . without even the implied warranty of
18    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 18    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
19  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 19  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
20..}^=.=       =       ; Library General Public License for more 20..}^=.=       =       ; Library General Public License for more
21++=   -.     .`     .: details. 21++=   -.     .`     .: details.
22 :     =  ...= . :.=- 22 :     =  ...= . :.=-
23 -.   .:....=;==+<; You should have received a copy of the GNU 23 -.   .:....=;==+<; You should have received a copy of the GNU
24  -_. . .   )=.  = Library General Public License along with 24  -_. . .   )=.  = Library General Public License along with
25    --        :-=` this library; see the file COPYING.LIB. 25    --        :-=` this library; see the file COPYING.LIB.
26 If not, write to the Free Software Foundation, 26 If not, write to the Free Software Foundation,
27 Inc., 59 Temple Place - Suite 330, 27 Inc., 59 Temple Place - Suite 330,
28 Boston, MA 02111-1307, USA. 28 Boston, MA 02111-1307, USA.
29 29
30*/ 30*/
31 31
32#include "oipkg.h" 32#include "oipkg.h"
33 33
34#include <stdlib.h> 34#include <stdlib.h>
35#include <string.h> 35#include <string.h>
36 36
37#include <qdir.h> 37#include <qdir.h>
38#include <qfile.h> 38#include <qfile.h>
39#include <qtextstream.h> 39#include <qtextstream.h>
40 40
41const QString IPKG_CONF = "/etc/ipkg.conf"; // Fully-qualified name of Ipkg primary configuration file 41const QString IPKG_CONF = "/etc/ipkg.conf"; // Fully-qualified name of Ipkg primary configuration file
42const QString IPKG_CONF_DIR = "/etc/ipkg"; // Directory of secondary Ipkg configuration files 42const QString IPKG_CONF_DIR = "/etc/ipkg"; // Directory of secondary Ipkg configuration files
43const QString IPKG_PKG_PATH = "/usr/lib/ipkg/lists"; // Directory containing server package lists 43const QString IPKG_PKG_PATH = "/usr/lib/ipkg/lists"; // Directory containing server package lists
44const QString IPKG_STATUS_PATH = "usr/lib/ipkg/status"; // Destination status file location 44const QString IPKG_STATUS_PATH = "usr/lib/ipkg/status"; // Destination status file location
45 45
46OIpkg *oipkg; 46OIpkg *oipkg;
47 47
48// Ipkg callback functions 48// Ipkg callback functions
49 49
50int fsignalIpkgMessage( ipkg_conf_t */*conf*/, message_level_t /*level*/, char *msg ) 50int fsignalIpkgMessage( ipkg_conf_t */*conf*/, message_level_t /*level*/, char *msg )
51{ 51{
52 oipkg->ipkgMessage( msg ); 52 oipkg->ipkgMessage( msg );
53 return 0; 53 return 0;
54} 54}
55 55
56char *fIpkgResponse( char */*question*/ ) 56char *fIpkgResponse( char */*question*/ )
57{ 57{
58 return 0x0; 58 return 0x0;
59} 59}
60 60
61int fIpkgStatus( char */*name*/, int /*status*/, char *desc, void */*userdata*/ ) 61int fIpkgStatus( char */*name*/, int /*status*/, char *desc, void */*userdata*/ )
62{ 62{
63 oipkg->ipkgStatus( desc ); 63 oipkg->ipkgStatus( desc );
64 return 0; 64 return 0;
65} 65}
66 66
67int fIpkgFiles( char */*name*/, char *desc, char */*version*/, pkg_state_status_t /*status*/, 67int fIpkgFiles( char */*name*/, char *desc, char */*version*/, pkg_state_status_t /*status*/,
68 void */*userdata*/ ) 68 void */*userdata*/ )
69{ 69{
70 oipkg->ipkgList( desc ); 70 oipkg->ipkgList( desc );
71 return 0; 71 return 0;
72} 72}
73 73
74OIpkg::OIpkg( Config *config, QObject *parent, const char *name ) 74OIpkg::OIpkg( Config *config, QObject *parent, const char *name )
75 : QObject( parent, name ) 75 : QObject( parent, name )
76 , m_config( config ) 76 , m_config( config )
77 , m_confInfo( NULL ) 77 , m_confInfo( NULL )
78 , m_ipkgExecOptions( 0 ) 78 , m_ipkgExecOptions( 0 )
79 , m_ipkgExecVerbosity( 1 ) 79 , m_ipkgExecVerbosity( 1 )
80{ 80{
81 oipkg = this; 81 oipkg = this;
82 82
83 // Initialize libipkg 83 // Initialize libipkg
84 ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs ); 84 ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs );
85 85
86 // Default ipkg run-time arguments 86 // Default ipkg run-time arguments
87 m_ipkgArgs.noaction = false; 87 m_ipkgArgs.noaction = false;
88 m_ipkgArgs.force_defaults = true; 88 m_ipkgArgs.force_defaults = true;
89} 89}
90 90
91OIpkg::~OIpkg() 91OIpkg::~OIpkg()
92{ 92{
93 // Upon destruction, ensure that items in config list are deleted with list 93 // Upon destruction, ensure that items in config list are deleted with list
94 if ( m_confInfo ) 94 if ( m_confInfo )
95 m_confInfo->setAutoDelete( true ); 95 m_confInfo->setAutoDelete( true );
96 96
97 // Free up libipkg resources 97 // Free up libipkg resources
98 ipkg_deinit( &m_ipkgArgs ); 98 ipkg_deinit( &m_ipkgArgs );
99} 99}
100 100
101OConfItemList *OIpkg::configItems() 101OConfItemList *OIpkg::configItems()
102{ 102{
103 // Retrieve all configuration items 103 // Retrieve all configuration items
104 return filterConfItems(); 104 return filterConfItems();
105} 105}
106 106
107OConfItemList *OIpkg::servers() 107OConfItemList *OIpkg::servers()
108{ 108{
109 // Retrieve only servers 109 // Retrieve only servers
110 return filterConfItems( OConfItem::Source ); 110 return filterConfItems( OConfItem::Source );
111} 111}
112 112
113OConfItemList *OIpkg::destinations() 113OConfItemList *OIpkg::destinations()
114{ 114{
115 // Retrieve only destinations 115 // Retrieve only destinations
116 return filterConfItems( OConfItem::Destination ); 116 return filterConfItems( OConfItem::Destination );
117} 117}
118 118
119OConfItemList *OIpkg::options() 119OConfItemList *OIpkg::options()
120{ 120{
121 // Retrieve only destinations 121 // Retrieve only destinations
122 return filterConfItems( OConfItem::Option ); 122 return filterConfItems( OConfItem::Option );
123} 123}
124 124
125void OIpkg::setConfigItems( OConfItemList *configList ) 125void OIpkg::setConfigItems( OConfItemList *configList )
126{ 126{
127 if ( m_confInfo ) 127 if ( m_confInfo )
128 delete m_confInfo; 128 delete m_confInfo;
129 129
130 m_confInfo = configList; 130 m_confInfo = configList;
131 131
132 // Write out new /etc/ipkg.conf 132 // Write out new /etc/ipkg.conf
133 QFile confFile( IPKG_CONF ); 133 QFile confFile( IPKG_CONF );
134 if ( confFile.open( IO_WriteOnly ) ) 134 if ( confFile.open( IO_WriteOnly ) )
135 { 135 {
136 QTextStream confStream( &confFile ); 136 QTextStream confStream( &confFile );
137 confStream << "# Generated by Opie Package Manager\n\n"; 137 confStream << "# Generated by Opie Package Manager\n\n";
138 138
139 OConfItemListIterator it( *m_confInfo ); 139 OConfItemListIterator it( *m_confInfo );
140 for ( ; it.current(); ++it ) 140 for ( ; it.current(); ++it )
141 { 141 {
142 OConfItem *item = it.current(); 142 OConfItem *item = it.current();
143 143
144 // Only write out valid conf items 144 // Only write out valid conf items
145 if ( item->type() != OConfItem::NotDefined ) 145 if ( item->type() != OConfItem::NotDefined )
146 { 146 {
147 QString confLine; 147 QString confLine;
148 if ( !item->active() ) 148 if ( !item->active() )
149 confLine = "#"; 149 confLine = "#";
150 150
151 switch ( item->type() ) 151 switch ( item->type() )
152 { 152 {
153 case OConfItem::Source : confLine.append( "src " ); break; 153 case OConfItem::Source : confLine.append( "src " ); break;
154 case OConfItem::Destination : confLine.append( "dest " ); break; 154 case OConfItem::Destination : confLine.append( "dest " ); break;
155 case OConfItem::Option : confLine.append( "option " ); break; 155 case OConfItem::Option : confLine.append( "option " ); break;
156 case OConfItem::Arch : confLine.append( "arch " ); break; 156 case OConfItem::Arch : confLine.append( "arch " ); break;
157 default : break; 157 default : break;
158 }; 158 };
159 159
160 confStream << confLine << " " << item->name() << " " << item->value() << "\n"; 160 confStream << confLine << " " << item->name() << " " << item->value() << "\n";
161 } 161 }
162 } 162 }
163 163
164 confFile.close(); 164 confFile.close();
165 } 165 }
166 else 166 else
167 { 167 {
168 // Problem writing to /etc/ipkg.conf, exit before removing other conf files 168 // Problem writing to /etc/ipkg.conf, exit before removing other conf files
169 return; 169 return;
170 } 170 }
171 171
172 // Delete /etc/ipkg/*.conf files (/etc/ipkg.conf should now have all settings 172 // Delete /etc/ipkg/*.conf files (/etc/ipkg.conf should now have all settings
173 QStringList confFiles; 173 QStringList confFiles;
174 QDir confDir( IPKG_CONF_DIR ); 174 QDir confDir( IPKG_CONF_DIR );
175 if ( confDir.exists() ) 175 if ( confDir.exists() )
176 { 176 {
177 confDir.setNameFilter( "*.conf" ); 177 confDir.setNameFilter( "*.conf" );
178 confDir.setFilter( QDir::Files ); 178 confDir.setFilter( QDir::Files );
179 confFiles = confDir.entryList( "*.conf", QDir::Files ); 179 confFiles = confDir.entryList( "*.conf", QDir::Files );
180 180
181 QStringList::Iterator lastFile = confFiles.end(); 181 QStringList::Iterator lastFile = confFiles.end();
182 for ( QStringList::Iterator it = confFiles.begin(); it != lastFile; ++it ) 182 for ( QStringList::Iterator it = confFiles.begin(); it != lastFile; ++it )
183 { 183 {
184 // Create absolute file path if necessary 184 // Create absolute file path if necessary
185 QString absFile = (*it); 185 QString absFile = (*it);
186 if ( !absFile.startsWith( "/" ) ) 186 if ( !absFile.startsWith( "/" ) )
187 absFile.prepend( QString( IPKG_CONF_DIR ) + "/" ); 187 absFile.prepend( QString( IPKG_CONF_DIR ) + "/" );
188 188
189 // Delete file 189 // Delete file
190printf( "Deleting: \'%s\'\n", absFile.latin1() );
191 QFile::remove( absFile ); 190 QFile::remove( absFile );
192 } 191 }
193 } 192 }
194 193
195 // Reinitialize libipkg to pick up new configuration 194 // Reinitialize libipkg to pick up new configuration
196 ipkg_deinit( &m_ipkgArgs ); 195 ipkg_deinit( &m_ipkgArgs );
197 ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs ); 196 ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs );
198 m_ipkgArgs.noaction = false; 197 m_ipkgArgs.noaction = false;
199 m_ipkgArgs.force_defaults = true; 198 m_ipkgArgs.force_defaults = true;
200} 199}
201 200
202void OIpkg::saveSettings() 201void OIpkg::saveSettings()
203{ 202{
204 // Save Ipkg execution options to application configuration file 203 // Save Ipkg execution options to application configuration file
205 if ( m_config ) 204 if ( m_config )
206 { 205 {
207 m_config->setGroup( "Ipkg" ); 206 m_config->setGroup( "Ipkg" );
208 m_config->writeEntry( "ExecOptions", m_ipkgExecOptions ); 207 m_config->writeEntry( "ExecOptions", m_ipkgExecOptions );
209 m_config->writeEntry( "Verbosity", m_ipkgExecVerbosity ); 208 m_config->writeEntry( "Verbosity", m_ipkgExecVerbosity );
210 } 209 }
211} 210}
212 211
213OPackageList *OIpkg::availablePackages( const QString &server ) 212OPackageList *OIpkg::availablePackages( const QString &server )
214{ 213{
215 // Load Ipkg configuration info if not already cached 214 // Load Ipkg configuration info if not already cached
216 if ( !m_confInfo ) 215 if ( !m_confInfo )
217 loadConfiguration(); 216 loadConfiguration();
218 217
219 // Build new server list (caller is responsible for deleting) 218 // Build new server list (caller is responsible for deleting)
220 OPackageList *pl = new OPackageList; 219 OPackageList *pl = new OPackageList;
221 220
222 // Open package list file 221 // Open package list file
223 QFile f( IPKG_PKG_PATH + "/" + server ); 222 QFile f( IPKG_PKG_PATH + "/" + server );
224 if ( !f.open( IO_ReadOnly ) ) 223 if ( !f.open( IO_ReadOnly ) )
225 return NULL; 224 return NULL;
226 QTextStream t( &f ); 225 QTextStream t( &f );
227 226
228 // Process all information in package list file 227 // Process all information in package list file
229 OPackage *package = NULL; 228 OPackage *package = NULL;
230 QString line = t.readLine(); 229 QString line = t.readLine();
231 while ( !t.eof() ) 230 while ( !t.eof() )
232 { 231 {
233 // Determine key/value pair 232 // Determine key/value pair
234 int pos = line.find( ':', 0 ); 233 int pos = line.find( ':', 0 );
235 QString key; 234 QString key;
236 if ( pos > -1 ) 235 if ( pos > -1 )
237 key = line.mid( 0, pos ); 236 key = line.mid( 0, pos );
238 else 237 else
239 key = QString::null; 238 key = QString::null;
240 QString value = line.mid( pos+2, line.length()-pos ); 239 QString value = line.mid( pos+2, line.length()-pos );
241 240
242 // Allocate new package and insert into list 241 // Allocate new package and insert into list
243 if ( package == NULL && !key.isEmpty() ) 242 if ( package == NULL && !key.isEmpty() )
244 { 243 {
245 package = new OPackage( value ); 244 package = new OPackage( value );
246 package->setSource( server ); 245 package->setSource( server );
247 pl->append( package ); 246 pl->append( package );
248 } 247 }
249 248
250 // Update package data 249 // Update package data
251 if ( key == "Package" ) 250 if ( key == "Package" )
252 package->setName( value ); 251 package->setName( value );
253 else if ( key == "Version" ) 252 else if ( key == "Version" )
254 package->setVersion( value ); 253 package->setVersion( value );
255 else if ( key == "Section" ) 254 else if ( key == "Section" )
256 package->setCategory( value ); 255 package->setCategory( value );
257 //DataManager::setAvailableCategories( value ); 256 //DataManager::setAvailableCategories( value );
258 else if ( key.isEmpty() && value.isEmpty() ) 257 else if ( key.isEmpty() && value.isEmpty() )
259 package = NULL; 258 package = NULL;
260 259
261 // Skip past all description lines 260 // Skip past all description lines
262 if ( key == "Description" ) 261 if ( key == "Description" )
263 { 262 {
264 line = t.readLine(); 263 line = t.readLine();
265 while ( !line.isEmpty() && line.find( ':', 0 ) == -1 && !t.eof() ) 264 while ( !line.isEmpty() && line.find( ':', 0 ) == -1 && !t.eof() )
266 line = t.readLine(); 265 line = t.readLine();
267 } 266 }
268 else 267 else
269 line = t.readLine(); 268 line = t.readLine();
270 } 269 }
271 270
272 f.close(); 271 f.close();
273 272
274 return pl; 273 return pl;
275} 274}
276 275
277OPackageList *OIpkg::installedPackages( const QString &destName, const QString &destPath ) 276OPackageList *OIpkg::installedPackages( const QString &destName, const QString &destPath )
278{ 277{
279 // Load Ipkg configuration info if not already cached 278 // Load Ipkg configuration info if not already cached
280 if ( !m_confInfo ) 279 if ( !m_confInfo )
281 loadConfiguration(); 280 loadConfiguration();
282 281
283 // Build new server list (caller is responsible for deleting) 282 // Build new server list (caller is responsible for deleting)
284 OPackageList *pl = new OPackageList; 283 OPackageList *pl = new OPackageList;
285 284
286 // Open status file 285 // Open status file
287 QString path = destPath; 286 QString path = destPath;
288 if ( path.right( 1 ) != "/" ) 287 if ( path.right( 1 ) != "/" )
289 path.append( "/" ); 288 path.append( "/" );
290 path.append( IPKG_STATUS_PATH ); 289 path.append( IPKG_STATUS_PATH );
291 290
292 QFile f( path ); 291 QFile f( path );
293 if ( !f.open( IO_ReadOnly ) ) 292 if ( !f.open( IO_ReadOnly ) )
294 return NULL; 293 return NULL;
295 QTextStream t( &f ); 294 QTextStream t( &f );
296 295
297 // Process all information in status file 296 // Process all information in status file
298 bool newPackage = false; 297 bool newPackage = false;
299 QString line = t.readLine(); 298 QString line = t.readLine();
300 QString name; 299 QString name;
301 QString version; 300 QString version;
302 QString status; 301 QString status;
303 302
304 while ( !t.eof() ) 303 while ( !t.eof() )
305 { 304 {
306 // Determine key/value pair 305 // Determine key/value pair
307 int pos = line.find( ':', 0 ); 306 int pos = line.find( ':', 0 );
308 QString key; 307 QString key;
309 if ( pos > -1 ) 308 if ( pos > -1 )
310 key = line.mid( 0, pos ); 309 key = line.mid( 0, pos );
311 else 310 else
312 key = QString::null; 311 key = QString::null;
313 QString value = line.mid( pos+2, line.length()-pos ); 312 QString value = line.mid( pos+2, line.length()-pos );
314 313
315 // Allocate new package and insert into list 314 // Allocate new package and insert into list
316 if ( newPackage && !key.isEmpty() ) 315 if ( newPackage && !key.isEmpty() )
317 { 316 {
318 // Add to list only if it has a valid name and is installed 317 // Add to list only if it has a valid name and is installed
319 if ( !name.isNull() && status.contains( " installed" ) ) 318 if ( !name.isNull() && status.contains( " installed" ) )
320 { 319 {
321 pl->append( new OPackage( name, QString::null, version, QString::null, destName ) ); 320 pl->append( new OPackage( name, QString::null, version, QString::null, destName ) );
322 name = QString::null; 321 name = QString::null;
323 version = QString::null; 322 version = QString::null;
324 status = QString::null; 323 status = QString::null;
325 324
326 newPackage = false; 325 newPackage = false;
327 } 326 }
328 } 327 }
329 328
330 // Update package data 329 // Update package data
331 if ( key == "Package" ) 330 if ( key == "Package" )
332 name = value; 331 name = value;
333 else if ( key == "Version" ) 332 else if ( key == "Version" )
334 version = value; 333 version = value;
335 else if ( key == "Status" ) 334 else if ( key == "Status" )
336 status = value; 335 status = value;
337 else if ( key.isEmpty() && value.isEmpty() ) 336 else if ( key.isEmpty() && value.isEmpty() )
338 newPackage = true; 337 newPackage = true;
339 338
340 // Skip past all description lines 339 // Skip past all description lines
341 if ( key == "Description" ) 340 if ( key == "Description" )
342 { 341 {
343 line = t.readLine(); 342 line = t.readLine();
344 while ( !line.isEmpty() && line.find( ':', 0 ) == -1 && !t.eof() ) 343 while ( !line.isEmpty() && line.find( ':', 0 ) == -1 && !t.eof() )
345 line = t.readLine(); 344 line = t.readLine();
346 } 345 }
347 else 346 else
348 line = t.readLine(); 347 line = t.readLine();
349 } 348 }
350 349
351 f.close(); 350 f.close();
352 351
353 return pl; 352 return pl;
354} 353}
355 354
356bool OIpkg::executeCommand( OPackage::Command command, QStringList *parameters, const QString &destination, 355bool OIpkg::executeCommand( OPackage::Command command, QStringList *parameters, const QString &destination,
357 const QObject *receiver, const char *slotOutput, bool rawOutput ) 356 const QObject *receiver, const char *slotOutput, bool rawOutput )
358{ 357{
359 if ( command == OPackage::NotDefined ) 358 if ( command == OPackage::NotDefined )
360 return false; 359 return false;
361 360
362 // Set ipkg run-time options/arguments 361 // Set ipkg run-time options/arguments
363 m_ipkgArgs.force_depends = ( m_ipkgExecOptions & FORCE_DEPENDS ); 362 m_ipkgArgs.force_depends = ( m_ipkgExecOptions & FORCE_DEPENDS );
364 m_ipkgArgs.force_reinstall = ( m_ipkgExecOptions & FORCE_REINSTALL ); 363 m_ipkgArgs.force_reinstall = ( m_ipkgExecOptions & FORCE_REINSTALL );
365 // TODO m_ipkgArgs.force_remove = ( m_ipkgExecOptions & FORCE_REMOVE ); 364 // TODO m_ipkgArgs.force_remove = ( m_ipkgExecOptions & FORCE_REMOVE );
366 m_ipkgArgs.force_overwrite = ( m_ipkgExecOptions & FORCE_OVERWRITE ); 365 m_ipkgArgs.force_overwrite = ( m_ipkgExecOptions & FORCE_OVERWRITE );
367 m_ipkgArgs.verbosity = m_ipkgExecVerbosity; 366 m_ipkgArgs.verbosity = m_ipkgExecVerbosity;
368 if ( m_ipkgArgs.dest ) 367 if ( m_ipkgArgs.dest )
369 free( m_ipkgArgs.dest ); 368 free( m_ipkgArgs.dest );
370 if ( !destination.isNull() ) 369 if ( !destination.isNull() )
371 { 370 {
372 int len = destination.length() + 1; 371 int len = destination.length() + 1;
373 m_ipkgArgs.dest = (char *)malloc( len ); 372 m_ipkgArgs.dest = (char *)malloc( len );
374 strncpy( m_ipkgArgs.dest, destination, destination.length() ); 373 strncpy( m_ipkgArgs.dest, destination, destination.length() );
375 m_ipkgArgs.dest[ len - 1 ] = '\0'; 374 m_ipkgArgs.dest[ len - 1 ] = '\0';
376 } 375 }
377 else 376 else
378 m_ipkgArgs.dest = 0x0; 377 m_ipkgArgs.dest = 0x0;
379 378
380 // Connect output signal to widget 379 // Connect output signal to widget
381 380
382 if ( rawOutput ) 381 if ( rawOutput )
383 { 382 {
384// if ( slotOutput ) 383// if ( slotOutput )
385// connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 384// connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput );
386 } 385 }
387 else 386 else
388 { 387 {
389 // TODO - connect to local slot and parse output before emitting signalIpkgMessage 388 // TODO - connect to local slot and parse output before emitting signalIpkgMessage
390 } 389 }
391 390
392 switch( command ) 391 switch( command )
393 { 392 {
394 case OPackage::Update : { 393 case OPackage::Update : {
395 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 394 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput );
396 ipkg_lists_update( &m_ipkgArgs ); 395 ipkg_lists_update( &m_ipkgArgs );
397 }; 396 };
398 break; 397 break;
399 case OPackage::Upgrade : { 398 case OPackage::Upgrade : {
400 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 399 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput );
401 ipkg_packages_upgrade( &m_ipkgArgs ); 400 ipkg_packages_upgrade( &m_ipkgArgs );
402 }; 401 };
403 break; 402 break;
404 case OPackage::Install : { 403 case OPackage::Install : {
405 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 404 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput );
406 for ( QStringList::Iterator it = parameters->begin(); it != parameters->end(); ++it ) 405 for ( QStringList::Iterator it = parameters->begin(); it != parameters->end(); ++it )
407 { 406 {
408 ipkg_packages_install( &m_ipkgArgs, (*it) ); 407 ipkg_packages_install( &m_ipkgArgs, (*it) );
409 } 408 }
410 }; 409 };
411 break; 410 break;
412 case OPackage::Remove : { 411 case OPackage::Remove : {
413 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 412 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput );
414 for ( QStringList::Iterator it = parameters->begin(); it != parameters->end(); ++it ) 413 for ( QStringList::Iterator it = parameters->begin(); it != parameters->end(); ++it )
415 { 414 {
416 ipkg_packages_remove( &m_ipkgArgs, (*it), true ); 415 ipkg_packages_remove( &m_ipkgArgs, (*it), true );
417 } 416 }
418 }; 417 };
419 break; 418 break;
420 case OPackage::Download : { 419 case OPackage::Download : {
421 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 420 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput );
422 for ( QStringList::Iterator it = parameters->begin(); it != parameters->end(); ++it ) 421 for ( QStringList::Iterator it = parameters->begin(); it != parameters->end(); ++it )
423 { 422 {
424 ipkg_packages_download( &m_ipkgArgs, (*it) ); 423 ipkg_packages_download( &m_ipkgArgs, (*it) );
425 } 424 }
426 }; 425 };
427 break; 426 break;
428 case OPackage::Info : { 427 case OPackage::Info : {
429 connect( this, SIGNAL(signalIpkgStatus(char*)), receiver, slotOutput ); 428 connect( this, SIGNAL(signalIpkgStatus(char*)), receiver, slotOutput );
430 ipkg_packages_info( &m_ipkgArgs, (*parameters->begin()), &fIpkgStatus, 0x0 ); 429 ipkg_packages_info( &m_ipkgArgs, (*parameters->begin()), &fIpkgStatus, 0x0 );
431 }; 430 };
432 break; 431 break;
433 case OPackage::Files : { 432 case OPackage::Files : {
434 connect( this, SIGNAL(signalIpkgList(char*)), receiver, slotOutput ); 433 connect( this, SIGNAL(signalIpkgList(char*)), receiver, slotOutput );
435 ipkg_package_files( &m_ipkgArgs, (*parameters->begin()), &fIpkgFiles, 0x0 ); 434 ipkg_package_files( &m_ipkgArgs, (*parameters->begin()), &fIpkgFiles, 0x0 );
436 }; 435 };
437 break; 436 break;
438 default : break; 437 default : break;
439 }; 438 };
440 439
441 return true; 440 return true;
442} 441}
443 442
444void OIpkg::ipkgMessage( char *msg ) 443void OIpkg::ipkgMessage( char *msg )
445{ 444{
446 emit signalIpkgMessage( msg ); 445 emit signalIpkgMessage( msg );
447} 446}
448 447
449void OIpkg::ipkgStatus( char *status ) 448void OIpkg::ipkgStatus( char *status )
450{ 449{
451 emit signalIpkgStatus( status ); 450 emit signalIpkgStatus( status );
452} 451}
453 452
454void OIpkg::ipkgList( char *filelist ) 453void OIpkg::ipkgList( char *filelist )
455{ 454{
456 emit signalIpkgList( filelist ); 455 emit signalIpkgList( filelist );
457} 456}
458 457
459void OIpkg::loadConfiguration() 458void OIpkg::loadConfiguration()
460{ 459{
461 if ( m_confInfo ) 460 if ( m_confInfo )
462 delete m_confInfo; 461 delete m_confInfo;
463 462
464 // Load configuration item list 463 // Load configuration item list
465 m_confInfo = new OConfItemList(); 464 m_confInfo = new OConfItemList();
466 465
467 QStringList confFiles; 466 QStringList confFiles;
468 QDir confDir( IPKG_CONF_DIR ); 467 QDir confDir( IPKG_CONF_DIR );
469 if ( confDir.exists() ) 468 if ( confDir.exists() )
470 { 469 {
471 confDir.setNameFilter( "*.conf" ); 470 confDir.setNameFilter( "*.conf" );
472 confDir.setFilter( QDir::Files ); 471 confDir.setFilter( QDir::Files );
473 confFiles = confDir.entryList( "*.conf", QDir::Files ); 472 confFiles = confDir.entryList( "*.conf", QDir::Files );
474 confFiles << IPKG_CONF; 473 confFiles << IPKG_CONF;
475 474
476 QStringList::Iterator lastFile = confFiles.end(); 475 QStringList::Iterator lastFile = confFiles.end();
477 for ( QStringList::Iterator it = confFiles.begin(); it != lastFile; ++it ) 476 for ( QStringList::Iterator it = confFiles.begin(); it != lastFile; ++it )
478 { 477 {
479 // Create absolute file path if necessary 478 // Create absolute file path if necessary
480 QString absFile = (*it); 479 QString absFile = (*it);
481 if ( !absFile.startsWith( "/" ) ) 480 if ( !absFile.startsWith( "/" ) )
482 absFile.prepend( QString( IPKG_CONF_DIR ) + "/" ); 481 absFile.prepend( QString( IPKG_CONF_DIR ) + "/" );
483 482
484 // Read in file 483 // Read in file
485 QFile f( absFile ); 484 QFile f( absFile );
486 if ( f.open( IO_ReadOnly ) ) 485 if ( f.open( IO_ReadOnly ) )
487 { 486 {
488 QTextStream s( &f ); 487 QTextStream s( &f );
489 while ( !s.eof() ) 488 while ( !s.eof() )
490 { 489 {
491 490
492 QString line = s.readLine().simplifyWhiteSpace(); 491 QString line = s.readLine().simplifyWhiteSpace();
493 492
494 // Parse line and save info to the conf options list 493 // Parse line and save info to the conf options list
495 if ( !line.isEmpty() ) 494 if ( !line.isEmpty() )
496 { 495 {
497 if ( !line.startsWith( "#" ) || 496 if ( !line.startsWith( "#" ) ||
498 line.startsWith( "#src" ) || 497 line.startsWith( "#src" ) ||
499 line.startsWith( "#dest" ) || 498 line.startsWith( "#dest" ) ||
500 line.startsWith( "#arch" ) || 499 line.startsWith( "#arch" ) ||
501 line.startsWith( "#option" ) ) 500 line.startsWith( "#option" ) )
502 { 501 {
503 int pos = line.find( ' ', 1 ); 502 int pos = line.find( ' ', 1 );
504 503
505 // Type 504 // Type
506 QString typeStr = line.left( pos ); 505 QString typeStr = line.left( pos );
507 OConfItem::Type type; 506 OConfItem::Type type;
508 if ( typeStr == "src" || typeStr == "#src" ) 507 if ( typeStr == "src" || typeStr == "#src" )
509 type = OConfItem::Source; 508 type = OConfItem::Source;
510 else if ( typeStr == "dest" || typeStr == "#dest" ) 509 else if ( typeStr == "dest" || typeStr == "#dest" )
511 type = OConfItem::Destination; 510 type = OConfItem::Destination;
512 else if ( typeStr == "option" || typeStr == "#option" ) 511 else if ( typeStr == "option" || typeStr == "#option" )
513 type = OConfItem::Option; 512 type = OConfItem::Option;
514 else if ( typeStr == "arch" || typeStr == "#arch" ) 513 else if ( typeStr == "arch" || typeStr == "#arch" )
515 type = OConfItem::Arch; 514 type = OConfItem::Arch;
516 else 515 else
517 type = OConfItem::NotDefined; 516 type = OConfItem::NotDefined;
518 ++pos; 517 ++pos;
519 int endpos = line.find( ' ', pos ); 518 int endpos = line.find( ' ', pos );
520 519
521 // Name 520 // Name
522 QString name = line.mid( pos, endpos - pos ); 521 QString name = line.mid( pos, endpos - pos );
523 522
524 // Value 523 // Value
525 QString value = ""; 524 QString value = "";
526 if ( endpos > -1 ) 525 if ( endpos > -1 )
527 value = line.right( line.length() - endpos - 1 ); 526 value = line.right( line.length() - endpos - 1 );
528 527
529 // Active 528 // Active
530 bool active = !line.startsWith( "#" ); 529 bool active = !line.startsWith( "#" );
531 530
532 // Add to list 531 // Add to list
533 m_confInfo->append( new OConfItem( absFile, type, name, value, active ) ); 532 m_confInfo->append( new OConfItem( absFile, type, name, value, active ) );
534 } 533 }
535 } 534 }
536 } 535 }
537 536
538 f.close(); 537 f.close();
539 } 538 }
540 } 539 }
541 } 540 }
542 541
543 // Load Ipkg execution options from application configuration file 542 // Load Ipkg execution options from application configuration file
544 if ( m_config ) 543 if ( m_config )
545 { 544 {
546 m_config->setGroup( "Ipkg" ); 545 m_config->setGroup( "Ipkg" );
547 m_ipkgExecOptions = m_config->readNumEntry( "ExecOptions", m_ipkgExecOptions ); 546 m_ipkgExecOptions = m_config->readNumEntry( "ExecOptions", m_ipkgExecOptions );
548 m_ipkgExecVerbosity = m_config->readNumEntry( "Verbosity", m_ipkgExecVerbosity ); 547 m_ipkgExecVerbosity = m_config->readNumEntry( "Verbosity", m_ipkgExecVerbosity );
549 } 548 }
550} 549}
551 550
552OConfItemList *OIpkg::filterConfItems( OConfItem::Type typefilter ) 551OConfItemList *OIpkg::filterConfItems( OConfItem::Type typefilter )
553{ 552{
554 // Load Ipkg configuration info if not already cached 553 // Load Ipkg configuration info if not already cached
555 if ( !m_confInfo ) 554 if ( !m_confInfo )
556 loadConfiguration(); 555 loadConfiguration();
557 556
558 // Build new server list (caller is responsible for deleting) 557 // Build new server list (caller is responsible for deleting)
559 OConfItemList *sl = new OConfItemList; 558 OConfItemList *sl = new OConfItemList;
560 559
561 // If typefilter is empty, retrieve all items 560 // If typefilter is empty, retrieve all items
562 bool retrieveAll = ( typefilter == OConfItem::NotDefined ); 561 bool retrieveAll = ( typefilter == OConfItem::NotDefined );
563 562
564 // Parse configuration info for servers 563 // Parse configuration info for servers
565 OConfItemListIterator it( *m_confInfo ); 564 OConfItemListIterator it( *m_confInfo );
566 for ( ; it.current(); ++it ) 565 for ( ; it.current(); ++it )
567 { 566 {
568 OConfItem *item = it.current(); 567 OConfItem *item = it.current();
569 if ( retrieveAll || item->type() == typefilter ) 568 if ( retrieveAll || item->type() == typefilter )
570 { 569 {
571 sl->append( item ); 570 sl->append( item );
572 } 571 }
573 } 572 }
574 573