1 /**************************************************************************/ 2 /* */ 3 /* Copyright (c) 2001, 2010 NoMachine, http://www.nomachine.com/. */ 4 /* */ 5 /* NXCOMP, NX protocol compression and NX extensions to this software */ 6 /* are copyright of NoMachine. Redistribution and use of the present */ 7 /* software is allowed according to terms specified in the file LICENSE */ 8 /* which comes in the source distribution. */ 9 /* */ 10 /* Check http://www.nomachine.com/licensing.html for applicability. */ 11 /* */ 12 /* NX and NoMachine are trademarks of Medialogic S.p.A. */ 13 /* */ 14 /* All rights reserved. */ 15 /* */ 16 /**************************************************************************/ 17 18 #ifndef PutPackedImage_H 19 #define PutPackedImage_H 20 21 #include "Message.h" 22 23 // 24 // Set the verbosity level. 25 // 26 27 #define PANIC 28 #define WARNING 29 #undef TEST 30 #undef DEBUG 31 #undef DUMP 32 33 // 34 // Set default values. 35 // 36 37 #define PUTPACKEDIMAGE_ENABLE_CACHE 1 38 #define PUTPACKEDIMAGE_ENABLE_DATA 1 39 #define PUTPACKEDIMAGE_ENABLE_SPLIT 1 40 #define PUTPACKEDIMAGE_ENABLE_COMPRESS 0 41 42 // 43 // We can't exceed lenght of 262144 bytes. 44 // 45 46 #define PUTPACKEDIMAGE_DATA_LIMIT 262144 - 40 47 #define PUTPACKEDIMAGE_DATA_OFFSET 40 48 49 #define PUTPACKEDIMAGE_CACHE_SLOTS 6000 50 #define PUTPACKEDIMAGE_CACHE_THRESHOLD 70 51 #define PUTPACKEDIMAGE_CACHE_LOWER_THRESHOLD 50 52 53 #define PUTPACKEDIMAGE_CACHE_THRESHOLD_IF_PACKED_SHADOW 97 54 #define PUTPACKEDIMAGE_CACHE_LOWER_THRESHOLD_IF_PACKED_SHADOW 90 55 56 #define PUTPACKEDIMAGE_ENABLE_SPLIT_IF_PROTO_STEP_8 0 57 58 // 59 // The message class. 60 // 61 62 class PutPackedImageMessage : public Message 63 { 64 friend class PutPackedImageStore; 65 66 public: 67 PutPackedImageMessage()68 PutPackedImageMessage() 69 { 70 } 71 ~PutPackedImageMessage()72 ~PutPackedImageMessage() 73 { 74 } 75 76 // 77 // Here are the fields which constitute 78 // the 'identity' part of the message. 79 // 80 81 private: 82 83 unsigned char client; 84 85 unsigned int drawable; 86 unsigned int gcontext; 87 88 unsigned char format; 89 unsigned char method; 90 91 unsigned char src_depth; 92 unsigned char dst_depth; 93 94 unsigned int src_length; 95 unsigned int dst_length; 96 97 short int src_x; 98 short int src_y; 99 unsigned short src_width; 100 unsigned short src_height; 101 102 short int dst_x; 103 short int dst_y; 104 unsigned short dst_width; 105 unsigned short dst_height; 106 }; 107 108 class PutPackedImageStore : public MessageStore 109 { 110 // 111 // Constructors and destructors. 112 // 113 114 public: 115 116 PutPackedImageStore(StaticCompressor *compressor); 117 118 virtual ~PutPackedImageStore(); 119 name()120 virtual const char *name() const 121 { 122 return "PutPackedImage"; 123 } 124 opcode()125 virtual unsigned char opcode() const 126 { 127 return X_NXPutPackedImage; 128 } 129 storage()130 virtual unsigned int storage() const 131 { 132 return sizeof(PutPackedImageMessage); 133 } 134 135 // 136 // Very special of this class. 137 // 138 getPackedSize(const int position)139 int getPackedSize(const int position) const 140 { 141 PutPackedImageMessage *message = (PutPackedImageMessage *) (*messages_)[position]; 142 143 if (message == NULL) 144 { 145 return 0; 146 } 147 148 return dataOffset + message -> src_length; 149 } 150 getUnpackedSize(const int position)151 int getUnpackedSize(const int position) const 152 { 153 PutPackedImageMessage *message = (PutPackedImageMessage *) (*messages_)[position]; 154 155 if (message == NULL) 156 { 157 return 0; 158 } 159 160 return dataOffset + message -> dst_length; 161 } 162 163 // 164 // Message handling methods. 165 // 166 167 protected: 168 create()169 virtual Message *create() const 170 { 171 return new PutPackedImageMessage(); 172 } 173 create(const Message & message)174 virtual Message *create(const Message &message) const 175 { 176 return new PutPackedImageMessage((const PutPackedImageMessage &) message); 177 } 178 destroy(Message * message)179 virtual void destroy(Message *message) const 180 { 181 delete (PutPackedImageMessage *) message; 182 } 183 184 virtual int encodeIdentity(EncodeBuffer &encodeBuffer, const unsigned char *buffer, 185 const unsigned int size, int bigEndian, 186 ChannelCache *channelCache) const; 187 188 virtual int decodeIdentity(DecodeBuffer &decodeBuffer, unsigned char *&buffer, 189 unsigned int &size, int bigEndian, WriteBuffer *writeBuffer, 190 ChannelCache *channelCache) const; 191 192 virtual int parseIdentity(Message *message, const unsigned char *buffer, 193 unsigned int size, int bigEndian) const; 194 195 virtual int unparseIdentity(const Message *message, unsigned char *buffer, 196 unsigned int size, int bigEndian) const; 197 198 virtual void updateIdentity(EncodeBuffer &encodeBuffer, const Message *message, 199 const Message *cachedMessage, 200 ChannelCache *channelCache) const; 201 202 virtual void updateIdentity(DecodeBuffer &decodeBuffer, const Message *message, 203 ChannelCache *channelCache) const; 204 205 virtual void identityChecksum(const Message *message, const unsigned char *buffer, 206 unsigned int size, int bigEndian) const; 207 208 virtual void dumpIdentity(const Message *message) const; 209 }; 210 211 #endif /* PutPackedImage_H */ 212