Exemple #1
0
 // ===============================
 // ======   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);

}
Exemple #2
0
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);
}
Exemple #3
0
void PBIBackend::installApp(QStringList appID, QString injail){
  qDebug() << "Install App requested for:" << appID;
  bool jailok = RUNNINGJAILS.contains(injail) && JAILPKGS.contains(injail);
  for(int i=0; i<appID.length(); i++){
    NGApp app;
    if(APPHASH.contains(appID[i])){ app = APPHASH[appID[i]]; }
    else if(PKGHASH.contains(appID[i])){ app = PKGHASH[appID[i]]; }
    else{
      qDebug() << appID[i] << "is not a valid application";
      continue; //go to the next item is this one is invalid
    } 
    bool jailpkgok = false;
    if(jailok){ jailpkgok = !JAILPKGS[injail].contains(app.origin); }
    if( !app.isInstalled || jailpkgok ){
      queueProcess(appID[i], true, injail);
      emit PBIStatusChange(appID[i]);
    }else{
      qDebug() << appID[i] << "is already installed!";
    }
  } // end of loop over items
  //Now check/start the remove process
  QTimer::singleShot(0,this,SLOT(checkProcesses()) );
  //Now emit the signal that items have changed or been added
  emit LocalPBIChanges();
}
Exemple #4
0
void PBIBackend::removePBI(QStringList appID, QString injail){
  qDebug() << "PBI Removals requested for:" << appID;
  bool jailok = RUNNINGJAILS.contains(injail) && JAILPKGS.contains(injail);
  QStringList cancelList;
  for(int i=0; i<appID.length(); i++){
    NGApp app;
    if(APPHASH.contains(appID[i])){ app = APPHASH[appID[i]]; }
    else if(PKGHASH.contains(appID[i])){ app = PKGHASH[appID[i]]; }
    else{ continue; }
    bool jailpkgok = false;
    if(jailok){ jailpkgok = !JAILPKGS[injail].contains(app.origin); }
      if( (!app.isInstalled && !jailok) || jailpkgok ){
	//Not a fully-installed PBI - cancel it instead (probably pending)
	qDebug() << jailok << jailpkgok << appID[i];
	cancelList << appID[i];
      }else if( BASELIST.contains(appID[i]) ){
	qDebug() << "PC-BSD base dependency:" << appID[i] << " - cannot remove";	      
      }else{
	queueProcess(appID[i], false, injail);
        emit PBIStatusChange(appID[i]);
      }
  }
  //If there are PBIs to cancel, do that too
  if(!cancelList.isEmpty()){ cancelActions(cancelList); }
  //Now check/start the remove process
  QTimer::singleShot(0,this,SLOT(checkProcesses()) );
}
Exemple #5
0
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()) );
}
Exemple #6
0
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);
}
Exemple #7
0
void PBIBackend::procPercent(QString percent, QString size, QString filename){ //percent, file size, filename
  PKGRUNSTAT = QString( tr("Downloading %1 (%2% of %3)")).arg(filename, percent, size);
  qDebug() << "MSG:" << PKGRUNSTAT;
  //don't save this to the log - can get tons of these types of messages for every percent update
  emit PBIStatusChange(PKGRUN);
}