Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

package.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *                                                                         *
00003  *   This program is free software; you can redistribute it and/or modify  *
00004  *   it under the terms of the GNU General Public License as published by  *
00005  *   the Free Software Foundation; either version 2 of the License, or     *
00006  *   (at your option) any later version.                                   *
00007  *                                                                         *
00008  ***************************************************************************/
00009 // (c) 2002 Patrick S. Vogt <tille@handhelds.org>
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 // void OipkgPackage::init( PackageManagerSettings *s )
00040 // {
00041 //      settings = s;
00042 //      init();
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 //  }else if ( n == "Priority")
00105 //  {
00106 
00107   }else if ( n == "Section")
00108   {
00109       setSection( t );
00110 //  }else if ( n == "Maintainer")
00111 //  {
00112 //
00113 //  }else if ( n == "Architecture")
00114 //  {
00115 
00116   }else if ( n == "Version")
00117   {
00118      _version = t;
00119 //  }else if ( n == "Pre-Depends")
00120 //  {
00121 //
00122 //  }else if ( n == "Depends")
00123 //  {
00124 
00125   }else if ( n == "Filename")
00126   {
00127     _fileName = t;
00128 //  }else if ( n == "Size")
00129 //      {
00130 //
00131 //      }else if ( n == "MD5Sum")
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 //  }else if ( n == "Essential")
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"; //prepair for the future ;)
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                 // continuation
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  //hack, but we're not writing status anyway...
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 // 20020830
00413 // a quick hack to make oipkg understand the new ipk format
00414 // neu:  ar pf PACKAGE control.tar.gz | tar xfOz - ./control > /tmp/control
00415     if (system("ar pf "+file+" control.tar.gz | tar xfOz - ./control > /tmp/control") != 0)
00416     {
00417 //#old tar ipk format
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 //QString OipkgPackage::getPackageName()
00437 //{
00438 //      if ( _packageName.isEmpty() ) return _name;
00439 //      else return _packageName;
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 }

Generated on Sat Nov 5 16:17:47 2005 for OPIE by  doxygen 1.4.2