PackageModel::PackageModel( QObject* parent ) : QAbstractItemModel( parent ) , storage( 0 ) { networked = AbstractPackageController::factory( AbstractPackageController::network, this ); installed = AbstractPackageController::factory( AbstractPackageController::installed, this ); // can only have a max of 15 top level items rootItems << installed << networked; //this must stay in sync with installedIndex //and networkedIndex for ( int i = 0; i < rootItems.count(); i++ ) connect( rootItems[i], SIGNAL(updated()), this, SLOT(controllerUpdate()) ); connect( networked, SIGNAL(packageInstalled(InstallControl::PackageInfo)), installed, SLOT(addPackage(InstallControl::PackageInfo)) ); connect( networked, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); connect( networked, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SIGNAL(rowsRemoved(QModelIndex,int,int))); connect( networked, SIGNAL(packageInstalled(InstallControl::PackageInfo)), this, SLOT(packageInstalled(InstallControl::PackageInfo)) ); connect( networked, SIGNAL(serverStatus(QString)), this, SLOT(serverStatusUpdated(QString)) ); // can only have a max of 4 columns, if more are needed, change the // macros used for PackageModel::index(...) below // columnHeads << "Name" << "Size"; QStorageMetaInfo *s = QStorageMetaInfo::instance(); connect( s, SIGNAL(disksChanged()), this, SLOT(publishTargets()) ); connect( this, SIGNAL(targetsUpdated(QStringList)), installed, SLOT(reloadInstalledLocations(QStringList)) ); if ( !QDir( Qtopia::packagePath() ).exists() ) QDir::root().mkpath( Qtopia::packagePath() ); }
void PackageProcessor::handlePackageUnarchFinished (int ret, QProcess::ExitStatus) { sender ()->deleteLater (); QProcess *unarch = qobject_cast<QProcess*> (sender ()); int packageId = unarch->property ("PackageID").toInt (); const auto& stagingDir = unarch->property ("StagingDirectory").toString (); Mode mode = static_cast<Mode> (unarch->property ("Mode").toInt ()); auto cleanupGuard = std::shared_ptr<void> (nullptr, [&stagingDir, this] (void*) { CleanupDir (stagingDir); }); if (ret) { QString errString = QString::fromUtf8 (unarch->readAllStandardError ()); qWarning () << Q_FUNC_INFO << "unpacker exited with" << ret << errString << "for" << packageId << unarch->property ("Path").toString (); QString errorString = tr ("Unable to unpack package archive, unpacker exited with %1: %2.") .arg (ret) .arg (errString); emit packageInstallError (packageId, errorString); return; } int oldId = -1; if (mode == MUpdate) { oldId = Core::Instance ().GetStorage ()->FindInstalledPackage (packageId); if (!CleanupBeforeUpdate (oldId, packageId)) { qWarning () << Q_FUNC_INFO << "unable to cleanup"; return; } } QDir packageDir; try { packageDir = Core::Instance ().GetPackageDir (packageId); } catch (const std::exception& e) { qWarning () << Q_FUNC_INFO << "while trying to get dir for package" << packageId << "got we exception" << e.what (); QString errorString = tr ("Unable to get directory for the package: %1.") .arg (QString::fromUtf8 (e.what ())); emit packageInstallError (packageId, errorString); return; } QDirIterator dirIt (stagingDir, QDir::NoDotAndDotDot | QDir::Readable | QDir::NoSymLinks | QDir::Dirs | QDir::Files, QDirIterator::Subdirectories); while (dirIt.hasNext ()) { dirIt.next (); QFileInfo fi = dirIt.fileInfo (); if (fi.isDir () || fi.isFile ()) if (!HandleEntry (packageId, fi, stagingDir, packageDir)) { try { Remove (packageId); } catch (const std::exception& e) { qWarning () << Q_FUNC_INFO << "while removing partially installed package" << packageId << "got:" << e.what (); } QString errorString = tr ("Unable to copy " "files from staging area to " "destination directory."); emit packageInstallError (packageId, errorString); return; } } switch (mode) { case MInstall: emit packageInstalled (packageId); break; case MUpdate: emit packageUpdated (oldId, packageId); break; } }