You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
323 lines
8.4 KiB
323 lines
8.4 KiB
/***************************************************************************
|
|
* Copyright (C) 2004 by David Sansome *
|
|
* me@davidsansome.com *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program; if not, write to the *
|
|
* Free Software Foundation, Inc., *
|
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
|
***************************************************************************/
|
|
|
|
|
|
#include "uninstallwizard.h"
|
|
#include "headerlistitem.h"
|
|
#include "data.h"
|
|
|
|
#include <ntqregexp.h>
|
|
#include <ntqwidgetstack.h>
|
|
#include <ntqfile.h>
|
|
#include <ntqtextstream.h>
|
|
#include <ntqheader.h>
|
|
#include <ntqlistbox.h>
|
|
#include <ntqmessagebox.h>
|
|
#include <ntqpushbutton.h>
|
|
#include <ntqlineedit.h>
|
|
#include <ntqtextedit.h>
|
|
#include <ntqlabel.h>
|
|
|
|
AppListItem::AppListItem(TQString nN, TQString n, TQListView* parent)
|
|
: TQCheckListItem(parent, "", TQCheckListItem::CheckBox)
|
|
{
|
|
niceName = nN;
|
|
name = n;
|
|
section = 2;
|
|
|
|
setText(0, niceName);
|
|
}
|
|
|
|
int AppListItem::compare(TQListViewItem* i, int col, bool ascending) const
|
|
{
|
|
switch (i->rtti())
|
|
{
|
|
case 1003: // App
|
|
{
|
|
AppListItem* item = (AppListItem*) i;
|
|
if (section < item->section)
|
|
return -1;
|
|
if (section > item->section)
|
|
return 1;
|
|
return TQListViewItem::compare(i, col, ascending);
|
|
}
|
|
break;
|
|
|
|
case 1002: // Header
|
|
{
|
|
HeaderListItem* item = (HeaderListItem*) i;
|
|
if (section < item->section)
|
|
return -1;
|
|
return 1;
|
|
}
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
UninstallWizard::UninstallWizard(TQWidget* parent, const char* name, bool modal, WFlags fl)
|
|
: WizardBase(parent,name, modal,fl)
|
|
{
|
|
mainStack->raiseWidget(1);
|
|
setCaption("Uninstall Software");
|
|
titleLabel->setText("<b>Uninstall Software</b>");
|
|
componentInfo->setMaximumSize(32767,70);
|
|
|
|
logDialog = new LogDialog(this);
|
|
logDialog->hide();
|
|
appList->header()->hide();
|
|
|
|
globalHeader = NULL;
|
|
|
|
icon.convertFromImage(qembed_findImage("misc"));
|
|
|
|
externalProcess = new TQProcess(this);
|
|
connect(externalProcess, SIGNAL(processExited()), SLOT(processExited()));
|
|
connect(externalProcess, SIGNAL(readyReadStdout()), SLOT(readyReadStdout()));
|
|
connect(externalProcess, SIGNAL(readyReadStderr()), SLOT(readyReadStderr()));
|
|
|
|
TQFile uninstallScript("/tmp/arkollon-uninstall.sh");
|
|
if (uninstallScript.exists())
|
|
uninstallScript.remove();
|
|
uninstallScript.open(IO_WriteOnly);
|
|
TQDataStream stream(&uninstallScript);
|
|
stream.writeRawBytes((const char*)uninstaller_sh_data, uninstaller_sh_len);
|
|
uninstallScript.close();
|
|
|
|
currentStage = ListingPackages;
|
|
externalProcess->addArgument("/bin/sh");
|
|
externalProcess->addArgument("/tmp/arkollon-uninstall.sh");
|
|
externalProcess->addArgument("--list");
|
|
externalProcess->start();
|
|
}
|
|
|
|
UninstallWizard::~UninstallWizard()
|
|
{
|
|
TQFile uninstallScript("/tmp/arkollon-uninstall.sh");
|
|
if (uninstallScript.exists())
|
|
uninstallScript.remove();
|
|
}
|
|
|
|
void UninstallWizard::logPressed()
|
|
{
|
|
logDialog->show();
|
|
}
|
|
|
|
void UninstallWizard::cancelPressed()
|
|
{
|
|
reject();
|
|
}
|
|
|
|
void UninstallWizard::previousPressed()
|
|
{
|
|
int currentId = uninstallStack->id(uninstallStack->visibleWidget());
|
|
if (currentId == 0)
|
|
return;
|
|
|
|
uninstallStack->raiseWidget(--currentId);
|
|
|
|
if (currentId == 0)
|
|
previousButton->setEnabled(false);
|
|
nextButton->setEnabled(true);
|
|
}
|
|
|
|
void UninstallWizard::nextPressed()
|
|
{
|
|
int currentId = uninstallStack->id(uninstallStack->visibleWidget());
|
|
if (currentId == 2)
|
|
{
|
|
accept();
|
|
return;
|
|
}
|
|
|
|
if (currentId == 0)
|
|
{
|
|
bool checked = false;
|
|
TQStringList argList;
|
|
argList.append("/bin/sh");
|
|
argList.append("/tmp/arkollon-uninstall.sh");
|
|
for ( TQListViewItem * myChild = appList->firstChild() ; myChild != NULL ; myChild = myChild->nextSibling())
|
|
{
|
|
if (myChild->rtti() != 1003)
|
|
continue;
|
|
AppListItem* app = (AppListItem*) myChild;
|
|
if (!app->isOn())
|
|
continue;
|
|
argList.append("--files");
|
|
argList.append(app->name);
|
|
checked = true;
|
|
}
|
|
if (!checked)
|
|
{
|
|
TQMessageBox::warning(this, "Error", "You need to select at least one package to remove", TQMessageBox::Ok, TQMessageBox::NoButton, TQMessageBox::NoButton);
|
|
return;
|
|
}
|
|
fileList->clear();
|
|
currentStage = ListingFiles;
|
|
externalProcess->setArguments(argList);
|
|
externalProcess->start();
|
|
nextButton->setEnabled(false); // Set true again when the process is done
|
|
}
|
|
|
|
uninstallStack->raiseWidget(++currentId);
|
|
|
|
if (currentId == 2)
|
|
removeUserPackages();
|
|
else
|
|
previousButton->setEnabled(true);
|
|
}
|
|
|
|
void UninstallWizard::processExited()
|
|
{
|
|
switch (currentStage)
|
|
{
|
|
case ListingPackages:
|
|
if (appList->childCount() <= 0)
|
|
{
|
|
TQMessageBox::warning(NULL, "Warning", "There are no packages installed", TQMessageBox::Ok, TQMessageBox::NoButton, TQMessageBox::NoButton);
|
|
reject();
|
|
return;
|
|
}
|
|
show();
|
|
break;
|
|
case ListingFiles:
|
|
nextButton->setEnabled(true);
|
|
fileList->sort();
|
|
break;
|
|
case RemovingGlobal:
|
|
finished();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void UninstallWizard::readyReadStdout()
|
|
{
|
|
switch (currentStage)
|
|
{
|
|
case ListingPackages:
|
|
{
|
|
while (externalProcess->canReadLineStdout())
|
|
{
|
|
TQString line = externalProcess->readLineStdout();
|
|
if (line.isEmpty())
|
|
continue;
|
|
|
|
// See if it already exists
|
|
bool exists = false;
|
|
|
|
for ( TQListViewItem * myChild = appList->firstChild() ; myChild != NULL ; myChild = myChild->nextSibling())
|
|
{
|
|
if (myChild->rtti() != 1003)
|
|
continue;
|
|
AppListItem* app = (AppListItem*) myChild;
|
|
if (app->name.lower() == line.lower())
|
|
{
|
|
exists = true;
|
|
break;
|
|
}
|
|
}
|
|
if (exists)
|
|
continue;
|
|
|
|
TQString niceName = line.left(line.findRev(':'));
|
|
niceName = niceName.left(1).upper() + niceName.right(niceName.length()-1);
|
|
new AppListItem(niceName, line, appList);
|
|
|
|
if (globalHeader == NULL)
|
|
{
|
|
globalHeader = new HeaderListItem(appList);
|
|
globalHeader->setText(0, "Applications available to all users");
|
|
globalHeader->section = 1;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ListingFiles:
|
|
{
|
|
while (externalProcess->canReadLineStdout())
|
|
{
|
|
TQString line = externalProcess->readLineStdout();
|
|
if (line.isEmpty())
|
|
continue;
|
|
fileList->insertItem(icon, line.left(line.find(" ")));
|
|
}
|
|
break;
|
|
}
|
|
case RemovingGlobal:
|
|
while (externalProcess->canReadLineStdout())
|
|
{
|
|
TQString line = externalProcess->readLineStdout();
|
|
if (line.isEmpty())
|
|
continue;
|
|
line.replace(TQRegExp("\\033[^m]*m"), "");
|
|
logDialog->logBox->append(line);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void UninstallWizard::readyReadStderr()
|
|
{
|
|
while (externalProcess->canReadLineStdout())
|
|
{
|
|
TQString line = externalProcess->readLineStdout();
|
|
if (line.isEmpty())
|
|
continue;
|
|
line.replace(TQRegExp("\\033[^m]*m"), "");
|
|
logDialog->logBox->append(line);
|
|
}
|
|
}
|
|
|
|
void UninstallWizard::removeUserPackages()
|
|
{
|
|
nextButton->setEnabled(false); // Set true again when the process is done
|
|
previousButton->setEnabled(false);
|
|
|
|
// Find out which packages belong to the user, and uninstall them
|
|
TQStringList argList;
|
|
argList.append("/bin/sh");
|
|
argList.append("/tmp/arkollon-uninstall.sh");
|
|
for ( TQListViewItem * myChild = appList->firstChild() ; myChild != NULL ; myChild = myChild->nextSibling())
|
|
{
|
|
if (myChild->rtti() != 1003)
|
|
continue;
|
|
AppListItem* app = (AppListItem*) myChild;
|
|
if (!app->isOn())
|
|
continue;
|
|
|
|
argList.append("--remove");
|
|
argList.append(app->name);
|
|
}
|
|
currentStage = RemovingGlobal;
|
|
externalProcess->setArguments(argList);
|
|
externalProcess->start();
|
|
}
|
|
|
|
void UninstallWizard::finished()
|
|
{
|
|
pleaseWaitLabel2->setText("Removal of packages complete!");
|
|
nextButton->setText("Finish");
|
|
nextButton->setEnabled(true);
|
|
}
|
|
|
|
#include "uninstallwizard.moc"
|
|
|