tradutorPortGlosa.cpp 3.97 KB
/**
 * 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<OuvinteTradutor*>();
            pyTradutor = new PyTradutor();
            
            // Inicia o mutex
            mutex = (pthread_mutex_t *) malloc( sizeof(pthread_mutex_t) );
            pthread_mutex_init(mutex, NULL);
            DPRINTF("Done!\n")

    }


	TradutorPortGlosa::~TradutorPortGlosa() {
            delete ouvintes;
            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<string> * traducao) {
            for (list<OuvinteTradutor*>::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<string> * vGlosa = portuguesToGlosaVector((const char *)texto);
            if (vGlosa->size() > 0)
                notificaOuvintes(vGlosa);
            free(vGlosa);
        }


        /**
         * Traduz um texto (char * input) para um vetor de tokens<string> contendo a
         * traducao para glosa
         *
         * @param input texto de entrada
         * @return vetor de string contendo os tokens em glosa traduzidos.
         **/
        vector<string> * TradutorPortGlosa::portuguesToGlosaVector(const char * input) {
            char * sGlosa;
            vector<string> * 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<string> contendo os
         * tokens da glosa
         *
         * @param sGlosa string de glosa
         * @return vetor de string contendo os tokens em glosa.
         **/
        vector<string> * TradutorPortGlosa::portuguesToGlosaVectorSplit(char * sGlosa) {

            //printf("[INFO] Glosa: %s\n", sGlosa);

            vector<string> * vGlosa = new vector<string>();
            string str(reinterpret_cast<char*>(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;
        }
}