// main genere automatiquement par xsl // ne pas modifier // derniere mise a jour : VF le 22/10/2002 // inclusions expat #include <stdio.h> #include "expat.h" // inclusions c++ #include <string> #include "config.h" #include <map> using namespace std; #include <iostream.h> #include "toi.h" #include "toiprocessor.h" #include "toimanager.h" #include "toisegment.h" #include "sophyainit.h" #include <stdexcept> #ifndef MAXINT #define MAXINT 2147483647 #endif #include "" // classe de gestion des balises en design patern object call-back class ToiPipe { public: ToiPipe(void); virtual ~ToiPipe(); static void startElement(void *userData, const char *name, const char **atts); static void endElement(void *userData, const char *name); private: // pour concordances instances - nom map<string,TOIProcessor*> toiProc; string id; // gestionnaire de TOI TOIManager* mgr; void startElementC(const char *name, const char **atts); void endElementC(const char *name); }; ToiPipe::ToiPipe() { // Ouverture du gestionnaire de TOI. mgr = TOIManager::getManager(); // initialisation du processeur courant id=""; } ToiPipe::~ToiPipe() { } void ToiPipe::startElement(void *userData, const char *name, const char **atts) { ToiPipe *toiPipe = (ToiPipe*) userData; toiPipe->startElementC(name, atts); } void ToiPipe::endElement(void *userData, const char *name) { ToiPipe* toiPipe = (ToiPipe*) userData; toiPipe->endElementC(name); } void ToiPipe::startElementC(const char *name, const char **atts) { int i; //puts(name); // filtrage des balises if ((string)name == "connect") { // mise en ordre des arguments string nom; TOIProcessor* procin=NULL; TOIProcessor* procout=NULL; string input; string output; int taille = 1024; bool writeflag = false; for (i=0; atts[i]; i+=2) { if ((string)atts[i] == "name") { nom=atts[i+1]; } if ((string)atts[i] == "procin") { map<string,TOIProcessor*>::iterator j=toiProc.find(atts[i+1]); if (j != toiProc.end()) { procin = (*j).second; } else { throw ParmError("Connect error: processor in not found"); } } if ((string)atts[i] == "procout") { map<string,TOIProcessor*>::iterator j=toiProc.find(atts[i+1]); if (j != toiProc.end()) { procout = (*j).second; } else { throw ParmError("Connect error: processor out not found"); } } if ((string)atts[i] == "input") { input = atts[i+1]; } if ((string)atts[i] == "output") { output = atts[i+1]; } } // connection automatique des toiprocesseurs if (procin != NULL && procout != NULL ) { cout << "connect " << output << " " << input << endl; mgr->connect(*procout, output, *procin, input, nom, taille, writeflag); cout << "connect done" << endl; } } else if ((string)name == "constraint") { // si balise de contrainte TOIProcessor* proc=NULL; int min=0; int max=MAXINT; for (i=0; atts[i]; i+=2) { if ((string)atts[i] =="proc") { map<string,TOIProcessor*>::iterator j=toiProc.find(atts[i+1]); if (j != toiProc.end()) { proc = (*j).second; } else { throw ParmError("Constraint error: processor not found"); } } if ((string)atts[i] == "min") { min = atoi(atts[i+1]); } if ((string)atts[i] == "max") { max = atoi(atts[i+1]); } } cout << "setting " << proc << " " << min << " " << max << endl; proc->setRequestedSample(min, max); cout << "constraint done" << endl; } else if ((string)name == "start") { // si balise de demarrage cout << "***** Starting execution *****" << endl; mgr->startAll(); // Gestion de la re-connection des threads cout<<"***** Joining threads *****"<<endl; mgr->joinAll(); cout<<"***** End threads *****"<<endl; // destruction du toimanager et des processeurs a implementer dans toimanager pour l'utilisation de plusieurs start //TOIManager::~toimanager(); //toiProc.clear(); } else if (id == "") { // si nouveau processeur if ((string)name == "") { ; , // gestion des arguments du constructeur for (i=0; atts[i]; i+=2) { // var pour instanciation if ((string)atts[i] == "id") { id=atts[i+1]; } //initialisation des arguments par defaut si existants = ; = ""; // mise a jour des arguments if ((string)atts[i] == "") { = atoi(atts[i+1]); = atof(atts[i+1]); = atts[i+1]; } } // creation du toiprocesseur toiProc[id] = new (); } } else { // sinon c une methode // gestion des methodes if (id == "") { if ((string)name == "") { ; , // gestion des arguments de la methode for (i=0; atts[i]; i+=2) { //initialisation des arguments par defaut si existants = ; = ""; // mise a jour des arguments if ((string)atts[i] == "") { = atoi(atts[i+1]); = atof(atts[i+1]); = atts[i+1]; } } // appelle de la methode du processeur concerne ((*)toiProc[id])-> (); } } } } void ToiPipe::endElementC(const char *name) { // verification si une balise processeur est fermee pour la gestion des methodes d'initialisation if ((string)name == "") { id=""; } // execution du pipeline if ((string)name == "toipipe") { cout << "***** Starting execution *****" << endl; mgr->startAll(); // Gestion de la re-connection des threads cout<<"***** Joining threads *****"<<endl; mgr->joinAll(); cout<<"***** End threads *****"<<endl; } } int main(int argc, char *argv[]) { char buf[BUFSIZ]; XML_Parser parser = XML_ParserCreate(NULL); int done; FILE* fich=fopen(argv[1],"r"); ToiPipe* toiPipe = new ToiPipe(); // Initialisation de Sophya SophyaInit(); cout << "-- Application start --" << endl; XML_SetUserData(parser, toiPipe); XML_SetElementHandler(parser, ToiPipe::startElement, ToiPipe::endElement); if (fich != NULL) { cout << "-- Reading file --" << endl; // traitement des balises do { try { size_t len = fread(buf, 1, sizeof(buf), fich); done = len < sizeof(buf); if (!XML_Parse(parser, buf, len, done)) { fprintf(stderr, "%s at line %d\n", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser)); return 1; } } catch (PThrowable & exc) { // Sophya exceptions cout << "\ntstdemopipe: Catched Exception \n" << (string)typeid(exc).name() << " - Msg= " << exc.Msg() << endl; } catch (const std::exception & sex) { // Standard exceptions cout << "\ntstdemopipe: Catched std::exception \n" << (string)typeid(sex).name() << endl; } catch (...) { // Other exceptions cout << "\ntstdemopipe: some other exception was caught ! " << endl; } } while (!done); XML_ParserFree(parser); fclose(fich); } else { fprintf(stderr,"file not found"); return 1; } return(0); }