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