Enhance ListDictonnary
This patch enhances ListDictionnary so that you can set callbacks for keys and for values.
This commit is contained in:
parent
6febe88026
commit
ef11358668
@ -659,7 +659,7 @@ void drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, char*
|
|||||||
drive->path = path;
|
drive->path = path;
|
||||||
|
|
||||||
drive->files = ListDictionary_New(TRUE);
|
drive->files = ListDictionary_New(TRUE);
|
||||||
ListDictionary_Object(drive->files)->fnObjectFree = (OBJECT_FREE_FN) drive_file_free;
|
ListDictionary_ValueObject(drive->files)->fnObjectFree = (OBJECT_FREE_FN) drive_file_free;
|
||||||
|
|
||||||
drive->IrpQueue = MessageQueue_New(NULL);
|
drive->IrpQueue = MessageQueue_New(NULL);
|
||||||
drive->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) drive_thread_func, drive, CREATE_SUSPENDED, NULL);
|
drive->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) drive_thread_func, drive, CREATE_SUSPENDED, NULL);
|
||||||
|
@ -55,7 +55,7 @@ DEVMAN* devman_new(rdpdrPlugin* rdpdr)
|
|||||||
|
|
||||||
devman->devices = ListDictionary_New(TRUE);
|
devman->devices = ListDictionary_New(TRUE);
|
||||||
|
|
||||||
ListDictionary_Object(devman->devices)->fnObjectFree =
|
ListDictionary_ValueObject(devman->devices)->fnObjectFree =
|
||||||
(OBJECT_FREE_FN) devman_device_free;
|
(OBJECT_FREE_FN) devman_device_free;
|
||||||
|
|
||||||
return devman;
|
return devman;
|
||||||
|
@ -192,18 +192,19 @@ struct _wListDictionary
|
|||||||
CRITICAL_SECTION lock;
|
CRITICAL_SECTION lock;
|
||||||
|
|
||||||
wListDictionaryItem* head;
|
wListDictionaryItem* head;
|
||||||
wObject object;
|
wObject objectKey;
|
||||||
|
wObject objectValue;
|
||||||
};
|
};
|
||||||
typedef struct _wListDictionary wListDictionary;
|
typedef struct _wListDictionary wListDictionary;
|
||||||
|
|
||||||
#define ListDictionary_Object(_dictionary) (&_dictionary->object)
|
#define ListDictionary_ValueObject(_dictionary) (&_dictionary->objectValue)
|
||||||
|
|
||||||
WINPR_API int ListDictionary_Count(wListDictionary* listDictionary);
|
WINPR_API int ListDictionary_Count(wListDictionary* listDictionary);
|
||||||
|
|
||||||
WINPR_API void ListDictionary_Lock(wListDictionary* listDictionary);
|
WINPR_API void ListDictionary_Lock(wListDictionary* listDictionary);
|
||||||
WINPR_API void ListDictionary_Unlock(wListDictionary* listDictionary);
|
WINPR_API void ListDictionary_Unlock(wListDictionary* listDictionary);
|
||||||
|
|
||||||
WINPR_API void ListDictionary_Add(wListDictionary* listDictionary, void* key, void* value);
|
WINPR_API BOOL ListDictionary_Add(wListDictionary* listDictionary, void* key, void* value);
|
||||||
WINPR_API void* ListDictionary_Remove(wListDictionary* listDictionary, void* key);
|
WINPR_API void* ListDictionary_Remove(wListDictionary* listDictionary, void* key);
|
||||||
WINPR_API void* ListDictionary_Remove_Head(wListDictionary* listDictionary);
|
WINPR_API void* ListDictionary_Remove_Head(wListDictionary* listDictionary);
|
||||||
WINPR_API void ListDictionary_Clear(wListDictionary* listDictionary);
|
WINPR_API void ListDictionary_Clear(wListDictionary* listDictionary);
|
||||||
|
@ -172,7 +172,7 @@ int ListDictionary_GetKeys(wListDictionary* listDictionary, ULONG_PTR** ppKeys)
|
|||||||
* Adds an entry with the specified key and value into the ListDictionary.
|
* Adds an entry with the specified key and value into the ListDictionary.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ListDictionary_Add(wListDictionary* listDictionary, void* key, void* value)
|
BOOL ListDictionary_Add(wListDictionary* listDictionary, void* key, void* value)
|
||||||
{
|
{
|
||||||
wListDictionaryItem* item;
|
wListDictionaryItem* item;
|
||||||
wListDictionaryItem* lastItem;
|
wListDictionaryItem* lastItem;
|
||||||
@ -181,6 +181,8 @@ void ListDictionary_Add(wListDictionary* listDictionary, void* key, void* value)
|
|||||||
EnterCriticalSection(&listDictionary->lock);
|
EnterCriticalSection(&listDictionary->lock);
|
||||||
|
|
||||||
item = (wListDictionaryItem*) malloc(sizeof(wListDictionaryItem));
|
item = (wListDictionaryItem*) malloc(sizeof(wListDictionaryItem));
|
||||||
|
if (!item)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
item->key = key;
|
item->key = key;
|
||||||
item->value = value;
|
item->value = value;
|
||||||
@ -203,6 +205,7 @@ void ListDictionary_Add(wListDictionary* listDictionary, void* key, void* value)
|
|||||||
|
|
||||||
if (listDictionary->synchronized)
|
if (listDictionary->synchronized)
|
||||||
LeaveCriticalSection(&listDictionary->lock);
|
LeaveCriticalSection(&listDictionary->lock);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -224,8 +227,8 @@ void ListDictionary_Clear(wListDictionary* listDictionary)
|
|||||||
while (item)
|
while (item)
|
||||||
{
|
{
|
||||||
nextItem = item->next;
|
nextItem = item->next;
|
||||||
if (listDictionary->object.fnObjectFree)
|
if (listDictionary->objectValue.fnObjectFree)
|
||||||
listDictionary->object.fnObjectFree(item->value);
|
listDictionary->objectValue.fnObjectFree(item->value);
|
||||||
free(item);
|
free(item);
|
||||||
item = nextItem;
|
item = nextItem;
|
||||||
}
|
}
|
||||||
@ -243,31 +246,27 @@ void ListDictionary_Clear(wListDictionary* listDictionary)
|
|||||||
|
|
||||||
BOOL ListDictionary_Contains(wListDictionary* listDictionary, void* key)
|
BOOL ListDictionary_Contains(wListDictionary* listDictionary, void* key)
|
||||||
{
|
{
|
||||||
BOOL status = FALSE;
|
|
||||||
wListDictionaryItem* item;
|
wListDictionaryItem* item;
|
||||||
|
OBJECT_EQUALS_FN keyEquals;
|
||||||
|
|
||||||
if (listDictionary->synchronized)
|
if (listDictionary->synchronized)
|
||||||
EnterCriticalSection(&listDictionary->lock);
|
EnterCriticalSection(&listDictionary->lock);
|
||||||
|
|
||||||
if (listDictionary->head)
|
keyEquals = listDictionary->objectKey.fnObjectEquals;
|
||||||
|
item = listDictionary->head;
|
||||||
|
|
||||||
|
while (item)
|
||||||
{
|
{
|
||||||
item = listDictionary->head;
|
if (keyEquals(item->key, key))
|
||||||
|
break;
|
||||||
|
|
||||||
while (item)
|
item = item->next;
|
||||||
{
|
|
||||||
if (item->key == key)
|
|
||||||
break;
|
|
||||||
|
|
||||||
item = item->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = (item) ? TRUE : FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (listDictionary->synchronized)
|
if (listDictionary->synchronized)
|
||||||
LeaveCriticalSection(&listDictionary->lock);
|
LeaveCriticalSection(&listDictionary->lock);
|
||||||
|
|
||||||
return status;
|
return (item) ? TRUE : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -279,42 +278,31 @@ void* ListDictionary_Remove(wListDictionary* listDictionary, void* key)
|
|||||||
void* value = NULL;
|
void* value = NULL;
|
||||||
wListDictionaryItem* item;
|
wListDictionaryItem* item;
|
||||||
wListDictionaryItem* prevItem;
|
wListDictionaryItem* prevItem;
|
||||||
|
OBJECT_EQUALS_FN keyEquals;
|
||||||
|
|
||||||
if (listDictionary->synchronized)
|
if (listDictionary->synchronized)
|
||||||
EnterCriticalSection(&listDictionary->lock);
|
EnterCriticalSection(&listDictionary->lock);
|
||||||
|
|
||||||
if (listDictionary->head)
|
keyEquals = listDictionary->objectKey.fnObjectEquals;
|
||||||
{
|
|
||||||
item = listDictionary->head;
|
|
||||||
|
|
||||||
if (listDictionary->head->key == key)
|
item = listDictionary->head;
|
||||||
|
prevItem = NULL;
|
||||||
|
|
||||||
|
while (item)
|
||||||
|
{
|
||||||
|
if (keyEquals(item->key, key))
|
||||||
{
|
{
|
||||||
listDictionary->head = listDictionary->head->next;
|
if (!prevItem)
|
||||||
|
listDictionary->head = item->next;
|
||||||
|
else
|
||||||
|
prevItem->next = item->next;
|
||||||
value = item->value;
|
value = item->value;
|
||||||
free(item);
|
free(item);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (item->next)
|
|
||||||
{
|
|
||||||
prevItem = item;
|
|
||||||
item = item->next;
|
|
||||||
|
|
||||||
while (item)
|
prevItem = item;
|
||||||
{
|
item = item->next;
|
||||||
if (item->key == key)
|
|
||||||
{
|
|
||||||
prevItem->next = item->next;
|
|
||||||
value = item->value;
|
|
||||||
free(item);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
prevItem = item;
|
|
||||||
item = item->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (listDictionary->synchronized)
|
if (listDictionary->synchronized)
|
||||||
@ -356,17 +344,20 @@ void* ListDictionary_GetItemValue(wListDictionary* listDictionary, void* key)
|
|||||||
{
|
{
|
||||||
void* value = NULL;
|
void* value = NULL;
|
||||||
wListDictionaryItem* item = NULL;
|
wListDictionaryItem* item = NULL;
|
||||||
|
OBJECT_EQUALS_FN keyEquals;
|
||||||
|
|
||||||
if (listDictionary->synchronized)
|
if (listDictionary->synchronized)
|
||||||
EnterCriticalSection(&listDictionary->lock);
|
EnterCriticalSection(&listDictionary->lock);
|
||||||
|
|
||||||
|
keyEquals = listDictionary->objectKey.fnObjectEquals;
|
||||||
|
|
||||||
if (listDictionary->head)
|
if (listDictionary->head)
|
||||||
{
|
{
|
||||||
item = listDictionary->head;
|
item = listDictionary->head;
|
||||||
|
|
||||||
while (item)
|
while (item)
|
||||||
{
|
{
|
||||||
if (item->key == key)
|
if (keyEquals(item->key, key))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
item = item->next;
|
item = item->next;
|
||||||
@ -389,24 +380,30 @@ BOOL ListDictionary_SetItemValue(wListDictionary* listDictionary, void* key, voi
|
|||||||
{
|
{
|
||||||
BOOL status = FALSE;
|
BOOL status = FALSE;
|
||||||
wListDictionaryItem* item;
|
wListDictionaryItem* item;
|
||||||
|
OBJECT_EQUALS_FN keyEquals;
|
||||||
|
|
||||||
if (listDictionary->synchronized)
|
if (listDictionary->synchronized)
|
||||||
EnterCriticalSection(&listDictionary->lock);
|
EnterCriticalSection(&listDictionary->lock);
|
||||||
|
|
||||||
|
keyEquals = listDictionary->objectKey.fnObjectEquals;
|
||||||
if (listDictionary->head)
|
if (listDictionary->head)
|
||||||
{
|
{
|
||||||
item = listDictionary->head;
|
item = listDictionary->head;
|
||||||
|
|
||||||
while (item)
|
while (item)
|
||||||
{
|
{
|
||||||
if (item->key == key)
|
if (keyEquals(item->key, key))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
item = item->next;
|
item = item->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item)
|
if (item)
|
||||||
|
{
|
||||||
|
if (listDictionary->objectValue.fnObjectFree)
|
||||||
|
listDictionary->objectValue.fnObjectFree(item->value);
|
||||||
item->value = value;
|
item->value = value;
|
||||||
|
}
|
||||||
|
|
||||||
status = (item) ? TRUE : FALSE;
|
status = (item) ? TRUE : FALSE;
|
||||||
}
|
}
|
||||||
@ -417,6 +414,10 @@ BOOL ListDictionary_SetItemValue(wListDictionary* listDictionary, void* key, voi
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL default_equal_function(void *obj1, void *obj2)
|
||||||
|
{
|
||||||
|
return (obj1 == obj2);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Construction, Destruction
|
* Construction, Destruction
|
||||||
*/
|
*/
|
||||||
@ -425,19 +426,20 @@ wListDictionary* ListDictionary_New(BOOL synchronized)
|
|||||||
{
|
{
|
||||||
wListDictionary* listDictionary = NULL;
|
wListDictionary* listDictionary = NULL;
|
||||||
|
|
||||||
listDictionary = (wListDictionary*) malloc(sizeof(wListDictionary));
|
listDictionary = (wListDictionary*) calloc(1, sizeof(wListDictionary));
|
||||||
|
if (!listDictionary)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (listDictionary)
|
listDictionary->synchronized = synchronized;
|
||||||
|
|
||||||
|
if (!InitializeCriticalSectionAndSpinCount(&listDictionary->lock, 4000))
|
||||||
{
|
{
|
||||||
listDictionary->synchronized = synchronized;
|
free(listDictionary);
|
||||||
|
return NULL;
|
||||||
listDictionary->head = NULL;
|
|
||||||
|
|
||||||
InitializeCriticalSectionAndSpinCount(&listDictionary->lock, 4000);
|
|
||||||
|
|
||||||
ZeroMemory(&(listDictionary->object), sizeof(wObject));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
listDictionary->objectKey.fnObjectEquals = default_equal_function;
|
||||||
|
listDictionary->objectValue.fnObjectEquals = default_equal_function;
|
||||||
return listDictionary;
|
return listDictionary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user