/* GCompris -- This files comes from XMMS * * XMMS - Cross-platform multimedia player * Copyright (C) 1998-2000 Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include #include "gcompris.h" #include "gc_core.h" static struct BoardPluginData *bp_data; static gboolean get_board_playing(void); #ifdef STATIC_MODULE gint gc_activation_check(char *code); extern BoardPlugin * get_advanced_colors_bplugin_info(); extern BoardPlugin * get_algebra_bplugin_info(); extern BoardPlugin * get_algebra_guesscount_bplugin_info(); extern BoardPlugin * get_awele_bplugin_info(); extern BoardPlugin * get_canal_lock_bplugin_info(); extern BoardPlugin * get_chess_bplugin_info(); extern BoardPlugin * get_clickgame_bplugin_info(); extern BoardPlugin * get_click_on_letter_bplugin_info(); extern BoardPlugin * get_clockgame_bplugin_info(); extern BoardPlugin * get_colors_bplugin_info(); extern BoardPlugin * get_crane_bplugin_info(); extern BoardPlugin * get_enumerate_bplugin_info(); extern BoardPlugin * get_erase_bplugin_info(); extern BoardPlugin * get_fifteen_bplugin_info(); extern BoardPlugin * get_gletters_bplugin_info(); extern BoardPlugin * get_gtans_bplugin_info(); extern BoardPlugin * get_hanoi_bplugin_info(); extern BoardPlugin * get_hanoi_real_bplugin_info(); extern BoardPlugin * get_imageid_bplugin_info(); extern BoardPlugin * get_leftright_bplugin_info(); extern BoardPlugin * get_machpuzzle_bplugin_info(); extern BoardPlugin * get_magic_hat_bplugin_info(); extern BoardPlugin * get_maze_bplugin_info(); extern BoardPlugin * get_memory_bplugin_info(); extern BoardPlugin * get_menu_bplugin_info(); extern BoardPlugin * get_missingletter_bplugin_info(); extern BoardPlugin * get_money_bplugin_info(); extern BoardPlugin * get_paratrooper_bplugin_info(); extern BoardPlugin * get_planegame_bplugin_info(); extern BoardPlugin * get_railroad_bplugin_info(); extern BoardPlugin * get_read_colors_bplugin_info(); extern BoardPlugin * get_reading_bplugin_info(); extern BoardPlugin * get_reversecount_bplugin_info(); extern BoardPlugin * get_scale_bplugin_info(); extern BoardPlugin * get_shapegame_bplugin_info(); extern BoardPlugin * get_smallnumbers_bplugin_info(); extern BoardPlugin * get_submarine_bplugin_info(); extern BoardPlugin * get_superbrain_bplugin_info(); extern BoardPlugin * get_target_bplugin_info(); extern BoardPlugin * get_traffic_bplugin_info(); extern BoardPlugin * get_wordsgame_bplugin_info(); extern BoardPlugin * get_python_bplugin_info(); extern BoardPlugin * get_wordprocessor_bplugin_info(); #define MAX_NUMBER_OF_BOARDS 200 static BoardPlugin *static_boards_demo[MAX_NUMBER_OF_BOARDS]; static BoardPlugin *static_boards[MAX_NUMBER_OF_BOARDS]; static char *board_nodemo[] = /* Some boards excluded from the demo version */ { "python:ballcatch", "python:followline", "python:guessnumber", "python:mosaic", "python:redraw", "python:searace", "python:sudoku", "python:watercycle", NULL }; void gc_board_init(void) { guint i=0; bp_data = g_malloc0(sizeof (struct BoardPluginData)); static_boards_demo[i++] = get_awele_bplugin_info(); static_boards_demo[i++] = get_canal_lock_bplugin_info(); static_boards_demo[i++] = get_click_on_letter_bplugin_info(); static_boards_demo[i++] = get_clickgame_bplugin_info(); static_boards_demo[i++] = get_clockgame_bplugin_info(); static_boards_demo[i++] = get_colors_bplugin_info(); static_boards_demo[i++] = get_crane_bplugin_info(); static_boards_demo[i++] = get_enumerate_bplugin_info(); static_boards_demo[i++] = get_erase_bplugin_info(); static_boards_demo[i++] = get_gletters_bplugin_info(); static_boards_demo[i++] = get_gtans_bplugin_info(); static_boards_demo[i++] = get_hanoi_bplugin_info(); static_boards_demo[i++] = get_leftright_bplugin_info(); static_boards_demo[i++] = get_magic_hat_bplugin_info(); static_boards_demo[i++] = get_menu_bplugin_info(); static_boards_demo[i++] = get_money_bplugin_info(); static_boards_demo[i++] = get_reading_bplugin_info(); static_boards_demo[i++] = get_python_bplugin_info(); static_boards_demo[i++] = get_scale_bplugin_info(); static_boards_demo[i++] = get_submarine_bplugin_info(); static_boards_demo[i++] = get_superbrain_bplugin_info(); static_boards_demo[i++] = get_target_bplugin_info(); static_boards_demo[i++] = get_wordprocessor_bplugin_info(); static_boards_demo[i++] = NULL; i=0; static_boards[i++] = get_advanced_colors_bplugin_info(); static_boards[i++] = get_algebra_bplugin_info(); static_boards[i++] = get_algebra_bplugin_info(); static_boards[i++] = get_algebra_guesscount_bplugin_info(); static_boards[i++] = get_awele_bplugin_info(); static_boards[i++] = get_canal_lock_bplugin_info(); static_boards[i++] = get_chess_bplugin_info(); static_boards[i++] = get_click_on_letter_bplugin_info(); static_boards[i++] = get_clickgame_bplugin_info(); static_boards[i++] = get_clockgame_bplugin_info(); static_boards[i++] = get_colors_bplugin_info(); static_boards[i++] = get_crane_bplugin_info(); static_boards[i++] = get_enumerate_bplugin_info(); static_boards[i++] = get_erase_bplugin_info(); static_boards[i++] = get_fifteen_bplugin_info(); static_boards[i++] = get_gletters_bplugin_info(); static_boards[i++] = get_gtans_bplugin_info(); static_boards[i++] = get_hanoi_bplugin_info(); static_boards[i++] = get_hanoi_real_bplugin_info(); static_boards[i++] = get_imageid_bplugin_info(); static_boards[i++] = get_leftright_bplugin_info(); static_boards[i++] = get_machpuzzle_bplugin_info(); static_boards[i++] = get_magic_hat_bplugin_info(); static_boards[i++] = get_maze_bplugin_info(); static_boards[i++] = get_memory_bplugin_info(); static_boards[i++] = get_menu_bplugin_info(); static_boards[i++] = get_missingletter_bplugin_info(); static_boards[i++] = get_money_bplugin_info(); static_boards[i++] = get_paratrooper_bplugin_info(); static_boards[i++] = get_planegame_bplugin_info(); static_boards[i++] = get_python_bplugin_info(); static_boards[i++] = get_railroad_bplugin_info(); static_boards[i++] = get_read_colors_bplugin_info(); static_boards[i++] = get_reading_bplugin_info(); static_boards[i++] = get_reversecount_bplugin_info(); static_boards[i++] = get_scale_bplugin_info(); static_boards[i++] = get_shapegame_bplugin_info(); static_boards[i++] = get_smallnumbers_bplugin_info(); static_boards[i++] = get_submarine_bplugin_info(); static_boards[i++] = get_superbrain_bplugin_info(); static_boards[i++] = get_target_bplugin_info(); static_boards[i++] = get_traffic_bplugin_info(); static_boards[i++] = get_wordprocessor_bplugin_info(); static_boards[i++] = get_wordsgame_bplugin_info(); static_boards[i++] = NULL; i=0; while(static_boards[i] != NULL) { /* If this plugin defines an initialisation entry point, call it */ BoardPlugin *bp; /* Get the BoardPlugin Info */ bp = (BoardPlugin *) static_boards[i++]; if(bp->init != NULL) { bp->init(NULL); } } } #else void gc_board_init(void) { /* First make sure the module loading is supported on this platform */ if (!g_module_supported()) g_error( _("Dynamic module loading is not supported. GCompris cannot load.\n") ); bp_data = g_malloc0(sizeof (struct BoardPluginData)); } #endif BoardPlugin *gc_board_get_current_board_plugin(void) { if(bp_data->current_gcompris_board) return bp_data->current_gcompris_board->plugin; return NULL; } GcomprisBoard *gc_board_get_current(void) { return bp_data->current_gcompris_board; } void gc_board_set_current(GcomprisBoard * gcomprisBoard) { bp_data->current_gcompris_board = gcomprisBoard; } #ifdef STATIC_MODULE gboolean gc_board_check_file(GcomprisBoard *gcomprisBoard) { GcomprisProperties *properties = gc_prop_get(); BoardPlugin *bp; guint i=0; gint key_is_valid = 0; g_assert(gcomprisBoard!=NULL); g_assert(properties->key!=NULL); /* Check Already loaded */ if(gcomprisBoard->plugin!=NULL) { return TRUE; } if(properties->administration) key_is_valid = 1; else key_is_valid = gc_activation_check(properties->key); i = 0; if(key_is_valid >= 1) { while(static_boards[i++] != NULL) { /* Get the BoardPlugin Info */ bp = (BoardPlugin *) static_boards[i-1]; if(bp->is_our_board(gcomprisBoard)) { /* Great, we found our plugin */ g_warning("We found the correct plugin for board %s (type=%s)\n", gcomprisBoard->name, gcomprisBoard->type); gcomprisBoard->plugin = bp; return TRUE; } } } else { while(static_boards_demo[i++] != NULL) { /* Get the BoardPlugin Info */ bp = (BoardPlugin *) static_boards_demo[i-1]; if(bp->is_our_board(gcomprisBoard)) { /* Great, we found our plugin */ /* check for excluded one */ char **ptr = board_nodemo; do { if(strcmp(*ptr, gcomprisBoard->type) == 0) break; } while(*++ptr); if(*ptr) goto notfound; g_warning("We found the correct plugin for board %s (type=%s)\n", gcomprisBoard->name, gcomprisBoard->type); gcomprisBoard->plugin = bp; return TRUE; } } } notfound: gcomprisBoard->plugin = NULL; g_warning("No plugin library found for board type '%s', requested by '%s'", gcomprisBoard->type, gcomprisBoard->filename); return FALSE; } #else gboolean gc_board_check_file(GcomprisBoard *gcomprisBoard) { GModule *gmodule = NULL; gchar *gmodule_file = NULL; BoardPlugin *(*plugin_get_bplugin_info) (void) = NULL; GcomprisProperties *properties = gc_prop_get(); gchar *sep; gchar *type; g_assert(gcomprisBoard!=NULL); /* Check Already loaded */ if(gcomprisBoard->plugin!=NULL) { return TRUE; } type = g_strdup(gcomprisBoard->type); /* Manage the python case where : is use to separate python plugin and boards */ if((sep = strchr(type, ':'))) *sep ='\0'; gmodule_file = g_module_build_path (properties->package_plugin_dir, type); gmodule = g_module_open (gmodule_file, 0); if(gmodule) { g_warning("opened module %s with name %s\n", gmodule_file, type); } else { g_warning("Failed to open module %s with name %s (error=%s)\n", gmodule_file, type, g_module_error()); } g_free(type); if(gmodule != NULL) { g_module_symbol (gmodule, "get_bplugin_info", (gpointer) &plugin_get_bplugin_info); if(plugin_get_bplugin_info != NULL) { BoardPlugin *bp; /* Get the BoardPlugin Info */ bp = (BoardPlugin *) plugin_get_bplugin_info(); /* If this plugin defines an initialisation entry point, call it */ if(bp->init != NULL) { bp->init(gcomprisBoard); } if(bp->is_our_board(gcomprisBoard)) { /* Great, we found our plugin */ g_warning("We found the correct plugin for board %s (type=%s)\n", gcomprisBoard->name, gcomprisBoard->type); /* done in is_our_board gcomprisBoard->plugin = bp; */ /* Save this for caching and cleanup */ gcomprisBoard->gmodule_file = gmodule_file; gcomprisBoard->gmodule = gmodule; return TRUE; } else { g_warning("We found a plugin with the name %s but is_our_board() returned FALSE (type=%s)\n", gcomprisBoard->name, gcomprisBoard->type); } } else { g_warning("plugin_get_bplugin_info entry point not found for %s\n", gcomprisBoard->filename); } } g_warning("No plugin library found for board type '%s', requested by '%s'", gcomprisBoard->type, gcomprisBoard->filename); return FALSE; } #endif void gc_board_play(GcomprisBoard *gcomprisBoard) { BoardPlugin *bp; g_assert(gcomprisBoard!=NULL); gc_board_check_file(gcomprisBoard); if(gcomprisBoard->plugin!=NULL) { /* Log the board start */ gc_log_start(gcomprisBoard); bp = gcomprisBoard->plugin; gc_board_set_current(gcomprisBoard); gc_activity_intro_play(gcomprisBoard); bp->start_board(gcomprisBoard); bp_data->playing = TRUE; return; } /* We set the playing flag even if no boardplugin recognizes the board. This way we are sure it will be skipped. */ bp_data->playing = TRUE; } void gc_board_pause(int pause) { if (get_board_playing() && gc_board_get_current_board_plugin()) { if(gc_board_get_current_board_plugin()->pause_board) gc_board_get_current_board_plugin()->pause_board(pause); } else g_warning ("No boards to pause ?"); } void gc_board_stop(void) { if (bp_data->playing && gc_board_get_current_board_plugin()) { bp_data->playing = FALSE; if (gc_board_get_current_board_plugin()->end_board) gc_board_get_current_board_plugin()->end_board(); gc_board_end(); return; } bp_data->playing = FALSE; } static gboolean get_board_playing(void) { return (bp_data && bp_data->playing); } static GcomprisBoard *next_board = NULL; static gint next_board_callback_id = 0; #define NEXT_TIME_DELAY 10 void board_run_next_end() { gtk_timeout_remove(next_board_callback_id); next_board_callback_id = 0; if (next_board && next_board->previous_board && next_board->previous_board->plugin->end_board) next_board->previous_board->plugin->end_board(); /* reset the im context */ gc_im_reset(); /*run the board */ gc_board_play(next_board); } void gc_board_run_next(GcomprisBoard *board) { board->previous_board = gc_board_get_current(); next_board = board; next_board_callback_id = gtk_timeout_add (NEXT_TIME_DELAY, (GtkFunction) board_run_next_end, NULL); }