vtkClientServerStream.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Kitware Inc.
2 // SPDX-License-Identifier: BSD-3-Clause
15 #ifndef vtkClientServerStream_h
16 #define vtkClientServerStream_h
17 
18 #include "vtkClientServerID.h" // for vtkClientServerID
19 #include "vtkVariant.h" // for vtkVariant
20 
21 class vtkClientServerStreamInternals;
22 
24 {
25 public:
27 
31  vtkClientServerStream(vtkObjectBase* owner = nullptr);
34 
36 
42 
48  enum Commands
49  {
50  New,
56  EndOfCommands
57  };
58 
64  enum Types
65  {
92  End
93  };
94 
99  void Reserve(size_t size);
100 
104  void Reset();
105 
109  void Copy(const vtkClientServerStream* source);
110 
111  //--------------------------------------------------------------------------
112  // Stream reading methods:
113 
118  int GetNumberOfMessages() const;
119 
124  vtkClientServerStream::Commands GetCommand(int message) const;
125 
130  int GetNumberOfArguments(int message) const;
131 
136  vtkClientServerStream::Types GetArgumentType(int message, int argument) const;
137 
139 
144  int GetArgument(int message, int argument, bool* value) const;
145  int GetArgument(int message, int argument, signed char* value) const;
146  int GetArgument(int message, int argument, char* value) const;
147  int GetArgument(int message, int argument, short* value) const;
148  int GetArgument(int message, int argument, int* value) const;
149  int GetArgument(int message, int argument, long* value) const;
150  int GetArgument(int message, int argument, unsigned char* value) const;
151  int GetArgument(int message, int argument, unsigned short* value) const;
152  int GetArgument(int message, int argument, unsigned int* value) const;
153  int GetArgument(int message, int argument, unsigned long* value) const;
154  int GetArgument(int message, int argument, float* value) const;
155  int GetArgument(int message, int argument, double* value) const;
156  int GetArgument(int message, int argument, long long* value) const;
157  int GetArgument(int message, int argument, unsigned long long* value) const;
158  int GetArgument(int message, int argument, signed char* value, vtkTypeUInt32 length) const;
159  int GetArgument(int message, int argument, char* value, vtkTypeUInt32 length) const;
160  int GetArgument(int message, int argument, short* value, vtkTypeUInt32 length) const;
161  int GetArgument(int message, int argument, int* value, vtkTypeUInt32 length) const;
162  int GetArgument(int message, int argument, long* value, vtkTypeUInt32 length) const;
163  int GetArgument(int message, int argument, unsigned char* value, vtkTypeUInt32 length) const;
164  int GetArgument(int message, int argument, unsigned short* value, vtkTypeUInt32 length) const;
165  int GetArgument(int message, int argument, unsigned int* value, vtkTypeUInt32 length) const;
166  int GetArgument(int message, int argument, unsigned long* value, vtkTypeUInt32 length) const;
167  int GetArgument(int message, int argument, float* value, vtkTypeUInt32 length) const;
168  int GetArgument(int message, int argument, double* value, vtkTypeUInt32 length) const;
169  int GetArgument(int message, int argument, long long* value, vtkTypeUInt32 length) const;
170  int GetArgument(int message, int argument, unsigned long long* value, vtkTypeUInt32 length) const;
171  int GetArgument(int message, int argument, const char** value) const;
172  int GetArgument(int message, int argument, char** value) const;
173  int GetArgument(int message, int argument, vtkStdString* value) const;
174  int GetArgument(int message, int argument, std::string* value) const;
175  int GetArgument(int message, int argument, vtkClientServerStream* value) const;
176  int GetArgument(int message, int argument, vtkClientServerID* value) const;
177  int GetArgument(int message, int argument, vtkObjectBase** value) const;
179 
189  int GetArgument(int message, int& argument, vtkVariant* value) const;
190 
195  int GetArgumentLength(int message, int argument, vtkTypeUInt32* length) const;
196 
202  int GetArgumentObject(int message, int argument, vtkObjectBase** value, const char* type) const;
203 
205 
209  struct Argument
210  {
211  const unsigned char* Data;
212  size_t Size;
213  };
215 
221  vtkClientServerStream::Argument GetArgument(int message, int argument) const;
222 
229  int GetData(const unsigned char** data, size_t* length) const;
230 
231  //--------------------------------------------------------------------------
232  // Stream writing methods:
233 
235 
239  struct Array
240  {
242  vtkTypeUInt32 Length;
243  vtkTypeUInt32 Size;
244  const void* Data;
245  };
247 
249 
262 
264 
267  vtkClientServerStream& operator<<(bool value);
268  vtkClientServerStream& operator<<(char value);
269  vtkClientServerStream& operator<<(short value);
270  vtkClientServerStream& operator<<(int value);
271  vtkClientServerStream& operator<<(long value);
272  vtkClientServerStream& operator<<(signed char value);
273  vtkClientServerStream& operator<<(unsigned char value);
274  vtkClientServerStream& operator<<(unsigned short value);
275  vtkClientServerStream& operator<<(unsigned int value);
276  vtkClientServerStream& operator<<(unsigned long value);
277  vtkClientServerStream& operator<<(long long value);
278  vtkClientServerStream& operator<<(unsigned long long value);
279  vtkClientServerStream& operator<<(float value);
280  vtkClientServerStream& operator<<(double value);
281  vtkClientServerStream& operator<<(const char* value);
283 
285 
288  static vtkClientServerStream::Array InsertArray(const char*, int);
289  static vtkClientServerStream::Array InsertArray(const short*, int);
290  static vtkClientServerStream::Array InsertArray(const int*, int);
291  static vtkClientServerStream::Array InsertArray(const long*, int);
292  static vtkClientServerStream::Array InsertArray(const signed char*, int);
293  static vtkClientServerStream::Array InsertArray(const unsigned char*, int);
294  static vtkClientServerStream::Array InsertArray(const unsigned short*, int);
295  static vtkClientServerStream::Array InsertArray(const unsigned int*, int);
296  static vtkClientServerStream::Array InsertArray(const unsigned long*, int);
297  static vtkClientServerStream::Array InsertArray(const long long*, int);
298  static vtkClientServerStream::Array InsertArray(const unsigned long long*, int);
299  static vtkClientServerStream::Array InsertArray(const float*, int);
300  static vtkClientServerStream::Array InsertArray(const double*, int);
302 
308  int SetData(const unsigned char* data, size_t length);
309 
310  //--------------------------------------------------------------------------
311  // Utility methods:
312 
314 
321  static const char* GetStringFromType(vtkClientServerStream::Types type);
322  static const char* GetStringFromType(vtkClientServerStream::Types type, int index);
324 
329  static vtkClientServerStream::Types GetTypeFromString(const char* name);
330 
335  static const char* GetStringFromCommand(vtkClientServerStream::Commands cmd);
336 
342  static vtkClientServerStream::Commands GetCommandFromString(const char* name);
343 
345 
348  void Print(ostream&) const;
349  void Print(ostream&, vtkIndent) const;
350  void PrintMessage(ostream&, int message) const;
351  void PrintMessage(ostream&, int message, vtkIndent) const;
352  void PrintArgument(ostream&, int message, int argument) const;
353  void PrintArgument(ostream&, int message, int argument, vtkIndent) const;
354  void PrintArgumentValue(ostream&, int message, int argument) const;
356 
358 
361  const char* StreamToString() const;
362  void StreamToString(ostream& os) const;
364 
370  int StreamFromString(const char* str);
371 
372 protected:
373  // Write arbitrary data to the stream. Used internally.
374  vtkClientServerStream& Write(const void* data, size_t length);
375 
376  // Data parsing utilities for SetData.
377  int ParseData();
378  unsigned char* ParseCommand(
379  int order, unsigned char* data, unsigned char* begin, unsigned char* end);
380  void ParseEnd();
381  unsigned char* ParseType(int order, unsigned char* data, unsigned char* begin, unsigned char* end,
383  unsigned char* ParseValue(
384  int order, unsigned char* data, unsigned char* end, unsigned int wordSize);
385  unsigned char* ParseArray(
386  int order, unsigned char* data, unsigned char* end, unsigned int wordSize);
387  unsigned char* ParseString(int order, unsigned char* data, unsigned char* end);
388  unsigned char* ParseStream(int order, unsigned char* data, unsigned char* end);
389 
390  // Enumeration of possible byte orderings of data in the stream.
391  enum
392  {
394  LittleEndian
395  };
396 
397  // Byte swap data in the given byte order to match the current
398  // machine's byte order.
399  void PerformByteSwap(
400  int dataByteOrder, unsigned char* data, unsigned int numWords, unsigned int wordSize);
401 
402  // Get a pointer to the given value within the given message.
403  // Returns 0 if either index is out of range.
404  const unsigned char* GetValue(int message, int value) const;
405 
406  // Get the number of values in the given message. The count
407  // includes the Command and End portions of the message. Returns 0
408  // if the given index is out of range.
409  int GetNumberOfValues(int message) const;
410 
411  // Internal implementation shared between PrintArgument and
412  // PrintArgumentValue.
413  void PrintArgumentInternal(ostream&, int message, int argument, int annotate, vtkIndent) const;
414 
415  // String writing routines.
416  void StreamToString(ostream& os, vtkIndent indent) const;
417  void MessageToString(ostream& os, int m) const;
418  void MessageToString(ostream& os, int m, vtkIndent indent) const;
419  void ArgumentToString(ostream& os, int m, int a) const;
420  void ArgumentToString(ostream& os, int m, int a, vtkIndent indent) const;
421  void ArgumentValueToString(ostream& os, int m, int a, vtkIndent indent) const;
422 
423  // Allow strings without null terminators to be passed into the stream.
424  static vtkClientServerStream::Array InsertString(const char* begin, const char* end);
425 
426  // String reading routines.
427  static vtkClientServerStream::Types GetTypeFromString(const char* begin, const char* end);
428  static vtkClientServerStream::Commands GetCommandFromString(const char* begin, const char* end);
429 
430  int StreamFromStringInternal(const char* begin, const char* end);
431  int AddMessageFromString(const char* begin, const char* end, const char** next);
432  int AddArgumentFromString(const char* begin, const char* end, const char** next);
433 
434 private:
435  vtkClientServerStreamInternals* Internal;
436  friend class vtkClientServerStreamInternals;
437 };
438 
440 
445 template <class T>
447  const vtkClientServerStream& msg, int message, int argument, T** result, const char* type)
448 {
449  vtkObjectBase* obj;
450  if (msg.GetArgumentObject(message, argument, &obj, type))
451  {
452  *result = reinterpret_cast<T*>(obj);
453  return 1;
454  }
455  return 0;
456 }
458 
459 #if defined(VTK_WRAPPING_CXX)
460 // Extract the given argument of the given message as a data array.
461 // This is for use only in generated wrappers.
462 template <class T>
463 class vtkClientServerStreamDataArg
464 {
465 public:
466  // Constructor checks the argument type and length, allocates
467  // memory, and extracts the data from the message.
468  vtkClientServerStreamDataArg(const vtkClientServerStream& msg, int message, int argument)
469  : Data(nullptr)
470  {
471  // Check the argument length.
472  vtkTypeUInt32 length = 0;
473  if (msg.GetArgumentLength(message, argument, &length) && length > 0)
474  {
475  // Allocate memory without throwing.
476  try
477  {
478  this->Data = new T[length];
479  }
480  catch (...)
481  {
482  }
483  }
484 
485  // Extract the data into the allocated memory.
486  if (this->Data && !msg.GetArgument(message, argument, this->Data, length))
487  {
488  delete[] this->Data;
489  this->Data = nullptr;
490  }
491  }
492 
493  // Destructor frees data memory.
494  ~vtkClientServerStreamDataArg()
495  {
496  if (this->Data)
497  {
498  delete[] this->Data;
499  }
500  }
501 
502  // Allow this object to be passed as if it were a pointer.
503  operator T*() { return this->Data; }
504 
505 private:
506  T* Data;
507 };
508 #endif
509 
510 #endif
511 
512 // 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.
length
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...
T * operator<<(T *LHS, const pqConnect &RHS)
Makes a Qt connection.
Definition: pqConnect.h:36
Store messages for the interpreter.
ValueType GetValue(vtkIdType valueIdx) const
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.
#define VTKREMOTINGCLIENTSERVERSTREAM_EXPORT
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...