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