mpbuff.hpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef MPBUFF_HPP
  14. #define MPBUFF_HPP
  15. #ifndef mp_decl
  16. #define mp_decl DECL_IMPORT
  17. #endif
  18. #include "jutil.hpp"
  19. #include "jsocket.hpp"
  20. #include "jlog.hpp"
  21. #include "mpbase.hpp"
  22. #include "mptag.hpp"
  23. class mp_decl CMessageBuffer: public MemoryBuffer
  24. {
  25. SocketEndpoint sender;
  26. mptag_t tag;
  27. mptag_t replytag;
  28. public:
  29. CMessageBuffer() : MemoryBuffer() { init(); }
  30. CMessageBuffer(size32_t initsize) : MemoryBuffer(initsize) { init(); }
  31. CMessageBuffer(size32_t len, const void * buffer) : MemoryBuffer(len,buffer) { init(); }
  32. inline const SocketEndpoint &getSender() const { return sender; }
  33. inline void setReplyTag(mptag_t tag) { replytag = tag; } // called prior to send (use cresteReplyTag to make tag)
  34. inline mptag_t getReplyTag() { return replytag; } // called after recv to determine tag to reply to
  35. inline mptag_t getTag() { return tag; }
  36. inline void init()
  37. {
  38. tag = TAG_NULL;
  39. replytag = TAG_NULL;
  40. }
  41. inline void init(const SocketEndpoint &_sender, mptag_t _tag, mptag_t _replytag)
  42. {
  43. sender = _sender;
  44. tag = _tag;
  45. replytag = _replytag;
  46. }
  47. void transferFrom(CMessageBuffer &mb)
  48. {
  49. // endian TBD
  50. swapWith(mb);
  51. tag = mb.tag;
  52. sender = mb.sender;
  53. replytag = mb.replytag;
  54. mb.clear();
  55. }
  56. StringBuffer &getDetails(StringBuffer &buf)
  57. {
  58. StringBuffer ep;
  59. StringBuffer data;
  60. unsigned n=(length()<16)?length():16;
  61. for (unsigned i=0;i<n;i++) {
  62. if (i!=0)
  63. data.append(", ");
  64. data.append((unsigned)(byte)toByteArray()[i]);
  65. }
  66. return buf.appendf("CMessageBuffer(%8X) tag=%d, sender=%s, replytag=%d, size== %d, data head = %s", (int)(long)toByteArray(), (int)tag, sender.getUrlStr(ep).str(), (int)replytag, length(), data.str());
  67. }
  68. CMessageBuffer *clone()
  69. {
  70. // copies data (otherwise use transferFrom)
  71. CMessageBuffer *ret = new CMessageBuffer();
  72. ret->tag = tag;
  73. ret->sender = sender;
  74. ret->replytag = replytag;
  75. ret->append(length(),toByteArray());
  76. return ret;
  77. }
  78. };
  79. #endif