24 #include "themefile.h" 25 #include "lineparser.h" 26 #include "themelocale.h" 30 #include <tdeapplication.h> 31 #include <tdemessagebox.h> 32 #include <tdestandarddirs.h> 33 #include <tdelocale.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;
120 ThemeFile::ThemeFile(
const KURL& url)
121 : m_stream(0), m_locale(0), m_zip(0)
127 ThemeFile::~ThemeFile()
134 bool 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();
179 bool ThemeFile::close()
192 bool ThemeFile::isValid()
const 194 return (exists() && !m_name.isEmpty() && !m_theme.isEmpty());
197 bool ThemeFile::exists()
const 199 TQFileInfo file(m_file);
200 return file.exists();
203 TQPixmap ThemeFile::icon()
const 205 return TQPixmap(readThemeFile(m_icon));
208 bool ThemeFile::set(
const KURL &url)
210 if(!url.isLocalFile() && !url.protocol().isEmpty())
212 if(KMessageBox::warningContinueCancel(tdeApp->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(tdeApp->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, tdeApp->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);
284 void 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();
328 bool ThemeFile::canUninstall()
const 330 TQFileInfo fi(file());
331 if(fi.permission(TQFileInfo::WriteUser) ||
332 fi.permission(TQFileInfo::WriteGroup) ||
333 fi.permission(TQFileInfo::WriteOther))
338 bool ThemeFile::isThemeFile(
const TQString& filename)
const 340 TQFileInfo fileInfo(filename);
342 return fileInfo.isRelative();
345 bool 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();
361 TQByteArray ThemeFile::readThemeFile(
const TQString& filename)
const 369 m_zip->setFile(filename);
374 TQFile file(path() +
"/" + filename);
376 if(file.open(IO_ReadOnly))
387 bool 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)
404 bool ThemeFile::pythonModuleExists()
const 406 return (!m_python.isEmpty() && fileExists(m_python +
".py"));
409 TQString ThemeFile::canonicalFile(
const TQString& file)
413 return TQDir(fi.dir().canonicalPath()).filePath(fi.fileName());