00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "package.h"
00011
00012 #include <qpe/process.h>
00013 #include <qpe/stringutil.h>
00014 #include <qfile.h>
00015 #include <qtextstream.h>
00016 #include <stdlib.h>
00017 #include <unistd.h>
00018
00019 #include "debug.h"
00020
00021 OipkgPackage::OipkgPackage( QObject *parent, const char *name )
00022 : QObject(parent,name)
00023 {
00024 init();
00025 }
00026
00027 OipkgPackage::~OipkgPackage()
00028 {
00029
00030 }
00031
00032 OipkgPackage::OipkgPackage( PackageManagerSettings *s, QObject *parent, const char *name )
00033 : QObject(parent,name)
00034 {
00035 settings = s;
00036 init();
00037 }
00038
00039
00040
00041
00042
00043
00044
00045 void OipkgPackage::init( )
00046 {
00047 _size = "";
00048 _section = "";
00049 _subsection = "";
00050 _shortDesc = "";
00051 _desc = "";
00052 _name = "";
00053 _toProcess = false;
00054 _useFileName = false;
00055 _old = false;
00056 _status = "";
00057 _dest = settings->getDestinationName();
00058 _link = settings->createLinks();
00059 _versions=0;
00060 _version="";
00061 }
00062
00063 OipkgPackage::OipkgPackage( QStringList pack, PackageManagerSettings *s , QObject *parent, const char *name )
00064 : QObject(parent,name)
00065 {
00066 settings = s;
00067 init();
00068 parsePackage( pack );
00069 }
00070
00071 OipkgPackage::OipkgPackage( QString n, PackageManagerSettings *s, QObject *parent, const char *name )
00072 : QObject(parent,name)
00073 {
00074 settings = s;
00075 init();
00076 if ( !QFile::exists( n ) )
00077 {
00078 _name = QString( n );
00079 }else{
00080 pvDebug(4,"remote file: "+n);
00081 parseIpkgFile( n );
00082 _useFileName = true;
00083 _fileName = QString( n );
00084 }
00085 }
00086
00087 OipkgPackage::OipkgPackage( OipkgPackage *pi, QObject *parent, const char *name )
00088 : QObject(parent,name)
00089 {
00090 settings = pi->settings;
00091 init();
00092 copyValues( pi );
00093 }
00094
00095
00096 void OipkgPackage::setValue( QString n, QString t )
00097 {
00098 if ( n == "Package" )
00099 {
00100 _name = QString( t );
00101 }else if ( n == "Installed-Size" )
00102 {
00103 _size = t;
00104
00105
00106
00107 }else if ( n == "Section")
00108 {
00109 setSection( t );
00110
00111
00112
00113
00114
00115
00116 }else if ( n == "Version")
00117 {
00118 _version = t;
00119
00120
00121
00122
00123
00124
00125 }else if ( n == "Filename")
00126 {
00127 _fileName = t;
00128
00129
00130
00131
00132
00133
00134 }else if ( n == "Description")
00135 {
00136 setDesc( t );
00137 }else if ( n == "Status")
00138 {
00139 if ( installed() ) return;
00140 _status = t;
00141
00142
00143
00144 }else{
00145 _values.insert(n,new QString(t));
00146 }
00147 }
00148
00149 QString OipkgPackage::name()
00150 {
00151 if (_displayName.isEmpty() ) return _name;
00152 else return _displayName;
00153 }
00154
00155
00156 QString OipkgPackage::installName()
00157 {
00158 if (_useFileName) return _fileName;
00159 else return _name;
00160 }
00161
00162 QString OipkgPackage::packageName()
00163 {
00164 QString pn = installName();
00165 pn = pn.right(pn.length()-pn.findRev("/"));
00166 pn = pn.left(pn.find("_"));
00167 return pn;
00168 }
00169
00170 bool OipkgPackage::installed()
00171 {
00172 if (_status.contains("installed"))
00173 {
00174 if (_status.contains("not-installed"))
00175 {
00176 _toProcess = true;
00177 return false;
00178 }
00179 else return true;
00180 }
00181 else
00182 if (_versions)
00183 {
00184 QDictIterator<OipkgPackage> other( *_versions );
00185 while ( other.current() )
00186 {
00187 if (other.current()->status().contains("installed")
00188 && other.current()->version() == version())
00189 return true;
00190 ++other;
00191 }
00192 }
00193 return false;
00194 }
00195
00196 bool OipkgPackage::otherInstalled()
00197 {
00198 if (_versions)
00199 {
00200 QDictIterator<OipkgPackage> other( *_versions );
00201 while ( other.current() )
00202 {
00203 if (other.current()->installed()) return true;
00204 ++other;
00205 }
00206 }
00207 return false;
00208 }
00209
00210 void OipkgPackage::setDesc( QString s )
00211 {
00212 _desc = s;
00213 _shortDesc = s.left( s.find("\n") );
00214 }
00215
00216 QString OipkgPackage::desc()
00217 {
00218 return _desc;
00219 }
00220
00221 QString OipkgPackage::shortDesc()
00222 {
00223 return _shortDesc;
00224 }
00225
00226 QString OipkgPackage::size()
00227 {
00228 return _size;
00229 }
00230
00231
00232 QString OipkgPackage::version()
00233 {
00234 return _version;
00235 }
00236
00237 QString OipkgPackage::sizeUnits()
00238 {
00239 int i = _size.toInt();
00240 int c = 0;
00241 QString ret;
00242 QStringList unit;
00243 unit << "B" << "KB" << "MB" << "GB" << "TB";
00244 while (i > 1)
00245 {
00246 ret=QString::number(i)+" "+unit[c];
00247 c++;
00248 i /= 1024;
00249 }
00250 return ret;
00251 }
00252
00253 bool OipkgPackage::toProcess()
00254 {
00255 return _toProcess;
00256 }
00257
00258 bool OipkgPackage::toRemove()
00259 {
00260 if ( _toProcess && installed() ) return true;
00261 else return false;
00262 }
00263
00264 bool OipkgPackage::toInstall()
00265 {
00266 if ( _toProcess && !installed() ) return true;
00267 else return false;
00268 }
00269
00270 void OipkgPackage::toggleProcess()
00271 {
00272 _toProcess = ! _toProcess;
00273 }
00274
00275
00276 void OipkgPackage::copyValues( OipkgPackage* pack )
00277 {
00278 if (_size.isEmpty() && !pack->_size.isEmpty()) _size = QString( pack->_size );
00279 if (_section.isEmpty() && !pack->_section.isEmpty()) _section = QString( pack->_section );
00280 if (_subsection.isEmpty()&& !pack->_subsection.isEmpty()) _subsection = QString( pack->_subsection );
00281 if (_shortDesc.isEmpty() && !pack->_shortDesc.isEmpty()) _shortDesc = QString( pack->_shortDesc );
00282 if (_desc.isEmpty() && !pack->_desc.isEmpty()) _desc = QString( pack->_desc );
00283 if (_name.isEmpty() && !pack->_name.isEmpty()) _name = QString( pack->_name );
00284 if (_dest.isEmpty() && !pack->_dest.isEmpty()) _dest= QString( pack->_dest );
00285 if (_displayName.isEmpty()&& !pack->_displayName.isEmpty()) _displayName = QString( pack->_displayName );
00286 if (_fileName.isEmpty() && !pack->_fileName.isEmpty()) _fileName = QString( pack->_fileName );
00287 if (_version.isEmpty() && !pack->_version.isEmpty()) _version = QString( pack->_version );
00288 if (_values.isEmpty() && !pack->_values.isEmpty())_values = QDict<QString>( pack->_values );
00289 if (!installed() && _status.isEmpty() && !pack->_status.isEmpty()) _status = QString( pack->_status );
00290 }
00291
00292 QString OipkgPackage::section()
00293 {
00294 return _section;
00295 }
00296
00297 void OipkgPackage::setSection( QString s)
00298 {
00299 int i = s.find("/");
00300 if ( i > 0 )
00301 {
00302 _section = s.left(i);
00303 _subsection = s.mid(i+1);
00304 }else{
00305 _section = s;
00306 _subsection = "";
00307 }
00308 }
00309
00310 QString OipkgPackage::subSection()
00311 {
00312 return _subsection;
00313 }
00314
00315 void OipkgPackage::parsePackage( QStringList pack )
00316 {
00317 if ( pack.isEmpty() ) return;
00318 int count = pack.count();
00319 for( int i = 0; i < count; i++ )
00320 {
00321 QString line = pack[i];
00322 int sep = line.find( QRegExp(":[\t ]+") );
00323 if ( sep >= 0 )
00324 {
00325 QString tag = line.left(sep);
00326 QString value = line.mid(sep+2).simplifyWhiteSpace();
00327 setValue( tag, value );
00328 }else{
00329 }
00330 }
00331 return;
00332 }
00333
00334 QString OipkgPackage::details()
00335 {
00336 QString status;
00337 Process ipkg_status(QStringList() << "ipkg" << "info" << name() );
00338 QString description;
00339 if ( ipkg_status.exec("",status) )
00340 {
00341 QStringList lines = QStringList::split('\n',status,TRUE);
00342 for (QStringList::Iterator it = lines.begin(); it!=lines.end(); ++it) {
00343 QString line = *it;
00344 if ( line == " ." )
00345 {
00346 description.append("<p>");
00347 } else
00348 if ( line[0] == ' ' || line[0] == '\t' )
00349 {
00350
00351 description.append(" ");
00352 description.append(Qtopia::escapeString(line));
00353 } else {
00354 int sep = line.find(QRegExp(":[\t ]+"));
00355 if ( sep >= 0 )
00356 {
00357 QString tag = line.left(sep);
00358 description.append("<br>");
00359 description.append("<b>");
00360 description.append(Qtopia::escapeString(tag));
00361 description.append(":</b> ");
00362 description.append(Qtopia::escapeString(line.mid(sep+2)));
00363 } else {
00364 description.append(" ");
00365 description.append(Qtopia::escapeString(line));
00366 }
00367 }
00368 }
00369 }
00370 return description;
00371 }
00372
00373 void OipkgPackage::processed()
00374 {
00375 _toProcess = false;
00376
00377 if ( installed() ) _status = "install";
00378 else _status = "installed";
00379 }
00380
00381 QString OipkgPackage::dest()
00382 {
00383 if ( installed()||(!installed() && _toProcess) )
00384 return _dest!=""?_dest:settings->getDestinationName();
00385 else return "";
00386 }
00387
00388 void OipkgPackage::setDest( QString d )
00389 {
00390 if ( d == "remote") _useFileName = true;
00391 else _dest = d;
00392 }
00393
00394 void OipkgPackage::setOn()
00395 {
00396 _toProcess = true;
00397 }
00398
00399 bool OipkgPackage::link()
00400 {
00401 if ( _dest == "root" || (!installed() && !_toProcess) ) return false;
00402 return _link;
00403 }
00404
00405 void OipkgPackage::setLink(bool b)
00406 {
00407 _link = b;
00408 }
00409
00410 void OipkgPackage::parseIpkgFile( QString file)
00411 {
00412
00413
00414
00415 if (system("ar pf "+file+" control.tar.gz | tar xfOz - ./control > /tmp/control") != 0)
00416 {
00417
00418 system("tar xzf "+file+" -C /tmp");
00419 system("tar xzf /tmp/control.tar.gz -C /tmp");
00420 }
00421 QFile f("/tmp/control");
00422 if ( f.open(IO_ReadOnly) )
00423 {
00424 QTextStream t( &f );
00425 QStringList pack;
00426 while ( !t.eof() )
00427 {
00428 pack << t.readLine();
00429 }
00430 f.close();
00431 parsePackage( pack );
00432 }
00433
00434 }
00435
00436
00437
00438
00439
00440
00441
00442 void OipkgPackage::instalFromFile(bool iff)
00443 {
00444 _useFileName = iff;
00445 }
00446
00447 void OipkgPackage::setName(QString n)
00448 {
00449 _displayName = n;
00450 }
00451
00452 QDict<QString>* OipkgPackage::getFields()
00453 {
00454 return &_values;
00455 }
00456
00457 QString OipkgPackage::status()
00458 {
00459 return _status;
00460 }
00461
00462 bool OipkgPackage::isOld()
00463 {
00464 if (!_versions) return false;
00465 QDictIterator<OipkgPackage> other( *_versions );
00466 while ( other.current() ) {
00467 if (other.current()->version() > version() ) return true;
00468 ++other;
00469 }
00470 return false;
00471 }
00472
00473 bool OipkgPackage::hasVersions()
00474 {
00475 if (!_versions) return false;
00476 else return true;
00477 }
00478
00479 QDict<OipkgPackage>* OipkgPackage::getOtherVersions()
00480 {
00481 return _versions;
00482 }
00483
00484 void OipkgPackage::setOtherVersions(QDict<OipkgPackage> *v)
00485 {
00486 _versions=v;
00487 }