#include #include #include "tlmpnet.h" #include "tlmpnet.m" #include "../tlmplib/tlmplib.h" class POPEN_OBJ: public ARRAY_OBJ{ public: POPENFD *pop; int noline; /*~PROTOBEG~ POPEN_OBJ */ public: POPEN_OBJ (POPENFD *_pop); ~POPEN_OBJ (void); /*~PROTOEND~ POPEN_OBJ */ }; PUBLIC POPEN_OBJ::POPEN_OBJ(POPENFD *_pop) { pop = _pop; noline = 0; } PUBLIC POPEN_OBJ::~POPEN_OBJ() { delete pop; } class POPEN_OBJS: public ARRAY{ public: /*~PROTOBEG~ POPEN_OBJS */ public: void add (POPEN_OBJ *o); POPEN_OBJ *getitem (int no)const; /*~PROTOEND~ POPEN_OBJS */ }; PUBLIC POPEN_OBJ *POPEN_OBJS::getitem(int no) const { return (POPEN_OBJ*)ARRAY::getitem(no); } PUBLIC void POPEN_OBJS::add (POPEN_OBJ *o) { ARRAY::add (o); } class POPENHANDLER_PRIVATE{ public: _F_POPENHANDLER *c; POPEN_OBJS pops; }; void _F_POPENHANDLER::oneerr (POPENFD *, const char *line) { tlmp_error (MSG_U(E_PROCERROR,"A process reported this error\n\t%s\n") ,line); } void _F_POPENHANDLER::end (POPENFD *) { } PUBLIC POPENHANDLER::POPENHANDLER (_F_POPENHANDLER &c) { priv = new POPENHANDLER_PRIVATE; priv->c = &c; } PUBLIC VIRTUAL POPENHANDLER::~POPENHANDLER () { delete priv; } /* Add a POPEN object to track. The object will be deleted when the connection end */ PUBLIC void POPENHANDLER::add (POPENFD *pop) { priv->pops.add (new POPEN_OBJ(pop)); } /* Return the number of process currently running */ PUBLIC int POPENHANDLER::getrunning () { return priv->pops.getnb(); } /* Insert the proper handle in the fd_set so a global select may be done. */ PUBLIC int POPENHANDLER::setup_select (fd_set &set, int max_handle) { for (int i=0; ipops.getnb(); i++){ POPEN_OBJ *o = priv->pops.getitem(i); max_handle = o->pop->setup (set,max_handle,-1); } return max_handle; } /* Process the work in the fd_set. */ PUBLIC void POPENHANDLER::process_select ( int select_ret, fd_set &set, long timeout) { for (int i=0; ipops.getnb(); i++){ POPEN_OBJ *o = priv->pops.getitem(i); bool ctlmsg; int ok = o->pop->process (select_ret,set,-1,ctlmsg); if (ok > 0){ char buf[1000]; while (o->pop->readout (buf,sizeof(buf)-1)!=-1){ priv->c->oneline(o->pop,buf,o->noline); o->noline++; } while (o->pop->readerr (buf,sizeof(buf)-1)!=-1){ priv->c->oneerr(o->pop,buf); } } if (o->pop->iseof()){ priv->c->end (o->pop); priv->pops.remove_del (i); i--; } } }