|
|
|
|
@@ -16,6 +16,11 @@ TrayMenuStore* NewTrayMenuStore() {
|
|
|
|
|
ABORT("[NewTrayMenuStore] Not enough memory to allocate trayMenuMap!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pthread_mutex_init(&result->lock, NULL) != 0) {
|
|
|
|
|
printf("\n mutex init has failed\n");
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -25,15 +30,19 @@ int dumpTrayMenu(void *const context, struct hashmap_element_s *const e) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DumpTrayMenuStore(TrayMenuStore* store) {
|
|
|
|
|
pthread_mutex_lock(&store->lock);
|
|
|
|
|
hashmap_iterate_pairs(&store->trayMenuMap, dumpTrayMenu, NULL);
|
|
|
|
|
pthread_mutex_unlock(&store->lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AddTrayMenuToStore(TrayMenuStore* store, const char* menuJSON) {
|
|
|
|
|
|
|
|
|
|
TrayMenu* newMenu = NewTrayMenu(menuJSON);
|
|
|
|
|
|
|
|
|
|
pthread_mutex_lock(&store->lock);
|
|
|
|
|
//TODO: check if there is already an entry for this menu
|
|
|
|
|
hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu);
|
|
|
|
|
|
|
|
|
|
pthread_mutex_unlock(&store->lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int showTrayMenu(void *const context, struct hashmap_element_s *const e) {
|
|
|
|
|
@@ -43,9 +52,11 @@ int showTrayMenu(void *const context, struct hashmap_element_s *const e) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ShowTrayMenusInStore(TrayMenuStore* store) {
|
|
|
|
|
pthread_mutex_lock(&store->lock);
|
|
|
|
|
if( hashmap_num_entries(&store->trayMenuMap) > 0 ) {
|
|
|
|
|
hashmap_iterate_pairs(&store->trayMenuMap, showTrayMenu, NULL);
|
|
|
|
|
}
|
|
|
|
|
pthread_mutex_unlock(&store->lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int freeTrayMenu(void *const context, struct hashmap_element_s *const e) {
|
|
|
|
|
@@ -64,16 +75,24 @@ void DeleteTrayMenuStore(TrayMenuStore *store) {
|
|
|
|
|
|
|
|
|
|
// Destroy tray menu map
|
|
|
|
|
hashmap_destroy(&store->trayMenuMap);
|
|
|
|
|
|
|
|
|
|
pthread_mutex_destroy(&store->lock);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TrayMenu* GetTrayMenuFromStore(TrayMenuStore* store, const char* menuID) {
|
|
|
|
|
// Get the current menu
|
|
|
|
|
return hashmap_get(&store->trayMenuMap, menuID, strlen(menuID));
|
|
|
|
|
pthread_mutex_lock(&store->lock);
|
|
|
|
|
TrayMenu* result = hashmap_get(&store->trayMenuMap, menuID, strlen(menuID));
|
|
|
|
|
pthread_mutex_unlock(&store->lock);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TrayMenu* MustGetTrayMenuFromStore(TrayMenuStore* store, const char* menuID) {
|
|
|
|
|
// Get the current menu
|
|
|
|
|
pthread_mutex_lock(&store->lock);
|
|
|
|
|
TrayMenu* result = hashmap_get(&store->trayMenuMap, menuID, strlen(menuID));
|
|
|
|
|
pthread_mutex_unlock(&store->lock);
|
|
|
|
|
|
|
|
|
|
if (result == NULL ) {
|
|
|
|
|
ABORT("Unable to find TrayMenu with ID '%s' in the TrayMenuStore!", menuID);
|
|
|
|
|
}
|
|
|
|
|
@@ -81,8 +100,11 @@ TrayMenu* MustGetTrayMenuFromStore(TrayMenuStore* store, const char* menuID) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DeleteTrayMenuInStore(TrayMenuStore* store, const char* ID) {
|
|
|
|
|
|
|
|
|
|
TrayMenu *menu = MustGetTrayMenuFromStore(store, ID);
|
|
|
|
|
pthread_mutex_lock(&store->lock);
|
|
|
|
|
hashmap_remove(&store->trayMenuMap, ID, strlen(ID));
|
|
|
|
|
pthread_mutex_unlock(&store->lock);
|
|
|
|
|
DeleteTrayMenu(menu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -110,7 +132,9 @@ void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON) {
|
|
|
|
|
// If we don't have a menu, we create one
|
|
|
|
|
if ( currentMenu == NULL ) {
|
|
|
|
|
// Store the new menu
|
|
|
|
|
pthread_mutex_lock(&store->lock);
|
|
|
|
|
hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu);
|
|
|
|
|
pthread_mutex_unlock(&store->lock);
|
|
|
|
|
|
|
|
|
|
// Show it
|
|
|
|
|
ShowTrayMenu(newMenu);
|
|
|
|
|
@@ -121,7 +145,9 @@ void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON) {
|
|
|
|
|
// Save the status bar reference
|
|
|
|
|
newMenu->statusbaritem = currentMenu->statusbaritem;
|
|
|
|
|
|
|
|
|
|
pthread_mutex_lock(&store->lock);
|
|
|
|
|
hashmap_remove(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID));
|
|
|
|
|
pthread_mutex_unlock(&store->lock);
|
|
|
|
|
|
|
|
|
|
// Delete the current menu
|
|
|
|
|
DeleteMenu(currentMenu->menu);
|
|
|
|
|
@@ -130,9 +156,10 @@ void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON) {
|
|
|
|
|
// Free the tray menu memory
|
|
|
|
|
MEMFREE(currentMenu);
|
|
|
|
|
|
|
|
|
|
pthread_mutex_lock(&store->lock);
|
|
|
|
|
hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu);
|
|
|
|
|
pthread_mutex_unlock(&store->lock);
|
|
|
|
|
|
|
|
|
|
// Show the updated menu
|
|
|
|
|
ShowTrayMenu(newMenu);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|