Uncrustify sources
This commit is contained in:
parent
1c88c88b63
commit
e820f2308a
140
uncrustify.cfg
Normal file
140
uncrustify.cfg
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
newlines lf
|
||||||
|
|
||||||
|
input_tab_size 8
|
||||||
|
output_tab_size 8
|
||||||
|
|
||||||
|
string_escape_char 92
|
||||||
|
string_escape_char2 0
|
||||||
|
|
||||||
|
# indenting
|
||||||
|
indent_columns 4
|
||||||
|
indent_with_tabs 0
|
||||||
|
indent_align_string True
|
||||||
|
indent_brace 0
|
||||||
|
indent_braces False
|
||||||
|
indent_braces_no_func True
|
||||||
|
indent_func_call_param False
|
||||||
|
indent_func_def_param False
|
||||||
|
indent_func_proto_param False
|
||||||
|
indent_switch_case indent_columns
|
||||||
|
indent_case_brace indent_columns
|
||||||
|
indent_paren_close 1
|
||||||
|
indent_var_def_cont False
|
||||||
|
|
||||||
|
# spacing
|
||||||
|
sp_arith Add
|
||||||
|
sp_assign Add
|
||||||
|
sp_enum_assign Add
|
||||||
|
sp_bool Add
|
||||||
|
sp_compare Add
|
||||||
|
sp_inside_paren Remove
|
||||||
|
sp_inside_fparens Remove
|
||||||
|
sp_func_def_paren Remove
|
||||||
|
sp_func_proto_paren Remove
|
||||||
|
sp_paren_paren Remove
|
||||||
|
sp_balance_nested_parens False
|
||||||
|
sp_paren_brace Remove
|
||||||
|
sp_before_square Remove
|
||||||
|
sp_before_squares Remove
|
||||||
|
sp_inside_square Remove
|
||||||
|
sp_after_comma Add
|
||||||
|
sp_before_comma Remove
|
||||||
|
sp_after_cast Remove
|
||||||
|
sp_sizeof_paren Remove
|
||||||
|
sp_not Remove
|
||||||
|
sp_inv Remove
|
||||||
|
sp_addr Remove
|
||||||
|
sp_member Remove
|
||||||
|
sp_deref Remove
|
||||||
|
sp_sign Remove
|
||||||
|
sp_incdec Remove
|
||||||
|
sp_attribute_paren Remove
|
||||||
|
sp_macro Force
|
||||||
|
sp_func_call_paren Remove
|
||||||
|
sp_brace_typedef add
|
||||||
|
sp_cond_colon add
|
||||||
|
sp_cond_question add
|
||||||
|
sp_defined_paren Remove
|
||||||
|
sp_inside_paren_cast Ignore
|
||||||
|
sp_else_brace Add
|
||||||
|
sp_between_ptr_star Remove
|
||||||
|
sp_before_ptr_star Add
|
||||||
|
|
||||||
|
# alignment
|
||||||
|
align_keep_tabs False
|
||||||
|
align_with_tabs False
|
||||||
|
align_on_tabstop False
|
||||||
|
align_number_left True
|
||||||
|
align_func_params True
|
||||||
|
align_var_def_span 2
|
||||||
|
align_var_def_amp_style 1
|
||||||
|
align_var_def_colon True
|
||||||
|
align_enum_equ_span 0
|
||||||
|
align_var_struct_span 2
|
||||||
|
align_var_def_star_style 1
|
||||||
|
align_var_def_amp_style 1
|
||||||
|
align_typedef_span 2
|
||||||
|
align_typedef_func 0
|
||||||
|
align_typedef_star_style 1
|
||||||
|
align_typedef_amp_style 2
|
||||||
|
align_var_def_inline True
|
||||||
|
align_assign_span 1
|
||||||
|
align_pp_define_together True
|
||||||
|
|
||||||
|
# newlines
|
||||||
|
nl_assign_leave_one_liners True
|
||||||
|
nl_enum_leave_one_liners False
|
||||||
|
nl_func_leave_one_liners False
|
||||||
|
nl_if_leave_one_liners False
|
||||||
|
nl_end_of_file Add
|
||||||
|
nl_end_of_file_min 2
|
||||||
|
nl_assign_brace Remove
|
||||||
|
nl_func_var_def_blk 1
|
||||||
|
nl_fcall_brace Add
|
||||||
|
nl_enum_brace Remove
|
||||||
|
nl_struct_brace Remove
|
||||||
|
nl_union_brace Remove
|
||||||
|
nl_if_brace Remove
|
||||||
|
nl_brace_else Remove
|
||||||
|
nl_elseif_brace Remove
|
||||||
|
nl_else_brace Remove
|
||||||
|
nl_for_brace Remove
|
||||||
|
nl_while_brace Remove
|
||||||
|
nl_do_brace Remove
|
||||||
|
nl_brace_while Remove
|
||||||
|
nl_switch_brace Remove
|
||||||
|
nl_before_case True
|
||||||
|
nl_after_case True
|
||||||
|
nl_func_type_name Force
|
||||||
|
nl_func_proto_type_name Remove
|
||||||
|
nl_func_paren Remove
|
||||||
|
nl_func_decl_start Remove
|
||||||
|
nl_func_decl_args Force
|
||||||
|
nl_func_decl_end Remove
|
||||||
|
nl_fdef_brace Force
|
||||||
|
nl_after_return False
|
||||||
|
nl_define_macro False
|
||||||
|
nl_create_if_one_liner False
|
||||||
|
nl_create_for_one_liner False
|
||||||
|
nl_create_while_one_liner False
|
||||||
|
nl_after_semicolon True
|
||||||
|
nl_multi_line_cond False
|
||||||
|
nl_var_def_blk_in 2
|
||||||
|
nl_multi_line_define True
|
||||||
|
|
||||||
|
# mod
|
||||||
|
mod_full_brace_for Force
|
||||||
|
mod_full_brace_if Force
|
||||||
|
mod_full_brace_while Force
|
||||||
|
mod_full_brace_do Remove
|
||||||
|
mod_full_brace_nl 3
|
||||||
|
mod_paren_on_return Remove
|
||||||
|
|
||||||
|
# line splitting
|
||||||
|
#code_width = 78
|
||||||
|
ls_for_split_full True
|
||||||
|
ls_func_split_full True
|
||||||
|
|
||||||
|
# positioning
|
||||||
|
pos_bool Trail
|
||||||
|
pos_conditional Lead
|
@ -42,7 +42,7 @@ ConfigData *active_config = NULL;
|
|||||||
GQuark
|
GQuark
|
||||||
wmud_config_error_quark()
|
wmud_config_error_quark()
|
||||||
{
|
{
|
||||||
return g_quark_from_static_string("wmud-config-error");
|
return g_quark_from_static_string("wmud-config-error");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,26 +54,32 @@ wmud_config_error_quark()
|
|||||||
void
|
void
|
||||||
wmud_configdata_free(ConfigData **config_data)
|
wmud_configdata_free(ConfigData **config_data)
|
||||||
{
|
{
|
||||||
if ((*config_data)->admin_email)
|
if ((*config_data)->admin_email) {
|
||||||
g_free((*config_data)->admin_email);
|
g_free((*config_data)->admin_email);
|
||||||
|
}
|
||||||
|
|
||||||
if ((*config_data)->database_dsn)
|
if ((*config_data)->database_dsn) {
|
||||||
g_free((*config_data)->database_dsn);
|
g_free((*config_data)->database_dsn);
|
||||||
|
}
|
||||||
|
|
||||||
if ((*config_data)->smtp_server)
|
if ((*config_data)->smtp_server) {
|
||||||
g_free((*config_data)->smtp_server);
|
g_free((*config_data)->smtp_server);
|
||||||
|
}
|
||||||
|
|
||||||
if ((*config_data)->smtp_username)
|
if ((*config_data)->smtp_username) {
|
||||||
g_free((*config_data)->smtp_username);
|
g_free((*config_data)->smtp_username);
|
||||||
|
}
|
||||||
|
|
||||||
if ((*config_data)->smtp_password)
|
if ((*config_data)->smtp_password) {
|
||||||
g_free((*config_data)->smtp_password);
|
g_free((*config_data)->smtp_password);
|
||||||
|
}
|
||||||
|
|
||||||
if ((*config_data)->smtp_sender)
|
if ((*config_data)->smtp_sender) {
|
||||||
g_free((*config_data)->smtp_sender);
|
g_free((*config_data)->smtp_sender);
|
||||||
|
}
|
||||||
|
|
||||||
g_free(*config_data);
|
g_free(*config_data);
|
||||||
*config_data = NULL;
|
*config_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -90,127 +96,176 @@ wmud_configdata_free(ConfigData **config_data)
|
|||||||
gboolean
|
gboolean
|
||||||
wmud_config_init(ConfigData **config_data, GError **err)
|
wmud_config_init(ConfigData **config_data, GError **err)
|
||||||
{
|
{
|
||||||
GString *config_file = g_string_new(WMUD_CONFDIR);
|
GString *config_file = g_string_new(WMUD_CONFDIR);
|
||||||
GKeyFile *config;
|
GKeyFile *config;
|
||||||
GError *in_err = NULL;
|
GError *in_err = NULL;
|
||||||
gchar *pos;
|
gchar *pos;
|
||||||
|
|
||||||
if (!config_data)
|
if (!config_data)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (*config_data) {
|
if (*config_data) {
|
||||||
g_clear_error(err);
|
g_clear_error(err);
|
||||||
g_set_error(err, WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_REUSE, "Configuration pointer reuse. Please file a bug report!");
|
g_set_error(err,
|
||||||
return FALSE;
|
WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_REUSE,
|
||||||
}
|
"Configuration pointer reuse. Please file a bug report!");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
*config_data = g_new0(ConfigData, 1);
|
*config_data = g_new0(ConfigData, 1);
|
||||||
|
|
||||||
g_string_append(config_file, "/wmud.conf");
|
g_string_append(config_file, "/wmud.conf");
|
||||||
|
|
||||||
config = g_key_file_new();
|
config = g_key_file_new();
|
||||||
/* TODO: Error checking */
|
/* TODO: Error checking */
|
||||||
g_key_file_load_from_file(config, config_file->str, 0, &in_err);
|
g_key_file_load_from_file(config, config_file->str, 0, &in_err);
|
||||||
|
|
||||||
if (!g_key_file_has_group(config, "global")) {
|
if (!g_key_file_has_group(config, "global")) {
|
||||||
g_set_error(err, WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOGLOBAL, "Config file (%s) does not contain a [global] group", config_file->str);
|
g_set_error(err,
|
||||||
g_key_file_free(config);
|
WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOGLOBAL,
|
||||||
g_string_free(config_file, TRUE);
|
"Config file (%s) does not contain a [global] group",
|
||||||
|
config_file->str);
|
||||||
|
g_key_file_free(config);
|
||||||
|
g_string_free(config_file, TRUE);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_key_file_has_group(config, "smtp")) {
|
if (!g_key_file_has_group(config, "smtp")) {
|
||||||
g_set_error(err, WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOSMTP, "Config file (%s) does not contain an [smtp] group", config_file->str);
|
g_set_error(err,
|
||||||
g_key_file_free(config);
|
WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOSMTP,
|
||||||
g_string_free(config_file, TRUE);
|
"Config file (%s) does not contain an [smtp] group",
|
||||||
|
config_file->str);
|
||||||
|
g_key_file_free(config);
|
||||||
|
g_string_free(config_file, TRUE);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_key_file_has_group(config, "database")) {
|
if (!g_key_file_has_group(config, "database")) {
|
||||||
g_set_error(err, WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NODATABASE, "Config file (%s) does not contain a [database] group", config_file->str);
|
g_set_error(err,
|
||||||
g_key_file_free(config);
|
WMUD_CONFIG_ERROR,
|
||||||
g_string_free(config_file, TRUE);
|
WMUD_CONFIG_ERROR_NODATABASE,
|
||||||
|
"Config file (%s) does not contain a [database] group",
|
||||||
|
config_file->str);
|
||||||
|
g_key_file_free(config);
|
||||||
|
g_string_free(config_file, TRUE);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_clear_error(&in_err);
|
g_clear_error(&in_err);
|
||||||
(*config_data)->port = g_key_file_get_integer(config, "global", "port", &in_err);
|
(*config_data)->port = g_key_file_get_integer(config,
|
||||||
if (in_err)
|
"global", "port",
|
||||||
{
|
&in_err);
|
||||||
if (g_error_matches(in_err, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
|
||||||
(*config_data)->port = DEFAULT_PORT;
|
|
||||||
} else if (g_error_matches(in_err, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE)) {
|
|
||||||
g_set_error(err, WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_BADPORT, "Config file (%s) contains an invalid port number", config_file->str);
|
|
||||||
g_key_file_free(config);
|
|
||||||
g_string_free(config_file, TRUE);
|
|
||||||
(*config_data)->port = 0;
|
|
||||||
|
|
||||||
return FALSE;
|
if (in_err) {
|
||||||
}
|
if (g_error_matches(in_err,
|
||||||
|
G_KEY_FILE_ERROR,
|
||||||
|
G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
||||||
|
(*config_data)->port = DEFAULT_PORT;
|
||||||
|
} else if (g_error_matches(in_err,
|
||||||
|
G_KEY_FILE_ERROR,
|
||||||
|
G_KEY_FILE_ERROR_INVALID_VALUE)) {
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_BADPORT,
|
||||||
|
"Config file (%s) contains an invalid port number",
|
||||||
|
config_file->str);
|
||||||
|
g_key_file_free(config);
|
||||||
|
g_string_free(config_file, TRUE);
|
||||||
|
(*config_data)->port = 0;
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_clear_error(&in_err);
|
return FALSE;
|
||||||
(*config_data)->admin_email = g_key_file_get_string(config, "global", "admin email", &in_err);
|
}
|
||||||
if (in_err && g_error_matches(in_err, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
|
||||||
g_set_error(err, WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOEMAIL, "Config file (%s) does not contain an admin e-mail address", config_file->str);
|
|
||||||
g_key_file_free(config);
|
|
||||||
g_string_free(config_file, TRUE);
|
|
||||||
wmud_configdata_free(config_data);
|
|
||||||
|
|
||||||
return FALSE;
|
g_clear_error(&in_err);
|
||||||
}
|
(*config_data)->admin_email = g_key_file_get_string(config,
|
||||||
|
"global", "admin email",
|
||||||
|
&in_err);
|
||||||
|
if (in_err && g_error_matches(in_err,
|
||||||
|
G_KEY_FILE_ERROR,
|
||||||
|
G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOEMAIL,
|
||||||
|
"Config file (%s) does not contain an admin e-mail address",
|
||||||
|
config_file->str);
|
||||||
|
g_key_file_free(config);
|
||||||
|
g_string_free(config_file, TRUE);
|
||||||
|
wmud_configdata_free(config_data);
|
||||||
|
|
||||||
g_clear_error(&in_err);
|
return FALSE;
|
||||||
(*config_data)->smtp_server = g_key_file_get_string(config, "smtp", "smtp server", &in_err);
|
}
|
||||||
if (in_err && g_error_matches(in_err, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
|
||||||
g_set_error(err, WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOSMTPSERVER, "Config file (%s) does not contain an smtp server address", config_file->str);
|
|
||||||
g_key_file_free(config);
|
|
||||||
g_string_free(config_file, TRUE);
|
|
||||||
wmud_configdata_free(config_data);
|
|
||||||
|
|
||||||
return FALSE;
|
g_clear_error(&in_err);
|
||||||
}
|
(*config_data)->smtp_server = g_key_file_get_string(config,
|
||||||
|
"smtp", "smtp server",
|
||||||
|
&in_err);
|
||||||
|
if (in_err && g_error_matches(in_err,
|
||||||
|
G_KEY_FILE_ERROR,
|
||||||
|
G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOSMTPSERVER,
|
||||||
|
"Config file (%s) does not contain an smtp server address",
|
||||||
|
config_file->str);
|
||||||
|
g_key_file_free(config);
|
||||||
|
g_string_free(config_file, TRUE);
|
||||||
|
wmud_configdata_free(config_data);
|
||||||
|
|
||||||
g_clear_error(&in_err);
|
return FALSE;
|
||||||
(*config_data)->smtp_sender = g_key_file_get_string(config, "smtp", "smtp sender", &in_err);
|
}
|
||||||
if (in_err && g_error_matches(in_err, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
|
||||||
g_set_error(err, WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOSMTPSENDER, "Config file (%s) does not contain an smtp sender name", config_file->str);
|
|
||||||
g_key_file_free(config);
|
|
||||||
g_string_free(config_file, TRUE);
|
|
||||||
wmud_configdata_free(config_data);
|
|
||||||
|
|
||||||
return FALSE;
|
g_clear_error(&in_err);
|
||||||
}
|
(*config_data)->smtp_sender = g_key_file_get_string(config,
|
||||||
|
"smtp", "smtp sender",
|
||||||
|
&in_err);
|
||||||
|
if (in_err && g_error_matches(in_err,
|
||||||
|
G_KEY_FILE_ERROR,
|
||||||
|
G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOSMTPSENDER,
|
||||||
|
"Config file (%s) does not contain an smtp sender name",
|
||||||
|
config_file->str);
|
||||||
|
g_key_file_free(config);
|
||||||
|
g_string_free(config_file, TRUE);
|
||||||
|
wmud_configdata_free(config_data);
|
||||||
|
|
||||||
g_clear_error(&in_err);
|
return FALSE;
|
||||||
(*config_data)->database_dsn = g_key_file_get_string(config, "database", "dsn", &in_err);
|
}
|
||||||
if (in_err && g_error_matches(in_err, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
|
||||||
g_set_error(err, WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOWORLD, "Config file (%s) does not contain a database dsn", config_file->str);
|
|
||||||
g_key_file_free(config);
|
|
||||||
g_string_free(config_file, TRUE);
|
|
||||||
wmud_configdata_free(config_data);
|
|
||||||
|
|
||||||
return FALSE;
|
g_clear_error(&in_err);
|
||||||
}
|
(*config_data)->database_dsn = g_key_file_get_string(config,
|
||||||
|
"database", "dsn",
|
||||||
|
&in_err);
|
||||||
|
if (in_err && g_error_matches(in_err,
|
||||||
|
G_KEY_FILE_ERROR,
|
||||||
|
G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_CONFIG_ERROR, WMUD_CONFIG_ERROR_NOWORLD,
|
||||||
|
"Config file (%s) does not contain a database dsn",
|
||||||
|
config_file->str);
|
||||||
|
g_key_file_free(config);
|
||||||
|
g_string_free(config_file, TRUE);
|
||||||
|
wmud_configdata_free(config_data);
|
||||||
|
|
||||||
if ((pos = g_strstr_len((*config_data)->database_dsn, -1, "{statedir}")) != NULL) {
|
return FALSE;
|
||||||
guint real_pos = pos - (*config_data)->database_dsn;
|
}
|
||||||
GString *tmp = g_string_new((*config_data)->database_dsn);
|
|
||||||
|
|
||||||
g_string_erase(tmp, real_pos, 10);
|
if ((pos = g_strstr_len((*config_data)->database_dsn,
|
||||||
g_string_insert(tmp, real_pos, WMUD_STATEDIR);
|
-1, "{statedir}")) != NULL) {
|
||||||
(*config_data)->database_dsn = tmp->str;
|
guint real_pos = pos - (*config_data)->database_dsn;
|
||||||
g_string_free(tmp, FALSE);
|
GString *tmp = g_string_new((*config_data)->database_dsn);
|
||||||
}
|
|
||||||
|
|
||||||
g_key_file_free(config);
|
g_string_erase(tmp, real_pos, 10);
|
||||||
g_string_free(config_file, TRUE);
|
g_string_insert(tmp, real_pos, WMUD_STATEDIR);
|
||||||
|
(*config_data)->database_dsn = tmp->str;
|
||||||
|
g_string_free(tmp, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
g_key_file_free(config);
|
||||||
|
g_string_free(config_file, TRUE);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
767
wmud/db.c
767
wmud/db.c
@ -45,7 +45,7 @@ static GdaSqlParser *parser = NULL;
|
|||||||
GQuark
|
GQuark
|
||||||
wmud_db_error_quark()
|
wmud_db_error_quark()
|
||||||
{
|
{
|
||||||
return g_quark_from_static_string("wmud-db-error");
|
return g_quark_from_static_string("wmud-db-error");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -57,26 +57,36 @@ wmud_db_error_quark()
|
|||||||
gboolean
|
gboolean
|
||||||
wmud_db_init(GError **err)
|
wmud_db_init(GError **err)
|
||||||
{
|
{
|
||||||
GError *local_err = NULL;
|
GError *local_err = NULL;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Initializing database");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Initializing database");
|
||||||
|
|
||||||
gda_init();
|
gda_init();
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Database DSN is \"%s\"", active_config->database_dsn);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
dbh = gda_connection_open_from_string(NULL, active_config->database_dsn, NULL, GDA_CONNECTION_OPTIONS_THREAD_SAFE, &local_err);
|
"Database DSN is \"%s\"",
|
||||||
|
active_config->database_dsn);
|
||||||
|
dbh = gda_connection_open_from_string(NULL,
|
||||||
|
active_config->database_dsn,
|
||||||
|
NULL,
|
||||||
|
GDA_CONNECTION_OPTIONS_THREAD_SAFE,
|
||||||
|
&local_err);
|
||||||
|
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_CANTOPEN, "Can not open databsae (%s): %s", active_config->database_dsn, local_err->message);
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_CANTOPEN,
|
||||||
|
"Can not open databsae (%s): %s",
|
||||||
|
active_config->database_dsn,
|
||||||
|
local_err->message);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
parser = gda_sql_parser_new();
|
parser = gda_sql_parser_new();
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Database initialization finished.");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Database initialization finished.");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,62 +98,79 @@ wmud_db_init(GError **err)
|
|||||||
gboolean
|
gboolean
|
||||||
wmud_db_load_players(GError **err)
|
wmud_db_load_players(GError **err)
|
||||||
{
|
{
|
||||||
GdaStatement *sth = NULL;
|
GdaStatement *sth = NULL;
|
||||||
GdaDataModel *res;
|
GdaDataModel *res;
|
||||||
GdaDataModelIter *iter;
|
GdaDataModelIter *iter;
|
||||||
GError *local_err = NULL;
|
GError *local_err = NULL;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading players");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading players");
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
if (err)
|
if (err)
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sth = gda_sql_parser_parse_string(parser, "SELECT id, login, password, email FROM players", NULL, NULL);
|
sth = gda_sql_parser_parse_string(
|
||||||
|
parser,
|
||||||
|
"SELECT id, login, password, email FROM players",
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
/* TODO: error checking! */
|
/* TODO: error checking! */
|
||||||
if ((res = gda_connection_statement_execute_select(dbh, sth, NULL, &local_err)) == NULL) {
|
if ((res = gda_connection_statement_execute_select(
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "Unable to load players: %s", local_err->message);
|
dbh,
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_SELECT_ERROR, "SELECT error: %s", local_err->message);
|
sth,
|
||||||
|
NULL,
|
||||||
|
&local_err)) == NULL) {
|
||||||
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
|
||||||
|
"Unable to load players: %s",
|
||||||
|
local_err->message);
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_SELECT_ERROR,
|
||||||
|
"SELECT error: %s",
|
||||||
|
local_err->message);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
iter = gda_data_model_create_iter(res);
|
iter = gda_data_model_create_iter(res);
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
|
|
||||||
while (gda_data_model_iter_is_valid(iter)) {
|
while (gda_data_model_iter_is_valid(iter)) {
|
||||||
const GValue *val;
|
const GValue *val;
|
||||||
WmudPlayer *player;
|
WmudPlayer *player;
|
||||||
|
|
||||||
player = wmud_player_new();
|
player = wmud_player_new();
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 0);
|
val = gda_data_model_iter_get_value_at(iter, 0);
|
||||||
wmud_player_set_id(player, g_value_get_int(val));
|
wmud_player_set_id(player, g_value_get_int(val));
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 1);
|
val = gda_data_model_iter_get_value_at(iter, 1);
|
||||||
wmud_player_set_player_name(player, g_value_get_string(val));
|
wmud_player_set_player_name(player, g_value_get_string(val));
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 2);
|
val = gda_data_model_iter_get_value_at(iter, 2);
|
||||||
wmud_player_set_cpassword(player, g_value_get_string(val));
|
wmud_player_set_cpassword(player, g_value_get_string(val));
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 3);
|
val = gda_data_model_iter_get_value_at(iter, 3);
|
||||||
wmud_player_set_email(player, g_value_get_string(val));
|
wmud_player_set_email(player, g_value_get_string(val));
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded player _%s_", wmud_player_get_player_name(player));
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
|
"Loaded player _%s_",
|
||||||
|
wmud_player_get_player_name(player));
|
||||||
|
|
||||||
players = g_slist_prepend(players, player);
|
players = g_slist_prepend(players, player);
|
||||||
|
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref(iter);
|
g_object_unref(iter);
|
||||||
g_object_unref(sth);
|
g_object_unref(sth);
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Finished loading players");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Finished loading players");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -159,41 +186,63 @@ wmud_db_load_players(GError **err)
|
|||||||
gboolean
|
gboolean
|
||||||
wmud_db_save_player(WmudPlayer *player, GError **err)
|
wmud_db_save_player(WmudPlayer *player, GError **err)
|
||||||
{
|
{
|
||||||
GError *local_err = NULL;
|
GError *local_err = NULL;
|
||||||
GValue *login_value,
|
GValue *login_value,
|
||||||
*email_value;
|
*email_value;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Saving player");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Saving player");
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
if (err)
|
if (err)
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
login_value = gda_value_new_from_string(wmud_player_get_player_name(player), G_TYPE_STRING);
|
login_value = gda_value_new_from_string(
|
||||||
email_value = gda_value_new_from_string(wmud_player_get_email(player), G_TYPE_STRING);
|
wmud_player_get_player_name(player),
|
||||||
|
G_TYPE_STRING);
|
||||||
|
email_value = gda_value_new_from_string(
|
||||||
|
wmud_player_get_email(player),
|
||||||
|
G_TYPE_STRING);
|
||||||
|
|
||||||
if (!gda_connection_insert_row_into_table(dbh, "players", &local_err, "id", NULL, "login", login_value, "password", NULL, "email", email_value, NULL)) {
|
if (!gda_connection_insert_row_into_table(dbh,
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_BADQUERY, "Error saving player: %s", local_err->message);
|
"players",
|
||||||
|
&local_err,
|
||||||
|
"id", NULL,
|
||||||
|
"login", login_value,
|
||||||
|
"password", NULL,
|
||||||
|
"email", email_value,
|
||||||
|
NULL)) {
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_BADQUERY,
|
||||||
|
"Error saving player: %s",
|
||||||
|
local_err->message);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
wmud_db_update_player_password(WmudPlayer *player, gchar *crypted_password, GError **err)
|
wmud_db_update_player_password(WmudPlayer *player,
|
||||||
|
gchar *crypted_password,
|
||||||
|
GError **err)
|
||||||
{
|
{
|
||||||
GValue *cpw,
|
GValue *cpw,
|
||||||
*player_id;
|
*player_id;
|
||||||
GError *local_err = NULL;
|
GError *local_err = NULL;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Saving player password for %s", wmud_player_get_player_name(player));
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
|
"Saving player password for %s",
|
||||||
|
wmud_player_get_player_name(player));
|
||||||
|
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -202,8 +251,16 @@ wmud_db_update_player_password(WmudPlayer *player, gchar *crypted_password, GErr
|
|||||||
g_value_set_uint(player_id, wmud_player_get_id(player));
|
g_value_set_uint(player_id, wmud_player_get_id(player));
|
||||||
cpw = gda_value_new_from_string(crypted_password, G_TYPE_STRING);
|
cpw = gda_value_new_from_string(crypted_password, G_TYPE_STRING);
|
||||||
|
|
||||||
if (!gda_connection_update_row_in_table(dbh, "players", "id", player_id, &local_err, "password", cpw, NULL)) {
|
if (!gda_connection_update_row_in_table(dbh,
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_BADQUERY, "Error saving player password: %s", local_err->message);
|
"players",
|
||||||
|
"id", player_id,
|
||||||
|
&local_err,
|
||||||
|
"password", cpw,
|
||||||
|
NULL)) {
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_BADQUERY,
|
||||||
|
"Error saving player password: %s",
|
||||||
|
local_err->message);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -214,395 +271,465 @@ wmud_db_update_player_password(WmudPlayer *player, gchar *crypted_password, GErr
|
|||||||
gboolean
|
gboolean
|
||||||
wmud_db_load_planes(GSList **planes, GError **err)
|
wmud_db_load_planes(GSList **planes, GError **err)
|
||||||
{
|
{
|
||||||
GdaStatement *sth = NULL;
|
GdaStatement *sth = NULL;
|
||||||
GdaDataModel *res = NULL;
|
GdaDataModel *res = NULL;
|
||||||
GdaDataModelIter *iter;
|
GdaDataModelIter *iter;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading planes");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading planes");
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
if (err)
|
if (err)
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sth = gda_sql_parser_parse_string(parser, "SELECT id, name FROM planes", NULL, NULL);
|
sth = gda_sql_parser_parse_string(parser,
|
||||||
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
"SELECT id, name FROM planes",
|
||||||
iter = gda_data_model_create_iter(res);
|
NULL,
|
||||||
gda_data_model_iter_move_next(iter);
|
NULL);
|
||||||
|
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
||||||
|
iter = gda_data_model_create_iter(res);
|
||||||
|
gda_data_model_iter_move_next(iter);
|
||||||
|
|
||||||
while (gda_data_model_iter_is_valid(iter)) {
|
while (gda_data_model_iter_is_valid(iter)) {
|
||||||
const GValue *val;
|
const GValue *val;
|
||||||
wmudPlane *plane;
|
wmudPlane *plane;
|
||||||
|
|
||||||
plane = g_new0(wmudPlane, 1);
|
plane = g_new0(wmudPlane, 1);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 0);
|
val = gda_data_model_iter_get_value_at(iter, 0);
|
||||||
plane->id = g_value_get_int(val);
|
plane->id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 1);
|
val = gda_data_model_iter_get_value_at(iter, 1);
|
||||||
plane->name = g_strdup(g_value_get_string(val));
|
plane->name = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded plane _%s_", plane->name);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
|
"Loaded plane _%s_",
|
||||||
|
plane->name);
|
||||||
|
|
||||||
*planes = g_slist_prepend(*planes, plane);
|
*planes = g_slist_prepend(*planes, plane);
|
||||||
|
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref(iter);
|
g_object_unref(iter);
|
||||||
g_object_unref(sth);
|
g_object_unref(sth);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
wmud_db_load_planets(GSList **planets, GError **err)
|
wmud_db_load_planets(GSList **planets, GError **err)
|
||||||
{
|
{
|
||||||
GdaStatement *sth = NULL;
|
GdaStatement *sth = NULL;
|
||||||
GdaDataModel *res = NULL;
|
GdaDataModel *res = NULL;
|
||||||
GdaDataModelIter *iter;
|
GdaDataModelIter *iter;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading planets");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading planets");
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
if (err)
|
if (err)
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sth = gda_sql_parser_parse_string(parser, "SELECT id, name FROM planets", NULL, NULL);
|
sth = gda_sql_parser_parse_string(parser,
|
||||||
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
"SELECT id, name FROM planets",
|
||||||
iter = gda_data_model_create_iter(res);
|
NULL,
|
||||||
gda_data_model_iter_move_next(iter);
|
NULL);
|
||||||
|
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
||||||
|
iter = gda_data_model_create_iter(res);
|
||||||
|
gda_data_model_iter_move_next(iter);
|
||||||
|
|
||||||
while (gda_data_model_iter_is_valid(iter)) {
|
while (gda_data_model_iter_is_valid(iter)) {
|
||||||
const GValue *val;
|
const GValue *val;
|
||||||
wmudPlanet *planet;
|
wmudPlanet *planet;
|
||||||
|
|
||||||
planet = g_new0(wmudPlanet, 1);
|
planet = g_new0(wmudPlanet, 1);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 0);
|
val = gda_data_model_iter_get_value_at(iter, 0);
|
||||||
planet->id = g_value_get_int(val);
|
planet->id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 1);
|
val = gda_data_model_iter_get_value_at(iter, 1);
|
||||||
planet->name = g_strdup(g_value_get_string(val));
|
planet->name = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded planet _%s_", planet->name);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
|
"Loaded planet _%s_",
|
||||||
|
planet->name);
|
||||||
|
|
||||||
*planets = g_slist_prepend(*planets, planet);
|
*planets = g_slist_prepend(*planets, planet);
|
||||||
|
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref(iter);
|
g_object_unref(iter);
|
||||||
g_object_unref(sth);
|
g_object_unref(sth);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
wmud_db_load_directions(GSList **directions, GError **err)
|
wmud_db_load_directions(GSList **directions, GError **err)
|
||||||
{
|
{
|
||||||
GdaStatement *sth = NULL;
|
GdaStatement *sth = NULL;
|
||||||
GdaDataModel *res = NULL;
|
GdaDataModel *res = NULL;
|
||||||
GdaDataModelIter *iter;
|
GdaDataModelIter *iter;
|
||||||
GError *local_err = NULL;
|
GError *local_err = NULL;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading directions");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading directions");
|
||||||
|
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
if (err)
|
if (err)
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sth = gda_sql_parser_parse_string(parser, "SELECT id, short_name, name FROM directions", NULL, NULL);
|
sth = gda_sql_parser_parse_string(
|
||||||
|
parser,
|
||||||
|
"SELECT id, short_name, name FROM directions",
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
if ((res = gda_connection_statement_execute_select(dbh, sth, NULL, &local_err)) == NULL) {
|
if ((res = gda_connection_statement_execute_select(
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_SELECT_ERROR, "Unable to load directions: %s", local_err->message);
|
dbh, sth,
|
||||||
|
NULL, &local_err)) == NULL) {
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_SELECT_ERROR,
|
||||||
|
"Unable to load directions: %s",
|
||||||
|
local_err->message);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
iter = gda_data_model_create_iter(res);
|
iter = gda_data_model_create_iter(res);
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
|
|
||||||
while (gda_data_model_iter_is_valid(iter)) {
|
while (gda_data_model_iter_is_valid(iter)) {
|
||||||
const GValue *val;
|
const GValue *val;
|
||||||
wmudDirection *dir;
|
wmudDirection *dir;
|
||||||
|
|
||||||
dir = g_new0(wmudDirection, 1);
|
dir = g_new0(wmudDirection, 1);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 0);
|
val = gda_data_model_iter_get_value_at(iter, 0);
|
||||||
dir->id = g_value_get_int(val);
|
dir->id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 1);
|
val = gda_data_model_iter_get_value_at(iter, 1);
|
||||||
dir->short_name = g_strdup(g_value_get_string(val));
|
dir->short_name = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 2);
|
val = gda_data_model_iter_get_value_at(iter, 2);
|
||||||
dir->name = g_strdup(g_value_get_string(val));
|
dir->name = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded direction _%s_", dir->name);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
|
"Loaded direction _%s_",
|
||||||
|
dir->name);
|
||||||
|
|
||||||
*directions = g_slist_prepend(*directions, dir);
|
*directions = g_slist_prepend(*directions, dir);
|
||||||
|
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref(iter);
|
g_object_unref(iter);
|
||||||
g_object_unref(sth);
|
g_object_unref(sth);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
wmud_db_load_areas(GSList **areas, GError **err)
|
wmud_db_load_areas(GSList **areas, GError **err)
|
||||||
{
|
{
|
||||||
GdaStatement *sth = NULL;
|
GdaStatement *sth = NULL;
|
||||||
GdaDataModel *res = NULL;
|
GdaDataModel *res = NULL;
|
||||||
GdaDataModelIter *iter;
|
GdaDataModelIter *iter;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading areas");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading areas");
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
if (err)
|
if (err)
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sth = gda_sql_parser_parse_string(parser, "SELECT id, name FROM areas", NULL, NULL);
|
sth = gda_sql_parser_parse_string(
|
||||||
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
parser,
|
||||||
iter = gda_data_model_create_iter(res);
|
"SELECT id, name FROM areas",
|
||||||
gda_data_model_iter_move_next(iter);
|
NULL,
|
||||||
|
NULL);
|
||||||
|
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
||||||
|
iter = gda_data_model_create_iter(res);
|
||||||
|
gda_data_model_iter_move_next(iter);
|
||||||
|
|
||||||
while (gda_data_model_iter_is_valid(iter)) {
|
while (gda_data_model_iter_is_valid(iter)) {
|
||||||
const GValue *val;
|
const GValue *val;
|
||||||
wmudArea *area;
|
wmudArea *area;
|
||||||
|
|
||||||
area = g_new0(wmudArea, 1);
|
area = g_new0(wmudArea, 1);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 0);
|
val = gda_data_model_iter_get_value_at(iter, 0);
|
||||||
area->id = g_value_get_int(val);
|
area->id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 1);
|
val = gda_data_model_iter_get_value_at(iter, 1);
|
||||||
area->name = g_strdup(g_value_get_string(val));
|
area->name = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded area _%s_", area->name);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded area _%s_", area->name);
|
||||||
|
|
||||||
*areas = g_slist_prepend(*areas, area);
|
*areas = g_slist_prepend(*areas, area);
|
||||||
|
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref(iter);
|
g_object_unref(iter);
|
||||||
g_object_unref(sth);
|
g_object_unref(sth);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
wmud_db_load_rooms(GSList **rooms, GError **err)
|
wmud_db_load_rooms(GSList **rooms, GError **err)
|
||||||
{
|
{
|
||||||
GdaStatement *sth = NULL;
|
GdaStatement *sth = NULL;
|
||||||
GdaDataModel *res = NULL;
|
GdaDataModel *res = NULL;
|
||||||
GdaDataModelIter *iter;
|
GdaDataModelIter *iter;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading rooms");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading rooms");
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
if (err)
|
if (err)
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sth = gda_sql_parser_parse_string(parser, "SELECT id, area, name, distant_description, close_description FROM rooms", NULL, NULL);
|
sth = gda_sql_parser_parse_string(
|
||||||
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
parser,
|
||||||
iter = gda_data_model_create_iter(res);
|
"SELECT id, area, name, distant_description, close_description FROM rooms",
|
||||||
gda_data_model_iter_move_next(iter);
|
NULL,
|
||||||
|
NULL);
|
||||||
|
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
||||||
|
iter = gda_data_model_create_iter(res);
|
||||||
|
gda_data_model_iter_move_next(iter);
|
||||||
|
|
||||||
while (gda_data_model_iter_is_valid(iter)) {
|
while (gda_data_model_iter_is_valid(iter)) {
|
||||||
const GValue *val;
|
const GValue *val;
|
||||||
wmudRoom *room;
|
wmudRoom *room;
|
||||||
|
|
||||||
room = g_new0(wmudRoom, 1);
|
room = g_new0(wmudRoom, 1);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 0);
|
val = gda_data_model_iter_get_value_at(iter, 0);
|
||||||
room->id = g_value_get_int(val);
|
room->id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 1);
|
val = gda_data_model_iter_get_value_at(iter, 1);
|
||||||
room->area_id = g_value_get_int(val);
|
room->area_id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 2);
|
val = gda_data_model_iter_get_value_at(iter, 2);
|
||||||
room->name = g_strdup(g_value_get_string(val));
|
room->name = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 3);
|
val = gda_data_model_iter_get_value_at(iter, 3);
|
||||||
room->distant_description = g_strdup(g_value_get_string(val));
|
room->distant_description = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 4);
|
val = gda_data_model_iter_get_value_at(iter, 4);
|
||||||
room->close_description = g_strdup(g_value_get_string(val));
|
room->close_description = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded room %d/_%s_", room->area_id, room->name);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
|
"Loaded room %d/_%s_",
|
||||||
|
room->area_id,
|
||||||
|
room->name);
|
||||||
|
|
||||||
*rooms = g_slist_prepend(*rooms, room);
|
*rooms = g_slist_prepend(*rooms, room);
|
||||||
|
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref(iter);
|
g_object_unref(iter);
|
||||||
g_object_unref(sth);
|
g_object_unref(sth);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
wmud_db_load_exits(GSList **exits, GError **err)
|
wmud_db_load_exits(GSList **exits, GError **err)
|
||||||
{
|
{
|
||||||
GdaStatement *sth = NULL;
|
GdaStatement *sth = NULL;
|
||||||
GdaDataModel *res = NULL;
|
GdaDataModel *res = NULL;
|
||||||
GdaDataModelIter *iter;
|
GdaDataModelIter *iter;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading exits");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading exits");
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
if (err)
|
if (err)
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sth = gda_sql_parser_parse_string(parser, "SELECT room_id, direction, other_side FROM room_exits", NULL, NULL);
|
sth = gda_sql_parser_parse_string(
|
||||||
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
parser,
|
||||||
iter = gda_data_model_create_iter(res);
|
"SELECT room_id, direction, other_side FROM room_exits",
|
||||||
gda_data_model_iter_move_next(iter);
|
NULL,
|
||||||
|
NULL);
|
||||||
|
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
||||||
|
iter = gda_data_model_create_iter(res);
|
||||||
|
gda_data_model_iter_move_next(iter);
|
||||||
|
|
||||||
while (gda_data_model_iter_is_valid(iter)) {
|
while (gda_data_model_iter_is_valid(iter)) {
|
||||||
const GValue *val;
|
const GValue *val;
|
||||||
wmudExit *room_exit;
|
wmudExit *room_exit;
|
||||||
|
|
||||||
room_exit = g_new0(wmudExit, 1);
|
room_exit = g_new0(wmudExit, 1);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 0);
|
val = gda_data_model_iter_get_value_at(iter, 0);
|
||||||
room_exit->source_room_id = g_value_get_int(val);
|
room_exit->source_room_id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 1);
|
val = gda_data_model_iter_get_value_at(iter, 1);
|
||||||
room_exit->direction_id = g_value_get_int(val);
|
room_exit->direction_id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 2);
|
val = gda_data_model_iter_get_value_at(iter, 2);
|
||||||
room_exit->destination_room_id = g_value_get_int(val);
|
room_exit->destination_room_id = g_value_get_int(val);
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded exit %d =%d=> %d", room_exit->source_room_id, room_exit->direction_id, room_exit->destination_room_id);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
|
"Loaded exit %d =%d=> %d",
|
||||||
|
room_exit->source_room_id,
|
||||||
|
room_exit->direction_id,
|
||||||
|
room_exit->destination_room_id);
|
||||||
|
|
||||||
*exits = g_slist_prepend(*exits, room_exit);
|
*exits = g_slist_prepend(*exits, room_exit);
|
||||||
|
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref(iter);
|
g_object_unref(iter);
|
||||||
g_object_unref(sth);
|
g_object_unref(sth);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
wmud_db_load_planet_planes(GSList **planet_planes, GError **err)
|
wmud_db_load_planet_planes(GSList **planet_planes, GError **err)
|
||||||
{
|
{
|
||||||
GdaStatement *sth = NULL;
|
GdaStatement *sth = NULL;
|
||||||
GdaDataModel *res = NULL;
|
GdaDataModel *res = NULL;
|
||||||
GdaDataModelIter *iter;
|
GdaDataModelIter *iter;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading planet<->plane associations");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
if (dbh == NULL) {
|
"Loading planet<->plane associations");
|
||||||
if (err)
|
if (dbh == NULL) {
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
if (err)
|
||||||
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sth = gda_sql_parser_parse_string(parser, "SELECT planet_id, plane_id FROM planet_planes", NULL, NULL);
|
sth = gda_sql_parser_parse_string(
|
||||||
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
parser,
|
||||||
iter = gda_data_model_create_iter(res);
|
"SELECT planet_id, plane_id FROM planet_planes",
|
||||||
gda_data_model_iter_move_next(iter);
|
NULL,
|
||||||
|
NULL);
|
||||||
|
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
||||||
|
iter = gda_data_model_create_iter(res);
|
||||||
|
gda_data_model_iter_move_next(iter);
|
||||||
|
|
||||||
while (gda_data_model_iter_is_valid(iter)) {
|
while (gda_data_model_iter_is_valid(iter)) {
|
||||||
const GValue *val;
|
const GValue *val;
|
||||||
wmudPlanetPlaneAssoc *planet_plane;
|
wmudPlanetPlaneAssoc *planet_plane;
|
||||||
|
|
||||||
planet_plane = g_new0(wmudPlanetPlaneAssoc, 1);
|
planet_plane = g_new0(wmudPlanetPlaneAssoc, 1);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 0);
|
val = gda_data_model_iter_get_value_at(iter, 0);
|
||||||
planet_plane->planet_id = g_value_get_int(val);
|
planet_plane->planet_id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 1);
|
val = gda_data_model_iter_get_value_at(iter, 1);
|
||||||
planet_plane->plane_id = g_value_get_int(val);
|
planet_plane->plane_id = g_value_get_int(val);
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded planet-plane association %d <> %d", planet_plane->planet_id, planet_plane->plane_id);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
|
"Loaded planet-plane association %d <> %d",
|
||||||
|
planet_plane->planet_id,
|
||||||
|
planet_plane->plane_id);
|
||||||
|
|
||||||
*planet_planes = g_slist_prepend(*planet_planes, planet_plane);
|
*planet_planes = g_slist_prepend(*planet_planes, planet_plane);
|
||||||
|
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref(iter);
|
g_object_unref(iter);
|
||||||
g_object_unref(sth);
|
g_object_unref(sth);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
wmud_db_load_menu(GSList **menu_items, GError **err)
|
wmud_db_load_menu(GSList **menu_items, GError **err)
|
||||||
{
|
{
|
||||||
GdaStatement *sth = NULL;
|
GdaStatement *sth = NULL;
|
||||||
GdaDataModel *res = NULL;
|
GdaDataModel *res = NULL;
|
||||||
GdaDataModelIter *iter;
|
GdaDataModelIter *iter;
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading menu items");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading menu items");
|
||||||
if (dbh == NULL) {
|
if (dbh == NULL) {
|
||||||
if (err)
|
if (err)
|
||||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
g_set_error(err,
|
||||||
|
WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
|
||||||
|
"Database backend not initialized");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sth = gda_sql_parser_parse_string(parser, "SELECT id, menuchar, need_active_char, placement, display_text, fnctn FROM menu ORDER BY placement", NULL, NULL);
|
sth = gda_sql_parser_parse_string(
|
||||||
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
parser,
|
||||||
iter = gda_data_model_create_iter(res);
|
"SELECT id, menuchar, need_active_char, placement, display_text, fnctn FROM menu ORDER BY placement",
|
||||||
gda_data_model_iter_move_next(iter);
|
NULL,
|
||||||
|
NULL);
|
||||||
|
res = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
|
||||||
|
iter = gda_data_model_create_iter(res);
|
||||||
|
gda_data_model_iter_move_next(iter);
|
||||||
|
|
||||||
while (gda_data_model_iter_is_valid(iter)) {
|
while (gda_data_model_iter_is_valid(iter)) {
|
||||||
const GValue *val;
|
const GValue *val;
|
||||||
wmudMenu *menu_item;
|
wmudMenu *menu_item;
|
||||||
|
|
||||||
menu_item = g_new0(wmudMenu, 1);
|
menu_item = g_new0(wmudMenu, 1);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 0);
|
val = gda_data_model_iter_get_value_at(iter, 0);
|
||||||
menu_item->id = g_value_get_int(val);
|
menu_item->id = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 1);
|
val = gda_data_model_iter_get_value_at(iter, 1);
|
||||||
menu_item->menuchar = *(g_value_get_string(val));
|
menu_item->menuchar = *(g_value_get_string(val));
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 2);
|
val = gda_data_model_iter_get_value_at(iter, 2);
|
||||||
menu_item->need_active_char = g_value_get_boolean(val);
|
menu_item->need_active_char = g_value_get_boolean(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 3);
|
val = gda_data_model_iter_get_value_at(iter, 3);
|
||||||
menu_item->placement = g_value_get_int(val);
|
menu_item->placement = g_value_get_int(val);
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 4);
|
val = gda_data_model_iter_get_value_at(iter, 4);
|
||||||
menu_item->text = g_strdup(g_value_get_string(val));
|
menu_item->text = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
val = gda_data_model_iter_get_value_at(iter, 5);
|
val = gda_data_model_iter_get_value_at(iter, 5);
|
||||||
menu_item->func = g_strdup(g_value_get_string(val));
|
menu_item->func = g_strdup(g_value_get_string(val));
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded menu item %d: %s(%c)", menu_item->id, menu_item->text, menu_item->menuchar);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
|
||||||
|
"Loaded menu item %d: %s(%c)",
|
||||||
|
menu_item->id, menu_item->text,
|
||||||
|
menu_item->menuchar);
|
||||||
|
|
||||||
*menu_items = g_slist_prepend(*menu_items, menu_item);
|
*menu_items = g_slist_prepend(*menu_items, menu_item);
|
||||||
|
|
||||||
gda_data_model_iter_move_next(iter);
|
gda_data_model_iter_move_next(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref(iter);
|
g_object_unref(iter);
|
||||||
g_object_unref(sth);
|
g_object_unref(sth);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,27 +12,28 @@
|
|||||||
GType
|
GType
|
||||||
@enum_name@_get_type (void)
|
@enum_name@_get_type (void)
|
||||||
{
|
{
|
||||||
static volatile gsize g_define_type_id__volatile = 0;
|
static volatile gsize g_define_type_id__volatile = 0;
|
||||||
|
|
||||||
if (g_once_init_enter(&g_define_type_id__volatile)) {
|
if (g_once_init_enter(&g_define_type_id__volatile)) {
|
||||||
static const G@Type@Value values[] = {
|
static const G@Type@Value values[] = {
|
||||||
/*** END value-header ***/
|
/*** END value-header ***/
|
||||||
|
|
||||||
/*** BEGIN value-production ***/
|
/*** BEGIN value-production ***/
|
||||||
{ @VALUENAME@, "@VALUENAME@", "@valuenick@" },
|
{ @VALUENAME@, "@VALUENAME@", "@valuenick@" },
|
||||||
/*** END value-production ***/
|
/*** END value-production ***/
|
||||||
|
|
||||||
/*** BEGIN value-tail ***/
|
/*** BEGIN value-tail ***/
|
||||||
{ 0, NULL, NULL }
|
{ 0, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
GType g_define_type_id = g_@type@_register_static(g_intern_static_string("@EnumName@"), values);
|
GType g_define_type_id = g_@type@_register_static(
|
||||||
|
g_intern_static_string("@EnumName@"),
|
||||||
|
values);
|
||||||
|
|
||||||
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_define_type_id__volatile;
|
return g_define_type_id__volatile;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** END value-tail ***/
|
/*** END value-tail ***/
|
||||||
|
|
||||||
|
@ -45,8 +45,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
struct AcceptData {
|
struct AcceptData {
|
||||||
GMainContext *context;
|
GMainContext *context;
|
||||||
GSocketListener *listener;
|
GSocketListener *listener;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -70,14 +70,14 @@ static void state_regemail_confirm(WmudClient *client);
|
|||||||
static void
|
static void
|
||||||
remove_client(WmudClient *client, gboolean send_quitmessage)
|
remove_client(WmudClient *client, gboolean send_quitmessage)
|
||||||
{
|
{
|
||||||
clients = g_slist_remove(clients, client);
|
clients = g_slist_remove(clients, client);
|
||||||
wmud_client_close(client, send_quitmessage);
|
wmud_client_close(client, send_quitmessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hup_client(WmudClient *client)
|
hup_client(WmudClient *client)
|
||||||
{
|
{
|
||||||
remove_client(client, FALSE);
|
remove_client(client, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,103 +91,123 @@ hup_client(WmudClient *client)
|
|||||||
static void
|
static void
|
||||||
recv_client(WmudClient *client)
|
recv_client(WmudClient *client)
|
||||||
{
|
{
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
GSocket *client_socket;
|
GSocket *client_socket;
|
||||||
gssize len;
|
gssize len;
|
||||||
gchar *buf2;
|
gchar *buf2;
|
||||||
gchar *buf = g_malloc0(sizeof(gchar) * (MAX_RECV_LEN + 1));
|
gchar *buf = g_malloc0(sizeof(gchar) * (MAX_RECV_LEN + 1));
|
||||||
|
|
||||||
client_socket = wmud_client_get_socket(client);
|
client_socket = wmud_client_get_socket(client);
|
||||||
|
|
||||||
if ((len = g_socket_receive(client_socket, buf, MAX_RECV_LEN, NULL, &err)) == 0) {
|
if ((len = g_socket_receive(client_socket,
|
||||||
g_free(buf);
|
buf,
|
||||||
remove_client(client, FALSE);
|
MAX_RECV_LEN,
|
||||||
|
NULL,
|
||||||
|
&err)) == 0) {
|
||||||
|
g_free(buf);
|
||||||
|
remove_client(client, FALSE);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf2 = buf;
|
buf2 = buf;
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
char *r = strchr((char *)buf2, '\r'),
|
char *r = strchr((char *)buf2, '\r'),
|
||||||
*n = strchr((char *)buf2, '\n');
|
*n = strchr((char *)buf2, '\n');
|
||||||
|
|
||||||
if (r || n) {
|
if (r || n) {
|
||||||
gint i,
|
gint i,
|
||||||
sloc = -1;
|
sloc = -1;
|
||||||
|
|
||||||
if ((r < n) && r) {
|
if ((r < n) && r) {
|
||||||
if (wmud_client_get_buffer_length(client) > 0)
|
if (wmud_client_get_buffer_length(client) > 0)
|
||||||
g_string_append_len(wmud_client_get_buffer(client), buf2, (r - buf2));
|
g_string_append_len(wmud_client_get_buffer(client),
|
||||||
else
|
buf2,
|
||||||
g_string_overwrite_len(wmud_client_get_buffer(client), 0, buf2, (r - buf2));
|
(r - buf2));
|
||||||
buf2 = r;
|
else
|
||||||
} else if (n) {
|
g_string_overwrite_len(
|
||||||
if (wmud_client_get_buffer_length(client) > 0)
|
wmud_client_get_buffer(client),
|
||||||
g_string_append_len(wmud_client_get_buffer(client), buf2, (n - buf2));
|
0,
|
||||||
else
|
buf2,
|
||||||
g_string_overwrite_len(wmud_client_get_buffer(client), 0, buf2, (n - buf2));
|
(r - buf2));
|
||||||
buf2 = n;
|
buf2 = r;
|
||||||
}
|
} else if (n) {
|
||||||
|
if (wmud_client_get_buffer_length(client) > 0)
|
||||||
|
g_string_append_len(
|
||||||
|
wmud_client_get_buffer(client),
|
||||||
|
buf2,
|
||||||
|
(n - buf2));
|
||||||
|
else
|
||||||
|
g_string_overwrite_len(
|
||||||
|
wmud_client_get_buffer(client),
|
||||||
|
0,
|
||||||
|
buf2,
|
||||||
|
(n - buf2));
|
||||||
|
buf2 = n;
|
||||||
|
}
|
||||||
|
|
||||||
/* Remove telnet codes from the string */
|
/* Remove telnet codes from the string */
|
||||||
for (i = 0; i < wmud_client_get_buffer_length(client); i++) {
|
for (i = 0; i < wmud_client_get_buffer_length(client); i++) {
|
||||||
guchar c = (wmud_client_get_buffer(client)->str)[i];
|
guchar c = (wmud_client_get_buffer(client)->str)[i];
|
||||||
|
|
||||||
if ((c >= 240) || (c == 1)) {
|
if ((c >= 240) || (c == 1)) {
|
||||||
if (sloc == -1)
|
if (sloc == -1)
|
||||||
sloc = i;
|
sloc = i;
|
||||||
} else {
|
} else {
|
||||||
if (sloc != -1) {
|
if (sloc != -1) {
|
||||||
g_string_erase(wmud_client_get_buffer(client), sloc, i - sloc);
|
g_string_erase(
|
||||||
sloc = -1;
|
wmud_client_get_buffer(client),
|
||||||
}
|
sloc,
|
||||||
}
|
i - sloc);
|
||||||
}
|
sloc = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (sloc != -1)
|
if (sloc != -1)
|
||||||
g_string_erase(wmud_client_get_buffer(client), sloc, -1);
|
g_string_erase(wmud_client_get_buffer(client), sloc, -1);
|
||||||
|
|
||||||
switch (wmud_client_get_state(client))
|
switch (wmud_client_get_state(client))
|
||||||
{
|
{
|
||||||
case WMUD_CLIENT_STATE_FRESH:
|
case WMUD_CLIENT_STATE_FRESH:
|
||||||
state_fresh(client);
|
state_fresh(client);
|
||||||
break;
|
break;
|
||||||
case WMUD_CLIENT_STATE_PASSWAIT:
|
case WMUD_CLIENT_STATE_PASSWAIT:
|
||||||
state_passwait(client);
|
state_passwait(client);
|
||||||
break;
|
break;
|
||||||
case WMUD_CLIENT_STATE_MENU:
|
case WMUD_CLIENT_STATE_MENU:
|
||||||
state_menu(client);
|
state_menu(client);
|
||||||
break;
|
break;
|
||||||
case WMUD_CLIENT_STATE_INGAME:
|
case WMUD_CLIENT_STATE_INGAME:
|
||||||
wmud_interpret_game_command(client);
|
wmud_interpret_game_command(client);
|
||||||
break;
|
break;
|
||||||
case WMUD_CLIENT_STATE_YESNO:
|
case WMUD_CLIENT_STATE_YESNO:
|
||||||
state_yesno(client);
|
state_yesno(client);
|
||||||
break;
|
break;
|
||||||
case WMUD_CLIENT_STATE_REGISTERING:
|
case WMUD_CLIENT_STATE_REGISTERING:
|
||||||
state_registering(client);
|
state_registering(client);
|
||||||
break;
|
break;
|
||||||
case WMUD_CLIENT_STATE_REGEMAIL_CONFIRM:
|
case WMUD_CLIENT_STATE_REGEMAIL_CONFIRM:
|
||||||
state_regemail_confirm(client);
|
state_regemail_confirm(client);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_string_erase(wmud_client_get_buffer(client), 0, -1);
|
g_string_erase(wmud_client_get_buffer(client), 0, -1);
|
||||||
|
|
||||||
for (; ((*buf2 == '\r') || (*buf2 == '\n')) && *buf2; buf2++);
|
for (; ((*buf2 == '\r') || (*buf2 == '\n')) && *buf2; buf2++);
|
||||||
|
|
||||||
if (!*buf2)
|
if (!*buf2)
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
if (wmud_client_get_buffer_length(client) > 0)
|
if (wmud_client_get_buffer_length(client) > 0)
|
||||||
g_string_append(wmud_client_get_buffer(client), buf2);
|
g_string_append(wmud_client_get_buffer(client), buf2);
|
||||||
else
|
else
|
||||||
g_string_overwrite(wmud_client_get_buffer(client), 0, buf2);
|
g_string_overwrite(wmud_client_get_buffer(client), 0, buf2);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(buf);
|
g_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -202,48 +222,50 @@ recv_client(WmudClient *client)
|
|||||||
* Return value: this function always returns %TRUE
|
* Return value: this function always returns %TRUE
|
||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
game_source_callback(GSocket *socket, GIOCondition condition, struct AcceptData *accept_data)
|
game_source_callback(GSocket *socket,
|
||||||
|
GIOCondition condition,
|
||||||
|
struct AcceptData *accept_data)
|
||||||
{
|
{
|
||||||
GSocket *client_socket;
|
GSocket *client_socket;
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
GSocketAddress *remote_addr;
|
GSocketAddress *remote_addr;
|
||||||
WmudClient *client;
|
WmudClient *client;
|
||||||
|
|
||||||
/* This function should never return an error. If so, it is a huge bug,
|
/* This function should never return an error. If so, it is a huge bug,
|
||||||
* and will trigger a higher level error. */
|
* and will trigger a higher level error. */
|
||||||
client_socket = g_socket_listener_accept_socket(accept_data->listener, NULL, NULL, &err);
|
client_socket = g_socket_listener_accept_socket(accept_data->listener, NULL, NULL, &err);
|
||||||
|
|
||||||
client = wmud_client_new();
|
client = wmud_client_new();
|
||||||
wmud_client_set_socket(WMUD_CLIENT(client), client_socket);
|
wmud_client_set_socket(WMUD_CLIENT(client), client_socket);
|
||||||
wmud_client_set_context(client, accept_data->context);
|
wmud_client_set_context(client, accept_data->context);
|
||||||
g_signal_connect(client, "net-hup", G_CALLBACK(hup_client), NULL);
|
g_signal_connect(client, "net-hup", G_CALLBACK(hup_client), NULL);
|
||||||
g_signal_connect(client, "net-recv", G_CALLBACK(recv_client), NULL);
|
g_signal_connect(client, "net-recv", G_CALLBACK(recv_client), NULL);
|
||||||
|
|
||||||
clients = g_slist_prepend(clients, client);
|
clients = g_slist_prepend(clients, client);
|
||||||
|
|
||||||
g_clear_error(&err);
|
g_clear_error(&err);
|
||||||
|
|
||||||
if ((remote_addr = g_socket_get_remote_address(client_socket, &err)) != NULL) {
|
if ((remote_addr = g_socket_get_remote_address(client_socket, &err)) != NULL) {
|
||||||
GInetAddress *addr;
|
GInetAddress *addr;
|
||||||
gchar *ip_addr;
|
gchar *ip_addr;
|
||||||
|
|
||||||
addr = g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(remote_addr));
|
addr = g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(remote_addr));
|
||||||
ip_addr = g_inet_address_to_string(addr);
|
ip_addr = g_inet_address_to_string(addr);
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "New game connection from %s", ip_addr);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "New game connection from %s", ip_addr);
|
||||||
g_free(ip_addr);
|
g_free(ip_addr);
|
||||||
g_object_unref(addr);
|
g_object_unref(addr);
|
||||||
g_object_unref(remote_addr);
|
g_object_unref(remote_addr);
|
||||||
} else {
|
} else {
|
||||||
if (err)
|
if (err)
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "New game connection. The remote address is unknown. This is a bug. Message from upper level: %s", err->message);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "New game connection. The remote address is unknown. This is a bug. Message from upper level: %s", err->message);
|
||||||
else
|
else
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "New game connection. The remote address is unknown. This is a bug.");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "New game connection. The remote address is unknown. This is a bug.");
|
||||||
}
|
}
|
||||||
|
|
||||||
g_clear_error(&err);
|
g_clear_error(&err);
|
||||||
wmud_client_send(WMUD_CLIENT(client), "By what name shall we call you? ");
|
wmud_client_send(WMUD_CLIENT(client), "By what name shall we call you? ");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -261,190 +283,190 @@ game_source_callback(GSocket *socket, GIOCondition condition, struct AcceptData
|
|||||||
gboolean
|
gboolean
|
||||||
wmud_networking_init(guint port_number, GMainContext *game_context, GSList *menu_items, GError **err)
|
wmud_networking_init(guint port_number, GMainContext *game_context, GSList *menu_items, GError **err)
|
||||||
{
|
{
|
||||||
struct AcceptData *accept_data;
|
struct AcceptData *accept_data;
|
||||||
GSocketListener *game_listener;
|
GSocketListener *game_listener;
|
||||||
gboolean need_ipv4_socket = TRUE;
|
gboolean need_ipv4_socket = TRUE;
|
||||||
GSocket *game_socket6,
|
GSocket *game_socket6,
|
||||||
*game_socket4;
|
*game_socket4;
|
||||||
GError *in_err = NULL;
|
GError *in_err = NULL;
|
||||||
GSource *game_net_source4 = NULL,
|
GSource *game_net_source4 = NULL,
|
||||||
*game_net_source6 = NULL;
|
*game_net_source6 = NULL;
|
||||||
|
|
||||||
clients = NULL;
|
clients = NULL;
|
||||||
game_listener = g_socket_listener_new();
|
game_listener = g_socket_listener_new();
|
||||||
|
|
||||||
/* The following snippet is borrowed from GLib 2.30's gsocketlistener.c
|
/* The following snippet is borrowed from GLib 2.30's gsocketlistener.c
|
||||||
* code, to create the necessary sockets to listen on both IPv4 and
|
* code, to create the necessary sockets to listen on both IPv4 and
|
||||||
* IPv6 address */
|
* IPv6 address */
|
||||||
if ((game_socket6 = g_socket_new(G_SOCKET_FAMILY_IPV6, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, NULL)) != NULL) {
|
if ((game_socket6 = g_socket_new(G_SOCKET_FAMILY_IPV6, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, NULL)) != NULL) {
|
||||||
GInetAddress *inet_address;
|
GInetAddress *inet_address;
|
||||||
GSocketAddress *address;
|
GSocketAddress *address;
|
||||||
gboolean result;
|
gboolean result;
|
||||||
|
|
||||||
inet_address = g_inet_address_new_any(G_SOCKET_FAMILY_IPV6);
|
inet_address = g_inet_address_new_any(G_SOCKET_FAMILY_IPV6);
|
||||||
address = g_inet_socket_address_new(inet_address, port_number);
|
address = g_inet_socket_address_new(inet_address, port_number);
|
||||||
g_object_unref(inet_address);
|
g_object_unref(inet_address);
|
||||||
|
|
||||||
g_socket_set_listen_backlog(game_socket6, 10);
|
g_socket_set_listen_backlog(game_socket6, 10);
|
||||||
|
|
||||||
result =
|
result =
|
||||||
g_socket_bind(game_socket6, address, TRUE, NULL)
|
g_socket_bind(game_socket6, address, TRUE, NULL)
|
||||||
&& g_socket_listen(game_socket6, NULL);
|
&& g_socket_listen(game_socket6, NULL);
|
||||||
|
|
||||||
g_object_unref(address);
|
g_object_unref(address);
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
g_object_unref(game_socket6);
|
g_object_unref(game_socket6);
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Unable to create listener IPv6 socket");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Unable to create listener IPv6 socket");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_socket_speaks_ipv4(game_socket6))
|
if (g_socket_speaks_ipv4(game_socket6))
|
||||||
need_ipv4_socket = FALSE;
|
need_ipv4_socket = FALSE;
|
||||||
|
|
||||||
game_net_source6 = g_socket_create_source(game_socket6, G_IO_IN, NULL);
|
game_net_source6 = g_socket_create_source(game_socket6, G_IO_IN, NULL);
|
||||||
|
|
||||||
/* This function should never return error. If so, that would be a
|
/* This function should never return error. If so, that would be a
|
||||||
* really big bug which will trigger a higher level problem for sure */
|
* really big bug which will trigger a higher level problem for sure */
|
||||||
g_socket_listener_add_socket(game_listener, game_socket6, NULL, NULL);
|
g_socket_listener_add_socket(game_listener, game_socket6, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (need_ipv4_socket) {
|
if (need_ipv4_socket) {
|
||||||
if ((game_socket4 = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, NULL)) != NULL) {
|
if ((game_socket4 = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, NULL)) != NULL) {
|
||||||
GInetAddress *inet_address;
|
GInetAddress *inet_address;
|
||||||
GSocketAddress *address;
|
GSocketAddress *address;
|
||||||
gboolean result;
|
gboolean result;
|
||||||
|
|
||||||
inet_address = g_inet_address_new_any(G_SOCKET_FAMILY_IPV4);
|
inet_address = g_inet_address_new_any(G_SOCKET_FAMILY_IPV4);
|
||||||
address = g_inet_socket_address_new(inet_address, port_number);
|
address = g_inet_socket_address_new(inet_address, port_number);
|
||||||
g_object_unref(inet_address);
|
g_object_unref(inet_address);
|
||||||
|
|
||||||
g_socket_set_listen_backlog(game_socket4, 10);
|
g_socket_set_listen_backlog(game_socket4, 10);
|
||||||
|
|
||||||
result = g_socket_bind(game_socket4, address, TRUE, NULL)
|
result = g_socket_bind(game_socket4, address, TRUE, NULL)
|
||||||
&& g_socket_listen(game_socket4, NULL);
|
&& g_socket_listen(game_socket4, NULL);
|
||||||
|
|
||||||
g_object_unref(address);
|
g_object_unref(address);
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
g_object_unref(game_socket4);
|
g_object_unref(game_socket4);
|
||||||
|
|
||||||
if (!game_socket6)
|
if (!game_socket6)
|
||||||
g_object_unref(game_socket6);
|
g_object_unref(game_socket6);
|
||||||
|
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Unable to create listener IPv4 socket!\n");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Unable to create listener IPv4 socket!\n");
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
game_net_source4 = g_socket_create_source(game_socket4, G_IO_IN, NULL);
|
game_net_source4 = g_socket_create_source(game_socket4, G_IO_IN, NULL);
|
||||||
g_socket_listener_add_socket(game_listener, game_socket4, NULL, NULL);
|
g_socket_listener_add_socket(game_listener, game_socket4, NULL, NULL);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (game_socket6 != NULL)
|
if (game_socket6 != NULL)
|
||||||
g_clear_error(&in_err);
|
g_clear_error(&in_err);
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
accept_data = g_new(struct AcceptData, 1);
|
accept_data = g_new(struct AcceptData, 1);
|
||||||
accept_data->listener = game_listener;
|
accept_data->listener = game_listener;
|
||||||
accept_data->context = game_context;
|
accept_data->context = game_context;
|
||||||
|
|
||||||
if (game_net_source6) {
|
if (game_net_source6) {
|
||||||
g_source_set_callback(game_net_source6, (GSourceFunc)game_source_callback, (gpointer)accept_data, NULL);
|
g_source_set_callback(game_net_source6, (GSourceFunc)game_source_callback, (gpointer)accept_data, NULL);
|
||||||
g_source_attach(game_net_source6, game_context);
|
g_source_attach(game_net_source6, game_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (game_net_source4) {
|
if (game_net_source4) {
|
||||||
g_source_set_callback(game_net_source4, (GSourceFunc)game_source_callback, (gpointer)accept_data, NULL);
|
g_source_set_callback(game_net_source4, (GSourceFunc)game_source_callback, (gpointer)accept_data, NULL);
|
||||||
g_source_attach(game_net_source4, game_context);
|
g_source_attach(game_net_source4, game_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
game_menu = menu_items;
|
game_menu = menu_items;
|
||||||
|
|
||||||
email_regex = g_regex_new("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$", G_REGEX_CASELESS, 0, NULL);
|
email_regex = g_regex_new("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$", G_REGEX_CASELESS, 0, NULL);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
wmud_client_quitanswer(WmudClient *client, gboolean answer)
|
wmud_client_quitanswer(WmudClient *client, gboolean answer)
|
||||||
{
|
{
|
||||||
if (answer) {
|
if (answer) {
|
||||||
remove_client(client, TRUE);
|
remove_client(client, TRUE);
|
||||||
} else {
|
} else {
|
||||||
wmud_client_send(client, "Good boy!\r\n");
|
wmud_client_send(client, "Good boy!\r\n");
|
||||||
wmud_client_set_state(client, WMUD_CLIENT_STATE_MENU);
|
wmud_client_set_state(client, WMUD_CLIENT_STATE_MENU);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
wmud_client_newchar_answer(WmudClient *client, gboolean answer)
|
wmud_client_newchar_answer(WmudClient *client, gboolean answer)
|
||||||
{
|
{
|
||||||
if (answer) {
|
if (answer) {
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Creating new player\n");
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Creating new player\n");
|
||||||
wmud_client_send(client, "Welcome to this MUD!\r\nPlease enter your e-mail address: ");
|
wmud_client_send(client, "Welcome to this MUD!\r\nPlease enter your e-mail address: ");
|
||||||
wmud_client_set_state(client, WMUD_CLIENT_STATE_REGISTERING);
|
wmud_client_set_state(client, WMUD_CLIENT_STATE_REGISTERING);
|
||||||
} else {
|
} else {
|
||||||
wmud_client_send(client, "What is your player-name, then? ");
|
wmud_client_send(client, "What is your player-name, then? ");
|
||||||
wmud_client_set_state(client, WMUD_CLIENT_STATE_FRESH);
|
wmud_client_set_state(client, WMUD_CLIENT_STATE_FRESH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
state_fresh(WmudClient *client)
|
state_fresh(WmudClient *client)
|
||||||
{
|
{
|
||||||
if (*(wmud_client_get_buffer(client)->str)) {
|
if (*(wmud_client_get_buffer(client)->str)) {
|
||||||
WmudPlayer *player;
|
WmudPlayer *player;
|
||||||
|
|
||||||
if ((player = wmud_player_exists(wmud_client_get_buffer(client)->str)) != NULL) {
|
if ((player = wmud_player_exists(wmud_client_get_buffer(client)->str)) != NULL) {
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Trying to"
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Trying to"
|
||||||
" login with playername '%s'",
|
" login with playername '%s'",
|
||||||
wmud_client_get_buffer(client)->str);
|
wmud_client_get_buffer(client)->str);
|
||||||
|
|
||||||
if (wmud_player_get_cpassword(player) == NULL) {
|
if (wmud_player_get_cpassword(player) == NULL) {
|
||||||
wmud_client_send(client, "Your registration is"
|
wmud_client_send(client, "Your registration is"
|
||||||
" not finished yet.\r\n");
|
" not finished yet.\r\n");
|
||||||
remove_client(client, TRUE);
|
remove_client(client, TRUE);
|
||||||
} else {
|
} else {
|
||||||
wmud_client_set_state(client, WMUD_CLIENT_STATE_PASSWAIT);
|
wmud_client_set_state(client, WMUD_CLIENT_STATE_PASSWAIT);
|
||||||
wmud_player_set_registered(player, TRUE);
|
wmud_player_set_registered(player, TRUE);
|
||||||
wmud_client_set_player(client, player);
|
wmud_client_set_player(client, player);
|
||||||
wmud_client_send(client, "Please provide us your password: %c%c%c", TELNET_IAC, TELNET_WILL, TELNET_ECHO);
|
wmud_client_send(client, "Please provide us your password: %c%c%c", TELNET_IAC, TELNET_WILL, TELNET_ECHO);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
WmudPlayer *player = wmud_player_new();
|
WmudPlayer *player = wmud_player_new();
|
||||||
|
|
||||||
wmud_player_set_player_name(player, wmud_client_get_buffer(client)->str);
|
wmud_player_set_player_name(player, wmud_client_get_buffer(client)->str);
|
||||||
wmud_client_set_player(client, player);
|
wmud_client_set_player(client, player);
|
||||||
wmud_client_set_state(client, WMUD_CLIENT_STATE_YESNO);
|
wmud_client_set_state(client, WMUD_CLIENT_STATE_YESNO);
|
||||||
wmud_client_set_yesno_callback(client, wmud_client_newchar_answer);
|
wmud_client_set_yesno_callback(client, wmud_client_newchar_answer);
|
||||||
wmud_client_send(client, "Is %s new to this game? [Y/N] ", wmud_client_get_buffer(client)->str);
|
wmud_client_send(client, "Is %s new to this game? [Y/N] ", wmud_client_get_buffer(client)->str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
state_passwait(WmudClient *client)
|
state_passwait(WmudClient *client)
|
||||||
{
|
{
|
||||||
if (*(wmud_client_get_buffer(client)->str)) {
|
if (*(wmud_client_get_buffer(client)->str)) {
|
||||||
WmudPlayer *player;
|
WmudPlayer *player;
|
||||||
|
|
||||||
player = wmud_client_get_player(client);
|
player = wmud_client_get_player(client);
|
||||||
|
|
||||||
if (wmud_player_password_valid(player, wmud_client_get_buffer(client)->str)) {
|
if (wmud_player_password_valid(player, wmud_client_get_buffer(client)->str)) {
|
||||||
gint fail_count;
|
gint fail_count;
|
||||||
GSocketAddress *socket_address;
|
GSocketAddress *socket_address;
|
||||||
GInetAddress *inet_address;
|
GInetAddress *inet_address;
|
||||||
gchar *ip_addr;
|
gchar *ip_addr;
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
|
|
||||||
wmud_client_send(client, "%c%c%c\r\nLogin successful."
|
wmud_client_send(client, "%c%c%c\r\nLogin successful."
|
||||||
"\r\n", TELNET_IAC, TELNET_WONT,
|
"\r\n", TELNET_IAC, TELNET_WONT,
|
||||||
TELNET_ECHO);
|
TELNET_ECHO);
|
||||||
wmud_client_set_authenticated(client, TRUE);
|
wmud_client_set_authenticated(client, TRUE);
|
||||||
|
|
||||||
socket_address = g_socket_get_remote_address(wmud_client_get_socket(client), &err);
|
socket_address = g_socket_get_remote_address(wmud_client_get_socket(client), &err);
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "socket family: %d", g_socket_address_get_family(socket_address));
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "socket family: %d", g_socket_address_get_family(socket_address));
|
||||||
@ -456,120 +478,120 @@ state_passwait(WmudClient *client)
|
|||||||
g_free(ip_addr);
|
g_free(ip_addr);
|
||||||
g_object_unref(socket_address);
|
g_object_unref(socket_address);
|
||||||
|
|
||||||
if ((fail_count = wmud_player_get_fail_count(player)) > 0) {
|
if ((fail_count = wmud_player_get_fail_count(player)) > 0) {
|
||||||
wmud_client_send(client, "There %s %d failed"
|
wmud_client_send(client, "There %s %d failed"
|
||||||
" login attempt%s with your"
|
" login attempt%s with your"
|
||||||
" account since your last"
|
" account since your last"
|
||||||
" visit\r\n",
|
" visit\r\n",
|
||||||
(fail_count == 1) ? "was" : "were",
|
(fail_count == 1) ? "was" : "were",
|
||||||
fail_count,
|
fail_count,
|
||||||
(fail_count == 1) ? "" : "s");
|
(fail_count == 1) ? "" : "s");
|
||||||
}
|
}
|
||||||
|
|
||||||
wmud_text_send_to_client("motd", client);
|
wmud_text_send_to_client("motd", client);
|
||||||
wmud_menu_present(client);
|
wmud_menu_present(client);
|
||||||
} else {
|
} else {
|
||||||
wmud_client_send(client, "%c%c%cThis password doesn't"
|
wmud_client_send(client, "%c%c%cThis password doesn't"
|
||||||
" seem to be valid. Let's try it again..."
|
" seem to be valid. Let's try it again..."
|
||||||
" \r\nBy what name would you like to be"
|
" \r\nBy what name would you like to be"
|
||||||
" be called? ", TELNET_IAC,
|
" be called? ", TELNET_IAC,
|
||||||
TELNET_WONT, TELNET_ECHO);
|
TELNET_WONT, TELNET_ECHO);
|
||||||
wmud_client_set_state(client, WMUD_CLIENT_STATE_FRESH);
|
wmud_client_set_state(client, WMUD_CLIENT_STATE_FRESH);
|
||||||
wmud_player_increase_fail_count(player);
|
wmud_player_increase_fail_count(player);
|
||||||
wmud_client_increase_login_fail_count(client);
|
wmud_client_increase_login_fail_count(client);
|
||||||
if (wmud_client_get_login_fail_count(client) == 3) {
|
if (wmud_client_get_login_fail_count(client) == 3) {
|
||||||
wmud_client_send(client, "You are trying "
|
wmud_client_send(client, "You are trying "
|
||||||
" these bad passwords for"
|
" these bad passwords for"
|
||||||
" too many times. Please"
|
" too many times. Please"
|
||||||
" stop that!\r\n");
|
" stop that!\r\n");
|
||||||
remove_client(client, TRUE);
|
remove_client(client, TRUE);
|
||||||
|
|
||||||
/* TODO: Increase IP fail count, and ban IP if it's too high */
|
/* TODO: Increase IP fail count, and ban IP if it's too high */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Increase and save login fail count */
|
/* TODO: Increase and save login fail count */
|
||||||
|
|
||||||
wmud_client_set_player(client, NULL);
|
wmud_client_set_player(client, NULL);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
wmud_client_send(client, "\r\nEmpty passwords are"
|
wmud_client_send(client, "\r\nEmpty passwords are"
|
||||||
" not valid.\r\nTry again: ");
|
" not valid.\r\nTry again: ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
state_menu(WmudClient *client)
|
state_menu(WmudClient *client)
|
||||||
{
|
{
|
||||||
gchar *menu_command;
|
gchar *menu_command;
|
||||||
|
|
||||||
if ((menu_command = wmud_menu_get_command_by_menuchar(*(wmud_client_get_buffer(client)->str), game_menu)) != NULL)
|
if ((menu_command = wmud_menu_get_command_by_menuchar(*(wmud_client_get_buffer(client)->str), game_menu)) != NULL)
|
||||||
wmud_menu_execute_command(client, menu_command);
|
wmud_menu_execute_command(client, menu_command);
|
||||||
else
|
else
|
||||||
wmud_client_send(client, "Unknown menu command.\r\n");
|
wmud_client_send(client, "Unknown menu command.\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
state_yesno(WmudClient *client)
|
state_yesno(WmudClient *client)
|
||||||
{
|
{
|
||||||
if (g_ascii_strcasecmp(wmud_client_get_buffer(client)->str, "y") == 0)
|
if (g_ascii_strcasecmp(wmud_client_get_buffer(client)->str, "y") == 0)
|
||||||
(wmud_client_get_yesno_callback(client))(client, TRUE);
|
(wmud_client_get_yesno_callback(client))(client, TRUE);
|
||||||
else if (g_ascii_strcasecmp(wmud_client_get_buffer(client)->str, "n") == 0)
|
else if (g_ascii_strcasecmp(wmud_client_get_buffer(client)->str, "n") == 0)
|
||||||
(wmud_client_get_yesno_callback(client))(client, FALSE);
|
(wmud_client_get_yesno_callback(client))(client, FALSE);
|
||||||
else
|
else
|
||||||
wmud_client_send(client, "Please enter a 'Y' or 'N'"
|
wmud_client_send(client, "Please enter a 'Y' or 'N'"
|
||||||
" character: ");
|
" character: ");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
state_registering(WmudClient *client)
|
state_registering(WmudClient *client)
|
||||||
{
|
{
|
||||||
if (!*(wmud_client_get_buffer(client)->str) && (wmud_client_get_bademail(client) == TRUE))
|
if (!*(wmud_client_get_buffer(client)->str) && (wmud_client_get_bademail(client) == TRUE))
|
||||||
remove_client(client, TRUE);
|
remove_client(client, TRUE);
|
||||||
|
|
||||||
if (g_regex_match(email_regex, wmud_client_get_buffer(client)->str, 0, NULL)) {
|
if (g_regex_match(email_regex, wmud_client_get_buffer(client)->str, 0, NULL)) {
|
||||||
wmud_player_set_email(wmud_client_get_player(client), wmud_client_get_buffer(client)->str);
|
wmud_player_set_email(wmud_client_get_player(client), wmud_client_get_buffer(client)->str);
|
||||||
wmud_client_set_state(client, WMUD_CLIENT_STATE_REGEMAIL_CONFIRM);
|
wmud_client_set_state(client, WMUD_CLIENT_STATE_REGEMAIL_CONFIRM);
|
||||||
wmud_client_send(client, "It seems to be a valid"
|
wmud_client_send(client, "It seems to be a valid"
|
||||||
" address to me, but could you"
|
" address to me, but could you"
|
||||||
" write it again? ");
|
" write it again? ");
|
||||||
} else {
|
} else {
|
||||||
wmud_client_send(client, "\r\nSorry, but this"
|
wmud_client_send(client, "\r\nSorry, but this"
|
||||||
"e-mail address doesn't seem to be"
|
"e-mail address doesn't seem to be"
|
||||||
" valid to me.\r\n\r\nIf you think"
|
" valid to me.\r\n\r\nIf you think"
|
||||||
" this is a valid address, simply"
|
" this is a valid address, simply"
|
||||||
" press enter to quit, and send an"
|
" press enter to quit, and send an"
|
||||||
" e-mail to %s from that address,"
|
" e-mail to %s from that address,"
|
||||||
" so we can fix our e-mail"
|
" so we can fix our e-mail"
|
||||||
" validation code.\r\n\r\nIf you"
|
" validation code.\r\n\r\nIf you"
|
||||||
" just mistyped your address, type"
|
" just mistyped your address, type"
|
||||||
" it now: ",
|
" it now: ",
|
||||||
active_config->admin_email);
|
active_config->admin_email);
|
||||||
|
|
||||||
if (*(wmud_client_get_buffer(client)->str))
|
if (*(wmud_client_get_buffer(client)->str))
|
||||||
wmud_client_set_bademail(client, TRUE);
|
wmud_client_set_bademail(client, TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
state_regemail_confirm(WmudClient *client)
|
state_regemail_confirm(WmudClient *client)
|
||||||
{
|
{
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
|
|
||||||
if (g_ascii_strcasecmp(wmud_player_get_email(wmud_client_get_player(client)), wmud_client_get_buffer(client)->str) == 0) {
|
if (g_ascii_strcasecmp(wmud_player_get_email(wmud_client_get_player(client)), wmud_client_get_buffer(client)->str) == 0) {
|
||||||
if (wmud_db_save_player(wmud_client_get_player(client), &err)) {
|
if (wmud_db_save_player(wmud_client_get_player(client), &err)) {
|
||||||
wmud_client_send(client, "\r\nGood. We will generate the password for this player name, and send it to you\r\nvia e-mail. Please come back to us, if you get that code, so you can log\r\nin.\r\n");
|
wmud_client_send(client, "\r\nGood. We will generate the password for this player name, and send it to you\r\nvia e-mail. Please come back to us, if you get that code, so you can log\r\nin.\r\n");
|
||||||
players = g_slist_prepend(players, wmud_player_dup(wmud_client_get_player(client)));
|
players = g_slist_prepend(players, wmud_player_dup(wmud_client_get_player(client)));
|
||||||
} else {
|
} else {
|
||||||
g_critical("wmud_db_save_player() error: %s", err->message);
|
g_critical("wmud_db_save_player() error: %s", err->message);
|
||||||
wmud_client_send(client, "\r\nThere was an error during the database update. Please try again later!\r\n");
|
wmud_client_send(client, "\r\nThere was an error during the database update. Please try again later!\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
remove_client(client, TRUE);
|
remove_client(client, TRUE);
|
||||||
} else {
|
} else {
|
||||||
wmud_player_set_email(wmud_client_get_player(client), NULL);
|
wmud_player_set_email(wmud_client_get_player(client), NULL);
|
||||||
|
|
||||||
wmud_client_send(client, "This is not the same as you entered before.\r\nLet's just try it again: ");
|
wmud_client_send(client, "This is not the same as you entered before.\r\nLet's just try it again: ");
|
||||||
wmud_client_set_state(client, WMUD_CLIENT_STATE_REGISTERING);
|
wmud_client_set_state(client, WMUD_CLIENT_STATE_REGISTERING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
63
wmud/game.c
63
wmud/game.c
@ -70,17 +70,19 @@ guint32 elapsed_cycle = 0;
|
|||||||
gboolean
|
gboolean
|
||||||
rl_sec_elapsed(gpointer user_data)
|
rl_sec_elapsed(gpointer user_data)
|
||||||
{
|
{
|
||||||
elapsed_ticks++;
|
elapsed_ticks++;
|
||||||
if (elapsed_ticks == G_MAXUINT32) {
|
if (elapsed_ticks == G_MAXUINT32) {
|
||||||
elapsed_ticks = 0;
|
elapsed_ticks = 0;
|
||||||
elapsed_cycle++;
|
elapsed_cycle++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elapsed_ticks % WMUD_HEARTBEAT_LENGTH == 0) {
|
if (elapsed_ticks % WMUD_HEARTBEAT_LENGTH == 0) {
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, "Heartbeat (%d ticks)", elapsed_ticks);
|
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE,
|
||||||
}
|
"Heartbeat (%d ticks)",
|
||||||
|
elapsed_ticks);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -94,36 +96,41 @@ rl_sec_elapsed(gpointer user_data)
|
|||||||
gpointer
|
gpointer
|
||||||
game_thread_func(GMainLoop *game_loop)
|
game_thread_func(GMainLoop *game_loop)
|
||||||
{
|
{
|
||||||
/* Run the game loop */
|
/* Run the game loop */
|
||||||
g_main_loop_run(game_loop);
|
g_main_loop_run(game_loop);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
wmud_game_init(GThread **game_thread, GMainContext **game_context)
|
wmud_game_init(GThread **game_thread, GMainContext **game_context)
|
||||||
{
|
{
|
||||||
GMainLoop *game_loop;
|
GMainLoop *game_loop;
|
||||||
GSource *timeout_source;
|
GSource *timeout_source;
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
|
|
||||||
/* Create the game context and main loop */
|
/* Create the game context and main loop */
|
||||||
*game_context = g_main_context_new();
|
*game_context = g_main_context_new();
|
||||||
game_loop = g_main_loop_new(*game_context, FALSE);
|
game_loop = g_main_loop_new(*game_context, FALSE);
|
||||||
|
|
||||||
/* Create the timeout source which keeps track of elapsed real-world
|
/* Create the timeout source which keeps track of elapsed real-world
|
||||||
* time */
|
* time */
|
||||||
timeout_source = g_timeout_source_new(WMUD_TICK_LENGTH);
|
timeout_source = g_timeout_source_new(WMUD_TICK_LENGTH);
|
||||||
g_source_set_callback(timeout_source, rl_sec_elapsed, NULL, NULL);
|
g_source_set_callback(timeout_source, rl_sec_elapsed, NULL, NULL);
|
||||||
g_source_attach(timeout_source, *game_context);
|
g_source_attach(timeout_source, *game_context);
|
||||||
g_source_unref(timeout_source);
|
g_source_unref(timeout_source);
|
||||||
|
|
||||||
g_clear_error(&err);
|
g_clear_error(&err);
|
||||||
#if GLIB_CHECK_VERSION(2, 32, 0)
|
#if GLIB_CHECK_VERSION(2, 32, 0)
|
||||||
*game_thread = g_thread_new("game", (GThreadFunc)game_thread_func, game_loop);
|
*game_thread = g_thread_new("game",
|
||||||
|
(GThreadFunc)game_thread_func,
|
||||||
|
game_loop);
|
||||||
#else
|
#else
|
||||||
*game_thread = g_thread_create((GThreadFunc)game_thread_func, game_loop, TRUE, &err);
|
*game_thread = g_thread_create((GThreadFunc)game_thread_func,
|
||||||
|
game_loop,
|
||||||
|
TRUE,
|
||||||
|
&err);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
229
wmud/main.c
229
wmud/main.c
@ -52,8 +52,8 @@
|
|||||||
* This variable holds the location of the last context marker
|
* This variable holds the location of the last context marker
|
||||||
*/
|
*/
|
||||||
struct {
|
struct {
|
||||||
char *file;
|
char *file;
|
||||||
int line;
|
int line;
|
||||||
} debug_context_loc = {NULL, 0};
|
} debug_context_loc = {NULL, 0};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -65,21 +65,21 @@ struct {
|
|||||||
gchar *
|
gchar *
|
||||||
wmud_random_string(gint len)
|
wmud_random_string(gint len)
|
||||||
{
|
{
|
||||||
gchar *ret = g_malloc0(len + 1);
|
gchar *ret = g_malloc0(len + 1);
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
gchar c = 0;
|
gchar c = 0;
|
||||||
/* Include only printable characters, but exclude $ because of
|
/* Include only printable characters, but exclude $ because of
|
||||||
* salt generation, and space to avoid misunderstanding in the
|
* salt generation, and space to avoid misunderstanding in the
|
||||||
* random generated passwords */
|
* random generated passwords */
|
||||||
while (!g_ascii_isprint(c) || (c == '$') || (c == ' ') || (c == '\t'))
|
while (!g_ascii_isprint(c) || (c == '$') || (c == ' ') || (c == '\t'))
|
||||||
c = random_number(1, 127);
|
c = random_number(1, 127);
|
||||||
|
|
||||||
ret[i] = c;
|
ret[i] = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -97,11 +97,11 @@ void
|
|||||||
*/
|
*/
|
||||||
debug_context(char *file, int line)
|
debug_context(char *file, int line)
|
||||||
{
|
{
|
||||||
if (debug_context_loc.file != NULL)
|
if (debug_context_loc.file != NULL)
|
||||||
g_free(debug_context_loc.file);
|
g_free(debug_context_loc.file);
|
||||||
|
|
||||||
debug_context_loc.file = g_strdup(file);
|
debug_context_loc.file = g_strdup(file);
|
||||||
debug_context_loc.line = line;
|
debug_context_loc.line = line;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -122,45 +122,72 @@ debug_context(char *file, int line)
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
wmud_type_init(void)
|
wmud_type_init(void)
|
||||||
{
|
{}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
wmud_logger(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
|
wmud_logger(const gchar *log_domain,
|
||||||
|
GLogLevelFlags log_level,
|
||||||
|
const gchar *message,
|
||||||
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
static char timestamp[20];
|
static char timestamp[20];
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
time_t ts = time(NULL);
|
time_t ts = time(NULL);
|
||||||
size_t last_char;
|
size_t last_char;
|
||||||
|
|
||||||
tm = localtime(&ts);
|
tm = localtime(&ts);
|
||||||
|
|
||||||
last_char = strftime((char *)×tamp, 20, "%F %T", tm);
|
last_char = strftime((char *)×tamp, 20, "%F %T", tm);
|
||||||
timestamp[last_char] = '\0';
|
timestamp[last_char] = '\0';
|
||||||
|
|
||||||
switch (log_level) {
|
switch (log_level) {
|
||||||
case G_LOG_LEVEL_DEBUG:
|
case G_LOG_LEVEL_DEBUG:
|
||||||
g_print("[%s] [%s] DEBUG: %s\n", log_domain, timestamp, message);
|
g_print("[%s] [%s] DEBUG: %s\n",
|
||||||
|
log_domain,
|
||||||
|
timestamp,
|
||||||
|
message);
|
||||||
#ifndef DEBUG
|
#ifndef DEBUG
|
||||||
g_warning("Logging a debug-level message without debugging support!");
|
g_warning("Logging a debug-level message without debugging support!");
|
||||||
#endif
|
#endif
|
||||||
break;
|
|
||||||
case G_LOG_LEVEL_MESSAGE:
|
break;
|
||||||
g_print("[%s] [%s] MESSAGE: %s\n", log_domain, timestamp, message);
|
case G_LOG_LEVEL_MESSAGE:
|
||||||
break;
|
g_print("[%s] [%s] MESSAGE: %s\n",
|
||||||
case G_LOG_LEVEL_INFO:
|
log_domain,
|
||||||
g_print("[%s] [%s] INFO: %s\n", log_domain, timestamp, message);
|
timestamp,
|
||||||
break;
|
message);
|
||||||
case G_LOG_LEVEL_WARNING:
|
|
||||||
g_print("[%s] [%s] WARNING: %s\n", log_domain, timestamp, message);
|
break;
|
||||||
break;
|
case G_LOG_LEVEL_INFO:
|
||||||
case G_LOG_LEVEL_CRITICAL:
|
g_print("[%s] [%s] INFO: %s\n",
|
||||||
g_print("[%s] [%s] CRITICAL: %s\n", log_domain, timestamp, message);
|
log_domain,
|
||||||
break;
|
timestamp,
|
||||||
default:
|
message);
|
||||||
g_print("[%s] [%s] UNKNOWN LEVEL %03d: %s\n", log_domain, timestamp, log_level, message);
|
|
||||||
break;
|
break;
|
||||||
}
|
case G_LOG_LEVEL_WARNING:
|
||||||
|
g_print("[%s] [%s] WARNING: %s\n",
|
||||||
|
log_domain,
|
||||||
|
timestamp,
|
||||||
|
message);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case G_LOG_LEVEL_CRITICAL:
|
||||||
|
g_print("[%s] [%s] CRITICAL: %s\n",
|
||||||
|
log_domain,
|
||||||
|
timestamp,
|
||||||
|
message);
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_print("[%s] [%s] UNKNOWN LEVEL %03d: %s\n",
|
||||||
|
log_domain,
|
||||||
|
timestamp,
|
||||||
|
log_level,
|
||||||
|
message);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -173,70 +200,80 @@ wmud_logger(const gchar *log_domain, GLogLevelFlags log_level, const gchar *mess
|
|||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
GThread *game_thread;
|
GThread *game_thread;
|
||||||
GMainContext *game_context;
|
GMainContext *game_context;
|
||||||
GSList *game_menu = NULL;
|
GSList *game_menu = NULL;
|
||||||
|
|
||||||
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK , wmud_logger, NULL);
|
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK , wmud_logger, NULL);
|
||||||
/* Initialize the thread and type system */
|
/* Initialize the thread and type system */
|
||||||
wmud_type_init();
|
wmud_type_init();
|
||||||
|
|
||||||
/* TODO: Command line parsing */
|
/* TODO: Command line parsing */
|
||||||
/* TODO: Create signal handlers! */
|
/* TODO: Create signal handlers! */
|
||||||
|
|
||||||
if (!wmud_config_init(&active_config, &err)) {
|
if (!wmud_config_init(&active_config, &err)) {
|
||||||
if (err)
|
if (err) {
|
||||||
g_critical("Config file parsing error: %s", err->message);
|
g_critical("Config file parsing error: %s", err->message);
|
||||||
else
|
} else {
|
||||||
g_critical("Config file parsing error!");
|
g_critical("Config file parsing error!");
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_clear_error(&err);
|
g_clear_error(&err);
|
||||||
if (!wmud_db_init(&err)) {
|
|
||||||
if (err)
|
|
||||||
g_critical("Database initialization error: %s", err->message);
|
|
||||||
else
|
|
||||||
g_critical("Database initialization error!");
|
|
||||||
|
|
||||||
return 1;
|
if (!wmud_db_init(&err)) {
|
||||||
}
|
if (err) {
|
||||||
|
g_critical("Database initialization error: %s", err->message);
|
||||||
|
} else {
|
||||||
|
g_critical("Database initialization error!");
|
||||||
|
}
|
||||||
|
|
||||||
g_clear_error(&err);
|
return 1;
|
||||||
wmud_db_load_players(&err);
|
}
|
||||||
if (!wmud_world_load(&err))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (!wmud_menu_init(&game_menu)) {
|
g_clear_error(&err);
|
||||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "An error occured during menu loading.");
|
wmud_db_load_players(&err);
|
||||||
|
|
||||||
return 1;
|
if (!wmud_world_load(&err)) {
|
||||||
}
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
wmud_texts_init();
|
if (!wmud_menu_init(&game_menu)) {
|
||||||
|
g_log(G_LOG_DOMAIN,
|
||||||
|
G_LOG_LEVEL_CRITICAL,
|
||||||
|
"An error occured during menu loading.");
|
||||||
|
|
||||||
/* Non-thread initialization ends here */
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
wmud_game_init(&game_thread, &game_context);
|
wmud_texts_init();
|
||||||
|
|
||||||
g_clear_error(&err);
|
/* Non-thread initialization ends here */
|
||||||
if (!wmud_networking_init(active_config->port, game_context, game_menu, &err)) {
|
|
||||||
if (err)
|
|
||||||
g_critical("Database initialization error: %s", err->message);
|
|
||||||
else
|
|
||||||
g_critical("Database initialization error: unknown error!");
|
|
||||||
|
|
||||||
return 1;
|
wmud_game_init(&game_thread, &game_context);
|
||||||
}
|
|
||||||
|
|
||||||
wmud_maintenance_init();
|
g_clear_error(&err);
|
||||||
|
if (!wmud_networking_init(active_config->port,
|
||||||
|
game_context,
|
||||||
|
game_menu,
|
||||||
|
&err)) {
|
||||||
|
if (err) {
|
||||||
|
g_critical("Database initialization error: %s", err->message);
|
||||||
|
} else {
|
||||||
|
g_critical("Database initialization error: unknown error!");
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize other threads here */
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
g_thread_join(game_thread);
|
wmud_maintenance_init();
|
||||||
|
|
||||||
return 0;
|
/* Initialize other threads here */
|
||||||
|
|
||||||
|
g_thread_join(game_thread);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user