Subversion Repositories Scribus

Rev

Rev 5857 | Rev 5866 | 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
 
8
#include <qdom.h>
9
#include <qhttp.h>
10
#include <qnetwork.h>
11
#include <iostream>
5857 cbradney 12
#include <cstdlib>
5855 cbradney 13
 
14
#include "upgradechecker.h"
15
#include "upgradechecker.moc"
16
#include "prefsmanager.h"
17
#include "scribuscore.h"
18
 
19
 
20
UpgradeChecker::UpgradeChecker()
21
 : QObject()
22
{
23
        getter=0;
24
        updates.clear();
25
        version=(VERSION);
26
        stability="unstablecvs";
27
        QString versionStripped=version.lower();
28
        isCVS=versionStripped.contains("cvs");
29
        if (isCVS)
30
                versionStripped.remove("cvs");
31
        major=versionStripped.section('.',0,0).toInt();
32
        minor=versionStripped.section('.',1,1).toInt();
33
        revision1=versionStripped.section('.',2,2).toInt();
34
        revision2=versionStripped.section('.',3,4).toInt();
35
        #if defined(Q_OS_MAC)
36
        platform="MacOSX";
37
        #elif defined(Q_OS_WIN32)
38
        platform="Win32";
39
        #else
40
        platform="X11";
41
        #endif
42
}
43
 
44
UpgradeChecker::~UpgradeChecker()
45
{
46
}
47
 
48
bool UpgradeChecker::fetch()
49
{
50
        QString filename("scribusversions.xml");
51
        QString filenameURL("http://www.scribus.net/downloads");
5858 cbradney 52
        char tmpname[L_tmpnam];
5857 cbradney 53
        tempFile="";
5858 cbradney 54
        char* tempFile2=tmpnam(tmpname);
5857 cbradney 55
        if (tempFile2==0)
56
                return true;
57
        tempFile+=tempFile2;
5855 cbradney 58
        fin=false;
59
 
60
        QFile file(tempFile);
61
        if (file.exists())
62
                file.remove();
63
        if (getter)
64
                delete getter;
65
        getter=new QHttp();
66
        connect (getter, SIGNAL(done(bool)), this, SLOT(fileFinished(bool)));
67
        connect (getter, SIGNAL(requestStarted(int)), this, SLOT(reqStarted(int)));
68
        connect (getter, SIGNAL(requestFinished(int, bool)), this, SLOT(reqFinished(int, bool)));
69
        retrieveError=false;
70
        getter->setHost("www.scribus.net");
71
        if (retrieveError)
72
                return true;
73
        qDebug(QString("Attempting to get the Scribus version update file"));
74
        qDebug(QString("(No data on your computer will be sent to an external location)"));
75
        if(!file.open(IO_WriteOnly))
76
                return true;
77
        getterID=getter->get("/downloads/scribusversions.xml", &file);
78
 
79
        int waitCount=0;
80
        while (!fin && waitCount<10 && !retrieveError)
81
        {
82
                qApp->processEvents();
83
                sleep(1);
84
                ++waitCount;
85
                std::cout << ". " << std::flush;
86
        }
87
        std::cout << std::endl;
88
        getter->closeConnection();
89
        file.close();
5858 cbradney 90
        bool errorOccurred=false;
5855 cbradney 91
        if (waitCount>=10)
92
        {
93
                qDebug(QString("Timed out when attempting to get update file."));
5858 cbradney 94
                errorOccurred=true;
5855 cbradney 95
        }
96
        if (retrieveError || getter->error()!=QHttp::NoError)
97
        {
98
                qDebug(QString("Error when attempting to get update file: %1").arg(getter->errorString()));
5858 cbradney 99
                errorOccurred=true;
100
        }
101
        if (errorOccurred)
102
        {
103
                file.remove();
5855 cbradney 104
                return true;
105
        }
106
        else
107
                process(tempFile);
108
        file.remove();
109
        return false;
110
}
111
 
112
bool UpgradeChecker::process( const QString& filename )
113
{
114
        QFile dataFile(filename);
115
        if (!dataFile.exists())
116
                return false;
117
        if ( !dataFile.open( IO_ReadOnly ) )
118
                return false;
119
        QTextStream ts(&dataFile);
120
        ts.setEncoding(QTextStream::UnicodeUTF8);
121
        QString errorMsg;
122
        int eline;
123
        int ecol;
124
        QDomDocument doc( "scribusversions" );
125
        QString data(ts.read());
126
        if ( !doc.setContent( data, &errorMsg, &eline, &ecol ))
127
        {
128
                if (data.lower().contains("404 not found"))
129
                        qDebug("%s", "File not found on server");
130
                else
131
                        qDebug("%s", QString("Could not open version file: %1\nError:%2 at line: %3, row: %4").arg(filename).arg(errorMsg).arg(eline).arg(ecol).ascii());
132
                dataFile.close();
133
                return false;
134
        }
135
        dataFile.close();
136
        QDomElement docElem = doc.documentElement();
137
 
138
        QDomNode n = docElem.firstChild();
139
        while( !n.isNull() ) {
140
                QDomElement e = n.toElement();
141
                if( !e.isNull() ) {
142
                        if (e.tagName()=="release")
143
                        {
144
                                if (e.hasAttribute("stability") && e.hasAttribute("platform") && e.hasAttribute("version"))
145
                                {
146
                                        if (e.attribute("platform")==platform)
147
                                        {
148
                                                QString verA(e.attribute("version"));
149
                                                QString verAStripped=verA.lower();
150
                                                bool verIsCVS=verAStripped.contains("cvs");
151
                                                if (verIsCVS)
152
                                                        verAStripped.remove("cvs");
153
                                                uint verMajor=verAStripped.section('.',0,0).toInt();
154
                                                uint verMinor=verAStripped.section('.',1,1).toInt();
155
                                                uint verRevsion1=verAStripped.section('.',2,2).toInt();
156
                                                uint verRevsion2=verAStripped.section('.',3,3).toInt();
157
                                                if (!(verMajor==major && verMinor==minor && verRevsion1==revision1 && verRevsion2==revision2))
158
                                                {
159
                                                        if (
160
                                                                (verMajor>major) ||
161
                                                                (verMajor==major && verMinor>minor) ||
162
                                                                (verMajor==major && verMinor==minor && verRevsion1>revision1) ||
163
                                                                (verMajor==major && verMinor==minor && verRevsion1==revision1 && verRevsion2>revision2)
164
                                                                )
165
                                                                updates.append(verA);
166
                                                }
167
                                        }
168
                                }
169
                        }
170
                }
171
                n = n.nextSibling();
172
        }
173
        return true;
174
}
175
 
176
QStringList UpgradeChecker::upgradeData( )
177
{
178
        return updates;
179
}
180
 
181
void UpgradeChecker::show(bool error)
182
{
183
        if (error)
184
        {
185
                qDebug(QString("An error occurred while looking for updates for Scribus, please check your internet connection."));
186
                return;
187
        }
188
        if (updates.isEmpty())
189
        {
190
                qDebug(QString("No updates are available for your version of Scribus %1").arg(version));
191
                return;
192
        }
193
        qDebug(QString("One or more updates for your version of Scribus (%1) are available:").arg(version));
194
 
195
        for ( QStringList::Iterator it = updates.begin(); it != updates.end(); ++it )
196
                qDebug(QString("%1").arg(*it));
197
}
198
 
199
void UpgradeChecker::fileFinished( bool error )
200
{
201
        fin=true;
202
}
203
 
204
void UpgradeChecker::fileStarted( bool error )
205
{
206
}
207
 
208
void UpgradeChecker::reqStarted(int id)
209
{
210
}
211
 
212
void UpgradeChecker::reqFinished(int id, bool error)
213
{
214
        retrieveError=error;
215
}