winix/plugins/ticket/ticketparser.cpp

437 lines
7.6 KiB
C++
Executable File

/*
* This file is a part of Winix
* and is not publicly distributed
*
* Copyright (c) 2010, Tomasz Sowa
* All rights reserved.
*
*/
#include "ticketparser.h"
#include "core/log.h"
#include "core/misc.h"
bool TicketParser::IsWhite(int c)
{
return (c==' ' || c=='\t' || c==13);
}
void TicketParser::SkipLine()
{
while( *pchar!=0 && *pchar!=10 )
pchar += 1;
}
void TicketParser::SkipWhite()
{
while( IsWhite(*pchar) || *pchar=='#' )
{
if( *pchar=='#' )
SkipLine();
else
pchar += 1;
}
}
void TicketParser::SkipWhiteLines()
{
while( IsWhite(*pchar) || *pchar == 10 || *pchar=='#' )
{
if( *pchar=='#' )
SkipLine();
else
pchar += 1;
}
}
void TicketParser::ReadTextQuoted(std::wstring & text)
{
pchar += 1;
while( *pchar!=0 && *pchar!=10 && *pchar!='\"' )
{
if( *pchar == '\\' )
pchar += 1;
text += *pchar;
pchar += 1;
}
if( *pchar == '\"' )
pchar += 1;
}
void TicketParser::ReadTextSimple(std::wstring & text, bool comma_separator)
{
while( *pchar!=0 && *pchar!=10 && !IsWhite(*pchar) && *pchar!='(' && *pchar!=')' &&
(!comma_separator || *pchar!=',' ) )
{
text += *pchar;
pchar += 1;
}
}
void TicketParser::ReadText(std::wstring & text, bool comma_separator)
{
SkipWhite();
text.clear();
if( *pchar == '\"' )
ReadTextQuoted(text);
else
ReadTextSimple(text, comma_separator);
}
void TicketParser::CheckId(int & id, bool & def)
{
if( *pchar != '(' )
return;
// dont set id and def here
// there are only changed if exists
pchar += 1;
while( *pchar!=0 && *pchar!=10 && *pchar!=')' )
{
ReadText(id_str, true);
if( id_str == L"def" )
def = true;
else
id = Toi(id_str);
if( *pchar == ',' )
pchar += 1;
}
if( *pchar == ')' )
pchar += 1;
}
bool TicketParser::ReadItemType()
{
ReadText(type);
if( type.empty() )
return false;
if( type == L"integer" )
item.type = TicketConf::TicketItem::TypeInteger;
else
if( type == L"progress" )
item.type = TicketConf::TicketItem::TypeProgress;
else
if( type == L"select" )
item.type = TicketConf::TicketItem::TypeSelect;
else
if( type == L"string" )
item.type = TicketConf::TicketItem::TypeString;
else
if( type == L"multistring" ) // !! nie skonczone jeszcze?
item.type = TicketConf::TicketItem::TypeMultistring;
else
if( type == L"images" )
item.type = TicketConf::TicketItem::TypeImages;
else
if( type == L"files" )
item.type = TicketConf::TicketItem::TypeFiles;
else
{
error = WINIX_TICKET_ERR_UKNOWN_TYPE;
return false;
}
return true;
}
void TicketParser::SetItemId()
{
int id;
bool def;
id = (!pconf->tab.empty()) ? pconf->tab.back().id + 1 : 0;
CheckId(id, def);
item.id = id;
}
bool TicketParser::ReadItemName()
{
ReadText(item.name);
if( item.name.empty() )
{
error = WINIX_TICKET_ERR_NO_ITEM_NAME;
return false;
}
return true;
}
void TicketParser::ReadItemInteger()
{
ReadText(int_min);
ReadText(int_max);
if( !int_min.empty() )
item.integer_min = Toi(int_min);
if( !int_max.empty() )
item.integer_max = Toi(int_max);
}
void TicketParser::ReadItemSelect()
{
bool def;
while( *pchar!=0 && *pchar!=10 )
{
ReadText(select.name);
select.id = (!item.select.empty()) ? item.select.back().id + 1 : 0;
def = false;
CheckId(select.id, def);
if( !select.name.empty() )
{
item.select.push_back(select);
if( def )
item.select_default = item.select.size() - 1;
}
}
}
void TicketParser::ReadItemString()
{
}
bool TicketParser::ReadItemFiles()
{
ReadText(item.upload_dir);
if( item.upload_dir.empty() )
{
error = WINIX_TICKET_ERR_NO_UPLOAD_DIR;
return false;
}
ReadText(int_max);
if( !int_max.empty() )
item.max_files = Toi(int_max);
return true;
}
bool TicketParser::CheckEndLine()
{
SkipWhite();
if( *pchar != 0 && *pchar != 10 )
{
error = WINIX_TICKET_ERR_SYNTAX_ERROR;
return false;
}
return true;
}
bool TicketParser::ReadItem()
{
SkipWhiteLines();
item.Clear();
if( !ReadItemType() )
return false;
SetItemId();
if( !ReadItemName() )
return false;
if( item.type == TicketConf::TicketItem::TypeInteger )
ReadItemInteger();
else
if( item.type == TicketConf::TicketItem::TypeProgress )
ReadItemInteger();
else
if( item.type == TicketConf::TicketItem::TypeSelect )
ReadItemSelect();
else
if( item.type == TicketConf::TicketItem::TypeString || item.type == TicketConf::TicketItem::TypeMultistring )
ReadItemString();
else
if( item.type == TicketConf::TicketItem::TypeImages || item.type == TicketConf::TicketItem::TypeFiles )
if( !ReadItemFiles() )
return false;
if( !CheckEndLine() )
return false;
return true;
}
void TicketParser::LogItemInteger(TicketConf::TicketItem & item)
{
log << log3 << "TicketParser: item_type: integer"
<< ", item_name: " << item.name
<< ", item_id: " << item.id
<< ", min: " << item.integer_min
<< ", max: " << item.integer_max
<< logend;
}
void TicketParser::LogItemProgress(TicketConf::TicketItem & item)
{
log << log3 << "TicketParser: item_type: progress"
<< ", item_name: " << item.name
<< ", item_id: " << item.id
<< ", min: " << item.integer_min
<< ", max: " << item.integer_max
<< logend;
}
void TicketParser::LogItemSelect(TicketConf::TicketItem & item)
{
log << log3 << "TicketParser: item_type: select"
<< ", item_name: " << item.name
<< ", item_id: " << item.id
<< ", options: ";
for(size_t i=0 ; i<item.select.size() ; ++i)
{
log << item.select[i].name << "(" << item.select[i].id;
if( item.select_default == i )
log << ", def";
log << ")";
if( i+1 < item.select.size() )
log << ", ";
}
log << logend;
}
void TicketParser::LogItemString(TicketConf::TicketItem & item)
{
log << log3 << "TicketParser: item_type: string"
<< ", item_name: " << item.name
<< ", item_id: " << item.id
<< logend;
}
void TicketParser::LogItemMultistring(TicketConf::TicketItem & item)
{
log << log3 << "TicketParser: item_type: multistring"
<< ", item_name: " << item.name
<< ", item_id: " << item.id
<< logend;
}
void TicketParser::LogItemImages(TicketConf::TicketItem & item)
{
log << log3 << "TicketParser: item_type: images"
<< ", item_name: " << item.name
<< ", item_id: " << item.id
<< ", item_upload_dir: " << item.upload_dir
<< logend;
}
void TicketParser::LogItemFiles(TicketConf::TicketItem & item)
{
log << log3 << "TicketParser: item_type: files"
<< ", item_name: " << item.name
<< ", item_id: " << item.id
<< ", item_upload_dir: " << item.upload_dir
<< logend;
}
void TicketParser::LogItem(TicketConf::TicketItem & item)
{
if( item.type == TicketConf::TicketItem::TypeInteger )
LogItemInteger(item);
else
if( item.type == TicketConf::TicketItem::TypeProgress )
LogItemProgress(item);
else
if( item.type == TicketConf::TicketItem::TypeSelect )
LogItemSelect(item);
else
if( item.type == TicketConf::TicketItem::TypeString )
LogItemString(item);
else
if( item.type == TicketConf::TicketItem::TypeMultistring )
LogItemMultistring(item);
else
if( item.type == TicketConf::TicketItem::TypeImages )
LogItemImages(item);
else
if( item.type == TicketConf::TicketItem::TypeFiles )
LogItemFiles(item);
else
log << log1 << "TicketParser: unknown item type" << logend;
}
int TicketParser::Parse(const wchar_t * str, TicketConf & conf)
{
pchar = str;
pconf = &conf;
error = WINIX_TICKET_ERR_OK;
conf.Clear();
while( ReadItem() )
{
conf.tab.push_back(item);
LogItem(item);
}
if( error != WINIX_TICKET_ERR_OK )
{
log << log1 << "TicketParser: some errors occured during parsing the config (clearing the table)" << logend;
conf.Clear();
}
return error;
}
int TicketParser::Parse(const std::wstring & str, TicketConf & conf)
{
return Parse(str.c_str(), conf);
}