blob: b44f1e67b3aa03c51d37b30e696c38caaaa1505a [file] [log] [blame]
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2010 Robert Bieber
*
* 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; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "targetdata.h"
#include <QStringList>
#include <QSettings>
const QString TargetData::reserved = "{}:#\n";
TargetData::TargetData()
{
QSettings settings;
settings.beginGroup("TargetData");
QString file = settings.value("targetDbPath", "").toString();
settings.endGroup();
if(!QFile::exists(file))
file = ":/targets/targetdb";
QFile fin(file);
fin.open(QFile::ReadOnly | QFile::Text);
/* Reading the database */
QString data = QString(fin.readAll());
fin.close();
int cursor = 0;
int index = 0;
while(cursor < data.count())
{
QString id = scanString(data, cursor);
QString name = "";
QRect size(0, 0, 0, 0);
ScreenDepth depth = None;
QRect rSize(0, 0, 0, 0);
ScreenDepth rDepth = None;
bool fm = false;
bool record = false;
if(id == "")
break;
if(!require('{', data, cursor))
break;
/* Now we have to parse each of the arguments */
while(cursor < data.count())
{
QString key = scanString(data, cursor);
if(key == "")
{
break;
}
else
{
if(!require(':', data, cursor))
break;
if(key.toLower() == "name")
{
name = scanString(data, cursor);
}
else if(key.toLower() == "screen")
{
QString s = scanString(data, cursor);
if(s[0].toLower() != 'n')
{
int subCursor = 0;
int width = scanInt(s, subCursor);
if(!require('x', s, subCursor))
break;
int height = scanInt(s, subCursor);
if(!require('@', s, subCursor))
break;
size = QRect(0, 0, width, height);
depth = scanDepth(s, subCursor);
}
}
else if(key.toLower() == "remote")
{
QString s = scanString(data, cursor);
if(s[0].toLower() != 'n')
{
int subCursor = 0;
int width = scanInt(s, subCursor);
if(!require('x', s, subCursor))
break;
int height = scanInt(s, subCursor);
if(!require('@', s, subCursor))
break;
rSize = QRect(0, 0, width, height);
rDepth = scanDepth(s, subCursor);
}
}
else if(key.toLower() == "fm")
{
QString s = scanString(data, cursor);
if(s.toLower() == "yes")
fm = true;
}
else if(key.toLower() == "record")
{
QString s = scanString(data, cursor);
if(s.toLower() == "yes")
record = true;
}
}
}
/* Checking for the closing '}' and adding the entry */
if(require('}', data, cursor))
{
entries.append(Entry(id, name, size, depth, rSize, rDepth,
fm, record));
indices.insert(id, index);
index++;
}
else
{
break;
}
}
}
TargetData::~TargetData()
{
}
QString TargetData::scanString(QString data, int &index)
{
QString retval;
/* Skipping whitespace and comments */
while(index < data.count() && (data[index].isSpace() || data[index] == '#'))
{
if(data[index] == '#')
skipComment(data, index);
else
index++;
}
while(index < data.count() && !reserved.contains(data[index]))
{
if(data[index] == '%')
{
retval.append(data[index + 1]);
index += 2;
}
else
{
retval.append(data[index]);
index++;
}
}
return retval.trimmed();
}
int TargetData::scanInt(QString data, int &index)
{
/* Skipping whitespace and comments */
while(index < data.count() && (data[index].isSpace() || data[index] == '#'))
{
if(data[index] == '#')
skipComment(data, index);
else
index++;
}
QString number;
while(index < data.count() && data[index].isDigit())
number.append(data[index++]);
return number.toInt();
}
TargetData::ScreenDepth TargetData::scanDepth(QString data, int &index)
{
QString depth = scanString(data, index);
if(depth.toLower() == "grey")
return Grey;
else if(depth.toLower() == "rgb")
return RGB;
else if(depth.toLower() == "mono")
return Mono;
else
return None;
}
void TargetData::skipComment(QString data, int &index)
{
if(data[index] != '#')
return;
while(index < data.count() && data[index] != '\n')
index++;
if(index < data.count())
index++;
}
bool TargetData::require(QChar required, QString data, int &index)
{
/* Skipping whitespace and comments */
while(index < data.count() && (data[index].isSpace() || data[index] == '#'))
{
if(data[index] == '#')
skipComment(data, index);
else
index++;
}
if(index == data.count())
{
return false;
}
else
{
if(data[index] == required)
{
index++;
return true;
}
else
{
return false;
}
}
}