source: src-qt4/pc-pkgmanager/mainWin.cpp @ 3f4caf6

9.1-release9.2-releasereleng/10.0releng/10.0.1releng/10.0.2
Last change on this file since 3f4caf6 was 3f4caf6, checked in by Kris Moore <kris@…>, 16 months ago

Add the beginnings of our new pc-pkgmanager GUI utility

  • Property mode set to 100644
File size: 7.8 KB
Line 
1/****************************************************************************
2** ui.h extension file, included from the uic-generated form implementation.
3**
4** If you want to add, delete, or rename functions or slots, use
5** Qt Designer to update this file, preserving your code.
6**
7** You should not define a constructor or destructor in this file.
8** Instead, write your code in functions called init() and destroy().
9** These will automatically be called by the form's constructor and
10** destructor.
11*****************************************************************************/
12#include <fcntl.h>
13#include <QDateTime>
14#include <QDebug>
15#include <QDir>
16#include <QProcess>
17#include <QProgressDialog>
18#include <QSocketNotifier>
19#include <QString>
20#include <QTextStream>
21#include <pcbsd-utils.h>
22#include "mainWin.h"
23#include "../config.h"
24
25void mainWin::ProgramInit(QString ch)
26{
27  // Set any warden directories
28  doingUpdate=false;
29  lastError="";
30  wDir = ch;
31
32  //Grab the username
33  //username = QString::fromLocal8Bit(getenv("LOGNAME"));
34  connect(pushUpdatePkgs, SIGNAL(clicked()), this, SLOT(slotUpdatePkgsClicked()));
35  connect(pushClose, SIGNAL(clicked()), this, SLOT(slotCloseClicked()));
36  connect(buttonRescanPkgs, SIGNAL(clicked()), this, SLOT(slotRescanPkgsClicked()));
37  progressUpdate->setHidden(true);
38
39  QTimer::singleShot(200, this, SLOT(slotRescanPkgsClicked() ) );
40}
41
42void mainWin::slotRescanPkgsClicked()
43{
44  // Check for pkg updates
45  checkMPKGUpdates();
46}
47
48void mainWin::checkMPKGUpdates() {
49  if ( doingUpdate )
50     return;
51
52  QString line, tmp, name, pkgname, pkgover, pkgnver;
53  QStringList up, listPkgs;
54  bool haveUpdates = false;
55  int totPkgs=0;
56  buttonRescanPkgs->setEnabled(false);
57  pushUpdatePkgs->setEnabled(false);
58  listViewUpdatesPkgs->clear();
59  groupUpdatesPkgs->setTitle(tr("Checking for updates"));
60
61  QProcess p;
62  if ( wDir.isEmpty() )
63     p.start(QString("pc-updatemanager"), QStringList() << "pkgcheck");
64  else
65     p.start(QString("chroot"), QStringList() << wDir << "pc-updatemanager" << "pkgcheck");
66  while(p.state() == QProcess::Starting || p.state() == QProcess::Running)
67     QCoreApplication::processEvents();
68
69  while (p.canReadLine()) {
70    line = p.readLine().simplified();
71    qDebug() << line;
72    if ( line.indexOf("Upgrading") != 0) {
73       continue;
74    }
75    tmp = line;
76    pkgname = tmp.section(" ", 1, 1);
77    pkgname.replace(":", "");
78    pkgover = tmp.section(" ", 2, 2);
79    pkgnver = tmp.section(" ", 4, 4);
80    QTreeWidgetItem *myItem = new QTreeWidgetItem(QStringList() << pkgname << pkgover << pkgnver);
81    listViewUpdatesPkgs->addTopLevelItem(myItem);
82    haveUpdates = true;
83    totPkgs++;
84  }
85
86  buttonRescanPkgs->setEnabled(true);
87  pushUpdatePkgs->setEnabled(haveUpdates);
88  if ( totPkgs > 0 ) {
89    if ( listUpdates.isEmpty() )
90      tabUpdates->setCurrentIndex(1);
91    tabUpdates->setTabText(1, tr("Package Updates (%1)").arg(totPkgs));
92    groupUpdatesPkgs->setTitle(tr("Available updates"));
93  } else {
94    tabUpdates->setTabText(1, tr("Package Updates"));
95    groupUpdatesPkgs->setTitle(tr("No available updates"));
96  }
97 
98  slotDisplayUpdates();
99}
100
101void mainWin::slotSingleInstance() {
102   this->hide();
103   this->showNormal();
104   this->activateWindow();
105   this->raise();
106}
107
108void mainWin::slotCloseClicked() {
109   close();
110}
111
112void mainWin::slotUpdatePkgsClicked() {
113  // Set our UI elements
114  progressUpdate->setHidden(false);
115  tabUpdates->setEnabled(false);
116
117  dPackages = false;
118  uPackages = false;
119  doingUpdate=true;
120  curUpdate = 0;
121
122  // Setup the upgrade process
123  uProc = new QProcess();
124  QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
125  env.insert("PCFETCHGUI", "YES");
126  uProc->setProcessEnvironment(env);
127  uProc->setProcessChannelMode(QProcess::MergedChannels);
128
129  // Connect the slots
130  connect( uProc, SIGNAL(readyReadStandardOutput()), this, SLOT(slotReadPkgUpdateOutput()) );
131  connect( uProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotUpdatePkgDone()) );
132
133  if ( wDir.isEmpty() )
134    uProc->start("pc-updatemanager", QStringList() << "pkgupdate");
135  else
136    uProc->start("chroot", QStringList() << wDir << "pc-updatemanager" << "pkgupdate");
137
138  textLabel->setText(tr("Starting package updates..."));
139
140  progressUpdate->setRange(0, listViewUpdatesPkgs->topLevelItemCount() );
141  progressUpdate->setValue(0);
142}
143
144void mainWin::slotReadPkgUpdateOutput() {
145   QString line, tmp, cur, tot, fname;
146
147   while (uProc->canReadLine()) {
148     line = uProc->readLine().simplified();
149     qDebug() << "Normal Line:" << line;
150     tmp = line;
151     tmp.truncate(50);
152     if ( line.indexOf("to be downloaded") != -1 ) {
153       textLabel->setText(tr("Downloading packages..."));
154       curUpdate = 0;
155       progressUpdate->setValue(0);
156       continue;
157     }
158     if ( line.indexOf("Checking integrity") == 0 ) {
159       textLabel->setText(line);
160       uPackages = true;
161       dPackages = false;
162       curUpdate = 0;
163       progressUpdate->setValue(0);
164     }
165     if ( line.indexOf("FETCH: ") == 0 ) { 
166        progressUpdate->setValue(progressUpdate->value() + 1); 
167        tmp = line; 
168        tmp = tmp.remove(0, tmp.lastIndexOf("/") + 1); 
169        textLabel->setText(tr("Downloading: %1").arg(tmp)); 
170        continue;
171     } 
172     
173     if ( line.indexOf("SIZE: ") == 0 ) {
174          bool ok, ok2;
175          line.replace("SIZE: ", "");
176          line.replace("DOWNLOADED: ", "");
177          line.replace("SPEED: ", "");
178          line.section(" ", 0, 0).toInt(&ok);
179          line.section(" ", 1, 1).toInt(&ok2);
180   
181          if ( ok && ok2 ) {
182            QString unit;
183            int tot = line.section(" ", 0, 0).toInt(&ok);
184            int cur = line.section(" ", 1, 1).toInt(&ok2);
185            QString percent = QString::number( (float)(cur * 100)/tot );
186            QString speed = line.section(" ", 2, 3);
187
188            // Get the MB downloaded / total
189            if ( tot > 2048 ) {
190              unit="MB";
191              tot = tot / 1024;
192              cur = cur / 1024;
193            } else {
194              unit="KB";
195            }
196
197            QString ProgressString=QString("%1" + unit + " of %2" + unit + " at %3").arg(cur).arg(tot).arg(speed);
198            progressUpdate->setRange(0, tot);
199            progressUpdate->setValue(cur);
200         }
201     }
202
203     if ( uPackages ) {
204       if ( line.indexOf("Upgrading") == 0 ) {
205         textLabel->setText(line);
206         curUpdate++;
207         progressUpdate->setValue(curUpdate);
208       }
209       continue;
210     }
211
212   } // end of while
213}
214
215// Function to read output of pipefile
216void mainWin::slotReadEventPipe(int fd) {
217  QString tmp, fname, cur, tot;
218  bool ok, ok2;
219  char buff[4028];
220  int totread = read(fd, buff, 4020);
221  buff[totread]='\0';
222  QString line = buff;
223  line = line.simplified();
224  //qDebug() << "Found line:" << line;
225 
226  if ( line.indexOf("INFO_FETCH") != -1  && dPackages ) {
227     tmp = line;
228     fname = tmp.section(":", 4, 4);
229     fname.remove(0, fname.lastIndexOf('/') + 1);
230     fname  = fname.section('"', 0, 0);
231     cur = tmp.section(":", 5, 5);
232     cur = cur.remove(',');
233     cur = cur.section(" ", 1, 1);
234     cur = cur.simplified();
235     tot = tmp.section(":", 6, 6);
236     tot = tot.simplified();
237     tot = tot.remove(',');
238     tot = tot.section("}", 0, 0);
239
240     textLabel->setText(tr("Downloading %1").arg(fname));
241     tot.toInt(&ok);
242     cur.toInt(&ok2);
243     if ( ok && ok2 )
244     { 
245       progressUpdate->setRange(0, tot.toInt(&ok2));
246       progressUpdate->setValue(cur.toInt(&ok2));
247     }
248     
249     //qDebug() << "File:" << fname << "cur" << cur << "tot" << tot;
250  }
251}
252
253void mainWin::slotUpdatePkgDone() {
254  progressUpdate->setHidden(true);
255  QFile sysTrig( SYSTRIGGER );
256  if ( sysTrig.open( QIODevice::WriteOnly ) ) {
257    QTextStream streamTrig( &sysTrig );
258     streamTrig << "INSTALLFINISHED: ";
259  }
260
261  if ( uProc->exitCode() != 0 )
262    QMessageBox::warning(this, tr("Failed package update"), tr("The package update failed! If this persists, you may need to manually run: pc-updatemanager pkgupdate"));
263
264  doingUpdate=false;
265  checkMPKGUpdates();
266}
Note: See TracBrowser for help on using the repository browser.