tradutorPortGlosa.cpp 3.65 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"

namespace Tradutor {
	TradutorPortGlosa::TradutorPortGlosa() {
            listeners = new list<ListenerTradutor*>();
            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 listeners;
            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::addListener(ListenerTradutor* listener) {
        listeners->push_back(listener);
    }


    void TradutorPortGlosa::removeListener(ListenerTradutor* listener) {
         listeners->remove(listener);
    }


    void TradutorPortGlosa::notifyListeners(vector<string> * traducao) {
        for (list<ListenerTradutor*>::iterator i = listeners->begin() ; i != listeners->end() ; i++){
            (*i)->notifyTranslation(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.
    void TradutorPortGlosa::notifyInput(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)
            notifyListeners(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;
    }
}