25#include "lineparser.h"
26#include "themelocale.h"
30#include <tdeapplication.h>
31#include <tdemessagebox.h>
32#include <kstandarddirs.h>
34#include <tdeio/netaccess.h>
35#include <tqtextstream.h>
36#include <tqfileinfo.h>
47 void setFile(
const TQString& filename)
49 m_filename = filename;
50 if(filename.isEmpty())
53 const KArchiveEntry* entry;
55 entry = m_dir->entry(filename);
56 if(entry == 0 || !entry->isFile())
61 m_file =
static_cast<const KArchiveFile*
>(entry);
63 void setZip(
const TQString& zipfile)
67 m_zip =
new KZip(zipfile);
69 if(!m_zip->open(IO_ReadOnly))
71 tqDebug(
"Unable to open '%s' for reading.", zipfile.ascii());
74 m_dir = m_zip->directory();
77 tqDebug(
"Error reading directory contents of file %s", zipfile.ascii());
99 return m_file->data();
102 if(!m_filename.isEmpty())
103 tqDebug(
"Error reading file %s from zip", m_filename.ascii());
104 return TQByteArray();
110 return (m_file != 0);
115 const KArchiveFile* m_file;
117 const KArchiveDirectory* m_dir;
120ThemeFile::ThemeFile(
const KURL& url)
121 : m_stream(0), m_locale(0), m_zip(0)
127ThemeFile::~ThemeFile()
134bool ThemeFile::open()
142 m_zip->setFile(m_theme);
143 m_ba = m_zip->data();
146 m_stream =
new TQTextStream(m_ba, IO_ReadOnly);
152 m_fl.setName(m_file);
154 if(m_fl.open(IO_ReadOnly|IO_Translate))
156 m_stream =
new TQTextStream(&m_fl);
169 TQString result = m_stream->readLine();
179bool ThemeFile::close()
192bool ThemeFile::isValid()
const
194 return (exists() && !m_name.isEmpty() && !m_theme.isEmpty());
197bool ThemeFile::exists()
const
199 TQFileInfo file(m_file);
200 return file.exists();
203TQPixmap ThemeFile::icon()
const
205 return TQPixmap(readThemeFile(m_icon));
208bool ThemeFile::set(
const KURL &url)
210 if(!url.isLocalFile() && !url.protocol().isEmpty())
212 if(KMessageBox::warningContinueCancel(kapp->activeWindow(),
213 i18n(
"You are about to install and run %1 SuperKaramba theme. Since "
214 "themes can contain executable code you should only install themes "
215 "from sources that you trust. Continue?"), i18n(
"Executable Code Warning"), i18n(
"Install")
216 .arg(url.prettyURL()))
217 == KMessageBox::Cancel)
222 TQDir themeDir(locateLocal(
"appdata",
"themes/",
true));
223 TQFileInfo localFile = themeDir.filePath(url.fileName());
225 if(localFile.exists())
227 if(KMessageBox::warningContinueCancel(kapp->activeWindow(),
228 i18n(
"%1 already exists. Do you want to overwrite it?")
229 .arg(localFile.filePath()),i18n(
"File Exists"),i18n(
"Overwrite"))
230 == KMessageBox::Cancel)
235 if(!TDEIO::NetAccess::file_copy(url, localFile.filePath(), -1,
true,
236 false, kapp->mainWidget()))
240 m_file = localFile.filePath();
244 if(url.directory().isEmpty() || url.directory() ==
"/")
245 m_file = canonicalFile(TQDir::current().filePath(url.fileName()));
247 m_file = canonicalFile(url.path());
252 TQFileInfo fi(m_file);
254 m_name = fi.baseName( TRUE );
255 m_theme = m_name +
".theme";
259 if(isZipFile(m_file))
263 m_zip =
new ZipFile();
264 m_zip->setZip(m_file);
268 m_path = fi.dirPath(
true) +
"/";
273 TQFileInfo fimo(m_python);
274 if(m_python.isEmpty())
275 fimo.setFile(m_theme);
277 fimo.setFile(m_python);
278 m_mo = fimo.baseName( TRUE );
280 m_locale =
new ThemeLocale(
this);
284void ThemeFile::parseXml()
286 if(!fileExists(
"maindata.xml"))
288 TQByteArray ba = readThemeFile(
"maindata.xml");
289 TQDomDocument doc(
"superkaramba_theme");
291 TQDomElement element = doc.documentElement();
293 TQDomNode n = element.firstChild();
296 TQDomElement e = n.toElement();
299 if(e.tagName() ==
"name")
301 else if(e.tagName() ==
"themefile")
303 else if(e.tagName() ==
"python_module")
306 if(m_python.right(3).lower() ==
".py")
307 m_python.remove(m_python.length() - 3, 3);
309 else if(e.tagName() ==
"description")
310 m_description = e.text();
311 else if(e.tagName() ==
"author")
313 else if(e.tagName() ==
"author_email")
314 m_authorEmail = e.text();
315 else if(e.tagName() ==
"homepage")
316 m_homepage = e.text();
317 else if(e.tagName() ==
"icon")
319 else if(e.tagName() ==
"version")
320 m_version = e.text();
321 else if(e.tagName() ==
"license")
322 m_license = e.text();
328bool ThemeFile::canUninstall()
const
330 TQFileInfo fi(file());
331 if(fi.permission(TQFileInfo::WriteUser) ||
332 fi.permission(TQFileInfo::WriteGroup) ||
333 fi.permission(TQFileInfo::WriteOther))
338bool ThemeFile::isThemeFile(
const TQString& filename)
const
340 TQFileInfo fileInfo(filename);
342 return fileInfo.isRelative();
345bool ThemeFile::fileExists(
const TQString& filename)
const
347 if(isThemeFile(filename))
351 m_zip->setFile(filename);
352 return m_zip->exists();
355 return TQFileInfo(path() +
"/" + filename).exists();
358 return TQFileInfo(filename).exists();
361TQByteArray ThemeFile::readThemeFile(
const TQString& filename)
const
369 m_zip->setFile(filename);
374 TQFile file(path() +
"/" + filename);
376 if(file.open(IO_ReadOnly))
387bool ThemeFile::isZipFile(
const TQString& filename)
389 TQFile file(filename);
391 if(file.open(IO_ReadOnly))
393 unsigned char buf[5];
395 if(file.readBlock((
char*)buf, 4) == 4)
397 if(buf[0] ==
'P' && buf[1] ==
'K' && buf[2] == 3 && buf[3] == 4)
404bool ThemeFile::pythonModuleExists()
const
406 return (!m_python.isEmpty() && fileExists(m_python +
".py"));
409TQString ThemeFile::canonicalFile(
const TQString& file)
413 return TQDir(fi.dir().canonicalPath()).filePath(fi.fileName());