/** ****************************************************************************** @file /common/rm/rmtxt.cpp @brief RM pristupujici k textum ve hre @author Vta @version 1.0 ******************************************************************************/ #include "common/rm/rmtxt.h" using namespace rm; // vraci samotna data (texty ze hry) char * TRM_txt::getLangDataRaw(int id) { this->lock(); char * out = this->texts->getDataRaw("text",id,NULL); this->unlock(); if (out==NULL) { GLOBALLOGID(PRIORITY_MISSING_DATA,"RMtxt: The language does not contain text having id %i",id); THROW(E_8K_RM,"RMtxt: The language does not contain specified text"); } return out; } int TRM_txt::getLangData(char * output, int size, int id) { this->lock(); int i= this->texts->getData(output,size,"text",id,NULL); this->unlock(); if (i==-1) { GLOBALLOGID(PRIORITY_MISSING_DATA,"RMtxt: non-existing language id %i",id); THROW(E_8K_RM,"RMtxt: non-existing language"); } return i; } void TRM_txt::delData(int id) { this->lock(); if (id<1) { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not remove any string having id %i < 1",id); THROW(E_8K_RM,"RMtxt: can not remove any string having id less than 1"); } int result=this->texts->getData(NULL,0,"text",id,0); if (result!=XML_ERROR_NO_SUCH_A_PATH) // jen pokud tam je { size_t sizeoffile2=100; char * file2=(char*)KMemAlloc(sizeof(char)*sizeoffile2); size_t sizeoffile=100; char * file=(char*)KMemAlloc(sizeof(char)*sizeoffile); int activelang=this->langloaded; DA langs; this->index->getListOfIds(&langs,NULL,0,NULL); int i; for (i=langs.getNext(-1);i!=-1;i=langs.getNext(i)) // pres vsechny jazyky { this->inputLangData(i); this->texts->delData(1,"text",id,NULL); this->getLangId(&file, sizeoffile, i); // vsude odstranim strpath(&file2,RESOURCES_DIR,this->rmconfi->getPack(),LANGUAGES_DIR,file,sizeoffile2,".xml"); if (this->texts->saveToFile(file2)!=XML_ERROR_OK) // zapisu { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not write to the file %s",file2); THROW(E_8K_RM,"RMtxt: can not write to a file"); } } KMemFree(file); KMemFree(file2); this->inputLangData(activelang); // vratim puvodni nacteny soubor } else { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not remove non-existing string"); THROW(E_8K_RM,"RMtxt: can not remove non-existing string"); } this->unlock(); } void TRM_txt::setData(char * data,int id) { this->lock(); int i=-1; int result=this->texts->getData(NULL,0,"text",id,0); if (result!=XML_ERROR_NO_SUCH_A_PATH) // pouze pokud tam uz je { this->texts->setData(data,"text",id,NULL); } else { THROW(E_8K_RM,"Nelze modifikovat novou prazdnou polozku"); } this->unlock(); } int TRM_txt::getNumOfLanguages() { return this->index->getNumId(); } int TRM_txt::getNumOfTexts() { return this->texts->getNumId(); } int TRM_txt::getAllTextIds(DA * ids) { this->lock(); this->texts->getListOfIds(ids,NULL,0,NULL); int ret=this->texts->getMaxId(); this->unlock(); return ret; } int TRM_txt::getAllLanguages(DA * ids,char * subtag) { this->lock(); this->index->getListOfStructs(ids,NULL,subtag,0,0,0); // NULL chci vse this->unlock(); return this->index->getMaxId(); // musi vracet MaxId neb vraci DA } int TRM_txt::addData(char * data, int id,int startid=1) { this->lock(); if (id<1) { if (id==-1) // vezmu prvni volny { if (startid<1) startid=1; int max=this->texts->getMaxId(); max++; int i; for (i=startid;itexts->getData(NULL,0,"text",i,0)==XML_ERROR_NO_SUCH_A_PATH) break; } id=i; } else { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not add a string having id %i",id); THROW(E_8K_RM,"RMtxt: can not add a string"); } } int result=this->texts->getData(NULL,0,"text",id,0); if (result==XML_ERROR_NO_SUCH_A_PATH) // pouze pokud tam jeste neni! { char * file=(char*)KMemAlloc(sizeof(char)*100); size_t sizeoffile=100; char * file2=(char*)KMemAlloc(sizeof(char)*100); size_t sizeoffile2=100; int activelang=this->langloaded; DA langs; this->index->getListOfIds(&langs,NULL,0,NULL); int i; for (i=langs.getNext(-1);i!=-1;i=langs.getNext(i)) // pridavam text do vsech { this->inputLangData(i); this->texts->setData(data,"text",id,0); this->getLangId(&file, sizeoffile, i); strpath(&file2,RESOURCES_DIR,this->rmconfi->getPack(),LANGUAGES_DIR,file,sizeoffile2,".xml"); if (this->texts->saveToFile(file2)!=XML_ERROR_OK) { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not write to the file %s",file2); THROW(E_8K_RM,"RMtxt: can not write to a file"); } } KMemFree(file); KMemFree(file2); this->inputLangData(activelang); // vratim puvodni nacteny soubor } else { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not add a string"); THROW(E_8K_RM,"RMtxt: can not add a string"); } this->unlock(); return id; } int TRM_txt::addLangDataRaw(char * language,char * code) { this->lock(); int retvalue=-1; int exists=this->index->getIdOfTagWhoseChildContains(language,0,0,0); if (exists==XML_ERROR_NO_SUCH_A_PATH) // pokud tam takovy nebyl { // printf("Existuje : %i",exists); int newLangId=1; DA daids; int j=1,max; max=this->index->getListOfIds(&daids,NULL,0,NULL); int i; for (i=1;i<=max;i++) { if (daids[i]==0) break; } newLangId=i; int activelang=this->langloaded; retvalue= (this->inputLangDataRaw(newLangId,language,code)); this->inputLangData(activelang); // vratim puvodni nacteny soubor } else { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not replace existing language having id %i",code); THROW(E_8K_RM,"RMtxt: can not replace existing language"); } this->unlock(); return retvalue; } int TRM_txt::inputLangDataRaw(int langid,char * language,char * code) { int id_loaded=langid; size_t filesize=100; int result; char *file=(char*)KMemAlloc(filesize*sizeof(char)); size_t pathsize=100; char *path=(char*)KMemAlloc(pathsize*sizeof(char)); // char pathstr[100]; this->lock(); if (this->langloaded!=id_loaded) { try { result=this->getLangId(&file,filesize,langid); // zjistim ktery soubor teda vlastne mam nacist KMemFree(file); // pro pripad vyjimky KMemFree(path); this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: language having id %i already exists",code); THROW(E_8K_RM,"RMtxt: can not replace existing language"); } catch (E_8K_RM) { if (file[0]==0) // v languages.xml neni zaznam pro takovy jazyk, vytvorim novy { this->index->setData(language,"lang",langid,"name",0,NULL); // pridam ten jeden udaj o novem jazyce this->index->setData(code,"lang",langid,"code",0,NULL); // pridam ten jeden udaj o novem jazyce if (this->saveToFile(this->rmconfi->getPack(),this->rmconfi->getLanguageFile())!=XML_ERROR_OK) { this->unlock(); GLOBALLOGID(PRIORITY_FATAL, "RMtxt: can not write to the index file"); THROW(E_8K_RM,"RMtxt: can not write to the index file"); } } } // if (result==-1) strpath(&path,RESOURCES_DIR,this->rmconfi->getPack(),LANGUAGES_DIR,language,pathsize,".xml"); // pokud existuje pro dany language soubor, nactu do RM i jazykovou sodu int retvalue=this->texts->readFile(path); // zkusim to nacist if (retvalue!=XML_ERROR_OK) // soubor s danou sadou pravdepodobne neexistuje { if (this->texts->saveToFile(path)!=XML_ERROR_OK) { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not write to the file %s",path); THROW(E_8K_RM,"RMtxt: can not write to a file"); } } this->langloaded=id_loaded; // urcite to ten file vytvorilo, takze to zacnu pouzivat, jen to bude ze zacatku prazne // co s obsahem?? nechat nebo vymazat vse?? pri pridavani by se to melo stejne vymazat! - kazdy jazyk musi mit pokryte stejne id } KMemFree(path); KMemFree(file); this->unlock(); return 0; } void TRM_txt::delLang(int iLangCode) { this->lock(); if (iLangCode<1) { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not release language having id %i < 1",iLangCode); THROW(E_8K_RM,"RMtxt: can not release language having id less than 1"); } if (this->langloaded==iLangCode) { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not remove language which is being used"); THROW(E_8K_RM,"RMtxt: can not remove language which is being used"); } int result=this->index->getData(NULL,0,"lang",iLangCode,"name",0,NULL); if (result!=XML_ERROR_NO_SUCH_A_PATH) // jen pokud tam je { this->index->delData(0,"lang",iLangCode,NULL); char * file=(char*)KMemAlloc(sizeof(char)*100); size_t sizeoffile=100; strpath(&file,RESOURCES_DIR,this->rmconfi->getPack(),XML_DIR,this->rmconfi->getLanguageFile(),sizeoffile,".xml"); int i=this->index->saveToFile(file); KMemFree(file); if (i!=XML_ERROR_OK) { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not write to the file %s",file); THROW(E_8K_RM,"RMtxt: can not write to a file"); } } else { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not release non-existing language"); THROW(E_8K_RM,"RMtxt: can not release non-existing language"); } this->unlock(); } void TRM_txt::loadData(int langid) { this->inputLangData(langid); } int TRM_txt::inputLangData(int langid) { if (langid<=0) // takovy jazyk nemuze existovat { // neni v locku GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not load language having id %i",langid); THROW(E_8K_RM,"RMtxt: Non-existing language with id less than 1"); } this->lock(); int * lang; TXMLdata * txt; lang=&(this->langloaded); // abych to mohl menit zarovens txt=this->texts; int id_loaded=langid; size_t pathsize=100; size_t filesize=100; char *path=(char*)KMemAlloc(pathsize*sizeof(char)); char *file=(char*)KMemAlloc(filesize*sizeof(char)); int retvalue; if ((*lang)!=id_loaded) { retvalue=-1; filesize=this->getLangId(&file,filesize,langid); // zjistim ktery soubor teda vlastne mam nacist retvalue=(int)filesize; // pokud existuje pro dany language soubor, nactu do RM i jazykovou sodu if (file[0]==0) // v languages.xml neni zaznam pro takovy jazyk, nastav a pouzij default { // zde neni jeste vyjimka ! GLOBALLOGID(PRIORITY_MISSING_FILE,"Can not load the language id %i, loading the default one",id_loaded); id_loaded=DEFAULT_LANGUAGE; if ((*lang)!=id_loaded) { retvalue=this->getLangId(&file,filesize,id_loaded); if (file[0]==0) // neexistuje zaznam ani o default jazyku - konec { (*lang)=-1; this->unlock(); KMemFree(path); KMemFree(file); GLOBALLOGID(PRIORITY_MISSING_FILE,"Can not load default language"); THROW(E_8K_RM,"Can not load default language"); } } } } // nactu soubor s vlastnimi daty if ((*lang)!=id_loaded) { strpath(&path,RESOURCES_DIR,this->rmconfi->getPack(),LANGUAGES_DIR,file,pathsize,".xml"); retvalue=txt->readFile(path); // nebudu to ani zabijet, protoze by se mely vsechny id prepsat!! if (retvalue!=XML_ERROR_OK) // soubor s danou sadou nelze nacist { (*lang)=-1; if (retvalue!=XML_ERROR_OK) { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"File %s is corrupted",path); KMemFree(path); KMemFree(file); THROW(E_8K_RM,"Can not load requested language"); } else { if (retvalue!=XML_ERROR_OK) { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"Can not load requested language"); KMemFree(path); KMemFree(file); THROW(E_8K_RM,"Can not load requested language"); } else // (retvalue==3) { /* this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"V souboru %s chybi DTD",path); KMemFree(path); KMemFree(file); THROW(E_8K_RM,"V nacitanem souboru chybi DTD"); */ } } } else { (*lang)=id_loaded; } } else retvalue=0; this->unlock(); KMemFree(path); KMemFree(file); return retvalue; } void TRM_txt::writeLangToFile(char *file) { char *path=(char*)KMemAlloc(100*sizeof(char)); size_t pathsize=100; strpath(&path,RESOURCES_DIR,this->rmconfi->getPack(),LANGUAGES_DIR,file,pathsize,".xml"); this->lock(); int i=this->texts->saveToFile(path); if (i!=XML_ERROR_OK) { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"Can not write to the file %s",path); KMemFree(path); THROW(E_8K_RM,"Can not write to a file"); } KMemFree(path); this->unlock(); } int TRM_txt::getLangId(char ** output, size_t &size, int id, int info) { this->lock(); int done,i=0; do { if (info==1) i=(this->index->getData(*output,(signed)size,"lang",id,"name",0,NULL)); else i=(this->index->getData(*output,(signed)size,"lang",id,"code",0,NULL)); if (i==-1) // nenaslo break; if ((i-1)>(signed)size) { if (size>0) KMemFree(*output); size=i+2; (*output)=(char*)KMemAlloc(size*sizeof(char)); done=-1; } else done=1; } while (done==-1); this->unlock(); if (i==-1) { GLOBALLOGID(PRIORITY_MISSING_DATA,"RMtxt: The record of language id %i is missing",id); THROW(E_8K_RM,"RMtxt: The record of requested language is missing"); } return i; } int TRM_txt::loadedLanguage(void) { return this->langloaded; } int TRM_txt::fileOfLoadedLanguage(char * output,size_t size) { this->lock(); int i=(this->getLangId(&output,size,this->langloaded)); if (i==-1) // nenaslo, toto by pravdepodobne nemelo vubec nastat { this->unlock(); GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: name of loaded language is missing"); THROW(E_8K_RM,"RM name of loaded language is missing"); } this->unlock(); return 0; } /* int TRM_txt::saveFileOfLanguages(char * path) { this->lock(); newandstrcpy(&(this->languages),path); this->unlock(); return 0; } */ TRM_txt::TRM_txt(TRM_conf_i * rmc) // konstruktor nema smyl zamykat... { this->rmconfi=rmc; this->texts=new TXMLdata(0); this->langloaded=0; TXMLdata files(1); TXMLdata config(1);// na nacteni config.xml char *path=(char*)KMemAlloc(100*sizeof(char)); size_t pathsize=100; int retvalue; try { strpath(&path,RESOURCES_DIR,this->rmconfi->getPack(),XML_DIR,this->rmconfi->getLanguageFile(),pathsize,".xml"); } catch (E_8K_RM) { KMemFree(path); // pro pripad vyjimky GLOBALLOGID(PRIORITY_FATAL, "files.xml is corrupted"); THROW(E_8K_RM,"files.xml is corrupted"); } retvalue=this->readInfoFile(path); // do RMtxt nactu informace kde ma hledat vsechny jazykove sady // tj. languages.xml, nikoliv cely files.xml if (retvalue!=XML_ERROR_OK) // chyba pri cteni fajlu o jazycich { GLOBALLOGID(PRIORITY_MISSING_FILE,"%s is corrupted",path); THROW(E_8K_RM,"RMtxt: The index file is corrupted"); // return retvalue; } // this->saveFileOfLanguages(path); // nacte se vychozi jazyk do language int language=this->rmconfi->getDefaultLanguage(); retvalue=this->inputLangData(language); if (retvalue!=XML_ERROR_OK) { GLOBALLOGID(PRIORITY_MISSING_FILE,"RMtxt: can not load a language"); THROW(E_8K_RM,"RMtxt: can not load a language"); // return retvalue; } KMemFree(path); GLOBALLOGID(PRIORITY_CONFIRM ,"RMtxt was created"); } TRM_txt::~TRM_txt() { delete this->rmconfi; delete this->texts; GLOBALLOGID(PRIORITY_CONFIRM ,"RMtxt was destroyed"); }