Subversion Repositories Scribus

Rev

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