void server_profiles_save(void) { int count; char** profiles; Server* server; GList* node; count = g_list_length(servers); profiles = server_get_names(); ggzcore_conf_write_list("Servers", "ProfileList", count, profiles); ggz_free(profiles); for (node = servers; node != NULL; node = node->next) { server = node->data; ggzcore_conf_write_string(server->name, "Host", server->host); ggzcore_conf_write_int(server->name, "Port", server->port); ggzcore_conf_write_int(server->name, "Type", server->type); ggzcore_conf_write_string(server->name, "Login", server->login); if (server->type == GGZ_LOGIN) ggzcore_conf_write_string(server->name, "Password", server->password); } for (node = deleted; node != NULL; node = node->next) { server = node->data; ggzcore_conf_remove_section(server->name); } /* Clear list of deleted servers */ if (deleted) { g_list_foreach(deleted, server_free_node, NULL); g_list_free(deleted); deleted = NULL; } }
static GGZModule *pick_module(GGZGameType * gt) { const char *name = ggzcore_gametype_get_name(gt); const char *engine = ggzcore_gametype_get_prot_engine(gt); const char *version = ggzcore_gametype_get_prot_version(gt); int i, j, preserve; GGZModule *module; GGZModule **frontends; int *modulenumbers; char *preferred; int num; GGZModuleEnvironment env; /* Check (again) how many modules are registered for this game type */ ggzcore_reload(); num = ggzcore_module_get_num_by_type(name, engine, version); if (num == 0) { return NULL; } /* If there's only one choice, use it regardless of frontend */ if (num == 1) return ggzcore_module_get_nth_by_type(name, engine, version, 0); /* See if the user has a listed preference. */ preferred = ggzcore_conf_read_string("GAME", name, NULL); if (preferred) { for (i = 0; i < num; i++) { const char *frontend; module = ggzcore_module_get_nth_by_type(name, engine, version, i); frontend = ggzcore_module_get_frontend(module); if (strcasecmp(preferred, frontend) == 0) { ggz_debug("modules", "User preferred %s frontend for %s", frontend, name); return module; } } } /* More than one frontend: pop up a window and let the player choose. */ frontends = ggz_malloc((num + 1) * sizeof(*frontends)); modulenumbers = ggz_malloc((num + 1) * sizeof(int)); j = 0; for (i = 0; i < num; i++) { module = ggzcore_module_get_nth_by_type(name, engine, version, i); env = ggzcore_module_get_environment(module); if ((env == GGZ_ENVIRONMENT_XWINDOW) || (env == GGZ_ENVIRONMENT_XFULLSCREEN)) { frontends[j] = module; modulenumbers[j] = i; j++; } } frontends[j] = NULL; i = ask_user_to_pick_module(frontends, modulenumbers, &preserve); if (i < 0) return NULL; module = ggzcore_module_get_nth_by_type(name, engine, version, i); ggz_free(frontends); ggz_free(modulenumbers); if (preserve) { const char *frontend = ggzcore_module_get_frontend(module); ggzcore_conf_write_string("GAME", name, frontend); ggzcore_conf_commit(); } return module; }