Gobligine/gameheaders/stratagus-maemo-extract.h

280 lines
6.9 KiB
C

/*
_________ __ __
/ _____// |_____________ _/ |______ ____ __ __ ______
\_____ \\ __\_ __ \__ \\ __\__ \ / ___\| | \/ ___/
/ \| | | | \// __ \| | / __ \_/ /_/ > | /\___ |
/_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
\/ \/ \//_____/ \/
______________________ ______________________
T H E W A R B E G I N S
Stratagus - A free fantasy real time strategy game engine
stratagus-maemo-extract.h - Stratagus Game data extractor for Maemo
Copyright (C) 2010-2011 Pali Rohár <pali.rohar@gmail.com>
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 2 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 <http://www.gnu.org/licenses/>.
*/
/**
* @page MaemoExtract Stratagus Game data extractor for Maemo
*
* Stratagus Game Launcher is C code for generating launcher for any Stratagus game.
* Game launcher for concrete game check if game data exists in default Stratagus
* location and spawn Stratagus process with correct game data location. If does not
* exist it show GUI or console error message.
*
* Before including this header, you need to define:
*
* ::GAME_NAME
*
* ::GAME_CD
*
* ::GAME_CD_DIR
*
* ::GAME_CD_FILE
*
* ::GAME
*
*
* ::EXTRACT_BIN
*
*
* And optional:
*
* ::EXTRACT_COMMAND
*
* ::EXTRACT_INFO
*
* Example use of code:
*
* @code
*
* #define GAME_NAME "My Game Name"
* #define GAME_CD "Original Game CD Name"
* #define GAME_CD_DIR "MyDocs/game"
* #define GAME_CD_FILE "datafile.bin"
* #define GAME "my_game"
* #define EXTRACT_BIN "/opt/stratagus/bin/mygametool"
* #define EXTRACT_COMMAND "/opt/stratagus/bin/mygametool /home/user/MyDocs/game /home/user/stratagus/my_game"
* #define EXTRACT_INFO ""
* #include <stratagus-maemo-extract.h>
*
* @endcode
**/
/**
* \def GAME_NAME
* Full name of your Game
**/
/**
* \def GAME_CD
* Full name of data CD
**/
/**
* \def GAME_CD_DIR
* Relative path of /home/user where is data CD
**/
/**
* \def GAME_CD_FILE
* Filename of one data file
**/
/**
* \def GAME
* Short name of game (lower ascii chars without space)
**/
/**
* \def EXTRACT_BIN
* Full path to program which extract data
**/
/**
* \def EXTRACT_COMMAND
* Optional: Full patch to extract program with command line arguments for extracting data
* If not specified 'EXTRACT_BIN DATA_DIR EXTRACT_DIR' is used
**/
/**
* \def EXTRACT_INFO
* Optional: Additional extract data game info
* Default empty
**/
/* Fake definitions for Doxygen */
#ifdef DOXYGEN
#define GAME_NAME
#define GAME_CD
#define GAME_CD_DIR
#define GAME_CD_FILE
#define GAME
#define EXTRACT_BIN
#endif
#if ! defined (GAME_NAME) || ! defined (GAME_CD) || ! defined (GAME_CD_DIR) || ! defined (GAME_CD_FILE) || ! defined (GAME) || ! defined (EXTRACT_BIN)
#error You need to define all Game macros, see stratagus-maemo-extract.h
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <gtk/gtk.h>
#include <hildon/hildon.h>
#define DATA_DIR "/home/user/" GAME_CD_DIR
#define EXTRACT_DIR "/home/user/MyDocs/stratagus/" GAME
#ifndef EXTRACT_COMMAND
#define EXTRACT_COMMAND EXTRACT_BIN " " DATA_DIR " " EXTRACT_DIR
#endif
#ifndef EXTRACT_INFO
#define EXTRACT_INFO ""
#endif
#define DATA_NEED_COPY "Note: You need the original " GAME_CD "\nto extract the game data files.\nData files are needed to run " GAME_NAME ".\n\nFirst copy " GAME_CD " to folder\n" GAME_CD_DIR "\nthen press OK. " EXTRACT_INFO
#define DATA_FOUND GAME_CD " data files was found in folder\n" GAME_CD_DIR "\n\nPlease be patient, the data may take\na couple of minutes to extract...\n\nPress OK to start extracting data now."
#define DATA_NOT_FOUND "Error: " GAME_CD " data files was not found.\n\nCheck if you have file\n" GAME_CD_DIR "/" GAME_CD_FILE
#define EXTRACT_OK GAME_CD " data files was successfull extracted."
#define EXTRACT_FAILED "Error: Cannot extract " GAME_CD " data files\nextract program crashed."
static void message(char * title, char * text, int error) {
GtkWidget * window = NULL;
GtkWidget * dialog = NULL;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), title);
gtk_widget_show(window);
dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, error ? GTK_MESSAGE_ERROR : GTK_MESSAGE_INFO, GTK_BUTTONS_OK, text, NULL);
gtk_window_set_title(GTK_WINDOW(dialog), title);
gtk_window_set_skip_pager_hint(GTK_WINDOW(dialog), 0);
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), 0);
gtk_label_set_selectable(GTK_LABEL(GTK_MESSAGE_DIALOG(dialog)->label), 0);
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
gtk_widget_destroy(window);
if ( error )
exit(error);
}
int main(int argc, char * argv[]) {
FILE * file;
struct stat st;
hildon_gtk_init(&argc, &argv);
file = fopen(EXTRACT_DIR "/extracted", "r");
if ( file ) {
char act_version[20];
int have_version = 0;
if ( fgets(act_version, 20, file) )
have_version = 1;
fclose(file);
if ( have_version ) {
file = popen(EXTRACT_BIN " -V", "r");
if ( file ) {
int i;
char new_version[20];
have_version = 0;
if ( fgets(new_version, 20, file) )
have_version = 1;
pclose(file);
if ( have_version ) {
for ( i = 0; i < 20; ++i ) {
if ( new_version[i] == '\n' ) {
new_version[i] = 0;
break;
}
}
if ( strcmp(act_version, new_version) == 0 )
return 0;
}
}
}
}
message(GAME_NAME, DATA_NEED_COPY, 0);
if ( stat(DATA_DIR "/" GAME_CD_FILE, &st) != 0 ) {
char * buf = strdup(GAME_CD_FILE);
char * path = calloc(strlen(DATA_DIR) + strlen(GAME_CD_FILE) + 2, 1);
char * ptr = buf;
while ( *ptr ) {
*ptr = toupper(*ptr);
++ptr;
}
sprintf(path, DATA_DIR "/%s", buf);
if ( stat(path, &st) != 0 )
message(GAME_NAME, DATA_NOT_FOUND, 1);
free(buf);
free(path);
}
if ( stat("/home/user/MyDocs/stratagus", &st) != 0 )
mkdir("/home/user/MyDocs/stratagus", 0777);
if ( stat("/home/user/MyDocs/stratagus/" GAME, &st) != 0 )
mkdir("/home/user/MyDocs/stratagus/" GAME, 0777);
message(GAME_NAME, DATA_FOUND, 0);
int ret = system(EXTRACT_COMMAND);
if ( ret != 0 )
message(GAME_NAME, EXTRACT_FAILED, ret);
message(GAME_NAME, EXTRACT_OK, 0);
return 0;
}