ParaView
vtkClientServerStream.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: ParaView
4  Module: vtkClientServerStream.h
5 
6  Copyright (c) Kitware, Inc.
7  All rights reserved.
8  See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
27 #ifndef vtkClientServerStream_h
28 #define vtkClientServerStream_h
29 
30 #include "vtkClientServerID.h"
31 #include "vtkVariant.h"
32 
33 class vtkClientServerStreamInternals;
34 
35 class VTKCLIENTSERVER_EXPORT vtkClientServerStream
36 {
37 public:
39 
43  vtkClientServerStream(vtkObjectBase* owner = 0);
46 
48 
51  vtkClientServerStream(const vtkClientServerStream&, vtkObjectBase* owner = 0);
54 
60  enum Commands
61  {
62  New,
68  EndOfCommands
69  };
70 
76  enum Types
77  {
104  End
105  };
106 
111  void Reserve(size_t size);
112 
116  void Reset();
117 
121  void Copy(const vtkClientServerStream* source);
122 
123  //--------------------------------------------------------------------------
124  // Stream reading methods:
125 
130  int GetNumberOfMessages() const;
131 
136  vtkClientServerStream::Commands GetCommand(int message) const;
137 
142  int GetNumberOfArguments(int message) const;
143 
148  vtkClientServerStream::Types GetArgumentType(int message, int argument) const;
149 
151 
156  int GetArgument(int message, int argument, bool* value) const;
157  int GetArgument(int message, int argument, signed char* value) const;
158  int GetArgument(int message, int argument, char* value) const;
159  int GetArgument(int message, int argument, short* value) const;
160  int GetArgument(int message, int argument, int* value) const;
161  int GetArgument(int message, int argument, long* value) const;
162  int GetArgument(int message, int argument, unsigned char* value) const;
163  int GetArgument(int message, int argument, unsigned short* value) const;
164  int GetArgument(int message, int argument, unsigned int* value) const;
165  int GetArgument(int message, int argument, unsigned long* value) const;
166  int GetArgument(int message, int argument, float* value) const;
167  int GetArgument(int message, int argument, double* value) const;
168 #if defined(VTK_TYPE_USE_LONG_LONG)
169  int GetArgument(int message, int argument, long long* value) const;
170  int GetArgument(int message, int argument, unsigned long long* value) const;
171 #endif
172 #if defined(VTK_TYPE_USE___INT64)
173  int GetArgument(int message, int argument, __int64* value) const;
174  int GetArgument(int message, int argument, unsigned __int64* value) const;
175 #endif
176  int GetArgument(int message, int argument, signed char* value, vtkTypeUInt32 length) const;
177  int GetArgument(int message, int argument, char* value, vtkTypeUInt32 length) const;
178  int GetArgument(int message, int argument, short* value, vtkTypeUInt32 length) const;
179  int GetArgument(int message, int argument, int* value, vtkTypeUInt32 length) const;
180  int GetArgument(int message, int argument, long* value, vtkTypeUInt32 length) const;
181  int GetArgument(int message, int argument, unsigned char* value, vtkTypeUInt32 length) const;
182  int GetArgument(int message, int argument, unsigned short* value, vtkTypeUInt32 length) const;
183  int GetArgument(int message, int argument, unsigned int* value, vtkTypeUInt32 length) const;
184  int GetArgument(int message, int argument, unsigned long* value, vtkTypeUInt32 length) const;
185  int GetArgument(int message, int argument, float* value, vtkTypeUInt32 length) const;
186  int GetArgument(int message, int argument, double* value, vtkTypeUInt32 length) const;
187 #if defined(VTK_TYPE_USE_LONG_LONG)
188  int GetArgument(int message, int argument, long long* value, vtkTypeUInt32 length) const;
189  int GetArgument(int message, int argument, unsigned long long* value, vtkTypeUInt32 length) const;
190 #endif
191 #if defined(VTK_TYPE_USE___INT64)
192  int GetArgument(int message, int argument, __int64* value, vtkTypeUInt32 length) const;
193  int GetArgument(int message, int argument, unsigned __int64* value, vtkTypeUInt32 length) const;
194 #endif
195  int GetArgument(int message, int argument, const char** value) const;
196  int GetArgument(int message, int argument, char** value) const;
197  int GetArgument(int message, int argument, vtkStdString* value) const;
198  int GetArgument(int message, int argument, std::string* value) const;
199  int GetArgument(int message, int argument, vtkClientServerStream* value) const;
200  int GetArgument(int message, int argument, vtkClientServerID* value) const;
201  int GetArgument(int message, int argument, vtkObjectBase** value) const;
203 
213  int GetArgument(int message, int& argument, vtkVariant* value) const;
214 
219  int GetArgumentLength(int message, int argument, vtkTypeUInt32* length) const;
220 
226  int GetArgumentObject(int message, int argument, vtkObjectBase** value, const char* type) const;
227 
229 
233  struct Argument
234  {
235  const unsigned char* Data;
236  size_t Size;
237  };
239 
245  vtkClientServerStream::Argument GetArgument(int message, int argument) const;
246 
253  int GetData(const unsigned char** data, size_t* length) const;
254 
255  //--------------------------------------------------------------------------
256  // Stream writing methods:
257 
259 
263  struct Array
264  {
266  vtkTypeUInt32 Length;
267  vtkTypeUInt32 Size;
268  const void* Data;
269  };
271 
273 
282  vtkClientServerStream& operator<<(vtkObjectBase*);
283  vtkClientServerStream& operator<<(const vtkStdString&);
284  vtkClientServerStream& operator<<(const vtkVariant&);
286 
288 
291  vtkClientServerStream& operator<<(bool value);
292  vtkClientServerStream& operator<<(char value);
293  vtkClientServerStream& operator<<(short value);
294  vtkClientServerStream& operator<<(int value);
295  vtkClientServerStream& operator<<(long value);
296  vtkClientServerStream& operator<<(signed char value);
297  vtkClientServerStream& operator<<(unsigned char value);
298  vtkClientServerStream& operator<<(unsigned short value);
299  vtkClientServerStream& operator<<(unsigned int value);
300  vtkClientServerStream& operator<<(unsigned long value);
301 #if defined(VTK_TYPE_USE_LONG_LONG)
302  vtkClientServerStream& operator<<(long long value);
303  vtkClientServerStream& operator<<(unsigned long long value);
304 #endif
305 #if defined(VTK_TYPE_USE___INT64)
306  vtkClientServerStream& operator<<(__int64 value);
307  vtkClientServerStream& operator<<(unsigned __int64 value);
308 #endif
309  vtkClientServerStream& operator<<(float value);
310  vtkClientServerStream& operator<<(double value);
311  vtkClientServerStream& operator<<(const char* value);
313 
315 
318  static vtkClientServerStream::Array InsertArray(const char*, int);
319  static vtkClientServerStream::Array InsertArray(const short*, int);
320  static vtkClientServerStream::Array InsertArray(const int*, int);
321  static vtkClientServerStream::Array InsertArray(const long*, int);
322  static vtkClientServerStream::Array InsertArray(const signed char*, int);
323  static vtkClientServerStream::Array InsertArray(const unsigned char*, int);
324  static vtkClientServerStream::Array InsertArray(const unsigned short*, int);
325  static vtkClientServerStream::Array InsertArray(const unsigned int*, int);
326  static vtkClientServerStream::Array InsertArray(const unsigned long*, int);
327 #if defined(VTK_TYPE_USE_LONG_LONG)
328  static vtkClientServerStream::Array InsertArray(const long long*, int);
329  static vtkClientServerStream::Array InsertArray(const unsigned long long*, int);
330 #endif
331 #if defined(VTK_TYPE_USE___INT64)
332  static vtkClientServerStream::Array InsertArray(const __int64*, int);
333  static vtkClientServerStream::Array InsertArray(const unsigned __int64*, int);
334 #endif
335  static vtkClientServerStream::Array InsertArray(const float*, int);
336  static vtkClientServerStream::Array InsertArray(const double*, int);
338 
344  int SetData(const unsigned char* data, size_t length);
345 
346  //--------------------------------------------------------------------------
347  // Utility methods:
348 
350 
357  static const char* GetStringFromType(vtkClientServerStream::Types type);
358  static const char* GetStringFromType(vtkClientServerStream::Types type, int index);
360 
365  static vtkClientServerStream::Types GetTypeFromString(const char* name);
366 
371  static const char* GetStringFromCommand(vtkClientServerStream::Commands cmd);
372 
378  static vtkClientServerStream::Commands GetCommandFromString(const char* name);
379 
381 
384  void Print(ostream&) const;
385  void Print(ostream&, vtkIndent) const;
386  void PrintMessage(ostream&, int message) const;
387  void PrintMessage(ostream&, int message, vtkIndent) const;
388  void PrintArgument(ostream&, int message, int argument) const;
389  void PrintArgument(ostream&, int message, int argument, vtkIndent) const;
390  void PrintArgumentValue(ostream&, int message, int argument) const;
392 
394 
397  const char* StreamToString() const;
398  void StreamToString(ostream& os) const;
400 
406  int StreamFromString(const char* str);
407 
408 protected:
409  // Write arbitrary data to the stream. Used internally.
410  vtkClientServerStream& Write(const void* data, size_t length);
411 
412  // Data parsing utilities for SetData.
413  int ParseData();
414  unsigned char* ParseCommand(
415  int order, unsigned char* data, unsigned char* begin, unsigned char* end);
416  void ParseEnd();
417  unsigned char* ParseType(int order, unsigned char* data, unsigned char* begin, unsigned char* end,
419  unsigned char* ParseValue(
420  int order, unsigned char* data, unsigned char* end, unsigned int wordSize);
421  unsigned char* ParseArray(
422  int order, unsigned char* data, unsigned char* end, unsigned int wordSize);
423  unsigned char* ParseString(int order, unsigned char* data, unsigned char* end);
424  unsigned char* ParseStream(int order, unsigned char* data, unsigned char* end);
425 
426  // Enumeration of possible byte orderings of data in the stream.
427  enum
428  {
430  LittleEndian
431  };
432 
433  // Byte swap data in the given byte order to match the current
434  // machine's byte order.
435  void PerformByteSwap(
436  int dataByteOrder, unsigned char* data, unsigned int numWords, unsigned int wordSize);
437 
438  // Get a pointer to the given value within the given message.
439  // Returns 0 if either index is out of range.
440  const unsigned char* GetValue(int message, int value) const;
441 
442  // Get the number of values in the given message. The count
443  // includes the Command and End portions of the message. Returns 0
444  // if the given index is out of range.
445  int GetNumberOfValues(int message) const;
446 
447  // Internal implementation shared between PrintArgument and
448  // PrintArgumentValue.
449  void PrintArgumentInternal(ostream&, int message, int argument, int annotate, vtkIndent) const;
450 
451  // String writing routines.
452  void StreamToString(ostream& os, vtkIndent indent) const;
453  void MessageToString(ostream& os, int m) const;
454  void MessageToString(ostream& os, int m, vtkIndent indent) const;
455  void ArgumentToString(ostream& os, int m, int a) const;
456  void ArgumentToString(ostream& os, int m, int a, vtkIndent indent) const;
457  void ArgumentValueToString(ostream& os, int m, int a, vtkIndent indent) const;
458 
459  // Allow strings without null terminators to be passed into the stream.
460  static vtkClientServerStream::Array InsertString(const char* begin, const char* end);
461 
462  // String reading routines.
463  static vtkClientServerStream::Types GetTypeFromString(const char* begin, const char* end);
464  static vtkClientServerStream::Commands GetCommandFromString(const char* begin, const char* end);
465 
466  int StreamFromStringInternal(const char* begin, const char* end);
467  int AddMessageFromString(const char* begin, const char* end, const char** next);
468  int AddArgumentFromString(const char* begin, const char* end, const char** next);
469 
470 private:
471  vtkClientServerStreamInternals* Internal;
472  friend class vtkClientServerStreamInternals;
473 };
474 
476 
481 template <class T>
483  const vtkClientServerStream& msg, int message, int argument, T** result, const char* type)
484 {
485  vtkObjectBase* obj;
486  if (msg.GetArgumentObject(message, argument, &obj, type))
487  {
488  *result = reinterpret_cast<T*>(obj);
489  return 1;
490  }
491  return 0;
492 }
494 
495 #if defined(VTK_WRAPPING_CXX)
496 // Extract the given argument of the given message as a data array.
497 // This is for use only in generated wrappers.
498 template <class T>
499 class vtkClientServerStreamDataArg
500 {
501 public:
502  // Constructor checks the argument type and length, allocates
503  // memory, and extracts the data from the message.
504  vtkClientServerStreamDataArg(const vtkClientServerStream& msg, int message, int argument)
505  : Data(0)
506  {
507  // Check the argument length.
508  vtkTypeUInt32 length = 0;
509  if (msg.GetArgumentLength(message, argument, &length) && length > 0)
510  {
511  // Allocate memory without throwing.
512  try
513  {
514  this->Data = new T[length];
515  }
516  catch (...)
517  {
518  }
519  }
520 
521  // Extract the data into the allocated memory.
522  if (this->Data && !msg.GetArgument(message, argument, this->Data, length))
523  {
524  delete[] this->Data;
525  this->Data = 0;
526  }
527  }
528 
529  // Destructor frees data memory.
530  ~vtkClientServerStreamDataArg()
531  {
532  if (this->Data)
533  {
534  delete[] this->Data;
535  }
536  }
537 
538  // Allow this object to be passed as if it were a pointer.
539  operator T*() { return this->Data; }
540 private:
541  T* Data;
542 };
543 #endif
544 
545 #endif
546 
547 // VTK-HeaderTest-Exclude: vtkClientServerStream.h
Proxy-object returned by InsertArray and used to insert array data into the stream.
int GetArgument(int message, int argument, bool *value) const
Get the value of the given argument in the given message.
Types
Enumeration of data types that may be stored in a stream.
Proxy-object returned by the two-argument form of GetArgument.
int GetArgumentObject(int message, int argument, vtkObjectBase **value, const char *type) const
Get the given argument in the given message as an object of a particular vtkObjectBase type...
Store messages for the interpreter.
int GetArgumentLength(int message, int argument, vtkTypeUInt32 *length) const
Get the length of an argument of an array type.
Commands
Enumeration of message types that may be stored in a stream.
VTKCLIENTSERVER_EXPORT ostream & operator<<(ostream &os, const vtkClientServerID &id)
Identifier for a ClientServer object.
int vtkClientServerStreamGetArgumentObject(const vtkClientServerStream &msg, int message, int argument, T **result, const char *type)
Get the given argument of the given message as a pointer to a vtkObjectBase instance of a specific ty...