Subversion Repositories Scribus

Rev

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