// =============================== // ====== PRIVATE SLOTS ====== // =============================== // Internal Process Management void PBIBackend::checkProcesses(){ //Check whether to startup the next pending process if( !PKGRUN.isEmpty() || PENDING.isEmpty() ){ return; } //currently running or nothing to do //Parse the next PENDING command PKGRUN = PENDING[0].section("::::",0,0); PKGCMD = PENDING[0].section("::::",1,1); PKGJAIL = PENDING[0].section("::::",2,2); PENDING.removeAt(0); //remove this from the pending list if( PKGCMD.startsWith("pbi_add") || PKGCMD.startsWith("pc-pkg install") ){ PROCTYPE = 0; } //install else if( PKGCMD.startsWith("pbi_delete") || PKGCMD.startsWith("pc-pkg remove") ){ PROCTYPE = 1; } //remove else{ PROCTYPE = -1; } //other type of command (no special checks later) PROCCANCELLED = false; PKGRUNSTAT.clear(); PROCLOG.clear(); bool injail = !PKGJAIL.isEmpty(); QHash<QString, NGApp> hash; if(JAILPKGS.contains(PKGJAIL) && PKGJAIL!="--newjail"){ hash = JAILPKGS[PKGJAIL]; } else if(APPHASH.contains(PKGRUN)){ hash = APPHASH; } else if(PKGHASH.contains(PKGRUN)){ hash = PKGHASH; } //Check that this is a valid entry/command bool skip = false; //need to skip this PENDING entry for some reason if( hash.isEmpty() ){ skip = true; qDebug() << PKGRUN+":" << "pkg not on repo";} //invalid pkg on the repo else if( PROCTYPE==0 && hash.value(PKGRUN).isInstalled && PKGJAIL!="--newjail"){ skip = true; qDebug() << PKGRUN+":" << "already installed"; } //already installed else if( PROCTYPE==1 && !hash.value(PKGRUN).isInstalled ){ skip = true; qDebug() << PKGRUN+":" << "already uninstalled"; } //not installed if(skip){ qDebug() << "Requested Process Invalid:" << PKGRUN << PKGCMD; emit PBIStatusChange(PKGRUN); PKGRUN.clear(); PKGCMD.clear(); QTimer::singleShot(1,this,SLOT(checkProcesses()) ); //restart this function to check the next command return; } //Now run any pre-remove commands (if not an in-jail removal, or raw pkg mode) if(PROCTYPE==1 && !injail && PKGCMD.startsWith("pc-pkg ") ){ Extras::getCmdOutput("pbi_icon del-desktop del-menu del-mime "+PKGRUN); //don't care about result }else if( PROCTYPE==0 && injail && RUNNINGJAILS.contains(PKGJAIL) && PKGJAIL!="--newjail"){ //For installations, make sure the jail pkg config is synced with the current system pkg config qDebug() << "Syncing pkg config in jail:" << PKGJAIL; emit devMessage( "** Syncing pkg config in jail: " +PKGJAIL+" **" ); Extras::getCmdOutput("pc-updatemanager -j "+RUNNINGJAILS[PKGJAIL]+" syncconf"); } qDebug() << "Starting Process:" << PKGRUN << PKGCMD; //Set the new status if(PROCTYPE==0){ PKGRUNSTAT=tr("Starting Installation"); } else if(PROCTYPE==1){ PKGRUNSTAT=tr("Starting Removal"); } else{ PKGRUNSTAT.clear(); } emit PBIStatusChange(PKGRUN); //Now start the command emit devMessage( "** Starting Process: \""+PKGCMD+"\" **" ); pkgProc->start(PKGCMD); }
void MainUI::ProgramInit() { QSplashScreen *SS = new QSplashScreen(this, QPixmap(":/icons/splash.png")); SS->show(); QCoreApplication::processEvents(); qDebug("Application starting..."); //Now startup the backend qDebug() << "Startup Backend"; QApplication::processEvents(); PBI = new PBIBackend(this, SS); //Initialize the Installed tab qDebug() << "Initialize Installed Tab"; initializeInstalledTab(); //Initialize the PBI Browser qDebug() << "Initialize Browser Tab"; initializeBrowserTab(); connect(PBI,SIGNAL(LocalPBIChanges()),this,SLOT(slotRefreshInstallTab()) ); connect(PBI,SIGNAL(PBIStatusChange(QString)),this,SLOT(slotPBIStatusUpdate(QString)) ); connect(PBI,SIGNAL(RepositoryInfoReady()),this,SLOT(slotEnableBrowser()) ); connect(PBI,SIGNAL(NoRepoAvailable()),this,SLOT(slotDisableBrowser()) ); connect(PBI,SIGNAL(SearchComplete(QStringList,QStringList)),this,SLOT(slotShowSearchResults(QStringList, QStringList)) ); connect(PBI,SIGNAL(SimilarFound(QStringList)),this,SLOT(slotShowSimilarApps(QStringList)) ); connect(PBI,SIGNAL(Error(QString,QString,QStringList)),this,SLOT(slotDisplayError(QString,QString,QStringList)) ); connect(PBI,SIGNAL(devMessage(QString)), ui->text_dev_output, SLOT(append(QString)) ); //Make sure we start on the installed tab ui->tabWidget->setCurrentWidget(ui->tab_browse); //In the initialization phase, this should already have the installed/repo info available slotRefreshInstallTab(); slotEnableBrowser(); SS->finish(this); }
void PBIBackend::procFinished(int ret, QProcess::ExitStatus stat){ emit devMessage("** Process Finished **"); if(stat != QProcess::NormalExit){ //Process Crashed emit Error(tr("Process Crashed"), QString(tr("The process for %1 has quit unexpectedly. Please restart this operation at a later time.")).arg(PKGRUN), PROCLOG); }else if( ret != 0 ){ //Failure QString title, msg; if(PROCTYPE==0){ title = tr("Installation Failure"); msg = QString(tr("The following application installation experienced an error: %1")+"\n\n"+tr("Please try again later.")).arg(APPHASH[PKGRUN].name); }else if(PROCTYPE==1){ title = tr("Removal Failure"); msg = QString(tr("The following application removal experienced an error: %1")+"\n\n"+tr("Please try again later.")).arg(APPHASH[PKGRUN].name); } if(!msg.isEmpty()){ emit Error(title, msg, PROCLOG); } }else{ //Success - perform any cleanup operations if(PROCTYPE==0 && PKGCMD.contains("pbi_") && !PROCCANCELLED && PKGJAIL.isEmpty()){ //if new installation on main system Extras::getCmdOutput("pbi_icon add-menu add-mime "+PKGRUN); //don't care about result if(autoDE && APPHASH[PKGRUN].hasDE){ runCmdAsUser("pbi_icon add-desktop "+PKGRUN); } }else if(PROCTYPE==0 && PKGCMD.contains("pc-pkg ") && !PROCCANCELLED && PKGJAIL.isEmpty()){ Extras::getCmdOutput("pc-extractoverlay ports"); //make sure to extract the ports overlay after a pkg operation } } //Now clean up the process variables and update the app status if(PKGJAIL.isEmpty()){ //update the local system info slotSyncToDatabase(true); }else if(PKGJAIL=="--newjail"){ //Find the new jail checkForJails(); emit JailListChanged(); }else{ //Just update the pkg list for this particular jail checkForJails(PKGJAIL); } QString origin = PKGRUN; //temporary PKGCMD.clear(); PKGRUN.clear(); PKGJAIL.clear(); //Emit the proper signals emit PBIStatusChange(origin); emit LocalPBIChanges(); //so that it knows to look for a different install list //Now check for the next command to run QTimer::singleShot(1, this, SLOT(checkProcesses()) ); }
void PBIBackend::procMessage(QString msg){ //qDebug() << "MSG:" << msg; PROCLOG << msg; //save full message to the log for later QString tmp; //Do some quick parsing of the message for better messages if(msg.startsWith("[")){ //Is installing, get the percent tmp = msg.section("]",0,0).remove("[").simplified(); double percent = tmp.section("/",0,0).toDouble()/tmp.section("/",-1).toDouble(); percent = percent*100; if(PROCTYPE==0){ tmp = QString(tr("Installing: %1")).arg(QString::number( (int) percent )+"%"); }else if(PROCTYPE==1){ tmp = QString(tr("Removing: %1")).arg(QString::number( (int) percent )+"%"); } } if(!tmp.isEmpty()){ PKGRUNSTAT = tmp; //set this as the current status (might want to do some parsing/translation later) emit PBIStatusChange(PKGRUN); } emit devMessage(msg); }