/** * edit: * @author Erickson Silva * @date 14/10/2013 * */ /** * Essa classe converte portugues para Glosa * * @author Derzu Omaia * @date 21/10/2009 * */ #include "tradutorPortGlosa.h" using namespace std; namespace Tradutor { TradutorPortGlosa::TradutorPortGlosa() { ouvintes = new list(); pyTradutor = new PyTradutor(); // Inicia o mutex mutex = (pthread_mutex_t *) malloc( sizeof(pthread_mutex_t) ); pthread_mutex_init(mutex, NULL); DPRINTF("Done!\n") //Logger::Instance()->writeLogFile("ERRO"); } TradutorPortGlosa::~TradutorPortGlosa() { if (ouvintes) { ouvintes->clear(); delete ouvintes; } if (pyTradutor) delete pyTradutor; if (mutex) { int ret = pthread_mutex_destroy(mutex); if (ret) DDDPRINTF("Erro, destruindo mutex.\n"); free(mutex); } DDDPRINTF("Translator finalized!\n") } void TradutorPortGlosa::registraOuvinte(OuvinteTradutor * ouvinte) { ouvintes->push_back(ouvinte); } void TradutorPortGlosa::removeOuvinte(OuvinteTradutor * ouvinte) { ouvintes->remove(ouvinte); } void TradutorPortGlosa::notificaOuvintes(vector * traducao) { for (list::iterator i=ouvintes->begin() ; i!= ouvintes->end() ; i++){ (*i)->codifica(traducao); } } // Implemento o metodo da classe que estou ouvindo, classe ExtratorCC void TradutorPortGlosa::notificaCC(unsigned char * cc, int64_t pts) { // Mutex para evitar bug multiplas chamadas dos notificadores pthread_mutex_lock(mutex); traduz(cc); pthread_mutex_unlock(mutex); } // Implemento o metodo da classe que estou ouvindo, classe ExtratorCC void TradutorPortGlosa::chegouInput(unsigned char * texto) { // Mutex para evitar bug multiplas chamadas dos notificadores pthread_mutex_lock(mutex); traduz(texto); pthread_mutex_unlock(mutex); } void TradutorPortGlosa::traduz(unsigned char * texto) { vector * vGlosa = portuguesToGlosaVector((const char *)texto); notificaOuvintes(vGlosa); free(vGlosa); } /** * Traduz um texto (char * input) para um vetor de tokens contendo a * traducao para glosa * * @param input texto de entrada * @return vetor de string contendo os tokens em glosa traduzidos. **/ vector * TradutorPortGlosa::portuguesToGlosaVector(const char * input) { char * sGlosa; vector * vGlosa; // Faz a tradução de portugues para glosa sGlosa = pyTradutor->convertStringToGlosa(input); // Cria vetor de string contendo os tokens da glosa já traduzidos vGlosa = portuguesToGlosaVectorSplit(sGlosa); return vGlosa; } /** * Faz split de uma string (char * sGlosa) para um vector contendo os * tokens da glosa * * @param sGlosa string de glosa * @return vetor de string contendo os tokens em glosa. **/ vector * TradutorPortGlosa::portuguesToGlosaVectorSplit(char * sGlosa) { //cout << "[INFO] Glosa: " << sGlosa << endl; vector * vGlosa = new vector(); string str(reinterpret_cast(sGlosa)); int cutAt; while((cutAt = str.find_first_of(" ")) != str.npos){ if(cutAt > 0) { vGlosa->push_back(str.substr(0,cutAt)); } str = str.substr(cutAt+1); } if(str.length() > 0) { vGlosa->push_back(str); } return vGlosa; } }