00001 #ifndef _ots_WorkLoopManager_h
00002 #define _ots_WorkLoopManager_h
00003
00004 #include <toolbox/task/WorkLoop.h>
00005 #include <xgi/Method.h>
00006 #include <xoap/MessageReference.h>
00007
00008 #include <string>
00009 #include <map>
00010 #include <ctime>
00011
00012
00013 namespace ots
00014 {
00015
00016 class HttpXmlDocument;
00017 class SOAPCommand;
00018
00019 class WorkLoopManager
00020 {
00021 public:
00022 typedef unsigned long long RequestNumber;
00023
00024 WorkLoopManager (toolbox::task::ActionSignature* job);
00025 ~WorkLoopManager(void);
00026
00027
00028
00029
00030
00031
00032 HttpXmlDocument processRequest (cgicc::Cgicc& cgi);
00033 HttpXmlDocument processRequest (const xoap::MessageReference& message);
00034 bool report (toolbox::task::WorkLoop* workLoop, std::string result, float progress, bool status);
00035 bool removeProcessedRequests(void);
00036 std::string getWorkLoopRequest (toolbox::task::WorkLoop* workLoop);
00037 void translateWorkLoopName (toolbox::task::WorkLoop* workLoop, SOAPCommand& soapCommand);
00038
00039
00040 bool getRequestResult(cgicc::Cgicc &cgi, HttpXmlDocument& xmldoc);
00041 xoap::MessageReference getMessage(toolbox::task::WorkLoop* workLoop);
00042
00043 private:
00044 const std::string cWorkLoopType_;
00045 enum{maxWorkLoops = 5};
00046 enum{timeOutInSeconds = 20};
00047 struct WorkLoopStruct
00048 {
00049 toolbox::task::WorkLoop* workLoop;
00050 std::string workLoopName;
00051 std::string request;
00052 std::string result;
00053 bool done;
00054 float progress;
00055 time_t requestStartTime;
00056 time_t requestLastTimeChecked;
00057 xoap::MessageReference message;
00058 };
00059 HttpXmlDocument processRequest (std::string workLoopName, const xoap::MessageReference* message=0);
00060 bool removeWorkLoop (toolbox::task::WorkLoop* workLoop);
00061 bool removeWorkLoop (RequestNumber requestNumber);
00062 bool removeTimedOutRequests (void);
00063 std::string composeWorkLoopName (RequestNumber requestNumber, cgicc::Cgicc &cgi);
00064 std::string composeWorkLoopName (RequestNumber requestNumber, const xoap::MessageReference& message);
00065 RequestNumber getWorkLoopRequestNumber(toolbox::task::WorkLoop* workLoop);
00066 RequestNumber getWorkLoopRequestNumber(std::string workLoopName);
00067 std::string getWorkLoopRequest (std::string workLoopName);
00068
00069 std::map<RequestNumber, WorkLoopStruct> workLoops_;
00070 toolbox::task::ActionSignature* job_;
00071 unsigned long long requestNumber_;
00072 std::string requestName_;
00073 };
00074
00075 }
00076
00077 #endif