00001 00002 #ifndef CChainTask_h 00003 #define CChainTask_h 1 00004 00005 // CTask 00006 #include "jic/task/CTask.hpp" 00007 #include "jic/task/CMessageBlock.hpp" 00008 00009 namespace TASK { 00010 template <class MessageType> class CTasksChainControler; 00011 00012 } // namespace TASK 00013 00014 namespace TASK { 00015 00016 // Clase que auna funcionalidad común a una cadena objetos, 00017 // y clase padre de todos los objetos de la cadena. 00018 // - El objeto no es instanciable 00019 // Notas: 00020 // - De momento solo se soporta un controlador por cadena 00021 // de produccion. 00022 // - @@ La problematica de más de 1 cotnrolador está en que 00023 // si una tarea se pone como error o se para y la siguiente 00024 // está bajo otro controlador, habrá que decidir como se 00025 // actua (pegar a esto una pensada) 00026 00027 template <class MessageType> 00028 class CChainTask : public CTask 00029 { 00030 00031 public: 00032 CChainTask(); 00033 00034 CChainTask (std::string strName, int nThreads = 1, CTasksChainControler<MessageType> *pTaskControler = 0); 00035 00036 virtual ~CChainTask(); 00037 00038 virtual EStoppingWay stoppingWay (); 00039 00040 // Se ha creado a pelusqui, ya que Rational no la generaba 00041 // correctamente automáticamente (será por lo de ser un ptr 00042 // a template). 00043 CChainTask<MessageType> * get_pNext (); 00044 00045 // Se ha creado a pelusqui, ya que Rational no la generaba 00046 // correctamente automáticamente (será por lo de ser un ptr 00047 // a template). 00048 void set_pNext (CChainTask<MessageType> *pNext); 00049 00050 // Funcion que permite a un cliente meter desde fuera 00051 // mensajes en la cola de entrada del task 00052 // Nos aseguramos que el tipo sea correcto 00053 void put(CMessageBlock<MessageType> *data); 00054 00055 // Version que se encarga de la creación del bloque 00056 void put(MessageType *data); 00057 00058 protected: 00059 00060 // Metodo a invocar para poner los mensajes en la cola de 00061 // salida 00062 void msgToOutput (ACE_Message_Block *data) /*throw (CTaskException)*/; 00063 00064 // Metodo a invocar para obtener mensajes de la cola 00065 void msgFromInput (ACE_Message_Block *&data) /*throw (CTaskException)*/; 00066 00067 virtual void preStoppingActions (); 00068 00069 // Metodo para implementar por lo hijos. Cada tipo de 00070 // componente de la cadena realizará unas acciones 00071 // especificas. 00072 // En el sólo se tratarán mensajes de tipo MB_DATA 00073 virtual void specificStep () /* throw (CTaskException) */ = 0; 00074 00075 // Additional Protected Declarations 00076 00077 private: 00078 CChainTask(const CChainTask< MessageType > &right); 00079 00080 CChainTask< MessageType > & operator=(const CChainTask< MessageType > &right); 00081 00082 void step (); 00083 00084 bool haveToStop () throw (CTaskException); 00085 00086 // Metodo para retirar un mensaje que sabemos que existe en 00087 // la cola 00088 void retrieveExistingMessage (ACE_Message_Block *&data) throw (CTaskException); 00089 00090 void putMessageToTask(CChainTask *task,ACE_Message_Block *data); 00091 00092 // Additional Private Declarations 00093 00094 private: 00095 // Data Members for Associations 00096 00097 CChainTask *m_pNext; 00098 00099 // Additional Implementation Declarations 00100 00101 }; 00102 00103 // Parameterized Class TASK::CChainTask 00104 00105 template <class MessageType> 00106 inline CChainTask<MessageType> * CChainTask<MessageType>::get_pNext () 00107 { 00108 return m_pNext; 00109 } 00110 00111 template <class MessageType> 00112 inline void CChainTask<MessageType>::set_pNext (CChainTask<MessageType> *pNext) 00113 { 00114 m_pNext = pNext; 00115 } 00116 00117 } // namespace TASK 00118 00119 #if defined (ACE_TEMPLATES_REQUIRE_SOURCE) 00120 #include "CChainTask.cpp" 00121 #endif /* ACE_TEMPLATES_REQUIRE_SOURCE */ 00122 00123 #endif