FreeCalypso > hg > fc-magnetite
diff src/aci2/bmi/MmiUserData.c @ 3:93999a60b835
src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 26 Sep 2016 00:29:36 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/aci2/bmi/MmiUserData.c Mon Sep 26 00:29:36 2016 +0000 @@ -0,0 +1,231 @@ +/******************************************************************************* + + CONDAT (UK) + +******************************************************************************** + + This software product is the property of Condat (UK) Ltd and may not be + disclosed to any third party without the express permission of the owner. + +******************************************************************************** + + $Project name: Basic MMI + $Project code: BMI (6349) + $Module: MMI + $File: MmiUserData.c + $Revision: 1.0 + + $Author: Condat(UK) + $Date: 22/02/01 + +******************************************************************************** + + Description: + + + +******************************************************************************** + + $History: MmiUserData.c + + 25/10/00 Original Condat(UK) BMI version. + + $End + +*******************************************************************************/ + +#define ENTITY_MFW + +/* includes */ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#if defined (NEW_FRAME) + +#include "typedefs.h" +#include "vsi.h" +#include "pei.h" +#include "custom.h" +#include "gsm.h" + +#else + +#include "STDDEFS.H" +#include "custom.h" +#include "gsm.h" +#include "vsi.h" + +#endif +#include "mfw_sys.h" +#include "mfw_mfw.h" +#include "mfw_win.h" + +#include "MmiMmi.h" +#include "MmiUserData.h" + + +typedef struct uDe +{ + UserKey key; + void *data; + struct uDe *next; +} UserDataElement, *UserDataLink; + + +static UserDataLink userDataFind( UserDataLink first, UserKey key) +{ + while( first != NULL && first->key != key ) + { + first = first->next; + } + + return first; +} + + +static UserDataLink userDataPrevious( UserDataLink first, + UserDataLink beforeThis) +{ + if( first == beforeThis ) // <beforeThis> is the first element in the list. + { + return NULL; + } + + while( first->next != beforeThis ) + { + first = first->next; + } + + return first; +} + + +/* + * Sets the user data for <window> with <key> to <data>, + * and returns the previous contents of the user data. + * If <data> itself is returned no user data with <key> + * existed and a new user data element with <key> has been created + * and set to <data>. + * If NULL is returned, either <window> was invalid or a new user data + * element could not be created. + */ +void *userDataHndSet( MfwHnd window, UserKey key, void *data) +{ + if( window == NULL ) { return NULL; } + + return userDataWinSet( (MfwWin *)((MfwHdr *)window)->data, key, data); +} + + +void *userDataWinSet( MfwWin *window, UserKey key, void *data) +{ + UserDataLink thisOne; + + if( window == NULL ) { return NULL; } + + thisOne = userDataFind( (UserDataLink)window->user, key); + + if( thisOne == NULL ) // element with <key> does not exist: create. + { + thisOne = (UserDataLink)ALLOC_MEMORY(sizeof(UserDataElement)); + + if( thisOne == NULL ) + { + return NULL; + } + + thisOne->key = key; + thisOne->data = data; + thisOne->next = (UserDataLink)window->user; + + window->user = (void *)thisOne; + + return data; + } + else + { + void *oldData = thisOne->data; + + thisOne->data = data; + + return oldData; + } +} + + +/* + * Returns the user data for <window> with <key>. + * If NULL is returned, either <window> was invalid or no user data + * with <key> existed. + */ +void *userDataHndGet( MfwHnd window, UserKey key) +{ + if( window == NULL ) { return NULL; } + + return userDataWinGet( (MfwWin *)((MfwHdr *)window)->data, key); +} + + +void *userDataWinGet( MfwWin *window, UserKey key) +{ + UserDataLink thisOne; + + if( window == NULL ) { return NULL; } + + thisOne = userDataFind( (UserDataLink)window->user, key); + + if( thisOne == NULL ) { return NULL; } + + return thisOne->data; +} + + +/* + * Deletes the user data for <window> with <key>, and returns the + * contents of the user data. + * If NULL is returned, either <window> was invalid or no user data + * with <key> existed. + */ +void *userDataHndDelete( MfwHnd window, UserKey key) +{ + if( window == NULL ) { return NULL; } + + return userDataWinDelete( (MfwWin *)((MfwHdr *)window)->data, key); +} + + +void *userDataWinDelete( MfwWin *window, UserKey key) +{ + UserDataLink doomed; + + if( window == NULL ) { return NULL; } + + doomed = userDataFind( (UserDataLink)window->user, key); + + if( doomed == NULL ) // element with <key> does not exist. + { + return NULL; + } + else + { + void * oldData = doomed->data; + UserDataLink previous; + + previous = userDataPrevious( (UserDataLink)window->user, doomed); + + if( previous == NULL ) // <doomed> is the first element in the list. + { + window->user = (void *)doomed->next; + } + else + { + previous->next = doomed->next; + } + + FREE_MEMORY( (void *)doomed, sizeof(UserDataElement)); + + return oldData; + } +} +