Subversion Repositories Scribus

Rev

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