00001 #ifndef DATA_DELIVERY_COMM_H_ 00002 #define DATA_DELIVERY_COMM_H_ 00003 00004 #include "DTR.h" 00005 00006 namespace DataStaging { 00007 00008 class DataDeliveryCommHandler; 00009 00011 00025 class DataDeliveryComm { 00026 00027 friend class DataDeliveryCommHandler; 00028 00029 public: 00031 enum CommStatusType { 00032 CommInit, 00033 CommNoError, 00034 CommTimeout, 00035 CommClosed, 00036 CommExited, 00037 CommFailed 00038 00039 }; 00040 #pragma pack(4) 00041 00042 struct Status { 00043 CommStatusType commstatus; 00044 time_t timestamp; 00045 DTRStatus::DTRStatusType status; 00046 DTRErrorStatus::DTRErrorStatusType error; 00047 DTRErrorStatus::DTRErrorLocation error_location; 00048 char error_desc[256]; 00049 unsigned int streams; 00050 unsigned long long int transferred; 00051 unsigned long long int offset; 00052 unsigned long long int size; 00053 unsigned int speed; 00054 char checksum[128]; 00055 }; 00056 #pragma pack() 00057 00058 protected: 00059 00061 Status status_; 00063 Status status_buf_; 00065 unsigned int status_pos_; 00067 Glib::Mutex lock_; 00069 DataDeliveryCommHandler* handler_; 00071 std::string dtr_id; 00073 TransferParameters transfer_params; 00075 Arc::Time start_; 00077 DTRLogger logger_; 00078 00080 00085 virtual void PullStatus() = 0; 00086 00088 00090 DataDeliveryComm(DTR_ptr dtr, const TransferParameters& params); 00091 00092 public: 00094 static DataDeliveryComm* CreateInstance(DTR_ptr dtr, const TransferParameters& params); 00095 00097 virtual ~DataDeliveryComm() {}; 00098 00100 Status GetStatus() const; 00101 00105 static bool CheckComm(DTR_ptr dtr, std::vector<std::string>& allowed_dirs); 00106 00108 std::string GetError() const { return status_.error_desc; }; 00109 00111 virtual operator bool() const = 0; 00113 virtual bool operator!() const = 0; 00114 }; 00115 00117 class DataDeliveryCommHandler { 00118 00119 private: 00120 Glib::Mutex lock_; 00121 static void func(void* arg); 00122 std::list<DataDeliveryComm*> items_; 00123 static DataDeliveryCommHandler* comm_handler; 00124 00126 DataDeliveryCommHandler(); 00127 DataDeliveryCommHandler(const DataDeliveryCommHandler&); 00128 DataDeliveryCommHandler& operator=(const DataDeliveryCommHandler&); 00129 00130 public: 00131 ~DataDeliveryCommHandler() {}; 00133 void Add(DataDeliveryComm* item); 00135 void Remove(DataDeliveryComm* item); 00137 static DataDeliveryCommHandler* getInstance(); 00138 }; 00139 00140 } // namespace DataStaging 00141 00142 #endif // DATA_DELIVERY_COMM_H_