/* * client_data.c * This file is part of LCDd, the lcdproc server. * * This file is released under the GNU General Public License. Refer to the * COPYING file distributed with this package. * * Copyright (c) 1999, William Ferrell, Scott Scriven * 2001, Joris Robijn * * * Creates and destroys a client's data structures. These are mainly * its name, screen list, and menu list. * */ #include #include #include #include "shared/report.h" #include "client_data.h" #include "screen.h" #include "screenlist.h" #define ResetScreenList(a) LL_Rewind(a) #define NewScreen LL_new #define NextScreen(a) (screen *)LL_Get(a) #define MoreScreens(a) (LL_Next(a) == 0) #define DestroyScreenList(a) LL_Destroy(a) int client_data_init (client_data * d) { if (!d) return -1; d->ack = 0; d->name = NULL; d->client_keys = NULL; d->screenlist = NewScreen(); if (!d->screenlist) { report( RPT_ERR, "client_data_init: Error allocating screenlist"); return -1; } /* TODO: this section... (client menus) d->menulist = LL_new(); if(!d->menulist) { report( RPT_ERR, "client_data_init: Error allocating menulist"); return -1; } */ return 0; } int client_data_destroy (client_data * d) { screen *s; report( RPT_INFO, "client_data_destroy"); if (!d) return -1; d->ack = 0; // Clean up the name... if (d->name) free (d->name); // Clean up the key list... if (d->client_keys) free (d->client_keys); // Clean up the screenlist... debug( RPT_DEBUG, "client_data_destroy: Cleaning screenlist"); ResetScreenList (d->screenlist); do { s = NextScreen(d->screenlist); if (s) { debug( RPT_DEBUG, "client_data_destroy: removing screen %s", s->id); // FIXME? This shouldn't be handled here... // Now, remove it from the screenlist... if (screenlist_remove_all (s) < 0) { // Not a serious error.. report( RPT_ERR, "client_data_destroy: Error dequeueing screen"); return 0; } // Free its memory... screen_destroy (s); } } while (MoreScreens(d->screenlist)); DestroyScreenList(d->screenlist); // TODO: clean up the rest of the data... return 0; }