summaryrefslogtreecommitdiffstats
path: root/tdefile-plugins/sid/tdefile_sid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdefile-plugins/sid/tdefile_sid.cpp')
-rw-r--r--tdefile-plugins/sid/tdefile_sid.cpp227
1 files changed, 227 insertions, 0 deletions
diff --git a/tdefile-plugins/sid/tdefile_sid.cpp b/tdefile-plugins/sid/tdefile_sid.cpp
new file mode 100644
index 00000000..543d5b87
--- /dev/null
+++ b/tdefile-plugins/sid/tdefile_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., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "tdefile_sid.h"
+
+#include <klocale.h>
+#include <kgenericfactory.h>
+#include <kstringvalidator.h>
+#include <kdebug.h>
+
+#include <tqfile.h>
+#include <tqvalidator.h>
+#include <tqwidget.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+typedef KGenericFactory<KSidPlugin> SidFactory;
+
+K_EXPORT_COMPONENT_FACTORY(tdefile_sid, SidFactory("tdefile_sid"))
+
+KSidPlugin::KSidPlugin(TQObject *parent, const char *name,
+ const TQStringList &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"), TQVariant::String);
+ setAttributes(item, KFileMimeTypeInfo::Modifiable);
+ setHint(item, KFileMimeTypeInfo::Name);
+
+ item = addItemInfo(group, "Artist", i18n("Artist"), TQVariant::String);
+ setAttributes(item, KFileMimeTypeInfo::Modifiable);
+ setHint(item, KFileMimeTypeInfo::Author);
+
+ item = addItemInfo(group, "Copyright", i18n("Copyright"), TQVariant::String);
+ setAttributes(item, KFileMimeTypeInfo::Modifiable);
+ setHint(item, KFileMimeTypeInfo::Description);
+
+ // technical group
+ group = addGroupInfo(info, "Technical", i18n("Technical Details"));
+
+ item = addItemInfo(group, "Version", i18n("Version"), TQVariant::Int);
+ setPrefix(item, i18n("PSID v"));
+
+ addItemInfo(group, "Number of Songs", i18n("Number of Songs"), TQVariant::Int);
+ item = addItemInfo(group, "Start Song", i18n("Start Song"), TQVariant::Int);
+}
+
+bool KSidPlugin::readInfo(KFileMetaInfo& info, uint /*what*/)
+{
+ if ( info.path().isEmpty() ) // remote file
+ return false;
+ TQFile file(info.path());
+ if ( !file.open(IO_ReadOnly) )
+ return false;
+
+ int version;
+ int num_songs;
+ int start_song;
+ TQString name;
+ TQString artist;
+ TQString 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;
+
+ TQString 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;
+ TQString 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(TQFile::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;
+}
+
+TQValidator*
+KSidPlugin::createValidator(const TQString& /*mimetype*/, const TQString& group,
+ const TQString& /*key*/, TQObject* parent,
+ const char* name) const
+{
+ kdDebug(7034) << k_funcinfo << endl;
+ // all items in "General" group are strings of max length 31
+ if (group == "General")
+ return new TQRegExpValidator(TQRegExp(".{,31}"), parent, name);
+ // all others are read-only
+ return 0;
+}
+
+
+
+#include "tdefile_sid.moc"