ARC SDK
DataExternalComm.h
1 // -*- indent-tabs-mode: nil -*-
2 
3 #ifndef __ARC_DATAEXTERNALCOMM_H__
4 #define __ARC_DATAEXTERNALCOMM_H__
5 
6 
7 #include <arc/Run.h>
8 #include <arc/data/FileInfo.h>
9 #include <arc/data/DataStatus.h>
10 #include <arc/UserConfig.h>
11 
12 namespace Arc {
13 
15  public:
16 
17  static char const ErrorTag;
18  static char const DataStatusTag;
19  static char const FileInfoTag;
20  static char const DataChunkTag;
21  static char const TransferStatusTag;
22 
23  template<typename T> static bool InEntry(std::istream& instream, T& entry) {
24  try {
25  instream>>entry;
26  return true;
27  } catch(std::exception const&) {
28  }
29  return false;
30  }
31 
32  template<typename T> static void OutEntry(Arc::Run& run, int timeout, T& entry) {
33  std::ostringstream ostream;
34  ostream<<entry;
35  std::string entry_str((std::ostringstream()<<entry).str());
36  run.WriteStdin(-1, entry_str.c_str(), entry_str.length());
37  }
38 
39  static char InTag(std::istream& instream);
40  static char InTag(Arc::Run& run, int timeout);
41  static bool OutTag(Arc::Run& run, int timeout, char tag);
42 
43  static bool OutEntry(std::ostream& outstream, Arc::FileInfo const& info);
44  static bool InEntry(Arc::Run& run, int timeout, Arc::FileInfo& info);
45 
47  public:
48  TransferStatus(unsigned long long int count) : bytes_count(count) {};
49  unsigned long long int bytes_count;
50  };
51  static bool OutEntry(std::ostream& outstream, TransferStatus const& info);
52  static bool InEntry(Arc::Run& run, int timeout, TransferStatus& info);
53 
54  static bool OutEntry(std::ostream& outstream, Arc::DataStatus const& status);
55  static bool InEntry(Arc::Run& run, int timeout, Arc::DataStatus& status);
56 
57  static bool OutEntry(Arc::Run& run, int timeout, Arc::UserConfig const& data);
58  static bool InEntry(std::istream& instream, Arc::UserConfig& data);
59 
61  public:
63  bool complete() const { return (size_left == 0); }
64  bool write(Arc::Run& run, int timeout, void const* data, unsigned long long int offset, unsigned long long int size) const;
65  bool read(Arc::Run& run, int timeout, void* data, unsigned long long int& offset, unsigned long long int& size);
66  private:
68  DataChunkExtBuffer& operator=(DataChunkExtBuffer const&);
69  unsigned long long int offset_left;
70  unsigned long long int size_left;
71  };
72 
74  public:
75  // Empty buffer
77  // Exteral buffer
78  DataChunkClient(void* data, unsigned long long int offset, unsigned long long int size);
79  // Move constructor
81  // Move assignment
82  DataChunkClient& operator=(DataChunkClient& other);
83  ~DataChunkClient();
84  // Copy unallocated buffer into allocated
85  DataChunkClient& MakeCopy();
86  bool write(std::ostream& outstream) const;
87  bool read(std::istream& instream);
88  bool getEOF() const { return eof; }
89  void* get() const { return data; }
90  void* release() { data_allocated = false; return data; }
91  unsigned long long int getOffset() const { return offset; }
92  unsigned long long int getSize() const { return size; }
93  private:
94  char* data;
95  bool data_allocated;
96  unsigned long long int offset;
97  unsigned long long int size;
98  bool eof;
99  };
100 
101  // This is wrapper around simple list to make code compatible with old and new compilers.
103  public:
104  typedef std::list<DataChunkClient*>::iterator chunk_iterator;
105  DataChunkClientList() {};
107  for(chunk_iterator it = chunk_list.begin(); it != chunk_list.end(); ++it) delete *it;
108  };
109  class iterator: public chunk_iterator {
110  public:
111  iterator(chunk_iterator const& other):chunk_iterator(other) {};
112  DataChunkClient& operator*() { return *(chunk_iterator::operator*()); };
113  DataChunkClient* operator->() { return chunk_iterator::operator*(); };
114  DataChunkClient* get() { return chunk_iterator::operator*(); };
115  };
116  //typedef std::list<DataChunkClient*>::iterator iterator;
117  void erase(iterator it) { delete it.get(); chunk_list.erase(it); };
118  void clear() {
119  for(chunk_iterator it = chunk_list.begin(); it != chunk_list.end(); ++it) delete *it;
120  chunk_list.clear();
121  };
122  iterator begin() { return chunk_list.begin(); };
123  iterator end() { return chunk_list.end(); };
124  bool empty() const { return chunk_list.empty(); };
125  std::size_t size() const { return chunk_list.size(); };
126  void push_back(DataChunkClient& source) { chunk_list.push_back(new DataChunkClient(source)); };
127  private:
128  std::list<DataExternalComm::DataChunkClient*> chunk_list;
129  };
130 
131  static bool OutEntry(Arc::Run& run, int timeout, DataChunkExtBuffer const& data);
132  static bool InEntry(Arc::Run& run, int timeout, DataChunkExtBuffer& data);
133  static bool OutEntry(std::ostream& outstream, DataChunkClient const& data);
134  static bool InEntry(std::istream& instream, DataChunkClient& data);
135  }; // class DataExternalComm
136 
137 } // namespace Arc
138 
139 
140 #endif // __ARC_DATAEXTERNALCOMM_H__
141 
Arc namespace contains all core ARC classes.
Definition: ArcConfig.h:11
Definition: DataExternalComm.h:73
User configuration class
Definition: UserConfig.h:196
Definition: DataExternalComm.h:60
Status code returned by many DataPoint methods.
Definition: DataStatus.h:54
Definition: DataExternalComm.h:102
Definition: DataExternalComm.h:46
int WriteStdin(int timeout, const char *buf, int size)
Write to stdin pipe of running executable.
FileInfo stores information about files (metadata).
Definition: FileInfo.h:25
This class runs an external executable.
Definition: Run.h:19
Definition: DataExternalComm.h:14