diff options
Diffstat (limited to 'kfile-plugins/sid')
-rw-r--r-- | kfile-plugins/sid/Makefile.am | 22 | ||||
-rw-r--r-- | kfile-plugins/sid/kfile_sid.cpp | 227 | ||||
-rw-r--r-- | kfile-plugins/sid/kfile_sid.desktop | 60 | ||||
-rw-r--r-- | kfile-plugins/sid/kfile_sid.h | 42 |
4 files changed, 351 insertions, 0 deletions
diff --git a/kfile-plugins/sid/Makefile.am b/kfile-plugins/sid/Makefile.am new file mode 100644 index 00000000..5a3c33e1 --- /dev/null +++ b/kfile-plugins/sid/Makefile.am @@ -0,0 +1,22 @@ +## Makefile.am for sid file meta info plugin + +# set the include path for X, qt and KDE +INCLUDES = $(all_includes) $(taglib_includes) + +# these are the headers for your project +noinst_HEADERS = kfile_sid.h + +kde_module_LTLIBRARIES = kfile_sid.la + +kfile_sid_la_SOURCES = kfile_sid.cpp +kfile_sid_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN) +kfile_sid_la_LIBADD = $(LIB_KIO) + +# let automoc handle all of the meta source files (moc) +METASOURCES = AUTO + +messages: rc.cpp + $(XGETTEXT) kfile_sid.cpp -o $(podir)/kfile_sid.pot + +services_DATA = kfile_sid.desktop +servicesdir = $(kde_servicesdir) diff --git a/kfile-plugins/sid/kfile_sid.cpp b/kfile-plugins/sid/kfile_sid.cpp new file mode 100644 index 00000000..92b03c30 --- /dev/null +++ b/kfile-plugins/sid/kfile_sid.cpp @@ -0,0 +1,227 @@ +/* This file is part of the KDE project + * Copyright (C) 2003 Rolf Magnus <ramagnus@kde.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "kfile_sid.h" + +#include <klocale.h> +#include <kgenericfactory.h> +#include <kstringvalidator.h> +#include <kdebug.h> + +#include <qfile.h> +#include <qvalidator.h> +#include <qwidget.h> + +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +typedef KGenericFactory<KSidPlugin> SidFactory; + +K_EXPORT_COMPONENT_FACTORY(kfile_sid, SidFactory("kfile_sid")) + +KSidPlugin::KSidPlugin(QObject *parent, const char *name, + const QStringList &args) + + : KFilePlugin(parent, name, args) +{ + kdDebug(7034) << "sid plugin\n"; + + KFileMimeTypeInfo* info = addMimeTypeInfo("audio/prs.sid"); + + KFileMimeTypeInfo::GroupInfo* group = 0L; + + // General group + group = addGroupInfo(info, "General", i18n("General")); + + KFileMimeTypeInfo::ItemInfo* item; + + item = addItemInfo(group, "Title", i18n("Title"), QVariant::String); + setAttributes(item, KFileMimeTypeInfo::Modifiable); + setHint(item, KFileMimeTypeInfo::Name); + + item = addItemInfo(group, "Artist", i18n("Artist"), QVariant::String); + setAttributes(item, KFileMimeTypeInfo::Modifiable); + setHint(item, KFileMimeTypeInfo::Author); + + item = addItemInfo(group, "Copyright", i18n("Copyright"), QVariant::String); + setAttributes(item, KFileMimeTypeInfo::Modifiable); + setHint(item, KFileMimeTypeInfo::Description); + + // technical group + group = addGroupInfo(info, "Technical", i18n("Technical Details")); + + item = addItemInfo(group, "Version", i18n("Version"), QVariant::Int); + setPrefix(item, i18n("PSID v")); + + addItemInfo(group, "Number of Songs", i18n("Number of Songs"), QVariant::Int); + item = addItemInfo(group, "Start Song", i18n("Start Song"), QVariant::Int); +} + +bool KSidPlugin::readInfo(KFileMetaInfo& info, uint /*what*/) +{ + if ( info.path().isEmpty() ) // remote file + return false; + QFile file(info.path()); + if ( !file.open(IO_ReadOnly) ) + return false; + + int version; + int num_songs; + int start_song; + QString name; + QString artist; + QString copyright; + + char buf[64] = { 0 }; + + if (4 != file.readBlock(buf, 4)) + return false; + if (strncmp(buf, "PSID", 4)) + return false; + + //read version + int ch; + if (0 > (ch = file.getch())) + return false; + version = ch << 8; + if (0 > (ch = file.getch())) + return false; + version+= ch; + + //read number of songs + file.at(0xE); + if (0 > (ch = file.getch())) + return false; + num_songs = ch << 8; + if (0 > (ch = file.getch())) + return false; + num_songs += ch; + + //start song + if (0 > (ch = file.getch())) + return false; + start_song = ch << 8; + if (0 > (ch = file.getch())) + return false; + start_song += ch; + + //name + file.at(0x16); + if (32 != file.readBlock(buf, 32)) + return false; + name = buf; + + //artist + if (32 != file.readBlock(buf, 32)) + return false; + artist = buf; + + //copyright + if (32 != file.readBlock(buf, 32)) + return false; + copyright = buf; + + QString TODO("TODO"); + kdDebug(7034) << "sid plugin readInfo\n"; + + KFileMetaInfoGroup general = appendGroup(info, "General"); + + appendItem(general, "Title", name); + appendItem(general, "Artist", artist); + appendItem(general, "Copyright", copyright); + + KFileMetaInfoGroup tech = appendGroup(info, "Technical"); + + appendItem(tech, "Version", version); + appendItem(tech, "Number of Songs", num_songs); + appendItem(tech, "Start Song", start_song); + + kdDebug(7034) << "reading finished\n"; + return true; +} + +bool KSidPlugin::writeInfo(const KFileMetaInfo& info) const +{ + kdDebug(7034) << k_funcinfo << endl; + + char name[32] = {0}; + char artist[32] = {0}; + char copyright[32] = {0}; + + int file = 0; + QString s; + + KFileMetaInfoGroup group = info.group("General"); + if (!group.isValid()) + goto failure; + + s = group.item("Title").value().toString(); + if (s.isNull()) goto failure; + strncpy(name, s.local8Bit(), 31); + + s = group.item("Artist").value().toString(); + if (s.isNull()) goto failure; + strncpy(artist, s.local8Bit(), 31); + + s = group.item("Copyright").value().toString(); + if (s.isNull()) goto failure; + strncpy(copyright, s.local8Bit(), 31); + + kdDebug(7034) << "Opening sid file " << info.path() << endl; + file = ::open(QFile::encodeName(info.path()), O_WRONLY); + //name + if (-1 == ::lseek(file, 0x16, SEEK_SET)) + goto failure; + if (32 != ::write(file, name, 32)) + goto failure; + + //artist + if (32 != ::write(file, artist, 32)) + goto failure; + + //copyright + if (32 != write(file, copyright, 32)) + goto failure; + + close(file); + return true; + +failure: + if (file) close(file); + kdDebug(7034) << "something went wrong writing to sid file\n"; + return false; +} + +QValidator* +KSidPlugin::createValidator(const QString& /*mimetype*/, const QString& group, + const QString& /*key*/, QObject* parent, + const char* name) const +{ + kdDebug(7034) << k_funcinfo << endl; + // all items in "General" group are strings of max lenght 31 + if (group == "General") + return new QRegExpValidator(QRegExp(".{,31}"), parent, name); + // all others are read-only + return 0; +} + + + +#include "kfile_sid.moc" diff --git a/kfile-plugins/sid/kfile_sid.desktop b/kfile-plugins/sid/kfile_sid.desktop new file mode 100644 index 00000000..e3f29ebc --- /dev/null +++ b/kfile-plugins/sid/kfile_sid.desktop @@ -0,0 +1,60 @@ +[Desktop Entry] +Type=Service +Name=SID Info +Name[bg]=Информация за SID +Name[br]=Titouroù SID +Name[bs]=SID informacije +Name[ca]=Informació SID +Name[cs]=SID info +Name[cy]=Gwybodaeth SID +Name[da]=SID-info +Name[de]=SID-Info +Name[el]=Πληροφορίες SID +Name[eo]=SID-informo +Name[es]=Info SID +Name[et]=SID info +Name[eu]=SID informazioa +Name[fa]=اطلاعات SID +Name[fi]=SID-tiedot +Name[fr]=Informations SID +Name[ga]=Eolas faoi SID +Name[gl]=Información SID +Name[he]=מידע SID +Name[hu]=SID-jellemzők +Name[is]=SID upplýsingar +Name[it]=Informazioni SID +Name[ja]=SID 情報 +Name[kk]=SID мәліметі +Name[km]=ព័ត៌មាន SID +Name[ko]=SID 정보 +Name[lt]=SID Informacija +Name[mk]=SID информации +Name[nb]=SID-info +Name[nds]=SID-Info +Name[ne]=एसआईडी सूचना +Name[nl]=SID-informatie +Name[nn]=SID-info +Name[pa]=SID ਜਾਣਕਾਰੀ +Name[pl]=Informacja CD +Name[pt]=Informação do SID +Name[pt_BR]=Informação sobre SID +Name[ro]=Informaţii SID +Name[ru]=Сведения о SID +Name[sk]=SID info +Name[sl]=Podatki o SID +Name[sr]=Информације о SID-у +Name[sr@Latn]=Informacije o SID-u +Name[sv]=SID-information +Name[ta]=SID தகவல் +Name[tg]=SID Ахборот +Name[th]=ข้อมูล SID +Name[tr]=SID Bilgisi +Name[uk]=Інформація по SID +Name[zh_CN]=SID 信息 +Name[zh_HK]=SID 資訊 +Name[zh_TW]=SID 資訊 +ServiceTypes=KFilePlugin +X-KDE-Library=kfile_sid +MimeType=audio/prs.sid +PreferredGroups=General,Technical +PreferredItems=Title,Artist,Copyright,Number of Songs,Start Song,Version diff --git a/kfile-plugins/sid/kfile_sid.h b/kfile-plugins/sid/kfile_sid.h new file mode 100644 index 00000000..13978320 --- /dev/null +++ b/kfile-plugins/sid/kfile_sid.h @@ -0,0 +1,42 @@ +/* This file is part of the KDE project + * Copyright (C) 2003 Rolf Magnus <ramagnus@kde.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation version 2. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * $Id$ + */ + +#ifndef KFILE_SID_H +#define KFILE_SID_H + +#include <kfilemetainfo.h> + +class QStringList; + +class KSidPlugin: public KFilePlugin +{ + Q_OBJECT + +public: + KSidPlugin(QObject *parent, const char *name, const QStringList& args); + + virtual bool readInfo(KFileMetaInfo& info, uint what); + virtual bool writeInfo(const KFileMetaInfo& info) const; + QValidator* createValidator(const QString& mimetype, const QString& group, + const QString& key, QObject* parent, + const char* name) const; +}; + +#endif |