source: src-qt4/pc-updatecenter/updatecontroller.cpp @ c21cafa

releng/10.0releng/10.0.1releng/10.0.2releng/10.0.3
Last change on this file since c21cafa was c21cafa, checked in by yurkis <yurkis@…>, 10 months ago

Update center - current base system update description showing

  • Property mode set to 100644
File size: 8.0 KB
Line 
1/**************************************************************************
2*   Copyright (C) 2013- by Yuri Momotyuk                                   *
3*   yurkis@gmail.com                                                      *
4*                                                                         *
5*   Permission is hereby granted, free of charge, to any person obtaining *
6*   a copy of this software and associated documentation files (the       *
7*   "Software"), to deal in the Software without restriction, including   *
8*   without limitation the rights to use, copy, modify, merge, publish,   *
9*   distribute, sublicense, and/or sell copies of the Software, and to    *
10*   permit persons to whom the Software is furnished to do so, subject to *
11*   the following conditions:                                             *
12*                                                                         *
13*   The above copyright notice and this permission notice shall be        *
14*   included in all copies or substantial portions of the Software.       *
15*                                                                         *
16*   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       *
17*   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *
18*   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
19*   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR     *
20*   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
21*   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
22*   OTHER DEALINGS IN THE SOFTWARE.                                       *
23***************************************************************************/
24
25#include "updatecontroller.h"
26
27#include <QDebug>
28#include <QCoreApplication>
29#include <unistd.h>
30
31const char* const EMULATION_PROC = "cat";
32const QStringList EMULATION_DEF_ARGS;
33
34///////////////////////////////////////////////////////////////////////////////
35CAbstractUpdateController::CAbstractUpdateController()
36{
37    mCurrentState= eNOT_INITIALIZED;
38    mUpdProc.setProcessChannelMode(QProcess::MergedChannels);
39    connect(&mUpdProc, SIGNAL(readyReadStandardOutput()),
40            this, SLOT(slotProcessRead()));
41    connect(&mUpdProc, SIGNAL(finished(int,QProcess::ExitStatus)),
42            this, SLOT(slotProcessFinished(int,QProcess::ExitStatus)));
43}
44
45///////////////////////////////////////////////////////////////////////////////
46void CAbstractUpdateController::setJailPrefix(QString prefix)
47{
48    mJailPrefix= prefix;
49}
50
51///////////////////////////////////////////////////////////////////////////////
52void CAbstractUpdateController::removeJailPrefix()
53{
54    mJailPrefix.clear();
55}
56
57///////////////////////////////////////////////////////////////////////////////
58CAbstractUpdateController::EUpdateControllerState CAbstractUpdateController::currentState()
59{
60    return mCurrentState;
61}
62
63///////////////////////////////////////////////////////////////////////////////
64QString CAbstractUpdateController::updateMessage()
65{
66    return mUpdateMasage;
67}
68
69///////////////////////////////////////////////////////////////////////////////
70QStringList CAbstractUpdateController::updateLog()
71{
72    return mLogMessages;
73}
74
75///////////////////////////////////////////////////////////////////////////////
76bool CAbstractUpdateController::hasLog()
77{
78    return (mLogMessages.size()!=0);
79}
80
81///////////////////////////////////////////////////////////////////////////////
82void CAbstractUpdateController::parseProcessLine(CAbstractUpdateController::EUpdateControllerState state, QString line)
83{
84    switch (state)
85    {
86        case eCHECKING:
87            onReadCheckLine(line);
88            break;
89        case eUPDATING:
90            onReadUpdateLine(line);
91            break;
92        case eNOT_INITIALIZED:
93            qDebug()<<"Updater internal state error";
94            break;
95        default:
96            break;
97    }
98}
99
100///////////////////////////////////////////////////////////////////////////////
101void CAbstractUpdateController::setCurrentState(CAbstractUpdateController::EUpdateControllerState new_state)
102{
103
104
105    //Set default start values for update progress
106    if((new_state == eUPDATING) && (mCurrentState!=eUPDATING))
107    {
108        mUpdateMasage = tr("Starting update...");
109        mCurrentProgress = SProgress();
110        mLogMessages.clear();
111    }
112
113    mCurrentState= new_state;
114
115    emit stateChanged(mCurrentState);
116}
117
118///////////////////////////////////////////////////////////////////////////////
119void CAbstractUpdateController::reportProgress(CAbstractUpdateController::SProgress curr_progress)
120{
121    mCurrentProgress= curr_progress;
122    emit progress(mCurrentProgress);
123}
124
125///////////////////////////////////////////////////////////////////////////////
126void CAbstractUpdateController::reportLogLine(QString line)
127{
128    mLogMessages.append(line);
129    emit logLinePresent(line);
130}
131
132///////////////////////////////////////////////////////////////////////////////
133void CAbstractUpdateController::reportUpdatesAvail(QString message)
134{
135    mUpdateMasage = message;
136    setCurrentState(eUPDATES_AVAIL);
137    emit updatesAvail(mUpdateMasage);
138}
139
140///////////////////////////////////////////////////////////////////////////////
141void CAbstractUpdateController::reportError(QString error_message)
142{
143    mErrorMessage = error_message;
144    setCurrentState(eUPDATING_ERROR);
145    emit updateError(mErrorMessage);
146}
147
148///////////////////////////////////////////////////////////////////////////////
149void CAbstractUpdateController::launchUpdate()
150{
151    QString proc;
152    QStringList args;
153    updateShellCommand(proc, args);
154
155    //if jail is present
156    if (mJailPrefix.length())
157    {
158        args.push_front(proc);
159        args.push_front(mJailPrefix);
160        proc = "chroot";
161    }
162
163    mUpdProc.start(proc,args);
164    if (!mUpdProc.waitForStarted())
165    {
166        reportError(tr("Can not execute update shell command"));
167        return;
168    }
169
170    if (currentState() != eUPDATING)
171        setCurrentState(eUPDATING);
172}
173
174///////////////////////////////////////////////////////////////////////////////
175void CAbstractUpdateController::launchCheck()
176{
177    QString proc;
178    QStringList args;
179    checkShellCommand(proc, args);
180
181    //if jail is present
182    if (mJailPrefix.length())
183    {
184        args.push_front(proc);
185        args.push_front(mJailPrefix);
186        proc = "chroot";
187    }
188
189    mUpdProc.start(proc,args);
190    if (!mUpdProc.waitForStarted())
191    {
192        reportError(tr("Can not execute update shell command"));
193        return;
194    }
195
196    setCurrentState(eCHECKING);
197}
198
199///////////////////////////////////////////////////////////////////////////////
200void CAbstractUpdateController::check()
201{
202    onCheckUpdates();
203    launchCheck();
204}
205
206///////////////////////////////////////////////////////////////////////////////
207void CAbstractUpdateController::updateAll()
208{
209    //TODO: correct current state check
210
211    onUpdateAll();
212
213    launchUpdate();
214}
215
216///////////////////////////////////////////////////////////////////////////////
217void CAbstractUpdateController::cancel()
218{
219    if (mCurrentProgress.misCanCancel)
220    {
221        onCancel();
222    }
223}
224
225///////////////////////////////////////////////////////////////////////////////
226void CAbstractUpdateController::slotProcessRead()
227{
228    /*qint64 size= mUpdProc.bytesAvailable();
229    for(qint64 i=0; i<size; i++)
230    {
231        char ch;
232        mUpdProc.getChar(&ch);
233        mUpdProc.putChar(ch);
234        onReadProcessChar(ch);
235    }*/
236
237    while (mUpdProc.canReadLine())
238    {
239        parseProcessLine(currentState(), mUpdProc.readLine().simplified());
240    }
241}
242
243///////////////////////////////////////////////////////////////////////////////
244void CAbstractUpdateController::slotProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
245{
246    Q_UNUSED(exitStatus)
247
248    slotProcessRead();
249
250    switch (currentState())
251    {
252        case eCHECKING:
253            onCheckProcessfinished(exitCode);
254            break;
255        case eUPDATING:
256            onUpdateProcessfinished(exitCode);
257            break;
258        default:
259            break;
260    }
261}
Note: See TracBrowser for help on using the repository browser.