Subversion Repositories Scribus

Rev

Rev 5923 | Rev 5925 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5855 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
7
 
5866 cbradney 8
#include <qdir.h>
5855 cbradney 9
#include <qdom.h>
10
#include <qhttp.h>
11
#include <qnetwork.h>
5924 cbradney 12
#include <qwidget.h>
5855 cbradney 13
#include <iostream>
5857 cbradney 14
#include <cstdlib>
5855 cbradney 15
 
5923 cbradney 16
#include "helpbrowser.h"
5917 jghali 17
#include "scpaths.h"
5855 cbradney 18
#include "upgradechecker.h"
19
#include "upgradechecker.moc"
20
#include "prefsmanager.h"
21
#include "scribuscore.h"
22
 
5880 jghali 23
#ifdef _WIN32
24
#include <windows.h>
25
#define sleep Sleep
26
#endif
5855 cbradney 27
 
5924 cbradney 28
UpgradeChecker::UpgradeChecker()
29
 : QObject()
5855 cbradney 30
{
5924 cbradney 31
        init();
32
        writeToConsole=true;
33
}
34
 
35
UpgradeChecker::~UpgradeChecker()
36
{
37
}
38
 
39
void UpgradeChecker::init()
40
{
5855 cbradney 41
        getter=0;
42
        updates.clear();
43
        version=(VERSION);
44
        stability="unstablecvs";
45
        QString versionStripped=version.lower();
46
        isCVS=versionStripped.contains("cvs");
47
        if (isCVS)
48
                versionStripped.remove("cvs");
49
        major=versionStripped.section('.',0,0).toInt();
50
        minor=versionStripped.section('.',1,1).toInt();
51
        revision1=versionStripped.section('.',2,2).toInt();
52
        revision2=versionStripped.section('.',3,4).toInt();
53
        #if defined(Q_OS_MAC)
54
        platform="MacOSX";
55
        #elif defined(Q_OS_WIN32)
56
        platform="Win32";
57
        #else
58
        platform="X11";
59
        #endif
60
}
61
 
62
 
63
bool UpgradeChecker::fetch()
64
{
65
        QString filename("scribusversions.xml");
5917 jghali 66
        tempFile=ScPaths::getTempFileDir()+filename;
5866 cbradney 67
 
5855 cbradney 68
        fin=false;
69
 
70
        QFile file(tempFile);
71
        if (getter)
72
                delete getter;
73
        getter=new QHttp();
74
        connect (getter, SIGNAL(done(bool)), this, SLOT(fileFinished(bool)));
75
        connect (getter, SIGNAL(requestStarted(int)), this, SLOT(reqStarted(int)));
76
        connect (getter, SIGNAL(requestFinished(int, bool)), this, SLOT(reqFinished(int, bool)));
77
        retrieveError=false;
78
        getter->setHost("www.scribus.net");
79
        if (retrieveError)
80
                return true;
5923 cbradney 81
        outputText(tr("Attempting to get the Scribus version update file"));
82
        outputText(tr("(No data on your computer will be sent to an external location)"));
5866 cbradney 83
        if(!file.open(IO_ReadWrite))
5855 cbradney 84
                return true;
5866 cbradney 85
        getterID=getter->get("/downloads/"+filename, &file);
5855 cbradney 86
 
87
        int waitCount=0;
88
        while (!fin && waitCount<10 && !retrieveError)
89
        {
90
                qApp->processEvents();
91
                sleep(1);
92
                ++waitCount;
5923 cbradney 93
                if (writeToConsole)
94
                        std::cout << ". " << std::flush;
5855 cbradney 95
        }
5923 cbradney 96
        if (writeToConsole)
97
                std::cout << std::endl;
5855 cbradney 98
        getter->closeConnection();
5858 cbradney 99
        bool errorOccurred=false;
5855 cbradney 100
        if (waitCount>=10)
101
        {
5923 cbradney 102
                outputText(tr("Timed out when attempting to get update file."));
5858 cbradney 103
                errorOccurred=true;
5855 cbradney 104
        }
105
        if (retrieveError || getter->error()!=QHttp::NoError)
106
        {
5923 cbradney 107
                outputText(tr("Error when attempting to get update file: %1").arg(getter->errorString()));
5858 cbradney 108
                errorOccurred=true;
109
        }
110
        if (errorOccurred)
111
        {
5866 cbradney 112
                file.close();
5858 cbradney 113
                file.remove();
5855 cbradney 114
                return true;
115
        }
5866 cbradney 116
 
117
        file.reset();
118
        process(file);
119
        file.close();
120
        file.remove();
5855 cbradney 121
        return false;
122
}
123
 
5866 cbradney 124
bool UpgradeChecker::process( QFile& dataFile )
5855 cbradney 125
{
5866 cbradney 126
 
5855 cbradney 127
        QTextStream ts(&dataFile);
128
        ts.setEncoding(QTextStream::UnicodeUTF8);
129
        QString errorMsg;
130
        int eline;
131
        int ecol;
132
        QDomDocument doc( "scribusversions" );
133
        QString data(ts.read());
134
        if ( !doc.setContent( data, &errorMsg, &eline, &ecol ))
135
        {
136
                if (data.lower().contains("404 not found"))
5923 cbradney 137
                        outputText(tr("File not found on server"));
5855 cbradney 138
                else
5923 cbradney 139
                        outputText(tr("Could not open version file: %1\nError:%2 at line: %3, row: %4").arg(dataFile.name()).arg(errorMsg).arg(eline).arg(ecol));
5855 cbradney 140
                return false;
141
        }
5866 cbradney 142
 
5855 cbradney 143
        QDomElement docElem = doc.documentElement();
144
        QDomNode n = docElem.firstChild();
145
        while( !n.isNull() ) {
146
                QDomElement e = n.toElement();
147
                if( !e.isNull() ) {
148
                        if (e.tagName()=="release")
149
                        {
150
                                if (e.hasAttribute("stability") && e.hasAttribute("platform") && e.hasAttribute("version"))
151
                                {
152
                                        if (e.attribute("platform")==platform)
153
                                        {
154
                                                QString verA(e.attribute("version"));
155
                                                QString verAStripped=verA.lower();
156
                                                bool verIsCVS=verAStripped.contains("cvs");
157
                                                if (verIsCVS)
158
                                                        verAStripped.remove("cvs");
159
                                                uint verMajor=verAStripped.section('.',0,0).toInt();
160
                                                uint verMinor=verAStripped.section('.',1,1).toInt();
161
                                                uint verRevsion1=verAStripped.section('.',2,2).toInt();
162
                                                uint verRevsion2=verAStripped.section('.',3,3).toInt();
163
                                                if (!(verMajor==major && verMinor==minor && verRevsion1==revision1 && verRevsion2==revision2))
164
                                                {
165
                                                        if (
166
                                                                (verMajor>major) ||
167
                                                                (verMajor==major && verMinor>minor) ||
168
                                                                (verMajor==major && verMinor==minor && verRevsion1>revision1) ||
169
                                                                (verMajor==major && verMinor==minor && verRevsion1==revision1 && verRevsion2>revision2)
170
                                                                )
171
                                                                updates.append(verA);
172
                                                }
173
                                        }
174
                                }
175
                        }
176
                }
177
                n = n.nextSibling();
178
        }
179
        return true;
180
}
181
 
182
QStringList UpgradeChecker::upgradeData( )
183
{
184
        return updates;
185
}
186
 
187
void UpgradeChecker::show(bool error)
188
{
189
        if (error)
190
        {
5923 cbradney 191
                outputText(tr("An error occurred while looking for updates for Scribus, please check your internet connection."));
5855 cbradney 192
                return;
193
        }
194
        if (updates.isEmpty())
195
        {
5923 cbradney 196
                outputText(tr("No updates are available for your version of Scribus %1").arg(version));
5855 cbradney 197
                return;
198
        }
5923 cbradney 199
        outputText(tr("One or more updates for your version of Scribus (%1) are available:").arg(version));
5855 cbradney 200
 
201
        for ( QStringList::Iterator it = updates.begin(); it != updates.end(); ++it )
5923 cbradney 202
                outputText(*it);
5855 cbradney 203
}
204
 
5866 cbradney 205
void UpgradeChecker::fileFinished(bool /*error*/)
5855 cbradney 206
{
207
        fin=true;
208
}
209
 
5866 cbradney 210
void UpgradeChecker::fileStarted(bool /*error*/)
5855 cbradney 211
{
212
}
213
 
5866 cbradney 214
void UpgradeChecker::reqStarted(int /*id*/)
5855 cbradney 215
{
216
}
217
 
5866 cbradney 218
void UpgradeChecker::reqFinished(int /*id*/, bool error)
5855 cbradney 219
{
220
        retrieveError=error;
221
}
5923 cbradney 222
 
223
void UpgradeChecker::outputText(QString text)
224
{
5924 cbradney 225
        qDebug("%s", text.local8Bit().data());
226
}
227
 
228
UpgradeCheckerGUI::UpgradeCheckerGUI(QWidget *widget)
229
 : UpgradeChecker(),
230
 outputWidget(widget)
231
{
232
        writeToConsole=false;
233
}
234
 
235
UpgradeCheckerGUI::~UpgradeCheckerGUI()
236
{
237
}
238
 
239
void UpgradeCheckerGUI::outputText(QString text)
240
{
241
        TextBrowser* w=dynamic_cast<TextBrowser*>(outputWidget);
242
        if (w)
5923 cbradney 243
        {
5924 cbradney 244
                QString wText=w->text();
245
                wText.remove("<qt>");
246
                wText.remove("</qt>");
247
                w->setText("<qt>"+wText+text+"<br/>"+"</qt>");
5923 cbradney 248
        }      
249
}