Merge pull request #170 from mfleisz/cryptofix
[platform/upstream/freerdp.git] / libfreerdp-cache / pointer.c
1 /**
2  * FreeRDP: A Remote Desktop Protocol Client
3  * Glyph Cache
4  *
5  * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 #include <freerdp/utils/stream.h>
21 #include <freerdp/utils/memory.h>
22
23 #include <freerdp/cache/pointer.h>
24
25 void update_pointer_position(rdpUpdate* update, POINTER_POSITION_UPDATE* pointer_position)
26 {
27
28 }
29
30 void update_pointer_system(rdpUpdate* update, POINTER_SYSTEM_UPDATE* pointer_system)
31 {
32
33 }
34
35 void update_pointer_color(rdpUpdate* update, POINTER_COLOR_UPDATE* pointer_color)
36 {
37
38 }
39
40 void update_pointer_new(rdpUpdate* update, POINTER_NEW_UPDATE* pointer_new)
41 {
42         rdpPointer* pointer;
43         rdpCache* cache = (rdpCache*) update->context->cache;
44
45         pointer = Pointer_Alloc(update->context);
46
47         if (pointer != NULL)
48         {
49                 pointer->xorBpp = pointer_new->xorBpp;
50                 pointer->xPos = pointer_new->colorPtrAttr.xPos;
51                 pointer->yPos = pointer_new->colorPtrAttr.yPos;
52                 pointer->width = pointer_new->colorPtrAttr.width;
53                 pointer->height = pointer_new->colorPtrAttr.height;
54                 pointer->lengthAndMask = pointer_new->colorPtrAttr.lengthAndMask;
55                 pointer->lengthXorMask = pointer_new->colorPtrAttr.lengthXorMask;
56                 pointer->xorMaskData = pointer_new->colorPtrAttr.xorMaskData;
57                 pointer->andMaskData = pointer_new->colorPtrAttr.andMaskData;
58
59                 pointer->New(update->context, pointer);
60                 pointer_cache_put(cache->pointer, pointer_new->colorPtrAttr.cacheIndex, pointer);
61                 Pointer_Set(update->context, pointer);
62         }
63 }
64
65 void update_pointer_cached(rdpUpdate* update, POINTER_CACHED_UPDATE* pointer_cached)
66 {
67         rdpPointer* pointer;
68         rdpCache* cache = (rdpCache*) update->context->cache;
69
70         pointer = pointer_cache_get(cache->pointer, pointer_cached->cacheIndex);
71         Pointer_Set(update->context, pointer);
72 }
73
74 rdpPointer* pointer_cache_get(rdpPointerCache* pointer_cache, uint16 index)
75 {
76         rdpPointer* pointer;
77
78         if (index >= pointer_cache->cacheSize)
79         {
80                 printf("invalid pointer index:%d\n", index);
81                 return NULL;
82         }
83
84         pointer = pointer_cache->entries[index];
85
86         return pointer;
87 }
88
89 void pointer_cache_put(rdpPointerCache* pointer_cache, uint16 index, rdpPointer* pointer)
90 {
91         if (index >= pointer_cache->cacheSize)
92         {
93                 printf("invalid pointer index:%d\n", index);
94                 return;
95         }
96
97         pointer_cache->entries[index] = pointer;
98 }
99
100 void pointer_cache_register_callbacks(rdpUpdate* update)
101 {
102         update->PointerPosition = update_pointer_position;
103         update->PointerSystem = update_pointer_system;
104         update->PointerColor = update_pointer_color;
105         update->PointerNew = update_pointer_new;
106         update->PointerCached = update_pointer_cached;
107 }
108
109 rdpPointerCache* pointer_cache_new(rdpSettings* settings)
110 {
111         rdpPointerCache* pointer_cache;
112
113         pointer_cache = (rdpPointerCache*) xzalloc(sizeof(rdpPointerCache));
114
115         if (pointer_cache != NULL)
116         {
117                 pointer_cache->settings = settings;
118                 pointer_cache->cacheSize = settings->pointer_cache_size;
119                 pointer_cache->update = ((freerdp*) settings->instance)->update;
120                 pointer_cache->entries = xzalloc(sizeof(rdpPointer**) * pointer_cache->cacheSize);
121         }
122
123         return pointer_cache;
124 }
125
126 void pointer_cache_free(rdpPointerCache* pointer_cache)
127 {
128         if (pointer_cache != NULL)
129         {
130                 int i;
131                 rdpPointer* pointer;
132
133                 for (i = 0; i < pointer_cache->cacheSize; i++)
134                 {
135                         pointer = pointer_cache->entries[i];
136
137                         if (pointer != NULL)
138                         {
139                                 pointer->Free(pointer_cache->update->context, pointer);
140
141                                 if (pointer->xorMaskData != NULL)
142                                         xfree(pointer->xorMaskData);
143
144                                 if (pointer->andMaskData != NULL)
145                                         xfree(pointer->andMaskData);
146
147                                 xfree(pointer);
148                         }
149                 }
150
151                 xfree(pointer_cache->entries);
152                 xfree(pointer_cache);
153         }
154 }