comparison g23m/condat/ms/src/bmi/MmiUserData.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:509db1a7b7b8
1 /*******************************************************************************
2
3 CONDAT (UK)
4
5 ********************************************************************************
6
7 This software product is the property of Condat (UK) Ltd and may not be
8 disclosed to any third party without the express permission of the owner.
9
10 ********************************************************************************
11
12 $Project name: Basic MMI
13 $Project code: BMI (6349)
14 $Module: MMI
15 $File: MmiUserData.c
16 $Revision: 1.0
17
18 $Author: Condat(UK)
19 $Date: 22/02/01
20
21 ********************************************************************************
22
23 Description:
24
25
26
27 ********************************************************************************
28
29 $History: MmiUserData.c
30
31 25/10/00 Original Condat(UK) BMI version.
32
33 $End
34
35 *******************************************************************************/
36
37 #define ENTITY_MFW
38
39 /* includes */
40 #include <string.h>
41 #include <stdio.h>
42 #include <stdlib.h>
43
44 #if defined (NEW_FRAME)
45
46 #include "typedefs.h"
47 #include "vsi.h"
48 #include "pei.h"
49 #include "custom.h"
50 #include "gsm.h"
51
52 #else
53
54 #include "STDDEFS.H"
55 #include "custom.h"
56 #include "gsm.h"
57 #include "vsi.h"
58
59 #endif
60 #include "mfw_sys.h"
61 #include "mfw_mfw.h"
62 #include "mfw_win.h"
63
64 #include "MmiMmi.h"
65 #include "MmiUserData.h"
66
67
68 typedef struct uDe
69 {
70 UserKey key;
71 void *data;
72 struct uDe *next;
73 } UserDataElement, *UserDataLink;
74
75
76 static UserDataLink userDataFind( UserDataLink first, UserKey key)
77 {
78 while( first != NULL && first->key != key )
79 {
80 first = first->next;
81 }
82
83 return first;
84 }
85
86
87 static UserDataLink userDataPrevious( UserDataLink first,
88 UserDataLink beforeThis)
89 {
90 if( first == beforeThis ) // <beforeThis> is the first element in the list.
91 {
92 return NULL;
93 }
94
95 while( first->next != beforeThis )
96 {
97 first = first->next;
98 }
99
100 return first;
101 }
102
103
104 /*
105 * Sets the user data for <window> with <key> to <data>,
106 * and returns the previous contents of the user data.
107 * If <data> itself is returned no user data with <key>
108 * existed and a new user data element with <key> has been created
109 * and set to <data>.
110 * If NULL is returned, either <window> was invalid or a new user data
111 * element could not be created.
112 */
113 void *userDataHndSet( MfwHnd window, UserKey key, void *data)
114 {
115 if( window == NULL ) { return NULL; }
116
117 return userDataWinSet( (MfwWin *)((MfwHdr *)window)->data, key, data);
118 }
119
120
121 void *userDataWinSet( MfwWin *window, UserKey key, void *data)
122 {
123 UserDataLink thisOne;
124
125 if( window == NULL ) { return NULL; }
126
127 thisOne = userDataFind( (UserDataLink)window->user, key);
128
129 if( thisOne == NULL ) // element with <key> does not exist: create.
130 {
131 thisOne = (UserDataLink)ALLOC_MEMORY(sizeof(UserDataElement));
132
133 if( thisOne == NULL )
134 {
135 return NULL;
136 }
137
138 thisOne->key = key;
139 thisOne->data = data;
140 thisOne->next = (UserDataLink)window->user;
141
142 window->user = (void *)thisOne;
143
144 return data;
145 }
146 else
147 {
148 void *oldData = thisOne->data;
149
150 thisOne->data = data;
151
152 return oldData;
153 }
154 }
155
156
157 /*
158 * Returns the user data for <window> with <key>.
159 * If NULL is returned, either <window> was invalid or no user data
160 * with <key> existed.
161 */
162 void *userDataHndGet( MfwHnd window, UserKey key)
163 {
164 if( window == NULL ) { return NULL; }
165
166 return userDataWinGet( (MfwWin *)((MfwHdr *)window)->data, key);
167 }
168
169
170 void *userDataWinGet( MfwWin *window, UserKey key)
171 {
172 UserDataLink thisOne;
173
174 if( window == NULL ) { return NULL; }
175
176 thisOne = userDataFind( (UserDataLink)window->user, key);
177
178 if( thisOne == NULL ) { return NULL; }
179
180 return thisOne->data;
181 }
182
183
184 /*
185 * Deletes the user data for <window> with <key>, and returns the
186 * contents of the user data.
187 * If NULL is returned, either <window> was invalid or no user data
188 * with <key> existed.
189 */
190 void *userDataHndDelete( MfwHnd window, UserKey key)
191 {
192 if( window == NULL ) { return NULL; }
193
194 return userDataWinDelete( (MfwWin *)((MfwHdr *)window)->data, key);
195 }
196
197
198 void *userDataWinDelete( MfwWin *window, UserKey key)
199 {
200 UserDataLink doomed;
201
202 if( window == NULL ) { return NULL; }
203
204 doomed = userDataFind( (UserDataLink)window->user, key);
205
206 if( doomed == NULL ) // element with <key> does not exist.
207 {
208 return NULL;
209 }
210 else
211 {
212 void * oldData = doomed->data;
213 UserDataLink previous;
214
215 previous = userDataPrevious( (UserDataLink)window->user, doomed);
216
217 if( previous == NULL ) // <doomed> is the first element in the list.
218 {
219 window->user = (void *)doomed->next;
220 }
221 else
222 {
223 previous->next = doomed->next;
224 }
225
226 FREE_MEMORY( (void *)doomed, sizeof(UserDataElement));
227
228 return oldData;
229 }
230 }
231