You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/tdefile-plugins/sid/tdefile_sid.cpp

228 lines
6.1 KiB

/* 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"