/* This file is part of the KDE project * Copyright (C) 2003 Rolf Magnus * * 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 #include #include #include #include #include #include #include #include #include #include typedef KGenericFactory 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"