gnome-mud r715 - in trunk: . src
- From: lharris svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-mud r715 - in trunk: . src
- Date: Thu, 5 Feb 2009 19:19:17 +0000 (UTC)
Author: lharris
Date: Thu Feb 5 19:19:17 2009
New Revision: 715
URL: http://svn.gnome.org/viewvc/gnome-mud?rev=715&view=rev
Log:
Mud Connections fixes.
Modified:
trunk/ChangeLog
trunk/INSTALL
trunk/src/mud-connections.c
trunk/src/mud-regex.c
trunk/src/mud-telnet-handlers.c
trunk/src/mud-telnet-msp.c
trunk/src/mud-telnet.c
Modified: trunk/INSTALL
==============================================================================
--- trunk/INSTALL (original)
+++ trunk/INSTALL Thu Feb 5 19:19:17 2009
@@ -1,16 +1,19 @@
Installation Instructions
*************************
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
-Software Foundation, Inc.
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008 Free Software Foundation, Inc.
-This file is free documentation; the Free Software Foundation gives
+ This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it.
Basic Installation
==================
-These are generic installation instructions.
+ Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
@@ -23,9 +26,9 @@
It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring. (Caching is
+the results of its tests to speed up reconfiguring. Caching is
disabled by default to prevent problems with accidental use of stale
-cache files.)
+cache files.
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
@@ -35,20 +38,17 @@
may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'. You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
+`configure' by a program called `autoconf'. You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system. If you're
- using `csh' on an old version of System V, you might need to type
- `sh ./configure' instead to prevent `csh' from trying to execute
- `configure' itself.
+ `./configure' to configure the package for your system.
- Running `configure' takes awhile. While running, it prints some
- messages telling which features it is checking for.
+ Running `configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
2. Type `make' to compile the package.
@@ -67,42 +67,57 @@
all sorts of other programs in order to regenerate files that came
with the distribution.
+ 6. Often, you can also type `make uninstall' to remove the installed
+ files again.
+
Compilers and Options
=====================
-Some systems require unusual options for compilation or linking that the
-`configure' script does not know about. Run `./configure --help' for
-details on some of the pertinent environment variables.
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment. Here
is an example:
- ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
*Note Defining Variables::, for more details.
Compiling For Multiple Architectures
====================================
-You can compile the package for more than one kind of computer at the
+ You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
-own directory. To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'. `cd' to the
+own directory. To do this, you can use GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
- If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory. After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
+ With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
Installation Names
==================
-By default, `make install' installs the package's commands under
+ By default, `make install' installs the package's commands under
`/usr/local/bin', include files under `/usr/local/include', etc. You
can specify an installation prefix other than `/usr/local' by giving
`configure' the option `--prefix=PREFIX'.
@@ -125,7 +140,7 @@
Optional Features
=================
-Some packages pay attention to `--enable-FEATURE' options to
+ Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
@@ -137,14 +152,36 @@
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file. The option `-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
Specifying the System Type
==========================
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
`--build=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:
@@ -170,9 +207,9 @@
Sharing Defaults
================
-If you want to set default values for `configure' scripts to share, you
-can create a site shell script called `config.site' that gives default
-values for variables like `CC', `cache_file', and `prefix'.
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
@@ -181,7 +218,7 @@
Defining Variables
==================
-Variables not defined in a site shell script can be set in the
+ Variables not defined in a site shell script can be set in the
environment passed to `configure'. However, some packages may run
configure again during the build, and the customized values of these
variables may be lost. In order to avoid this problem, you should set
@@ -190,21 +227,29 @@
./configure CC=/usr/local2/bin/gcc
causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script). Here is a another example:
+overridden in the site shell script).
- /bin/bash ./configure CONFIG_SHELL=/bin/bash
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug. Until the bug is fixed you can use this workaround:
-Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
-configuration-related scripts to be executed by `/bin/bash'.
+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
`configure' Invocation
======================
-`configure' recognizes the following options to control how it operates.
+ `configure' recognizes the following options to control how it
+operates.
`--help'
`-h'
- Print a summary of the options to `configure', and exit.
+ Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+ Print a summary of the options unique to this package's
+ `configure', and exit. The `short' variant lists options used
+ only in the top level, while the `recursive' variant lists options
+ also present in any nested packages.
`--version'
`-V'
@@ -231,6 +276,16 @@
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
+`--prefix=DIR'
+ Use DIR as the installation prefix. *Note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+`--no-create'
+`-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
`configure' also accepts some other, not widely useful, options. Run
`configure --help' for more details.
Modified: trunk/src/mud-connections.c
==============================================================================
--- trunk/src/mud-connections.c (original)
+++ trunk/src/mud-connections.c Thu Feb 5 19:19:17 2009
@@ -37,53 +37,53 @@
struct _MudConnectionsPrivate
{
- // Main Window
- MudWindow *parent;
- GtkWidget *winwidget;
- MudTray *tray;
+ // Main Window
+ MudWindow *parent;
+ GtkWidget *winwidget;
+ MudTray *tray;
- GtkWidget *window;
- GtkWidget *iconview;
- GtkWidget *popup;
+ GtkWidget *window;
+ GtkWidget *iconview;
+ GtkWidget *popup;
- GtkTreeModel *icon_model;
- GtkTreeModel *profile_model;
+ GtkTreeModel *icon_model;
+ GtkTreeModel *profile_model;
- // Properties Dialog
- GtkWidget *properties_window;
- GtkWidget *name_entry;
- GtkWidget *host_entry;
- GtkWidget *port_entry;
+ // Properties Dialog
+ GtkWidget *properties_window;
+ GtkWidget *name_entry;
+ GtkWidget *host_entry;
+ GtkWidget *port_entry;
- GtkWidget *icon_button;
- GtkWidget *icon_image;
+ GtkWidget *icon_button;
+ GtkWidget *icon_image;
- GtkWidget *profile_combo;
- GtkCellRenderer *profile_combo_renderer;
+ GtkWidget *profile_combo;
+ GtkCellRenderer *profile_combo_renderer;
- GtkWidget *character_name_entry;
- GtkWidget *logon_textview;
+ GtkWidget *character_name_entry;
+ GtkWidget *logon_textview;
- gboolean changed;
+ gboolean changed;
- gchar *original_name;
- gchar *original_char_name;
+ gchar *original_name;
+ gchar *original_char_name;
- guint connection;
+ guint connection;
- // Iconview Dialog
- GtkWidget *icon_dialog;
- GtkWidget *icon_dialog_view;
- GtkTreeModel *icon_dialog_view_model;
- GtkWidget *icon_dialog_chooser;
- gchar *icon_current;
+ // Iconview Dialog
+ GtkWidget *icon_dialog;
+ GtkWidget *icon_dialog_view;
+ GtkTreeModel *icon_dialog_view_model;
+ GtkWidget *icon_dialog_chooser;
+ gchar *icon_current;
};
typedef enum MudConnectionsModelColumns
{
- MODEL_COLUMN_STRING,
- MODEL_COLUMN_PIXBUF,
- MODEL_COLUMN_N
+ MODEL_COLUMN_STRING,
+ MODEL_COLUMN_PIXBUF,
+ MODEL_COLUMN_N
} MudConnectionsModelColumns;
GType mud_connections_get_type (void);
@@ -91,1154 +91,1259 @@
static void mud_connections_init (MudConnections *conn);
static void mud_connections_class_init (MudConnectionsClass *klass);
static void mud_connections_finalize (GObject *object);
-static gint mud_connections_close_cb(GtkWidget *widget, MudConnections *conn);
-static void mud_connections_connect_cb(GtkWidget *widget, MudConnections *conn);
-static void mud_connections_add_cb(GtkWidget *widget, MudConnections *conn);
-static void mud_connections_delete_cb(GtkWidget *widget, MudConnections *conn);
-static void mud_connections_properties_cb(GtkWidget *widget, MudConnections *conn);
+static gint mud_connections_close_cb(GtkWidget *widget,
+ MudConnections *conn);
+static void mud_connections_connect_cb(GtkWidget *widget,
+ MudConnections *conn);
+static void mud_connections_add_cb(GtkWidget *widget,
+ MudConnections *conn);
+static void mud_connections_delete_cb(GtkWidget *widget,
+ MudConnections *conn);
+static void mud_connections_properties_cb(GtkWidget *widget,
+ MudConnections *conn);
static void mud_connections_populate_iconview(MudConnections *conn);
-static void mud_connections_show_properties(MudConnections *conn, gchar *mud);
-static void mud_connections_property_cancel_cb(GtkWidget *widget, MudConnections *conn);
-static void mud_connections_property_save_cb(GtkWidget *widget, MudConnections *conn);
-static void mud_connections_property_icon_cb(GtkWidget *widget, MudConnections *conn);
-static gboolean mud_connections_property_changed_cb(GtkWidget *widget, GdkEventKey *event, MudConnections *conn);
-static void mud_connections_property_combo_changed_cb(GtkWidget *widget, MudConnections *conn);
-static gboolean mud_connections_property_delete_cb(GtkWidget *widget, GdkEvent *event, MudConnections *conn);
+static void mud_connections_show_properties(MudConnections *conn,
+ gchar *mud);
+static void mud_connections_property_cancel_cb(GtkWidget *widget,
+ MudConnections *conn);
+static void mud_connections_property_save_cb(GtkWidget *widget,
+ MudConnections *conn);
+static void mud_connections_property_icon_cb(GtkWidget *widget,
+ MudConnections *conn);
+static gboolean mud_connections_property_changed_cb(GtkWidget *widget,
+ GdkEventKey *event,
+ MudConnections *conn);
+static void mud_connections_property_combo_changed_cb(GtkWidget *widget,
+ MudConnections *conn);
+static gboolean mud_connections_property_delete_cb(GtkWidget *widget,
+ GdkEvent *event,
+ MudConnections *conn);
static gboolean mud_connections_property_save(MudConnections *conn);
static gint mud_connections_property_confirm(void);
-static void mud_connections_property_populate_profiles(MudConnections *conn);
-static void mud_connections_property_combo_get_index(MudConnections *conn, gchar *profile);
+static void mud_connections_property_populate_profiles(
+ MudConnections *conn);
+static void mud_connections_property_combo_get_index(MudConnections *conn,
+ gchar *profile);
static void mud_connections_refresh_iconview(MudConnections *conn);
static gboolean mud_connections_delete_confirm(gchar *name);
static gboolean mud_connections_button_press_cb(GtkWidget *widget,
- GdkEventButton *event, MudConnections *conn);
-static void mud_connections_popup(MudConnections *conn, GdkEventButton *event);
+ GdkEventButton *event,
+ MudConnections *conn);
+static void mud_connections_popup(MudConnections *conn,
+ GdkEventButton *event);
static void mud_connections_show_icon_dialog(MudConnections *conn);
-static void mud_connections_icon_fileset_cb(GtkFileChooserButton *widget, MudConnections *conn);
-static void mud_connections_icon_select_cb(GtkIconView *view, MudConnections *conn);
+static void mud_connections_icon_fileset_cb(GtkFileChooserButton *widget,
+ MudConnections *conn);
+static void mud_connections_icon_select_cb(GtkIconView *view,
+ MudConnections *conn);
void mud_connections_iconview_activate_cb(GtkIconView *iconview,
- GtkTreePath *path, MudConnections *conn);
-void mud_connections_gconf_notify_cb(GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer *data);
+ GtkTreePath *path,
+ MudConnections *conn);
+void mud_connections_gconf_notify_cb(GConfClient *client,
+ guint cnxn_id, GConfEntry *entry,
+ gpointer *data);
// MudConnections class functions
GType
mud_connections_get_type (void)
{
- static GType object_type = 0;
+ static GType object_type = 0;
- g_type_init();
+ g_type_init();
- if (!object_type)
- {
- static const GTypeInfo object_info =
- {
- sizeof (MudConnectionsClass),
- NULL,
- NULL,
- (GClassInitFunc) mud_connections_class_init,
- NULL,
- NULL,
- sizeof (MudConnections),
- 0,
- (GInstanceInitFunc) mud_connections_init,
- };
-
- object_type = g_type_register_static(G_TYPE_OBJECT, "MudConnections", &object_info, 0);
- }
+ if (!object_type)
+ {
+ static const GTypeInfo object_info =
+ {
+ sizeof (MudConnectionsClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) mud_connections_class_init,
+ NULL,
+ NULL,
+ sizeof (MudConnections),
+ 0,
+ (GInstanceInitFunc) mud_connections_init,
+ };
+
+ object_type =
+ g_type_register_static(G_TYPE_OBJECT,
+ "MudConnections", &object_info, 0);
+ }
- return object_type;
+ return object_type;
}
static void
mud_connections_init (MudConnections *conn)
{
- GladeXML *glade;
- GConfClient *client;
+ GladeXML *glade;
+ GConfClient *client;
- conn->priv = g_new0(MudConnectionsPrivate, 1);
+ conn->priv = g_new0(MudConnectionsPrivate, 1);
- glade = glade_xml_new(GLADEDIR "/muds.glade", "mudviewwindow", NULL);
+ glade = glade_xml_new(GLADEDIR "/muds.glade", "mudviewwindow", NULL);
- conn->priv->window = glade_xml_get_widget(glade, "mudviewwindow");
- conn->priv->iconview = glade_xml_get_widget(glade, "iconview");
-
- conn->priv->icon_model = GTK_TREE_MODEL(gtk_list_store_new(MODEL_COLUMN_N,
- G_TYPE_STRING,
- GDK_TYPE_PIXBUF));
- conn->priv->original_name = NULL;
- conn->priv->original_char_name = NULL;
-
- gtk_icon_view_set_model(GTK_ICON_VIEW(conn->priv->iconview),
- conn->priv->icon_model);
- gtk_icon_view_set_text_column(GTK_ICON_VIEW(conn->priv->iconview),
- MODEL_COLUMN_STRING);
- gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(conn->priv->iconview),
- MODEL_COLUMN_PIXBUF);
-
- client = gconf_client_get_default();
- gconf_client_add_dir(client, "/apps/gnome-mud/muds", GCONF_CLIENT_PRELOAD_NONE, NULL);
- conn->priv->connection = gconf_client_notify_add(client, "/apps/gnome-mud/muds",
- (GConfClientNotifyFunc)mud_connections_gconf_notify_cb, conn,
- NULL, NULL);
-
- g_signal_connect(conn->priv->iconview, "item-activated",
- G_CALLBACK(mud_connections_iconview_activate_cb),
- conn);
- g_signal_connect(conn->priv->iconview, "button-press-event",
- G_CALLBACK(mud_connections_button_press_cb),
- conn);
- g_signal_connect(conn->priv->window, "destroy",
- G_CALLBACK(mud_connections_close_cb), conn);
- g_signal_connect(glade_xml_get_widget(glade, "connect_button"),
- "clicked", G_CALLBACK(mud_connections_connect_cb), conn);
- g_signal_connect(glade_xml_get_widget(glade, "add_button"),
- "clicked", G_CALLBACK(mud_connections_add_cb), conn);
- g_signal_connect(glade_xml_get_widget(glade, "delete_button"),
- "clicked", G_CALLBACK(mud_connections_delete_cb), conn);
- g_signal_connect(glade_xml_get_widget(glade, "properties_button"),
- "clicked", G_CALLBACK(mud_connections_properties_cb), conn);
+ conn->priv->window = glade_xml_get_widget(glade, "mudviewwindow");
+ conn->priv->iconview = glade_xml_get_widget(glade, "iconview");
+
+ conn->priv->icon_model =
+ GTK_TREE_MODEL(gtk_list_store_new(MODEL_COLUMN_N,
+ G_TYPE_STRING,
+ GDK_TYPE_PIXBUF));
+
+ conn->priv->original_name = NULL;
+ conn->priv->original_char_name = NULL;
+
+ gtk_icon_view_set_model(GTK_ICON_VIEW(conn->priv->iconview),
+ conn->priv->icon_model);
+ gtk_icon_view_set_text_column(GTK_ICON_VIEW(conn->priv->iconview),
+ MODEL_COLUMN_STRING);
+ gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(conn->priv->iconview),
+ MODEL_COLUMN_PIXBUF);
+
+ client = gconf_client_get_default();
+ gconf_client_add_dir(client, "/apps/gnome-mud/muds",
+ GCONF_CLIENT_PRELOAD_NONE, NULL);
+
+ conn->priv->connection =
+ gconf_client_notify_add(client, "/apps/gnome-mud/muds",
+ (GConfClientNotifyFunc)
+ mud_connections_gconf_notify_cb,
+ conn, NULL, NULL);
+
+ g_signal_connect(conn->priv->iconview, "item-activated",
+ G_CALLBACK(mud_connections_iconview_activate_cb),
+ conn);
+ g_signal_connect(conn->priv->iconview, "button-press-event",
+ G_CALLBACK(mud_connections_button_press_cb),
+ conn);
+ g_signal_connect(conn->priv->window, "destroy",
+ G_CALLBACK(mud_connections_close_cb), conn);
+ g_signal_connect(glade_xml_get_widget(glade, "connect_button"),
+ "clicked", G_CALLBACK(mud_connections_connect_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "add_button"),
+ "clicked", G_CALLBACK(mud_connections_add_cb), conn);
+ g_signal_connect(glade_xml_get_widget(glade, "delete_button"),
+ "clicked", G_CALLBACK(mud_connections_delete_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "properties_button"),
+ "clicked", G_CALLBACK(mud_connections_properties_cb),
+ conn);
- mud_connections_populate_iconview(conn);
+ mud_connections_populate_iconview(conn);
- gtk_widget_show_all(conn->priv->window);
- g_object_unref(glade);
+ gtk_widget_show_all(conn->priv->window);
+ g_object_unref(glade);
}
static void
mud_connections_class_init (MudConnectionsClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
- object_class->finalize = mud_connections_finalize;
+ object_class->finalize = mud_connections_finalize;
}
static void
mud_connections_finalize (GObject *object)
{
- MudConnections *conn;
- GObjectClass *parent_class;
- GConfClient *client = gconf_client_get_default();
+ MudConnections *conn;
+ GObjectClass *parent_class;
+ GConfClient *client = gconf_client_get_default();
- conn = MUD_CONNECTIONS(object);
+ conn = MUD_CONNECTIONS(object);
- gconf_client_notify_remove(client, conn->priv->connection);
+ gconf_client_notify_remove(client, conn->priv->connection);
- g_object_unref(conn->priv->icon_model);
- g_free(conn->priv);
+ g_object_unref(conn->priv->icon_model);
+ g_free(conn->priv);
- parent_class = g_type_class_peek_parent(G_OBJECT_GET_CLASS(object));
- parent_class->finalize(object);
+ parent_class = g_type_class_peek_parent(G_OBJECT_GET_CLASS(object));
+ parent_class->finalize(object);
}
// MudConnections Private Methods
static gint
mud_connections_close_cb(GtkWidget *widget, MudConnections *conn)
{
- g_object_unref(conn);
+ g_object_unref(conn);
- return TRUE;
+ return TRUE;
}
static void
mud_connections_connect_cb(GtkWidget *widget, MudConnections *conn)
{
- GList *selected = gtk_icon_view_get_selected_items(GTK_ICON_VIEW(conn->priv->iconview));
- GtkTreeIter iter;
- gchar *buf, *mud_name, *key, *strip_name,
- *profile, *host, *logon, *char_name;
- gint port;
- gchar **mud_tuple;
- gint len;
- GConfClient *client = gconf_client_get_default();
- MudConnectionView *view;
-
- if(g_list_length(selected) == 0)
- return;
-
- logon = char_name = NULL;
-
- gtk_tree_model_get_iter(conn->priv->icon_model, &iter, (GtkTreePath *)selected->data);
- gtk_tree_model_get(conn->priv->icon_model, &iter, 0, &buf, -1);
+ GList *selected =
+ gtk_icon_view_get_selected_items(
+ GTK_ICON_VIEW(conn->priv->iconview));
+ GtkTreeIter iter;
+ gchar *buf, *mud_name, *key, *strip_name,
+ *profile, *host, *logon, *char_name;
+ gint port;
+ gchar **mud_tuple;
+ gint len;
+ GConfClient *client = gconf_client_get_default();
+ MudConnectionView *view;
+
+ if(g_list_length(selected) == 0)
+ return;
+
+ logon = char_name = NULL;
+
+ gtk_tree_model_get_iter(conn->priv->icon_model, &iter,
+ (GtkTreePath *)selected->data);
+ gtk_tree_model_get(conn->priv->icon_model, &iter, 0, &buf, -1);
- mud_tuple = g_strsplit(buf, "\n", -1);
-
- len = g_strv_length(mud_tuple);
+ mud_tuple = g_strsplit(buf, "\n", -1);
- switch(len)
- {
- case 1:
- mud_name = g_strdup(mud_tuple[0]);
- break;
-
- case 2:
- char_name = remove_whitespace(mud_tuple[0]);
- mud_name = g_strdup(mud_tuple[1]);
- break;
-
- default:
- g_warning("Malformed mud name passed to delete.");
- return;
- }
-
- g_strfreev(mud_tuple);
- g_free(buf);
-
- strip_name = remove_whitespace(mud_name);
+ len = g_strv_length(mud_tuple);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/host", strip_name);
- host = gconf_client_get_string(client, key, NULL);
+ switch(len)
+ {
+ case 1:
+ mud_name = g_strdup(mud_tuple[0]);
+ break;
+
+ case 2:
+ char_name = remove_whitespace(mud_tuple[0]);
+ mud_name = g_strdup(mud_tuple[1]);
+ break;
+
+ default:
+ g_warning("Malformed mud name passed to delete.");
+ return;
+ }
+
+ g_strfreev(mud_tuple);
+ g_free(buf);
+
+ strip_name = remove_whitespace(mud_name);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/host", strip_name);
+ host = gconf_client_get_string(client, key, NULL);
+ g_free(key);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/profile", strip_name);
+ profile = gconf_client_get_string(client, key, NULL);
+ g_free(key);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/port", strip_name);
+ port = gconf_client_get_int(client, key, NULL);
+ g_free(key);
+
+ if(char_name && strlen(char_name) > 0)
+ {
+ key = g_strdup_printf(
+ "/apps/gnome-mud/muds/%s/characters/%s/logon",
+ strip_name, char_name);
+ logon = gconf_client_get_string(client, key, NULL);
g_free(key);
+ }
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/profile", strip_name);
- profile = gconf_client_get_string(client, key, NULL);
- g_free(key);
+ mud_tray_update_icon(conn->priv->tray, offline);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/port", strip_name);
- port = gconf_client_get_int(client, key, NULL);
- g_free(key);
+ view = mud_connection_view_new("Default", host, port,
+ conn->priv->winwidget,
+ (GtkWidget *)conn->priv->tray, mud_name);
+ mud_window_add_connection_view(conn->priv->parent, view, mud_name);
+ mud_connection_view_set_profile(view, get_profile(profile));
+ mud_window_profile_menu_set_active(profile, conn->priv->parent);
+
+ if(logon && strlen(logon) != 0)
+ mud_connection_view_set_connect_string(view, logon);
+
+ g_free(mud_name);
+ g_free(strip_name);
+ g_object_unref(client);
- if(char_name && strlen(char_name) > 0)
- {
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/logon",
- strip_name, char_name);
- logon = gconf_client_get_string(client, key, NULL);
- g_free(key);
- }
-
- mud_tray_update_icon(conn->priv->tray, offline);
-
- view = mud_connection_view_new("Default", host, port, conn->priv->winwidget,
- (GtkWidget *)conn->priv->tray, mud_name);
- mud_window_add_connection_view(conn->priv->parent, view, mud_name);
- mud_connection_view_set_profile(view, get_profile(profile));
- mud_window_profile_menu_set_active(profile, conn->priv->parent);
-
- if(logon && strlen(logon) != 0)
- mud_connection_view_set_connect_string(view, logon);
-
- g_free(mud_name);
- g_free(strip_name);
- g_object_unref(client);
-
- // Safe only because the iconview is in single select mode.
- /*g_free(selected->data);
- g_list_free(selected);*/
+ g_list_foreach(selected, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free(selected);
}
static void
mud_connections_add_cb(GtkWidget *widget, MudConnections *conn)
{
- mud_connections_show_properties(conn, NULL);
+ mud_connections_show_properties(conn, NULL);
}
static void
mud_connections_delete_cb(GtkWidget *widget, MudConnections *conn)
{
- GList *selected = gtk_icon_view_get_selected_items(GTK_ICON_VIEW(conn->priv->iconview));
- GtkTreeIter iter;
- gchar *buf, *mud_name, *key, *strip_name;
- gchar **mud_tuple;
- gint len;
- GConfClient *client = gconf_client_get_default();
+ GList *selected =
+ gtk_icon_view_get_selected_items(
+ GTK_ICON_VIEW(conn->priv->iconview));
+ GtkTreeIter iter;
+ gchar *buf, *mud_name, *key, *strip_name;
+ gchar **mud_tuple;
+ gint len;
+ GConfClient *client = gconf_client_get_default();
+
+ if(g_list_length(selected) == 0)
+ return;
+
+ gtk_tree_model_get_iter(conn->priv->icon_model, &iter,
+ (GtkTreePath *)selected->data);
+ gtk_tree_model_get(conn->priv->icon_model, &iter, 0, &buf, -1);
+
+ mud_tuple = g_strsplit(buf, "\n", -1);
- if(g_list_length(selected) == 0)
- return;
+ len = g_strv_length(mud_tuple);
- gtk_tree_model_get_iter(conn->priv->icon_model, &iter, (GtkTreePath *)selected->data);
- gtk_tree_model_get(conn->priv->icon_model, &iter, 0, &buf, -1);
-
- mud_tuple = g_strsplit(buf, "\n", -1);
+ switch(len)
+ {
+ case 1:
+ mud_name = g_strdup(mud_tuple[0]);
+ break;
- len = g_strv_length(mud_tuple);
+ case 2:
+ mud_name = g_strdup(mud_tuple[1]);
+ break;
- switch(len)
- {
- case 1:
- mud_name = g_strdup(mud_tuple[0]);
- break;
-
- case 2:
- mud_name = g_strdup(mud_tuple[1]);
- break;
-
- default:
- g_warning("Malformed mud name passed to delete.");
- return;
- }
+ default:
+ g_warning("Malformed mud name passed to delete.");
+ return;
+ }
- g_strfreev(mud_tuple);
+ g_strfreev(mud_tuple);
- if(!mud_connections_delete_confirm(buf))
- return;
+ if(!mud_connections_delete_confirm(buf))
+ return;
- g_free(buf);
+ g_free(buf);
- strip_name = remove_whitespace(mud_name);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s", strip_name);
- gconf_client_recursive_unset(client, key, 0, NULL);
- g_free(key);
- gconf_client_suggest_sync(client, NULL);
+ strip_name = remove_whitespace(mud_name);
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s", strip_name);
+ gconf_client_recursive_unset(client, key, 0, NULL);
+ g_free(key);
+ gconf_client_suggest_sync(client, NULL);
- g_free(mud_name);
- g_free(strip_name);
- g_object_unref(client);
+ g_free(mud_name);
+ g_free(strip_name);
+ g_object_unref(client);
- // Safe only because the iconview is in single select mode.
- /*g_free(selected->data);
- g_list_free(selected);*/
+ g_list_foreach(selected, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free(selected);
}
static void
mud_connections_properties_cb(GtkWidget *widget, MudConnections *conn)
{
- GList *selected = gtk_icon_view_get_selected_items(GTK_ICON_VIEW(conn->priv->iconview));
- GtkTreeIter iter;
- gchar *buf;
+ GList *selected =
+ gtk_icon_view_get_selected_items(
+ GTK_ICON_VIEW(conn->priv->iconview));
+ GtkTreeIter iter;
+ gchar *buf;
+
+ if(g_list_length(selected) == 0)
+ return;
+
+ gtk_tree_model_get_iter(conn->priv->icon_model, &iter,
+ (GtkTreePath *)selected->data);
+ gtk_tree_model_get(conn->priv->icon_model, &iter, 0, &buf, -1);
- if(g_list_length(selected) == 0)
- return;
+ mud_connections_show_properties(conn, g_strdup(buf));
- gtk_tree_model_get_iter(conn->priv->icon_model, &iter, (GtkTreePath *)selected->data);
- gtk_tree_model_get(conn->priv->icon_model, &iter, 0, &buf, -1);
-
- mud_connections_show_properties(conn, g_strdup(buf));
-
- g_free(buf);
+ g_free(buf);
}
static void
mud_connections_populate_iconview(MudConnections *conn)
{
- GSList *muds, *characters, *mud_entry, *char_entry;
- gchar *key, *mud_name, *char_name, *display_name,
- *name_strip, *char_strip, *buf;
- GConfClient *client = gconf_client_get_default();
- GtkTreeIter iter;
- GdkPixbuf *icon;
+ GSList *muds, *characters, *mud_entry, *char_entry;
+ gchar *key, *mud_name, *char_name, *display_name,
+ *name_strip, *char_strip, *buf;
+ GConfClient *client = gconf_client_get_default();
+ GtkTreeIter iter;
+ GdkPixbuf *icon;
+
+ key = g_strdup("/apps/gnome-mud/muds");
+ muds = gconf_client_all_dirs(client, key, NULL);
+ g_free(key);
+
+ for(mud_entry = muds; mud_entry != NULL;
+ mud_entry = g_slist_next(mud_entry))
+ {
+ mud_name = g_path_get_basename((gchar *)mud_entry->data);
+ name_strip = NULL;
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/name", mud_name);
+ name_strip = gconf_client_get_string(client, key, NULL);
+ g_free(key);
- key = g_strdup("/apps/gnome-mud/muds");
- muds = gconf_client_all_dirs(client, key, NULL);
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters",
+ mud_name);
+ characters = gconf_client_all_dirs(client, key, NULL);
g_free(key);
- for(mud_entry = muds; mud_entry != NULL; mud_entry = g_slist_next(mud_entry))
+ char_entry = characters;
+
+ if(char_entry == NULL) // No Characters
+ {
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/icon", mud_name);
+ buf = gconf_client_get_string(client, key, NULL);
+ g_free(key);
+
+ if(buf && strcmp(buf, "gnome-mud") != 0)
+ {
+ icon = gdk_pixbuf_new_from_file_at_size(
+ buf, 48, 48, NULL);
+ g_free(buf);
+ }
+ else
+ icon =
+ gtk_icon_theme_load_icon(gtk_icon_theme_get_default(),
+ "gnome-mud", 48, 0, NULL);
+
+ gtk_list_store_append(
+ GTK_LIST_STORE(conn->priv->icon_model), &iter);
+ gtk_list_store_set(
+ GTK_LIST_STORE(conn->priv->icon_model), &iter,
+ MODEL_COLUMN_STRING, name_strip,
+ MODEL_COLUMN_PIXBUF, icon,
+ -1);
+
+ g_object_unref(icon);
+ continue;
+ }
+
+ for(char_entry = characters; char_entry != NULL;
+ char_entry = g_slist_next(char_entry))
{
- mud_name = g_path_get_basename((gchar *)mud_entry->data);
- name_strip = NULL;
+ char_strip = NULL;
+ char_name = g_path_get_basename((gchar *)char_entry->data);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/name", mud_name);
- name_strip = gconf_client_get_string(client, key, NULL);
- g_free(key);
-
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters", mud_name);
- characters = gconf_client_all_dirs(client, key, NULL);
- g_free(key);
-
- char_entry = characters;
-
- if(char_entry == NULL) // No Characters
- {
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/icon", mud_name);
- buf = gconf_client_get_string(client, key, NULL);
- g_free(key);
-
- if(buf && strcmp(buf, "gnome-mud") != 0)
- {
- icon = gdk_pixbuf_new_from_file_at_size(
- buf, 48, 48, NULL);
- g_free(buf);
- }
- else
- icon = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(),
- "gnome-mud", 48, 0, NULL);
-
- gtk_list_store_append(GTK_LIST_STORE(conn->priv->icon_model), &iter);
- gtk_list_store_set(GTK_LIST_STORE(conn->priv->icon_model), &iter,
- MODEL_COLUMN_STRING, name_strip,
- MODEL_COLUMN_PIXBUF, icon,
- -1);
-
- g_object_unref(icon);
- continue;
- }
-
- for(char_entry = characters; char_entry != NULL; char_entry = g_slist_next(char_entry))
- {
- char_strip = NULL;
- char_name = g_path_get_basename((gchar *)char_entry->data);
-
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/name",
- mud_name, char_name);
- char_strip = gconf_client_get_string(client, key, NULL);
- g_free(key);
-
- display_name = g_strconcat(char_strip, "\n", name_strip, NULL);
-
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/icon", mud_name);
- buf = gconf_client_get_string(client, key, NULL);
- g_free(key);
-
- if(buf && strcmp(buf, "gnome-mud") != 0)
- {
- icon = gdk_pixbuf_new_from_file_at_size(
- buf, 48, 48, NULL);
- g_free(buf);
- }
- else
- icon = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(),
- "gnome-mud", 48, 0, NULL);
-
- gtk_list_store_append(GTK_LIST_STORE(conn->priv->icon_model), &iter);
- gtk_list_store_set(GTK_LIST_STORE(conn->priv->icon_model), &iter,
- MODEL_COLUMN_STRING, display_name,
- MODEL_COLUMN_PIXBUF, icon,
- -1);
-
- g_object_unref(icon);
- g_free(char_name);
- g_free(char_strip);
- g_free(display_name);
- }
+ key = g_strdup_printf(
+ "/apps/gnome-mud/muds/%s/characters/%s/name",
+ mud_name, char_name);
+ char_strip = gconf_client_get_string(client, key, NULL);
+ g_free(key);
+
+ display_name = g_strconcat(char_strip, "\n", name_strip, NULL);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/icon", mud_name);
+ buf = gconf_client_get_string(client, key, NULL);
+ g_free(key);
- g_free(mud_name);
- g_free(name_strip);
+ if(buf && strcmp(buf, "gnome-mud") != 0)
+ {
+ icon = gdk_pixbuf_new_from_file_at_size(
+ buf, 48, 48, NULL);
+ g_free(buf);
+ }
+ else
+ icon =
+ gtk_icon_theme_load_icon(gtk_icon_theme_get_default(),
+ "gnome-mud", 48, 0, NULL);
+
+ gtk_list_store_append(GTK_LIST_STORE(conn->priv->icon_model),
+ &iter);
+ gtk_list_store_set(GTK_LIST_STORE(conn->priv->icon_model),
+ &iter,
+ MODEL_COLUMN_STRING, display_name,
+ MODEL_COLUMN_PIXBUF, icon,
+ -1);
+
+ g_object_unref(icon);
+ g_free(char_name);
+ g_free(char_strip);
+ g_free(display_name);
}
+
+ g_free(mud_name);
+ g_free(name_strip);
+ }
}
static void
mud_connections_refresh_iconview(MudConnections *conn)
{
- GConfClient *client = gconf_client_get_default();
+ GConfClient *client = gconf_client_get_default();
- gtk_list_store_clear(GTK_LIST_STORE(conn->priv->icon_model));
+ gtk_list_store_clear(GTK_LIST_STORE(conn->priv->icon_model));
- gconf_client_suggest_sync(client, NULL);
+ gconf_client_suggest_sync(client, NULL);
- mud_connections_populate_iconview(conn);
+ mud_connections_populate_iconview(conn);
}
void
-mud_connections_gconf_notify_cb(GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer *conn)
+mud_connections_gconf_notify_cb(GConfClient *client, guint cnxn_id,
+ GConfEntry *entry, gpointer *conn)
{
- mud_connections_refresh_iconview((MudConnections *)conn);
+ mud_connections_refresh_iconview((MudConnections *)conn);
}
void
mud_connections_iconview_activate_cb(GtkIconView *iconview,
- GtkTreePath *path, MudConnections *conn)
+ GtkTreePath *path,
+ MudConnections *conn)
{
- mud_connections_connect_cb(GTK_WIDGET(iconview), conn);
+ mud_connections_connect_cb(GTK_WIDGET(iconview), conn);
}
static gboolean
mud_connections_button_press_cb(GtkWidget *widget,
- GdkEventButton *event, MudConnections *conn)
+ GdkEventButton *event,
+ MudConnections *conn)
{
- if ((event->button == 3) &&
- !(event->state & (GDK_SHIFT_MASK |
- GDK_CONTROL_MASK |
- GDK_MOD1_MASK)))
- {
- mud_connections_popup(conn, event);
- return TRUE;
- }
+ if ((event->button == 3) &&
+ !(event->state & (GDK_SHIFT_MASK |
+ GDK_CONTROL_MASK |
+ GDK_MOD1_MASK)))
+ {
+ mud_connections_popup(conn, event);
+ return TRUE;
+ }
- return FALSE;
+ return FALSE;
}
static void
mud_connections_popup(MudConnections *conn, GdkEventButton *event)
{
- GladeXML *glade;
- GtkWidget *popup;
- GList *selected = gtk_icon_view_get_selected_items(GTK_ICON_VIEW(conn->priv->iconview));
-
- if(g_list_length(selected) == 0)
- return;
-
- glade = glade_xml_new(GLADEDIR "/muds.glade", "popupmenu", NULL);
- popup = glade_xml_get_widget(glade, "popupmenu");
-
- g_signal_connect(glade_xml_get_widget(glade, "connect"), "activate",
- G_CALLBACK(mud_connections_connect_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "add"), "activate",
- G_CALLBACK(mud_connections_add_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "delete"), "activate",
- G_CALLBACK(mud_connections_delete_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "properties"), "activate",
- G_CALLBACK(mud_connections_properties_cb),
- conn);
-
- g_object_unref(glade);
-
- gtk_menu_attach_to_widget(GTK_MENU(popup), conn->priv->iconview,
- NULL);
- gtk_widget_show_all(popup);
- gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
- event ? event->button : 0,
- event ? event->time : gtk_get_current_event_time());
-
- // Safe only because the iconview is in single select mode.
- /*g_free(selected->data);
- g_list_free(selected);*/
+ GladeXML *glade;
+ GtkWidget *popup;
+ GList *selected =
+ gtk_icon_view_get_selected_items(
+ GTK_ICON_VIEW(conn->priv->iconview));
+
+ if(g_list_length(selected) == 0)
+ return;
+
+ glade = glade_xml_new(GLADEDIR "/muds.glade", "popupmenu", NULL);
+ popup = glade_xml_get_widget(glade, "popupmenu");
+
+ g_signal_connect(glade_xml_get_widget(glade, "connect"), "activate",
+ G_CALLBACK(mud_connections_connect_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "add"), "activate",
+ G_CALLBACK(mud_connections_add_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "delete"), "activate",
+ G_CALLBACK(mud_connections_delete_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "properties"), "activate",
+ G_CALLBACK(mud_connections_properties_cb),
+ conn);
+
+ g_object_unref(glade);
+
+ gtk_menu_attach_to_widget(GTK_MENU(popup), conn->priv->iconview,
+ NULL);
+ gtk_widget_show_all(popup);
+ gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL,
+ event ? event->button : 0,
+ event ? event->time : gtk_get_current_event_time());
+
+ g_list_foreach(selected, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free(selected);
}
static gboolean
mud_connections_delete_confirm(gchar *name)
{
- GladeXML *glade;
- GtkWidget *dialog;
- GtkWidget *label;
- gint result;
- gchar *message;
- gchar *title;
-
- glade = glade_xml_new(GLADEDIR "/muds.glade", "mudviewdelconfirm", NULL);
- dialog = glade_xml_get_widget(glade, "mudviewdelconfirm");
- label = glade_xml_get_widget(glade, "message");
- g_object_unref(glade);
-
- message = g_strdup_printf(_("Are you sure you want to delete %s?"), name);
- title = g_strdup_printf(_("Delete %s?"), name);
-
- gtk_label_set_text(GTK_LABEL(label), message);
- gtk_window_set_title(GTK_WINDOW(dialog), title);
+ GladeXML *glade;
+ GtkWidget *dialog;
+ GtkWidget *label;
+ gint result;
+ gchar *message;
+ gchar *title;
+
+ glade = glade_xml_new(
+ GLADEDIR "/muds.glade", "mudviewdelconfirm", NULL);
+ dialog = glade_xml_get_widget(glade, "mudviewdelconfirm");
+ label = glade_xml_get_widget(glade, "message");
+ g_object_unref(glade);
+
+ message =
+ g_strdup_printf(_("Are you sure you want to delete %s?"), name);
+ title = g_strdup_printf(_("Delete %s?"), name);
+
+ gtk_label_set_text(GTK_LABEL(label), message);
+ gtk_window_set_title(GTK_WINDOW(dialog), title);
- g_free(message);
- g_free(title);
+ g_free(message);
+ g_free(title);
- result = gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
+ result = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
- return (result == GTK_RESPONSE_YES);
+ return (result == GTK_RESPONSE_YES);
}
static void
mud_connections_show_properties(MudConnections *conn, gchar *mud)
{
- GladeXML *glade;
- GConfClient *client;
- GtkTextBuffer *buffer;
- gchar *key, *buf, *name_strip, *char_strip;
- gint port;
- gchar **mud_tuple;
-
- glade = glade_xml_new(GLADEDIR "/muds.glade", "mudviewproperties", NULL);
-
- conn->priv->properties_window = glade_xml_get_widget(glade, "mudviewproperties");
- conn->priv->name_entry = glade_xml_get_widget(glade, "name_entry");
- conn->priv->host_entry = glade_xml_get_widget(glade, "host_entry");
- conn->priv->port_entry = glade_xml_get_widget(glade, "port_entry");
- conn->priv->icon_button = glade_xml_get_widget(glade, "icon_button");
- conn->priv->icon_image = glade_xml_get_widget(glade, "icon_image");
- conn->priv->profile_combo = glade_xml_get_widget(glade, "profile_combo");
- conn->priv->character_name_entry =
- glade_xml_get_widget(glade, "character_name_entry");
- conn->priv->logon_textview =
- glade_xml_get_widget(glade, "character_logon_textview");
-
- if(conn->priv->icon_current)
- g_free(conn->priv->icon_current);
- conn->priv->icon_current = NULL;
-
- mud_connections_property_populate_profiles(conn);
- gtk_combo_box_set_model(GTK_COMBO_BOX(conn->priv->profile_combo), conn->priv->profile_model);
- conn->priv->profile_combo_renderer = gtk_cell_renderer_text_new();
- gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(conn->priv->profile_combo),
- conn->priv->profile_combo_renderer, TRUE);
- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(conn->priv->profile_combo),
- conn->priv->profile_combo_renderer, "text", 0, NULL);
-
- g_signal_connect(conn->priv->properties_window, "delete-event",
- G_CALLBACK(mud_connections_property_delete_cb), conn);
- g_signal_connect(glade_xml_get_widget(glade, "cancel_button"),
- "clicked",
- G_CALLBACK(mud_connections_property_cancel_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "save_button"),
- "clicked",
- G_CALLBACK(mud_connections_property_save_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "icon_button"),
- "clicked",
- G_CALLBACK(mud_connections_property_icon_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "name_entry"),
- "key-press-event",
- G_CALLBACK(mud_connections_property_changed_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "host_entry"),
- "key-press-event",
- G_CALLBACK(mud_connections_property_changed_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "port_entry"),
- "key-press-event",
- G_CALLBACK(mud_connections_property_changed_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "character_name_entry"),
- "key-press-event",
- G_CALLBACK(mud_connections_property_changed_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "character_logon_textview"),
- "key-press-event",
- G_CALLBACK(mud_connections_property_changed_cb),
- conn);
- g_signal_connect(glade_xml_get_widget(glade, "profile_combo"),
- "changed",
- G_CALLBACK(mud_connections_property_combo_changed_cb),
- conn);
-
- g_object_unref(glade);
-
- if(conn->priv->original_name != NULL)
- g_free(conn->priv->original_name);
- conn->priv->original_name = NULL;
-
- if(conn->priv->original_char_name != NULL)
- g_free(conn->priv->original_char_name);
- conn->priv->original_char_name = NULL;
+ GladeXML *glade;
+ GConfClient *client;
+ GtkTextBuffer *buffer;
+ gchar *key, *buf, *name_strip, *char_strip;
+ gint port;
+ gchar **mud_tuple;
+
+ glade =
+ glade_xml_new(GLADEDIR "/muds.glade", "mudviewproperties", NULL);
+
+ conn->priv->properties_window =
+ glade_xml_get_widget(glade, "mudviewproperties");
+ conn->priv->name_entry = glade_xml_get_widget(glade, "name_entry");
+ conn->priv->host_entry = glade_xml_get_widget(glade, "host_entry");
+ conn->priv->port_entry = glade_xml_get_widget(glade, "port_entry");
+ conn->priv->icon_button = glade_xml_get_widget(glade, "icon_button");
+ conn->priv->icon_image = glade_xml_get_widget(glade, "icon_image");
+ conn->priv->profile_combo =
+ glade_xml_get_widget(glade, "profile_combo");
+ conn->priv->character_name_entry =
+ glade_xml_get_widget(glade, "character_name_entry");
+ conn->priv->logon_textview =
+ glade_xml_get_widget(glade, "character_logon_textview");
+
+ if(conn->priv->icon_current)
+ g_free(conn->priv->icon_current);
+ conn->priv->icon_current = NULL;
+
+ mud_connections_property_populate_profiles(conn);
+ gtk_combo_box_set_model(
+ GTK_COMBO_BOX(conn->priv->profile_combo),
+ conn->priv->profile_model);
+ conn->priv->profile_combo_renderer = gtk_cell_renderer_text_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(conn->priv->profile_combo),
+ conn->priv->profile_combo_renderer, TRUE);
+ gtk_cell_layout_set_attributes(
+ GTK_CELL_LAYOUT(conn->priv->profile_combo),
+ conn->priv->profile_combo_renderer, "text", 0, NULL);
+
+ g_signal_connect(conn->priv->properties_window, "delete-event",
+ G_CALLBACK(mud_connections_property_delete_cb), conn);
+ g_signal_connect(glade_xml_get_widget(glade, "cancel_button"),
+ "clicked",
+ G_CALLBACK(mud_connections_property_cancel_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "save_button"),
+ "clicked",
+ G_CALLBACK(mud_connections_property_save_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "icon_button"),
+ "clicked",
+ G_CALLBACK(mud_connections_property_icon_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "name_entry"),
+ "key-press-event",
+ G_CALLBACK(mud_connections_property_changed_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "host_entry"),
+ "key-press-event",
+ G_CALLBACK(mud_connections_property_changed_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "port_entry"),
+ "key-press-event",
+ G_CALLBACK(mud_connections_property_changed_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "character_name_entry"),
+ "key-press-event",
+ G_CALLBACK(mud_connections_property_changed_cb),
+ conn);
+ g_signal_connect(
+ glade_xml_get_widget(glade, "character_logon_textview"),
+ "key-press-event",
+ G_CALLBACK(mud_connections_property_changed_cb),
+ conn);
+ g_signal_connect(glade_xml_get_widget(glade, "profile_combo"),
+ "changed",
+ G_CALLBACK(mud_connections_property_combo_changed_cb),
+ conn);
+
+ g_object_unref(glade);
+
+ if(conn->priv->original_name != NULL)
+ g_free(conn->priv->original_name);
+ conn->priv->original_name = NULL;
+
+ if(conn->priv->original_char_name != NULL)
+ g_free(conn->priv->original_char_name);
+ conn->priv->original_char_name = NULL;
- if(mud != NULL)
- {
- gint len;
- mud_tuple = g_strsplit(mud, "\n", -1);
- g_free(mud);
- len = g_strv_length(mud_tuple);
-
- switch(len)
- {
- case 1:
- conn->priv->original_name = g_strdup(mud_tuple[0]);
- break;
-
- case 2:
- conn->priv->original_char_name = g_strdup(mud_tuple[0]);
- conn->priv->original_name = g_strdup(mud_tuple[1]);
- break;
- }
-
- g_strfreev(mud_tuple);
- } else
- return;
-
- name_strip = remove_whitespace(conn->priv->original_name);
-
- gtk_entry_set_text(GTK_ENTRY(conn->priv->name_entry), conn->priv->original_name);
-
- if(conn->priv->original_char_name)
- gtk_entry_set_text(GTK_ENTRY(conn->priv->character_name_entry),
- conn->priv->original_char_name);
-
- client = gconf_client_get_default();
-
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/host", name_strip);
- buf = gconf_client_get_string(client, key, NULL);
- g_free(key);
+ if(mud != NULL)
+ {
+ gint len;
+ mud_tuple = g_strsplit(mud, "\n", -1);
+ g_free(mud);
+ len = g_strv_length(mud_tuple);
- if(buf)
+ switch(len)
{
- gtk_entry_set_text(GTK_ENTRY(conn->priv->host_entry), buf);
- g_free(buf);
+ case 1:
+ conn->priv->original_name = g_strdup(mud_tuple[0]);
+ break;
+
+ case 2:
+ conn->priv->original_char_name = g_strdup(mud_tuple[0]);
+ conn->priv->original_name = g_strdup(mud_tuple[1]);
+ break;
}
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/port", name_strip);
- port = gconf_client_get_int(client, key, NULL);
- g_free(key);
+ g_strfreev(mud_tuple);
+ } else
+ return;
- if(port != 0)
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(conn->priv->port_entry), port);
+ name_strip = remove_whitespace(conn->priv->original_name);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/profile", name_strip);
- buf = gconf_client_get_string(client, key, NULL);
- g_free(key);
+ gtk_entry_set_text(
+ GTK_ENTRY(conn->priv->name_entry), conn->priv->original_name);
- if(buf)
- {
- mud_connections_property_combo_get_index(conn, buf);
- g_free(buf);
- }
+ if(conn->priv->original_char_name)
+ gtk_entry_set_text(GTK_ENTRY(conn->priv->character_name_entry),
+ conn->priv->original_char_name);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/icon", name_strip);
- buf = gconf_client_get_string(client, key, NULL);
- g_free(key);
+ client = gconf_client_get_default();
- if(buf && strcmp(buf, "gnome-mud") != 0)
- {
- GdkPixbuf *icon;
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/host", name_strip);
+ buf = gconf_client_get_string(client, key, NULL);
+ g_free(key);
- conn->priv->icon_current = g_strdup(buf);
- g_free(buf);
+ if(buf)
+ {
+ gtk_entry_set_text(GTK_ENTRY(conn->priv->host_entry), buf);
+ g_free(buf);
+ }
- icon = gdk_pixbuf_new_from_file_at_size(
- conn->priv->icon_current, 48, 48, NULL);
- gtk_image_set_from_pixbuf(GTK_IMAGE(conn->priv->icon_image),
- icon);
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/port", name_strip);
+ port = gconf_client_get_int(client, key, NULL);
+ g_free(key);
+
+ if(port != 0)
+ gtk_spin_button_set_value(
+ GTK_SPIN_BUTTON(conn->priv->port_entry), port);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/profile", name_strip);
+ buf = gconf_client_get_string(client, key, NULL);
+ g_free(key);
+
+ if(buf)
+ {
+ mud_connections_property_combo_get_index(conn, buf);
+ g_free(buf);
+ }
- g_object_unref(icon);
- }
- else
- conn->priv->icon_current = g_strdup("gnome-mud");
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/icon", name_strip);
+ buf = gconf_client_get_string(client, key, NULL);
+ g_free(key);
- if(conn->priv->original_char_name != NULL)
- {
- char_strip = remove_whitespace(conn->priv->original_char_name);
+ if(buf && strcmp(buf, "gnome-mud") != 0)
+ {
+ GdkPixbuf *icon;
+
+ conn->priv->icon_current = g_strdup(buf);
+ g_free(buf);
+
+ icon = gdk_pixbuf_new_from_file_at_size(
+ conn->priv->icon_current, 48, 48, NULL);
+ gtk_image_set_from_pixbuf(GTK_IMAGE(conn->priv->icon_image),
+ icon);
+
+ g_object_unref(icon);
+ }
+ else
+ conn->priv->icon_current = g_strdup("gnome-mud");
+
+ if(conn->priv->original_char_name != NULL)
+ {
+ char_strip = remove_whitespace(conn->priv->original_char_name);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/logon",
- name_strip, char_strip);
- buf = gconf_client_get_string(client, key, NULL);
- g_free(key);
-
- if(buf)
- {
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(conn->priv->logon_textview));
- gtk_text_buffer_set_text(buffer, buf, strlen(buf));
- g_free(buf);
- }
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/logon",
+ name_strip, char_strip);
+ buf = gconf_client_get_string(client, key, NULL);
+ g_free(key);
- g_free(char_strip);
+ if(buf)
+ {
+ buffer =
+ gtk_text_view_get_buffer(
+ GTK_TEXT_VIEW(conn->priv->logon_textview));
+ gtk_text_buffer_set_text(buffer, buf, strlen(buf));
+ g_free(buf);
}
- g_free(name_strip);
+ g_free(char_strip);
+ }
+
+ g_free(name_strip);
- g_object_unref(client);
+ g_object_unref(client);
- conn->priv->changed = FALSE;
+ conn->priv->changed = FALSE;
}
static void
mud_connections_property_cancel_cb(GtkWidget *widget, MudConnections *conn)
{
- gtk_widget_destroy(conn->priv->properties_window);
+ gtk_widget_destroy(conn->priv->properties_window);
}
static void
mud_connections_property_save_cb(GtkWidget *widget, MudConnections *conn)
{
- if(mud_connections_property_save(conn))
- gtk_widget_destroy(conn->priv->properties_window);
+ if(mud_connections_property_save(conn))
+ gtk_widget_destroy(conn->priv->properties_window);
}
static void
mud_connections_property_icon_cb(GtkWidget *widget, MudConnections *conn)
{
- mud_connections_show_icon_dialog(conn);
+ mud_connections_show_icon_dialog(conn);
}
static gboolean
-mud_connections_property_changed_cb(GtkWidget *widget, GdkEventKey *event, MudConnections *conn)
+mud_connections_property_changed_cb(GtkWidget *widget,
+ GdkEventKey *event,
+ MudConnections *conn)
{
- conn->priv->changed = TRUE;
+ conn->priv->changed = TRUE;
- return FALSE;
+ return FALSE;
}
static void
-mud_connections_property_combo_changed_cb(GtkWidget *widget, MudConnections *conn)
+mud_connections_property_combo_changed_cb(GtkWidget *widget,
+ MudConnections *conn)
{
- conn->priv->changed = TRUE;
+ conn->priv->changed = TRUE;
}
static gboolean
-mud_connections_property_delete_cb(GtkWidget *widget, GdkEvent *event, MudConnections *conn)
+mud_connections_property_delete_cb(GtkWidget *widget,
+ GdkEvent *event,
+ MudConnections *conn)
{
- if(conn->priv->changed)
- switch(mud_connections_property_confirm())
- {
- case -1:
- return FALSE;
- break;
- case 1:
- if(mud_connections_property_save(conn))
- {
- return FALSE;
- }
- else
- return TRUE;
- break;
-
- case 0:
- return TRUE;
- break;
- }
+ if(conn->priv->changed)
+ switch(mud_connections_property_confirm())
+ {
+ case -1:
+ return FALSE;
+ break;
+ case 1:
+ if(mud_connections_property_save(conn))
+ {
+ return FALSE;
+ }
+ else
+ return TRUE;
+ break;
- return FALSE;
+ case 0:
+ return TRUE;
+ break;
+ }
+
+ return FALSE;
}
static gint
mud_connections_property_confirm(void)
{
- GladeXML *glade;
- GtkWidget *dialog;
- gint result;
-
- glade = glade_xml_new(GLADEDIR "/muds.glade", "mudviewconfirm", NULL);
- dialog = glade_xml_get_widget(glade, "mudviewconfirm");
- g_object_unref(glade);
-
- result = gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
-
- switch(result)
- {
- case GTK_RESPONSE_OK:
- return 1;
- break;
-
- case GTK_RESPONSE_CLOSE:
- return -1;
- break;
-
- default:
- return 0;
- break;
- }
+ GladeXML *glade;
+ GtkWidget *dialog;
+ gint result;
+
+ glade = glade_xml_new(GLADEDIR "/muds.glade", "mudviewconfirm", NULL);
+ dialog = glade_xml_get_widget(glade, "mudviewconfirm");
+ g_object_unref(glade);
+
+ result = gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+
+ switch(result)
+ {
+ case GTK_RESPONSE_OK:
+ return 1;
+ break;
+
+ case GTK_RESPONSE_CLOSE:
+ return -1;
+ break;
+
+ default:
+ return 0;
+ break;
+ }
}
static gboolean
mud_connections_property_save(MudConnections *conn)
{
- GConfClient *client;
- const gchar *name = gtk_entry_get_text(GTK_ENTRY(conn->priv->name_entry));
- const gchar *host = gtk_entry_get_text(GTK_ENTRY(conn->priv->host_entry));
- const gchar *character_name = gtk_entry_get_text(GTK_ENTRY(conn->priv->character_name_entry));
- gchar *logon, *profile, *key, *buf, *char_name, *stripped_name, *strip_name_new;
- GtkTextIter start, end;
- GtkTextBuffer *buffer;
- GtkTreeIter iter;
- GSList *chars, *entry;
-
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(conn->priv->logon_textview));
- gtk_text_buffer_get_bounds(buffer, &start, &end);
- logon = gtk_text_iter_get_text(&start, &end);
-
- if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(conn->priv->profile_combo), &iter))
- gtk_tree_model_get(GTK_TREE_MODEL(conn->priv->profile_model), &iter, 0, &profile, -1);
- else
- profile = g_strdup("Default");
-
- if(strlen(name) == 0)
- {
- utils_error_message(conn->priv->properties_window, _("Error"),
- "%s", _("No mud name specified."));
+ GConfClient *client;
+ const gchar *name =
+ gtk_entry_get_text(GTK_ENTRY(conn->priv->name_entry));
+ const gchar *host =
+ gtk_entry_get_text(GTK_ENTRY(conn->priv->host_entry));
+ const gchar *character_name
+ = gtk_entry_get_text(GTK_ENTRY(conn->priv->character_name_entry));
+ gchar *logon, *profile, *key, *buf, *char_name,
+ *stripped_name, *strip_name_new;
+ GtkTextIter start, end;
+ GtkTextBuffer *buffer;
+ GtkTreeIter iter;
+ GSList *chars, *entry;
+
+ buffer =
+ gtk_text_view_get_buffer(GTK_TEXT_VIEW(conn->priv->logon_textview));
+ gtk_text_buffer_get_bounds(buffer, &start, &end);
+ logon = gtk_text_iter_get_text(&start, &end);
+
+ if(gtk_combo_box_get_active_iter(
+ GTK_COMBO_BOX(conn->priv->profile_combo), &iter))
+ gtk_tree_model_get(
+ GTK_TREE_MODEL(conn->priv->profile_model),
+ &iter, 0, &profile, -1);
+ else
+ profile = g_strdup("Default");
+
+ if(strlen(name) == 0)
+ {
+ utils_error_message(conn->priv->properties_window, _("Error"),
+ "%s", _("No mud name specified."));
- if(logon)
- g_free(logon);
+ if(logon)
+ g_free(logon);
- return FALSE;
- }
+ return FALSE;
+ }
- client = gconf_client_get_default();
+ client = gconf_client_get_default();
+
+ /* If the user renames the mud we need to
+ * transfer over the old character information
+ * and do some cleanup */
+ if(conn->priv->original_name &&
+ strcmp(conn->priv->original_name, name) != 0)
+ {
+ stripped_name = remove_whitespace(conn->priv->original_name);
+ strip_name_new = remove_whitespace(name);
+
+ g_message("stripped_name: %s", stripped_name);
+ g_message("strip_name_new: %s", strip_name_new);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters",
+ stripped_name);
+ chars = gconf_client_all_dirs(client, key, NULL);
+ g_free(key);
- /* If the user renames the mud we need to
- * transfer over the old character information
- * and do some cleanup */
- if(conn->priv->original_name &&
- strcmp(conn->priv->original_name, name) != 0)
+ for(entry = chars; entry != NULL; entry = g_slist_next(entry))
{
- stripped_name = remove_whitespace(conn->priv->original_name);
- strip_name_new = remove_whitespace(name);
+ char_name = g_path_get_basename((gchar *)entry->data);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters", stripped_name);
- chars = gconf_client_all_dirs(client, key, NULL);
- g_free(key);
-
- for(entry = chars; entry != NULL; entry = g_slist_next(entry))
- {
- char_name = g_path_get_basename((gchar *)entry->data);
-
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/logon",
- stripped_name, char_name);
- buf = gconf_client_get_string(client, key, NULL);
- g_free(key);
-
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/logon",
- strip_name_new, char_name);
- gconf_client_set_string(client, key, buf, NULL);
- g_free(key);
-
- g_free(char_name);
- g_free(buf);
- }
-
- for(entry = chars; entry != NULL; entry = g_slist_next(entry))
- if(entry->data)
- g_free(entry->data);
- g_slist_free(chars);
-
- key = g_strdup_printf("/apps/gnome-mud/muds/%s", conn->priv->original_name);
- gconf_client_recursive_unset(client, key, 0, NULL);
- g_free(key);
+ key = g_strdup_printf(
+ "/apps/gnome-mud/muds/%s/characters/%s/logon",
+ stripped_name, char_name);
+ buf = gconf_client_get_string(client, key, NULL);
+ g_free(key);
+
+ key = g_strdup_printf(
+ "/apps/gnome-mud/muds/%s/characters/%s/logon",
+ strip_name_new, char_name);
+ gconf_client_set_string(client, key, buf, NULL);
+ g_free(key);
- g_free(stripped_name);
- g_free(strip_name_new);
+ g_free(char_name);
+ g_free(buf);
}
- stripped_name = remove_whitespace(name);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/name", stripped_name);
- gconf_client_set_string(client, key, name, NULL);
- g_free(key);
+ for(entry = chars; entry != NULL; entry = g_slist_next(entry))
+ if(entry->data)
+ g_free(entry->data);
+ g_slist_free(chars);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/host", stripped_name);
- gconf_client_set_string(client, key, host, NULL);
+ key = g_strdup_printf(
+ "/apps/gnome-mud/muds/%s", stripped_name);
+ gconf_client_recursive_unset(client, key, 0, NULL);
g_free(key);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/port", stripped_name);
- gconf_client_set_int(client, key,
- gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(conn->priv->port_entry)),
- NULL);
+ g_free(stripped_name);
+ g_free(strip_name_new);
+ }
+
+ stripped_name = remove_whitespace(name);
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/name", stripped_name);
+ gconf_client_set_string(client, key, name, NULL);
+ g_free(key);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/host", stripped_name);
+ gconf_client_set_string(client, key, host, NULL);
+ g_free(key);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/port", stripped_name);
+ gconf_client_set_int(client, key,
+ gtk_spin_button_get_value_as_int(
+ GTK_SPIN_BUTTON(conn->priv->port_entry)),
+ NULL);
+ g_free(key);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/icon", stripped_name);
+ if(conn->priv->icon_current &&
+ strcmp(conn->priv->icon_current, "gnome-mud") != 0)
+ gconf_client_set_string(
+ client, key, conn->priv->icon_current, NULL);
+ else
+ gconf_client_set_string(client, key, "gnome-mud", NULL);
+ g_free(key);
+
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/profile", stripped_name);
+ gconf_client_set_string(client, key, profile, NULL);
+ g_free(key);
+
+ if(conn->priv->original_char_name &&
+ strcmp(conn->priv->original_char_name, character_name) != 0)
+ {
+ strip_name_new = remove_whitespace(conn->priv->original_char_name);
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s",
+ stripped_name, strip_name_new);
+ gconf_client_recursive_unset(client, key, 0, NULL);
g_free(key);
+ g_free(strip_name_new);
+ }
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/icon", stripped_name);
- if(conn->priv->icon_current && strcmp(conn->priv->icon_current, "gnome-mud") != 0)
- gconf_client_set_string(client, key, conn->priv->icon_current, NULL);
- else
- gconf_client_set_string(client, key, "gnome-mud", NULL);
- g_free(key);
+ strip_name_new = remove_whitespace(character_name);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/profile", stripped_name);
- gconf_client_set_string(client, key, profile, NULL);
+ if(strlen(strip_name_new) > 0)
+ {
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/logon",
+ stripped_name, strip_name_new);
+ gconf_client_set_string(client, key, logon, NULL);
g_free(key);
- if(conn->priv->original_char_name &&
- strcmp(conn->priv->original_char_name, character_name) != 0)
- {
- strip_name_new = remove_whitespace(conn->priv->original_char_name);
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s",
- stripped_name, strip_name_new);
- gconf_client_recursive_unset(client, key, 0, NULL);
- g_free(key);
- g_free(strip_name_new);
- }
-
- strip_name_new = remove_whitespace(character_name);
-
- if(strlen(strip_name_new) > 0)
- {
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/logon",
- stripped_name, strip_name_new);
- gconf_client_set_string(client, key, logon, NULL);
- g_free(key);
-
- key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/name",
- stripped_name, strip_name_new);
- gconf_client_set_string(client, key, character_name, NULL);
- g_free(key);
- }
+ key = g_strdup_printf("/apps/gnome-mud/muds/%s/characters/%s/name",
+ stripped_name, strip_name_new);
+ gconf_client_set_string(client, key, character_name, NULL);
+ g_free(key);
+ }
- g_object_unref(client);
+ g_object_unref(client);
- if(logon)
- g_free(logon);
+ if(logon)
+ g_free(logon);
- if(profile)
- g_free(profile);
+ if(profile)
+ g_free(profile);
- return TRUE;
+ return TRUE;
}
static void
mud_connections_property_populate_profiles(MudConnections *conn)
{
- GSList *profiles, *entry;
- GConfClient *client = gconf_client_get_default();
- GError *error = NULL;
- gchar *keyname = g_strdup("/apps/gnome-mud/profiles/list");
- GtkTreeIter iter;
-
- profiles = gconf_client_get_list(client, keyname,
- GCONF_VALUE_STRING, &error);
-
- conn->priv->profile_model = GTK_TREE_MODEL(gtk_list_store_new(1, G_TYPE_STRING));
+ GSList *profiles, *entry;
+ GConfClient *client = gconf_client_get_default();
+ GError *error = NULL;
+ gchar *keyname = g_strdup("/apps/gnome-mud/profiles/list");
+ GtkTreeIter iter;
+
+ profiles = gconf_client_get_list(client, keyname,
+ GCONF_VALUE_STRING, &error);
+
+ conn->priv->profile_model =
+ GTK_TREE_MODEL(gtk_list_store_new(1, G_TYPE_STRING));
+
+ for(entry = profiles; entry != NULL; entry = g_slist_next(entry))
+ {
+ gtk_list_store_append(
+ GTK_LIST_STORE(conn->priv->profile_model), &iter);
+ gtk_list_store_set(GTK_LIST_STORE(conn->priv->profile_model), &iter,
+ 0, (gchar *)entry->data, -1);
+ }
- for(entry = profiles; entry != NULL; entry = g_slist_next(entry))
- {
- gtk_list_store_append(GTK_LIST_STORE(conn->priv->profile_model), &iter);
- gtk_list_store_set(GTK_LIST_STORE(conn->priv->profile_model), &iter,
- 0, (gchar *)entry->data, -1);
- }
-
- g_free(keyname);
- g_object_unref(client);
+ g_free(keyname);
+ g_object_unref(client);
}
static void
-mud_connections_property_combo_get_index(MudConnections *conn, gchar *profile)
+mud_connections_property_combo_get_index(MudConnections *conn,
+ gchar *profile)
{
- gchar *buf;
- GtkTreeIter iter;
+ gchar *buf;
+ GtkTreeIter iter;
- gtk_tree_model_get_iter_first(conn->priv->profile_model, &iter);
+ gtk_tree_model_get_iter_first(conn->priv->profile_model, &iter);
- do
- {
- gtk_tree_model_get(conn->priv->profile_model, &iter, 0, &buf, -1);
+ do
+ {
+ gtk_tree_model_get(conn->priv->profile_model, &iter, 0, &buf, -1);
- if(strcmp(buf, profile) == 0)
- {
- gtk_combo_box_set_active_iter(
- GTK_COMBO_BOX(conn->priv->profile_combo),
- &iter);
- g_free(buf);
- return;
- }
-
- g_free(buf);
+ if(strcmp(buf, profile) == 0)
+ {
+ gtk_combo_box_set_active_iter(
+ GTK_COMBO_BOX(conn->priv->profile_combo),
+ &iter);
+ g_free(buf);
+ return;
}
- while(gtk_tree_model_iter_next(conn->priv->profile_model, &iter));
+
+ g_free(buf);
+ }
+ while(gtk_tree_model_iter_next(conn->priv->profile_model, &iter));
}
// Iconview Dialog
static void
mud_connections_show_icon_dialog(MudConnections *conn)
{
- GladeXML *glade;
- gint result;
+ GladeXML *glade;
+ gint result;
- glade = glade_xml_new(GLADEDIR "/muds.glade", "iconselect", NULL);
- conn->priv->icon_dialog = glade_xml_get_widget(glade, "iconselect");
- conn->priv->icon_dialog_view = glade_xml_get_widget(glade, "view");
- conn->priv->icon_dialog_chooser = glade_xml_get_widget(glade, "chooser");
- g_object_unref(glade);
-
- conn->priv->icon_dialog_view_model = GTK_TREE_MODEL(gtk_list_store_new(MODEL_COLUMN_N,
- G_TYPE_STRING,
- GDK_TYPE_PIXBUF));
-
- gtk_icon_view_set_model(GTK_ICON_VIEW(conn->priv->icon_dialog_view),
- conn->priv->icon_dialog_view_model);
- gtk_icon_view_set_text_column(GTK_ICON_VIEW(conn->priv->icon_dialog_view),
- MODEL_COLUMN_STRING);
- gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(conn->priv->icon_dialog_view),
- MODEL_COLUMN_PIXBUF);
+ glade = glade_xml_new(GLADEDIR "/muds.glade", "iconselect", NULL);
+ conn->priv->icon_dialog = glade_xml_get_widget(glade, "iconselect");
+ conn->priv->icon_dialog_view = glade_xml_get_widget(glade, "view");
+ conn->priv->icon_dialog_chooser =
+ glade_xml_get_widget(glade, "chooser");
+ g_object_unref(glade);
+
+ conn->priv->icon_dialog_view_model =
+ GTK_TREE_MODEL(gtk_list_store_new(MODEL_COLUMN_N,
+ G_TYPE_STRING,
+ GDK_TYPE_PIXBUF));
+
+ gtk_icon_view_set_model(GTK_ICON_VIEW(conn->priv->icon_dialog_view),
+ conn->priv->icon_dialog_view_model);
+ gtk_icon_view_set_text_column(
+ GTK_ICON_VIEW(conn->priv->icon_dialog_view),
+ MODEL_COLUMN_STRING);
+ gtk_icon_view_set_pixbuf_column(
+ GTK_ICON_VIEW(conn->priv->icon_dialog_view),
+ MODEL_COLUMN_PIXBUF);
+
+ if(conn->priv->icon_current == NULL)
+ g_free(conn->priv->icon_current);
+ conn->priv->icon_current = NULL;
+
+ g_signal_connect(
+ conn->priv->icon_dialog_chooser, "current-folder-changed",
+ G_CALLBACK(mud_connections_icon_fileset_cb),
+ conn);
+ g_signal_connect(conn->priv->icon_dialog_view, "selection-changed",
+ G_CALLBACK(mud_connections_icon_select_cb),
+ conn);
+
+ g_object_set(conn->priv->icon_dialog_view, "item-width", 64, NULL);
+ gtk_file_chooser_set_current_folder(
+ GTK_FILE_CHOOSER(conn->priv->icon_dialog_chooser),
+ "/usr/share/icons");
- if(conn->priv->icon_current == NULL)
- g_free(conn->priv->icon_current);
- conn->priv->icon_current = NULL;
+ result = gtk_dialog_run(GTK_DIALOG(conn->priv->icon_dialog));
+ gtk_widget_destroy(conn->priv->icon_dialog);
- g_signal_connect(conn->priv->icon_dialog_chooser, "current-folder-changed",
- G_CALLBACK(mud_connections_icon_fileset_cb),
- conn);
- g_signal_connect(conn->priv->icon_dialog_view, "selection-changed",
- G_CALLBACK(mud_connections_icon_select_cb),
- conn);
-
- g_object_set(conn->priv->icon_dialog_view, "item-width", 64, NULL);
- gtk_file_chooser_set_current_folder(
- GTK_FILE_CHOOSER(conn->priv->icon_dialog_chooser),
- "/usr/share/icons");
-
- result = gtk_dialog_run(GTK_DIALOG(conn->priv->icon_dialog));
- gtk_widget_destroy(conn->priv->icon_dialog);
-
- if(result == GTK_RESPONSE_OK)
- {
- if(conn->priv->icon_current == NULL)
- return;
+ if(result == GTK_RESPONSE_OK)
+ {
+ if(conn->priv->icon_current == NULL)
+ return;
- GdkPixbuf *icon = gdk_pixbuf_new_from_file_at_size(
- conn->priv->icon_current, 48, 48, NULL);
- gtk_image_set_from_pixbuf(GTK_IMAGE(conn->priv->icon_image),
- icon);
- g_object_unref(icon);
- }
+ GdkPixbuf *icon = gdk_pixbuf_new_from_file_at_size(
+ conn->priv->icon_current, 48, 48, NULL);
+ gtk_image_set_from_pixbuf(GTK_IMAGE(conn->priv->icon_image),
+ icon);
+ g_object_unref(icon);
+ }
}
void
-mud_connections_icon_fileset_cb(GtkFileChooserButton *chooser, MudConnections *conn)
+mud_connections_icon_fileset_cb(GtkFileChooserButton *chooser,
+ MudConnections *conn)
{
- const gchar *file;
- gchar *current_folder =
- gtk_file_chooser_get_current_folder(
- GTK_FILE_CHOOSER(conn->priv->icon_dialog_chooser));
- GDir *dir = g_dir_open(current_folder ,0, NULL);
- GPatternSpec *xpm_pattern = g_pattern_spec_new("*.xpm");
- GPatternSpec *svg_pattern = g_pattern_spec_new("*.svg");
- GPatternSpec *bmp_pattern = g_pattern_spec_new("*.bmp");
- GPatternSpec *png_pattern = g_pattern_spec_new("*.png");
-
- gtk_list_store_clear(GTK_LIST_STORE(conn->priv->icon_dialog_view_model));
-
- while( (file = g_dir_read_name(dir) ) != NULL)
- if( g_pattern_match_string(xpm_pattern, file) ||
- g_pattern_match_string(svg_pattern, file) ||
- g_pattern_match_string(bmp_pattern, file) ||
- g_pattern_match_string(png_pattern, file))
- {
- gchar *full_path = g_strconcat(current_folder,
- G_DIR_SEPARATOR_S,
- file, NULL);
- GdkPixbuf *icon = gdk_pixbuf_new_from_file_at_size(
- full_path, 48, 48, NULL);
- GtkTreeIter iter;
-
- gtk_list_store_append(GTK_LIST_STORE(
- conn->priv->icon_dialog_view_model),
- &iter);
- gtk_list_store_set(GTK_LIST_STORE(conn->priv->icon_dialog_view_model),
- &iter,
- MODEL_COLUMN_STRING, file,
- MODEL_COLUMN_PIXBUF, icon,
- -1);
+ const gchar *file;
+ gchar *current_folder =
+ gtk_file_chooser_get_current_folder(
+ GTK_FILE_CHOOSER(conn->priv->icon_dialog_chooser));
+ GDir *dir = g_dir_open(current_folder ,0, NULL);
+ GPatternSpec *xpm_pattern = g_pattern_spec_new("*.xpm");
+ GPatternSpec *svg_pattern = g_pattern_spec_new("*.svg");
+ GPatternSpec *bmp_pattern = g_pattern_spec_new("*.bmp");
+ GPatternSpec *png_pattern = g_pattern_spec_new("*.png");
+
+ gtk_list_store_clear(
+ GTK_LIST_STORE(conn->priv->icon_dialog_view_model));
+
+ while( (file = g_dir_read_name(dir) ) != NULL)
+ if( g_pattern_match_string(xpm_pattern, file) ||
+ g_pattern_match_string(svg_pattern, file) ||
+ g_pattern_match_string(bmp_pattern, file) ||
+ g_pattern_match_string(png_pattern, file))
+ {
+ gchar *full_path = g_strconcat(current_folder,
+ G_DIR_SEPARATOR_S,
+ file, NULL);
+ GdkPixbuf *icon = gdk_pixbuf_new_from_file_at_size(
+ full_path, 48, 48, NULL);
+ GtkTreeIter iter;
+
+ gtk_list_store_append(
+ GTK_LIST_STORE(conn->priv->icon_dialog_view_model),
+ &iter);
+ gtk_list_store_set(
+ GTK_LIST_STORE(conn->priv->icon_dialog_view_model),
+ &iter,
+ MODEL_COLUMN_STRING, file,
+ MODEL_COLUMN_PIXBUF, icon,
+ -1);
- g_object_unref(icon);
- g_free(full_path);
- }
-
- g_free(current_folder);
- g_dir_close(dir);
- g_pattern_spec_free(xpm_pattern);
- g_pattern_spec_free(svg_pattern);
- g_pattern_spec_free(bmp_pattern);
- g_pattern_spec_free(png_pattern);
+ g_object_unref(icon);
+ g_free(full_path);
+ }
+
+ g_free(current_folder);
+ g_dir_close(dir);
+ g_pattern_spec_free(xpm_pattern);
+ g_pattern_spec_free(svg_pattern);
+ g_pattern_spec_free(bmp_pattern);
+ g_pattern_spec_free(png_pattern);
}
static void
mud_connections_icon_select_cb(GtkIconView *view, MudConnections *conn)
{
- GList *selected =
- gtk_icon_view_get_selected_items(GTK_ICON_VIEW(conn->priv->icon_dialog_view));
- GtkTreeIter iter;
- gchar *buf;
-
- if(g_list_length(selected) == 0)
- return;
-
- gtk_tree_model_get_iter(conn->priv->icon_dialog_view_model, &iter, (GtkTreePath *)selected->data);
- gtk_tree_model_get(conn->priv->icon_dialog_view_model, &iter, 0, &buf, -1);
-
-
- if(conn->priv->icon_current != NULL)
- g_free(conn->priv->icon_current);
-
- conn->priv->icon_current = g_strconcat(
- gtk_file_chooser_get_current_folder(
- GTK_FILE_CHOOSER(conn->priv->icon_dialog_chooser)),
- G_DIR_SEPARATOR_S,
- buf, NULL);
+ GList *selected =
+ gtk_icon_view_get_selected_items(
+ GTK_ICON_VIEW(conn->priv->icon_dialog_view));
+ GtkTreeIter iter;
+ gchar *buf;
+
+ if(g_list_length(selected) == 0)
+ return;
+
+ gtk_tree_model_get_iter(conn->priv->icon_dialog_view_model,
+ &iter, (GtkTreePath *)selected->data);
+ gtk_tree_model_get(conn->priv->icon_dialog_view_model,
+ &iter, 0, &buf, -1);
+
+ if(conn->priv->icon_current != NULL)
+ g_free(conn->priv->icon_current);
+
+ conn->priv->icon_current = g_strconcat(
+ gtk_file_chooser_get_current_folder(
+ GTK_FILE_CHOOSER(conn->priv->icon_dialog_chooser)),
+ G_DIR_SEPARATOR_S,
+ buf, NULL);
- g_free(buf);
+ g_free(buf);
- // Safe only because the iconview is in single select mode.
- /*g_free(selected->data);
- g_list_free(selected);*/
+ g_list_foreach(selected, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free(selected);
}
// Instantiate MudConnections
MudConnections*
mud_connections_new(MudWindow *window, GtkWidget *winwidget, MudTray *tray)
{
- MudConnections *conn;
+ MudConnections *conn;
- conn = g_object_new(MUD_TYPE_CONNECTIONS, NULL);
+ conn = g_object_new(MUD_TYPE_CONNECTIONS, NULL);
- conn->priv->parent = window;
- conn->priv->winwidget = winwidget;
- conn->priv->tray = tray;
+ conn->priv->parent = window;
+ conn->priv->winwidget = winwidget;
+ conn->priv->tray = tray;
- return conn;
+ return conn;
}
Modified: trunk/src/mud-regex.c
==============================================================================
--- trunk/src/mud-regex.c (original)
+++ trunk/src/mud-regex.c Thu Feb 5 19:19:17 2009
@@ -25,13 +25,14 @@
#include <glib/gi18n.h>
#include <string.h>
#include <glib.h>
+#include <stdio.h>
#include "mud-regex.h"
struct _MudRegexPrivate
{
- const gchar **substring_list;
- gint substring_count;
+ const gchar **substring_list;
+ gint substring_count;
};
GType mud_regex_get_type (void);
@@ -43,143 +44,157 @@
GType
mud_regex_get_type (void)
{
- static GType object_type = 0;
+ static GType object_type = 0;
- g_type_init();
+ g_type_init();
- if (!object_type)
- {
- static const GTypeInfo object_info =
- {
- sizeof (MudRegexClass),
- NULL,
- NULL,
- (GClassInitFunc) mud_regex_class_init,
- NULL,
- NULL,
- sizeof (MudRegex),
- 0,
- (GInstanceInitFunc) mud_regex_init,
- };
+ if (!object_type)
+ {
+ static const GTypeInfo object_info =
+ {
+ sizeof (MudRegexClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) mud_regex_class_init,
+ NULL,
+ NULL,
+ sizeof (MudRegex),
+ 0,
+ (GInstanceInitFunc) mud_regex_init,
+ };
+
+ object_type =
+ g_type_register_static(
+ G_TYPE_OBJECT, "MudRegex", &object_info, 0);
+ }
- object_type = g_type_register_static(G_TYPE_OBJECT, "MudRegex", &object_info, 0);
- }
-
- return object_type;
+ return object_type;
}
static void
mud_regex_init (MudRegex *regex)
{
- regex->priv = g_new0(MudRegexPrivate, 1);
+ regex->priv = g_new0(MudRegexPrivate, 1);
- regex->priv->substring_list = NULL;
- regex->priv->substring_count = 0;
+ regex->priv->substring_list = NULL;
+ regex->priv->substring_count = 0;
}
static void
mud_regex_class_init (MudRegexClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
- object_class->finalize = mud_regex_finalize;
+ object_class->finalize = mud_regex_finalize;
}
static void
mud_regex_finalize (GObject *object)
{
- MudRegex *regex;
- GObjectClass *parent_class;
+ MudRegex *regex;
+ GObjectClass *parent_class;
- regex = MUD_REGEX(object);
+ regex = MUD_REGEX(object);
- g_free(regex->priv);
+ g_free(regex->priv);
- parent_class = g_type_class_peek_parent(G_OBJECT_GET_CLASS(object));
- parent_class->finalize(object);
+ parent_class = g_type_class_peek_parent(G_OBJECT_GET_CLASS(object));
+ parent_class->finalize(object);
}
// MudRegex Methods
gboolean
-mud_regex_check(const gchar *data, guint length, const gchar *rx, gint ovector[1020], MudRegex *regex)
+mud_regex_check(const gchar *data,
+ guint length,
+ const gchar *rx,
+ gint ovector[1020],
+ MudRegex *regex)
{
- pcre *re = NULL;
- const gchar *error = NULL;
- gint errorcode;
- gint erroroffset;
- gint rc;
+ pcre *re = NULL;
+ const gchar *error = NULL;
+ gint errorcode;
+ gint erroroffset;
+ gint rc;
- re = pcre_compile2(rx, 0, &errorcode, &error, &erroroffset, NULL);
+ re = pcre_compile2(rx, 0, &errorcode, &error, &erroroffset, NULL);
- if(!re)
- {
- gint i;
+ if(!re)
+ {
+ gint i;
- /* This should never be called since we check the regex validity
- at entry time. But You Never Know(tm) so its here to catch
- any runtime errors that cosmic rays, evil magic, errant gconf
- editing, and Monday mornings might produce. */
+ /*
+ This should never be called since we check the regex validity
+ at entry time. But You Never Know(tm) so its here to catch
+ any runtime errors that cosmic rays, evil magic, errant gconf
+ editing, and Monday mornings might produce.
+ */
- g_warning("Error in Regex! - ErrCode: %d - %s", errorcode, error);
- g_printf("--> %s\n ", rx);
+ g_warning("Error in Regex! - ErrCode: %d - %s", errorcode, error);
+ printf("--> %s\n ", rx);
- for(i = 0; i < erroroffset - 1; i++)
- g_printf(" ");
+ for(i = 0; i < erroroffset - 1; i++)
+ printf(" ");
- g_printf("^\n");
+ printf("^\n");
- return FALSE;
+ return FALSE;
- }
+ }
- rc = pcre_exec(re, NULL, data, length, 0, 0, ovector, 1020);
+ rc = pcre_exec(re, NULL, data, length, 0, 0, ovector, 1020);
- if(rc < 0)
- return FALSE;
+ if(rc < 0)
+ return FALSE;
- if(regex->priv->substring_list)
- pcre_free_substring_list(regex->priv->substring_list);
+ if(regex->priv->substring_list)
+ pcre_free_substring_list(regex->priv->substring_list);
- pcre_get_substring_list(data, ovector, rc, ®ex->priv->substring_list);
- regex->priv->substring_count = rc;
+ pcre_get_substring_list(data, ovector, rc, ®ex->priv->substring_list);
+ regex->priv->substring_count = rc;
- return TRUE;
+ return TRUE;
}
const gchar **
-mud_regex_test(const gchar *data, guint length, const gchar *rx, gint *rc, const gchar **error, gint *errorcode, gint *erroroffset)
+mud_regex_test(const gchar *data,
+ guint length,
+ const gchar *rx,
+ gint *rc,
+ const gchar **error,
+ gint *errorcode,
+ gint *erroroffset)
{
- pcre *re = NULL;
- gint ovector[1020];
- const gchar **sub_list;
+ pcre *re = NULL;
+ gint ovector[1020];
+ const gchar **sub_list;
- if(!data)
- return NULL;
+ if(!data)
+ return NULL;
- re = pcre_compile2(rx, 0, errorcode, error, erroroffset, NULL);
+ re = pcre_compile2(rx, 0, errorcode, error, erroroffset, NULL);
- if(!re)
- return NULL;
+ if(!re)
+ return NULL;
- *rc = pcre_exec(re, NULL, data, length, 0, 0, ovector, 1020);
+ *rc = pcre_exec(re, NULL, data, length, 0, 0, ovector, 1020);
- pcre_get_substring_list(data, ovector, *rc, &sub_list);
+ pcre_get_substring_list(data, ovector, *rc, &sub_list);
- return sub_list;
+ return sub_list;
}
void
mud_regex_substring_clear(const gchar **substring_list)
{
- pcre_free_substring_list(substring_list);
+ pcre_free_substring_list(substring_list);
}
const gchar **
mud_regex_get_substring_list(gint *count, MudRegex *regex)
{
- *count = regex->priv->substring_count;
- return regex->priv->substring_list;
+ *count = regex->priv->substring_count;
+ return regex->priv->substring_list;
}
@@ -187,9 +202,9 @@
MudRegex*
mud_regex_new(void)
{
- MudRegex *regex;
+ MudRegex *regex;
- regex = g_object_new(MUD_TYPE_REGEX, NULL);
+ regex = g_object_new(MUD_TYPE_REGEX, NULL);
- return regex;
+ return regex;
}
Modified: trunk/src/mud-telnet-handlers.c
==============================================================================
--- trunk/src/mud-telnet-handlers.c (original)
+++ trunk/src/mud-telnet-handlers.c Thu Feb 5 19:19:17 2009
@@ -97,13 +97,15 @@
telnet->ttype_iteration++;
break;
- case 4:
- mud_telnet_send_sub_req(telnet, 9,
- (guchar)TELOPT_TTYPE,
- (guchar)TEL_TTYPE_IS,
- 'U','N','K','N','O','W','N');
- telnet->ttype_iteration = 0;
- break;
+ /* RFC 1091 says we need to repeat the last type */
+ case 4:
+ mud_telnet_send_sub_req(telnet, 9,
+ (guchar)TELOPT_TTYPE,
+ (gchar)TEL_TTYPE_IS,
+ 'U','N','K','N','O','W','N');
+ telnet->ttype_iteration = 0;
+ break;
+
}
}
Modified: trunk/src/mud-telnet-msp.c
==============================================================================
--- trunk/src/mud-telnet-msp.c (original)
+++ trunk/src/mud-telnet-msp.c Thu Feb 5 19:19:17 2009
@@ -36,190 +36,203 @@
static void mud_telnet_msp_parser_args(MudTelnet *telnet);
static void mud_telnet_msp_command_free(MudMSPCommand *command);
static gboolean mud_telnet_msp_parser_is_param_char(gchar c);
-static gboolean mud_telnet_msp_parser_switch_on_param_char(gint *state, gchar *buf, gint index, gint len);
-static void mud_telnet_msp_process_command(MudTelnet *telnet, MudMSPCommand *command);
+static gboolean mud_telnet_msp_parser_switch_on_param_char(gint *state,
+ gchar *buf,
+ gint index,
+ gint len);
+static void mud_telnet_msp_process_command(MudTelnet *telnet,
+ MudMSPCommand *command);
static void mud_telnet_msp_stop_playing(MudTelnet *telnet, MudMSPTypes type);
static void mud_telnet_msp_start_playing(MudTelnet *telnet, MudMSPTypes type);
static gboolean mud_telnet_msp_get_files(MudTelnet *telnet, MudMSPTypes type);
-static gboolean mud_telnet_msp_sound_bus_call (GstBus *bus, GstMessage *msg, gpointer data);
-static gboolean mud_telnet_msp_music_bus_call (GstBus *bus, GstMessage *msg, gpointer data);
+static gboolean mud_telnet_msp_sound_bus_call (GstBus *bus,
+ GstMessage *msg, gpointer data);
+static gboolean mud_telnet_msp_music_bus_call (GstBus *bus,
+ GstMessage *msg, gpointer data);
GString *
mud_telnet_msp_parse(MudTelnet *telnet, GString *buf, gint *len)
{
- gint count;
- GString *ret = NULL;
- gchar *temp;
+ gint count;
+ GString *ret = NULL;
+ gchar *temp;
+
+ mud_telnet_msp_parser_reset(telnet);
+
+ if(telnet->prev_buffer)
+ {
+ g_string_prepend(buf, telnet->prev_buffer->str);
+ g_string_free(telnet->prev_buffer, TRUE);
+ telnet->prev_buffer = NULL;
+ }
+
+ while(telnet->msp_parser.lex_pos_start < *len)
+ {
+ switch(telnet->msp_parser.state)
+ {
+ case MSP_STATE_TEXT:
+ if(buf->str[telnet->msp_parser.lex_pos_start] == '!')
+ telnet->msp_parser.state = MSP_STATE_POSSIBLE_COMMAND;
+ else
+ {
+ g_string_append_c(telnet->msp_parser.output,
+ buf->str[telnet->msp_parser.lex_pos_start++]);
+ }
+ break;
+
+ case MSP_STATE_POSSIBLE_COMMAND:
+ if(telnet->msp_parser.lex_pos_start + 1 == *len)
+ continue;
+ else if(buf->str[telnet->msp_parser.lex_pos_start + 1] != '!')
+ {
+ g_string_append_c(telnet->msp_parser.output,
+ buf->str[telnet->msp_parser.lex_pos_start++]);
+ telnet->msp_parser.state = MSP_STATE_TEXT;
+ continue;
+ }
+
+ telnet->msp_parser.state = MSP_STATE_COMMAND;
+ break;
+
+ case MSP_STATE_COMMAND:
+ if(telnet->msp_parser.lex_pos_start + 8 >= *len)
+ {
+ telnet->prev_buffer = g_string_new(NULL);
+
+ count = telnet->msp_parser.lex_pos_start;
+
+ while(count != buf->len)
+ g_string_append_c(telnet->prev_buffer, buf->str[count++]);
+
+ telnet->msp_parser.lex_pos_start += count;
+ continue;
+ }
+
+ if(buf->str[telnet->msp_parser.lex_pos_start + 2] == 'S' &&
+ buf->str[telnet->msp_parser.lex_pos_start + 3] == 'O' &&
+ buf->str[telnet->msp_parser.lex_pos_start + 4] == 'U' &&
+ buf->str[telnet->msp_parser.lex_pos_start + 5] == 'N' &&
+ buf->str[telnet->msp_parser.lex_pos_start + 6] == 'D')
+ telnet->msp_type = MSP_TYPE_SOUND;
+ else if(buf->str[telnet->msp_parser.lex_pos_start + 2] == 'M' &&
+ buf->str[telnet->msp_parser.lex_pos_start + 3] == 'U' &&
+ buf->str[telnet->msp_parser.lex_pos_start + 4] == 'S' &&
+ buf->str[telnet->msp_parser.lex_pos_start + 5] == 'I' &&
+ buf->str[telnet->msp_parser.lex_pos_start + 6] == 'C')
+ telnet->msp_type = MSP_TYPE_MUSIC;
+ else
+ {
+ /* Not an msp command, bail out. */
+ g_string_append_c(telnet->msp_parser.output,
+ buf->str[telnet->msp_parser.lex_pos_start++]);
+ g_string_append_c(telnet->msp_parser.output,
+ buf->str[telnet->msp_parser.lex_pos_start++]);
+
+ telnet->msp_parser.state = MSP_STATE_TEXT;
+ continue;
+ }
+
+ // Skip leading (
+ telnet->msp_parser.lex_pos_start += 8;
+ telnet->msp_parser.state = MSP_STATE_GET_ARGS;
+ continue;
+ break;
+
+ case MSP_STATE_GET_ARGS:
+ telnet->msp_parser.lex_pos_end = telnet->msp_parser.lex_pos_start;
+
+ if(telnet->msp_parser.arg_buffer == NULL)
+ telnet->msp_parser.arg_buffer = g_string_new(NULL);
+ else
+ {
+ /* This stops some craziness where g_string_append_c
+ doesn't actually update the gstring. Glib bug? */
+ temp = g_strdup(telnet->msp_parser.arg_buffer->str);
+ g_string_free(telnet->msp_parser.arg_buffer, TRUE);
+ telnet->msp_parser.arg_buffer = g_string_new(temp);
+ g_free(temp);
+ }
+
+ while(telnet->msp_parser.lex_pos_end < *len &&
+ buf->str[telnet->msp_parser.lex_pos_end] != ')')
+ g_string_append_c(telnet->msp_parser.arg_buffer,
+ buf->str[telnet->msp_parser.lex_pos_end++]);
+
+ if(telnet->msp_parser.lex_pos_end >= *len &&
+ buf->str[telnet->msp_parser.lex_pos_end - 1] != ')')
+ {
+ telnet->msp_parser.lex_pos_start =
+ telnet->msp_parser.lex_pos_end;
+ continue;
+ }
+
+ telnet->msp_parser.state = MSP_STATE_PARSE_ARGS;
+
+ break;
+
+ case MSP_STATE_PARSE_ARGS:
+ mud_telnet_msp_parser_args(telnet);
+
+ g_string_free(telnet->msp_parser.arg_buffer, TRUE);
+ telnet->msp_parser.arg_buffer = NULL;
+ telnet->msp_parser.lex_pos_start =
+ telnet->msp_parser.lex_pos_end + 2;
+ telnet->msp_parser.state = MSP_STATE_TEXT;
+ break;
+ }
+ }
+
+ if(telnet->msp_parser.state == MSP_STATE_TEXT)
+ {
+ ret = g_string_new(g_strdup(telnet->msp_parser.output->str));
+ *len = telnet->msp_parser.output->len;
+ }
- mud_telnet_msp_parser_reset(telnet);
-
- if(telnet->prev_buffer)
- {
- g_string_prepend(buf, telnet->prev_buffer->str);
- g_string_free(telnet->prev_buffer, TRUE);
- telnet->prev_buffer = NULL;
- }
-
- while(telnet->msp_parser.lex_pos_start < *len)
- {
- switch(telnet->msp_parser.state)
- {
- case MSP_STATE_TEXT:
- if(buf->str[telnet->msp_parser.lex_pos_start] == '!')
- telnet->msp_parser.state = MSP_STATE_POSSIBLE_COMMAND;
- else
- {
- g_string_append_c(telnet->msp_parser.output,
- buf->str[telnet->msp_parser.lex_pos_start++]);
- }
- break;
-
- case MSP_STATE_POSSIBLE_COMMAND:
- if(telnet->msp_parser.lex_pos_start + 1 == *len)
- continue;
- else if(buf->str[telnet->msp_parser.lex_pos_start + 1] != '!')
- {
- g_string_append_c(telnet->msp_parser.output,
- buf->str[telnet->msp_parser.lex_pos_start++]);
- telnet->msp_parser.state = MSP_STATE_TEXT;
- continue;
- }
-
- telnet->msp_parser.state = MSP_STATE_COMMAND;
- break;
-
- case MSP_STATE_COMMAND:
- if(telnet->msp_parser.lex_pos_start + 8 >= *len)
- {
- telnet->prev_buffer = g_string_new(NULL);
-
- count = telnet->msp_parser.lex_pos_start;
-
- while(count != buf->len)
- g_string_append_c(telnet->prev_buffer, buf->str[count++]);
-
- telnet->msp_parser.lex_pos_start += count;
- continue;
- }
-
- if(buf->str[telnet->msp_parser.lex_pos_start + 2] == 'S' &&
- buf->str[telnet->msp_parser.lex_pos_start + 3] == 'O' &&
- buf->str[telnet->msp_parser.lex_pos_start + 4] == 'U' &&
- buf->str[telnet->msp_parser.lex_pos_start + 5] == 'N' &&
- buf->str[telnet->msp_parser.lex_pos_start + 6] == 'D')
- telnet->msp_type = MSP_TYPE_SOUND;
- else if(buf->str[telnet->msp_parser.lex_pos_start + 2] == 'M' &&
- buf->str[telnet->msp_parser.lex_pos_start + 3] == 'U' &&
- buf->str[telnet->msp_parser.lex_pos_start + 4] == 'S' &&
- buf->str[telnet->msp_parser.lex_pos_start + 5] == 'I' &&
- buf->str[telnet->msp_parser.lex_pos_start + 6] == 'C')
- telnet->msp_type = MSP_TYPE_MUSIC;
- else
- {
- /* Not an msp command, bail out. */
- g_string_append_c(telnet->msp_parser.output, buf->str[telnet->msp_parser.lex_pos_start++]);
- g_string_append_c(telnet->msp_parser.output, buf->str[telnet->msp_parser.lex_pos_start++]);
-
- telnet->msp_parser.state = MSP_STATE_TEXT;
- continue;
- }
-
- // Skip leading (
- telnet->msp_parser.lex_pos_start += 8;
- telnet->msp_parser.state = MSP_STATE_GET_ARGS;
- continue;
- break;
-
- case MSP_STATE_GET_ARGS:
- telnet->msp_parser.lex_pos_end = telnet->msp_parser.lex_pos_start;
-
- if(telnet->msp_parser.arg_buffer == NULL)
- telnet->msp_parser.arg_buffer = g_string_new(NULL);
- else
- {
- /* This stops some craziness where g_string_append_c
- doesn't actually update the gstring. Glib bug? */
- temp = g_strdup(telnet->msp_parser.arg_buffer->str);
- g_string_free(telnet->msp_parser.arg_buffer, TRUE);
- telnet->msp_parser.arg_buffer = g_string_new(temp);
- g_free(temp);
- }
-
- while(telnet->msp_parser.lex_pos_end < *len && buf->str[telnet->msp_parser.lex_pos_end] != ')')
- g_string_append_c(telnet->msp_parser.arg_buffer, buf->str[telnet->msp_parser.lex_pos_end++]);
-
- if(telnet->msp_parser.lex_pos_end >= *len && buf->str[telnet->msp_parser.lex_pos_end - 1] != ')')
- {
- telnet->msp_parser.lex_pos_start = telnet->msp_parser.lex_pos_end;
- continue;
- }
-
- telnet->msp_parser.state = MSP_STATE_PARSE_ARGS;
-
- break;
-
- case MSP_STATE_PARSE_ARGS:
- mud_telnet_msp_parser_args(telnet);
-
- g_string_free(telnet->msp_parser.arg_buffer, TRUE);
- telnet->msp_parser.arg_buffer = NULL;
- telnet->msp_parser.lex_pos_start = telnet->msp_parser.lex_pos_end + 2;
- telnet->msp_parser.state = MSP_STATE_TEXT;
- break;
- }
- }
-
- if(telnet->msp_parser.state == MSP_STATE_TEXT)
- {
- ret = g_string_new(g_strdup(telnet->msp_parser.output->str));
- *len = telnet->msp_parser.output->len;
- }
-
- return ret;
+ return ret;
}
void
mud_telnet_msp_init(MudTelnet *telnet)
{
- telnet->msp_parser.enabled = TRUE;
- telnet->msp_parser.state = MSP_STATE_TEXT;
- telnet->msp_parser.lex_pos_start = 0;
- telnet->msp_parser.lex_pos_end = 0;
- telnet->msp_parser.output = g_string_new(NULL);
- telnet->msp_parser.arg_buffer = NULL;
+ telnet->msp_parser.enabled = TRUE;
+ telnet->msp_parser.state = MSP_STATE_TEXT;
+ telnet->msp_parser.lex_pos_start = 0;
+ telnet->msp_parser.lex_pos_end = 0;
+ telnet->msp_parser.output = g_string_new(NULL);
+ telnet->msp_parser.arg_buffer = NULL;
}
void
mud_telnet_msp_parser_clear(MudTelnet *telnet)
{
- if(telnet->msp_parser.output)
- g_string_free(telnet->msp_parser.output, TRUE);
+ if(telnet->msp_parser.output)
+ g_string_free(telnet->msp_parser.output, TRUE);
- telnet->msp_parser.lex_pos_start = 0;
- telnet->msp_parser.lex_pos_end = 0;
- telnet->msp_parser.output = g_string_new(NULL);
+ telnet->msp_parser.lex_pos_start = 0;
+ telnet->msp_parser.lex_pos_end = 0;
+ telnet->msp_parser.output = g_string_new(NULL);
}
void
mud_telnet_msp_download_item_free(MudMSPDownloadItem *item)
{
- if(!item)
- return;
+ if(!item)
+ return;
- if(item->url)
- g_free(item->url);
+ if(item->url)
+ g_free(item->url);
- if(item->file)
- g_free(item->file);
+ if(item->file)
+ g_free(item->file);
- g_free(item);
+ g_free(item);
}
static void
mud_telnet_msp_parser_reset(MudTelnet *telnet)
{
- telnet->msp_parser.lex_pos_start = 0;
- telnet->msp_parser.lex_pos_end = 0;
+ telnet->msp_parser.lex_pos_start = 0;
+ telnet->msp_parser.lex_pos_end = 0;
}
#define ARG_STATE_FILE 0
@@ -233,662 +246,672 @@
static void
mud_telnet_msp_parser_args(MudTelnet *telnet)
{
- gint state = ARG_STATE_FILE;
- gint i;
- GString *buffer = g_string_new(NULL);
- gchar *args = g_strdup(telnet->msp_parser.arg_buffer->str);
- gint len = strlen(args);
- MudMSPCommand *command = g_new0(MudMSPCommand, 1);
-
- command->type = telnet->msp_type;
- command->fName = NULL;
- command->V = NULL;
- command->L = NULL;
- command->C = NULL;
- command->T = NULL;
- command->U = NULL;
- command->P = NULL;
+ gint state = ARG_STATE_FILE;
+ gint i;
+ GString *buffer = g_string_new(NULL);
+ gchar *args = g_strdup(telnet->msp_parser.arg_buffer->str);
+ gint len = strlen(args);
+ MudMSPCommand *command = g_new0(MudMSPCommand, 1);
+
+ command->type = telnet->msp_type;
+ command->fName = NULL;
+ command->V = NULL;
+ command->L = NULL;
+ command->C = NULL;
+ command->T = NULL;
+ command->U = NULL;
+ command->P = NULL;
- command->mud_name = g_strdup(telnet->mud_name);
- command->sfx_type = NULL;
+ command->mud_name = g_strdup(telnet->mud_name);
+ command->sfx_type = NULL;
/* Load defaults */
- command->volume = 100;
- command->priority = 50;
- command->initial_repeat_count = 1;
- command->current_repeat_count = 1;
- command->loop = FALSE;
- command->cont = (telnet->msp_type == MSP_TYPE_MUSIC);
-
- for(i = 0; i < len; ++i)
- {
- if(args[i] == ' ' || args[i] == '=' || args[i] == '"')
- continue;
-
- switch(state)
- {
- case ARG_STATE_FILE:
- if(mud_telnet_msp_parser_is_param_char(args[i]) &&
- mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
- {
- command->fName = g_strdup(buffer->str);
- g_string_free(buffer, TRUE);
- buffer = g_string_new(NULL);
- }
- else
- g_string_append_c(buffer, args[i]);
- break;
-
- case ARG_STATE_V:
- if(mud_telnet_msp_parser_is_param_char(args[i]) &&
- mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
- {
- command->V = g_strdup(buffer->str);
- g_string_free(buffer, TRUE);
- buffer = g_string_new(NULL);
- }
- else
- g_string_append_c(buffer, args[i]);
- break;
-
- case ARG_STATE_L:
- if(mud_telnet_msp_parser_is_param_char(args[i]) &&
- mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
- {
- command->L = g_strdup(buffer->str);
- g_string_free(buffer, TRUE);
- buffer = g_string_new(NULL);
- }
- else
- g_string_append_c(buffer, args[i]);
- break;
-
- case ARG_STATE_C:
- if(mud_telnet_msp_parser_is_param_char(args[i]) &&
- mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
- {
- command->C = g_strdup(buffer->str);
- g_string_free(buffer, TRUE);
- buffer = g_string_new(NULL);
- }
- else
- g_string_append_c(buffer, args[i]);
- break;
-
- case ARG_STATE_T:
- if(mud_telnet_msp_parser_is_param_char(args[i]) &&
- mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
- {
- command->T = g_strdup(buffer->str);
- g_string_free(buffer, TRUE);
- buffer = g_string_new(NULL);
- }
- else
- g_string_append_c(buffer, args[i]);
- break;
-
- case ARG_STATE_U:
- if(mud_telnet_msp_parser_is_param_char(args[i]) &&
- mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
- {
- if(buffer->str[buffer->len - 1] != '/')
- g_string_append_c(buffer, '/');
-
- command->U = g_strdup(buffer->str);
- g_string_free(buffer, TRUE);
- buffer = g_string_new(NULL);
- }
- else
- g_string_append_c(buffer, args[i]);
- break;
-
- case ARG_STATE_P:
- if(mud_telnet_msp_parser_is_param_char(args[i]) &&
- mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
- {
- command->P = g_strdup(buffer->str);
- g_string_free(buffer, TRUE);
- buffer = g_string_new(NULL);
- }
- else
- g_string_append_c(buffer, args[i]);
- break;
- }
- }
+ command->volume = 100;
+ command->priority = 50;
+ command->initial_repeat_count = 1;
+ command->current_repeat_count = 1;
+ command->loop = FALSE;
+ command->cont = (telnet->msp_type == MSP_TYPE_MUSIC);
+
+ for(i = 0; i < len; ++i)
+ {
+ if(args[i] == ' ' || args[i] == '=' || args[i] == '"')
+ continue;
switch(state)
{
- case ARG_STATE_FILE:
- command->fName = g_strdup(buffer->str);
- break;
-
- case ARG_STATE_V:
- command->V = g_strdup(buffer->str);
- break;
-
- case ARG_STATE_L:
- command->L = g_strdup(buffer->str);
- break;
-
- case ARG_STATE_C:
- command->C = g_strdup(buffer->str);
- break;
-
- case ARG_STATE_T:
- command->T = g_strdup(buffer->str);
- break;
-
- case ARG_STATE_U:
- if(buffer->str[buffer->len - 1] != '/')
- g_string_append_c(buffer, '/');
-
- command->U = g_strdup(buffer->str);
- break;
-
- case ARG_STATE_P:
- command->P = g_strdup(buffer->str);
- break;
- }
-
- if(command->C)
- command->cont = atoi(command->C);
-
- if(command->T)
- command->sfx_type = g_strdup(command->T);
-
- if(command->V)
- command->volume = atoi(command->V);
-
- if(command->P)
- command->priority = atoi(command->P);
-
- if(command->L)
- {
- command->initial_repeat_count = atoi(command->L);
+ case ARG_STATE_FILE:
+ if(mud_telnet_msp_parser_is_param_char(args[i]) &&
+ mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
+ {
+ command->fName = g_strdup(buffer->str);
+ g_string_free(buffer, TRUE);
+ buffer = g_string_new(NULL);
+ }
+ else
+ g_string_append_c(buffer, args[i]);
+ break;
+
+ case ARG_STATE_V:
+ if(mud_telnet_msp_parser_is_param_char(args[i]) &&
+ mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
+ {
+ command->V = g_strdup(buffer->str);
+ g_string_free(buffer, TRUE);
+ buffer = g_string_new(NULL);
+ }
+ else
+ g_string_append_c(buffer, args[i]);
+ break;
+
+ case ARG_STATE_L:
+ if(mud_telnet_msp_parser_is_param_char(args[i]) &&
+ mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
+ {
+ command->L = g_strdup(buffer->str);
+ g_string_free(buffer, TRUE);
+ buffer = g_string_new(NULL);
+ }
+ else
+ g_string_append_c(buffer, args[i]);
+ break;
+
+ case ARG_STATE_C:
+ if(mud_telnet_msp_parser_is_param_char(args[i]) &&
+ mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
+ {
+ command->C = g_strdup(buffer->str);
+ g_string_free(buffer, TRUE);
+ buffer = g_string_new(NULL);
+ }
+ else
+ g_string_append_c(buffer, args[i]);
+ break;
+
+ case ARG_STATE_T:
+ if(mud_telnet_msp_parser_is_param_char(args[i]) &&
+ mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
+ {
+ command->T = g_strdup(buffer->str);
+ g_string_free(buffer, TRUE);
+ buffer = g_string_new(NULL);
+ }
+ else
+ g_string_append_c(buffer, args[i]);
+ break;
+
+ case ARG_STATE_U:
+ if(mud_telnet_msp_parser_is_param_char(args[i]) &&
+ mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
+ {
+ if(buffer->str[buffer->len - 1] != '/')
+ g_string_append_c(buffer, '/');
+
+ command->U = g_strdup(buffer->str);
+ g_string_free(buffer, TRUE);
+ buffer = g_string_new(NULL);
+ }
+ else
+ g_string_append_c(buffer, args[i]);
+ break;
+
+ case ARG_STATE_P:
+ if(mud_telnet_msp_parser_is_param_char(args[i]) &&
+ mud_telnet_msp_parser_switch_on_param_char(&state, args, i, len))
+ {
+ command->P = g_strdup(buffer->str);
+ g_string_free(buffer, TRUE);
+ buffer = g_string_new(NULL);
+ }
+ else
+ g_string_append_c(buffer, args[i]);
+ break;
+ }
+ }
+
+ switch(state)
+ {
+ case ARG_STATE_FILE:
+ command->fName = g_strdup(buffer->str);
+ break;
+
+ case ARG_STATE_V:
+ command->V = g_strdup(buffer->str);
+ break;
+
+ case ARG_STATE_L:
+ command->L = g_strdup(buffer->str);
+ break;
+
+ case ARG_STATE_C:
+ command->C = g_strdup(buffer->str);
+ break;
+
+ case ARG_STATE_T:
+ command->T = g_strdup(buffer->str);
+ break;
+
+ case ARG_STATE_U:
+ if(buffer->str[buffer->len - 1] != '/')
+ g_string_append_c(buffer, '/');
+
+ command->U = g_strdup(buffer->str);
+ break;
+
+ case ARG_STATE_P:
+ command->P = g_strdup(buffer->str);
+ break;
+ }
+
+ if(command->C)
+ command->cont = atoi(command->C);
+
+ if(command->T)
+ command->sfx_type = g_strdup(command->T);
+
+ if(command->V)
+ command->volume = atoi(command->V);
+
+ if(command->P)
+ command->priority = atoi(command->P);
+
+ if(command->L)
+ {
+ command->initial_repeat_count = atoi(command->L);
+
+ if(command->initial_repeat_count == 0)
+ command->initial_repeat_count = 1;
+
+ command->current_repeat_count = command->initial_repeat_count;
+
+ if(command->current_repeat_count == -1)
+ command->loop = TRUE;
+ }
- if(command->initial_repeat_count == 0)
- command->initial_repeat_count = 1;
+ mud_telnet_msp_process_command(telnet, command);
- command->current_repeat_count = command->initial_repeat_count;
-
- if(command->current_repeat_count == -1)
- command->loop = TRUE;
- }
-
- mud_telnet_msp_process_command(telnet, command);
-
- g_free(args);
- g_string_free(buffer, TRUE);
+ g_free(args);
+ g_string_free(buffer, TRUE);
}
static gboolean
mud_telnet_msp_parser_is_param_char(gchar c)
{
- return (c == 'V' || c == 'L' || c == 'C' ||
- c == 'T' || c == 'U' || c == 'P');
+ return (c == 'V' || c == 'L' || c == 'C' ||
+ c == 'T' || c == 'U' || c == 'P');
}
static gboolean
-mud_telnet_msp_parser_switch_on_param_char(gint *state, gchar *buf, gint index, gint len)
+mud_telnet_msp_parser_switch_on_param_char(gint *state, gchar *buf,
+ gint index, gint len)
{
- if(index + 1 == len)
- return FALSE;
+ if(index + 1 == len)
+ return FALSE;
- if(buf[index + 1] != '=')
- return FALSE;
+ if(buf[index + 1] != '=')
+ return FALSE;
- switch(buf[index])
- {
- case 'V':
- *state = ARG_STATE_V;
- return TRUE;
- break;
-
- case 'L':
- *state = ARG_STATE_L;
- return TRUE;
- break;
-
- case 'C':
- *state = ARG_STATE_C;
- return TRUE;
- break;
-
- case 'T':
- *state = ARG_STATE_T;
- return TRUE;
- break;
-
- case 'U':
- *state = ARG_STATE_U;
- return TRUE;
- break;
-
- case 'P':
- *state = ARG_STATE_P;
- return TRUE;
- break;
- }
+ switch(buf[index])
+ {
+ case 'V':
+ *state = ARG_STATE_V;
+ return TRUE;
+ break;
- return FALSE;
+ case 'L':
+ *state = ARG_STATE_L;
+ return TRUE;
+ break;
+
+ case 'C':
+ *state = ARG_STATE_C;
+ return TRUE;
+ break;
+
+ case 'T':
+ *state = ARG_STATE_T;
+ return TRUE;
+ break;
+
+ case 'U':
+ *state = ARG_STATE_U;
+ return TRUE;
+ break;
+
+ case 'P':
+ *state = ARG_STATE_P;
+ return TRUE;
+ break;
+ }
+
+ return FALSE;
}
static void
mud_telnet_msp_command_free(MudMSPCommand *command)
{
- if(command == NULL)
- return;
+ if(command == NULL)
+ return;
- if(command->fName)
- g_free(command->fName);
+ if(command->fName)
+ g_free(command->fName);
- if(command->mud_name)
- g_free(command->mud_name);
+ if(command->mud_name)
+ g_free(command->mud_name);
- if(command->sfx_type)
- g_free(command->sfx_type);
+ if(command->sfx_type)
+ g_free(command->sfx_type);
- if(command->V)
- g_free(command->V);
+ if(command->V)
+ g_free(command->V);
- if(command->L)
- g_free(command->L);
+ if(command->L)
+ g_free(command->L);
- if(command->P)
- g_free(command->P);
+ if(command->P)
+ g_free(command->P);
- if(command->C)
- g_free(command->C);
+ if(command->C)
+ g_free(command->C);
- if(command->T)
- g_free(command->T);
+ if(command->T)
+ g_free(command->T);
- if(command->U)
- g_free(command->U);
+ if(command->U)
+ g_free(command->U);
- g_free(command);
+ g_free(command);
}
static void
mud_telnet_msp_process_command(MudTelnet *telnet, MudMSPCommand *command)
{
- /*g_message("MSP Command Parse Results");
- g_print("Type: %s\n", (command->type == MSP_TYPE_SOUND) ? "Sound" : "Music" );
- g_print("Filename: %s\n", (command->fName != NULL) ? command->fName : "<null>");
- g_print("V: %s\n", (command->V != NULL) ? command->V : "<null>");
- g_print("L: %s\n", (command->L != NULL) ? command->L : "<null>");
- g_print("C: %s\n", (command->C != NULL) ? command->C : "<null>");
- g_print("T: %s\n", (command->T != NULL) ? command->T : "<null>");
- g_print("U: %s\n", (command->U != NULL) ? command->U : "<null>");
- g_print("P: %s\n", (command->P != NULL) ? command->P : "<null>");
- g_print("Sfx Type: %s Volume: %d Priority: %d Repeat %d times. %s %s\n", (command->sfx_type) ? command->sfx_type:"None", command->volume,
- command->priority, command->initial_repeat_count, (command->loop)? "Looping" : "Not Looping",
- (command->cont) ? "Continue" : "Stop");*/
+ /*g_message("MSP Command Parse Results");
+ g_print("Type: %s\n", (command->type == MSP_TYPE_SOUND) ? "Sound" :
+ "Music" );
+ g_print("Filename: %s\n", (command->fName != NULL) ? command->fName :
+ "<null>");
+ g_print("V: %s\n", (command->V != NULL) ? command->V : "<null>");
+ g_print("L: %s\n", (command->L != NULL) ? command->L : "<null>");
+ g_print("C: %s\n", (command->C != NULL) ? command->C : "<null>");
+ g_print("T: %s\n", (command->T != NULL) ? command->T : "<null>");
+ g_print("U: %s\n", (command->U != NULL) ? command->U : "<null>");
+ g_print("P: %s\n", (command->P != NULL) ? command->P : "<null>");
+ g_print("Sfx Type: %s Volume: %d Priority: %d Repeat %d times. %s %s\n",
+ (command->sfx_type) ? command->sfx_type:"None", command->volume,
+ command->priority, command->initial_repeat_count, (command->loop) ?
+ "Looping" : "Not Looping",
+ (command->cont) ? "Continue" : "Stop");*/
- if(command->fName && strcmp(command->fName, "Off") == 0)
+ if(command->fName && strcmp(command->fName, "Off") == 0)
+ {
+ if(command->U)
{
- if(command->U)
- {
- if(telnet->base_url)
- g_free(telnet->base_url);
+ if(telnet->base_url)
+ g_free(telnet->base_url);
- telnet->base_url = g_strdup(command->U);
- }
- else
- mud_telnet_msp_stop_playing(telnet, command->type);
+ telnet->base_url = g_strdup(command->U);
+ }
+ else
+ mud_telnet_msp_stop_playing(telnet, command->type);
- mud_telnet_msp_command_free(command);
+ mud_telnet_msp_command_free(command);
- return;
- }
+ return;
+ }
- if(telnet->sound[command->type].current_command)
- {
- if(telnet->sound[command->type].playing)
- {
- if(command->priority > telnet->sound[command->type].current_command->priority)
- {
- mud_telnet_msp_stop_playing(telnet, command->type);
- telnet->sound[command->type].current_command = command;
- mud_telnet_msp_start_playing(telnet, command->type);
- }
- else
- mud_telnet_msp_command_free(command);
- }
- else
- {
- mud_telnet_msp_stop_playing(telnet, command->type);
- telnet->sound[command->type].current_command = command;
- mud_telnet_msp_start_playing(telnet, command->type);
- }
- }
- else
+ if(telnet->sound[command->type].current_command)
+ {
+ if(telnet->sound[command->type].playing)
{
+ if(command->priority >
+ telnet->sound[command->type].current_command->priority)
+ {
+ mud_telnet_msp_stop_playing(telnet, command->type);
telnet->sound[command->type].current_command = command;
mud_telnet_msp_start_playing(telnet, command->type);
+ }
+ else
+ mud_telnet_msp_command_free(command);
}
+ else
+ {
+ mud_telnet_msp_stop_playing(telnet, command->type);
+ telnet->sound[command->type].current_command = command;
+ mud_telnet_msp_start_playing(telnet, command->type);
+ }
+ }
+ else
+ {
+ telnet->sound[command->type].current_command = command;
+ mud_telnet_msp_start_playing(telnet, command->type);
+ }
}
static void
mud_telnet_msp_stop_playing(MudTelnet *telnet, MudMSPTypes type)
{
- telnet->sound[type].playing = FALSE;
+ telnet->sound[type].playing = FALSE;
- if(GST_IS_ELEMENT(telnet->sound[type].play))
- {
- gst_element_set_state (telnet->sound[type].play, GST_STATE_NULL);
- gst_object_unref (GST_OBJECT (telnet->sound[type].play));
- }
+ if(GST_IS_ELEMENT(telnet->sound[type].play))
+ {
+ gst_element_set_state (telnet->sound[type].play, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (telnet->sound[type].play));
+ }
+
+ if(telnet->sound[type].files)
+ {
+ g_strfreev(telnet->sound[type].files);
+ telnet->sound[type].files = NULL;
+ }
- if(telnet->sound[type].files)
- {
- g_strfreev(telnet->sound[type].files);
- telnet->sound[type].files = NULL;
- }
+ telnet->sound[type].files_len = 0;
- telnet->sound[type].files_len = 0;
-
- mud_telnet_msp_command_free(telnet->sound[type].current_command);
- telnet->sound[type].current_command = NULL;
+ mud_telnet_msp_command_free(telnet->sound[type].current_command);
+ telnet->sound[type].current_command = NULL;
}
static void
mud_telnet_msp_start_playing(MudTelnet *telnet, MudMSPTypes type)
{
- if(!telnet->sound[type].current_command)
- return;
+ if(!telnet->sound[type].current_command)
+ return;
- if(mud_telnet_msp_get_files(telnet, type))
- {
- gint num = 0;
+ if(mud_telnet_msp_get_files(telnet, type))
+ {
+ gint num = 0;
+
+ telnet->sound[type].playing = TRUE;
+
+ if(telnet->sound[type].files_len != 0)
+ num = rand() % telnet->sound[type].files_len;
+
+ telnet->sound[type].play = gst_element_factory_make ("playbin", "play");
+ g_object_set (G_OBJECT(telnet->sound[type].play),
+ "uri", telnet->sound[type].files[num], NULL);
+ g_object_set(G_OBJECT(telnet->sound[type].play),
+ "volume",
+ (double)telnet->sound[type].current_command->volume/100,
+ NULL);
+
+ telnet->sound[type].bus =
+ gst_pipeline_get_bus (GST_PIPELINE (telnet->sound[type].play));
+
+ if(type == MSP_TYPE_SOUND)
+ gst_bus_add_watch (telnet->sound[type].bus,
+ mud_telnet_msp_sound_bus_call, telnet);
+ else
+ gst_bus_add_watch (telnet->sound[type].bus,
+ mud_telnet_msp_music_bus_call, telnet);
- telnet->sound[type].playing = TRUE;
+ gst_object_unref (telnet->sound[type].bus);
- if(telnet->sound[type].files_len != 0)
- num = rand() % telnet->sound[type].files_len;
+ gst_element_set_state (telnet->sound[type].play, GST_STATE_PLAYING);
+ }
+}
- telnet->sound[type].play = gst_element_factory_make ("playbin", "play");
- g_object_set (G_OBJECT(telnet->sound[type].play),
- "uri", telnet->sound[type].files[num], NULL);
- g_object_set(G_OBJECT(telnet->sound[type].play),
- "volume", (double)telnet->sound[type].current_command->volume/100, NULL);
+static gboolean
+mud_telnet_msp_get_files(MudTelnet *telnet, MudMSPTypes type)
+{
+ gchar sound_dir[2048];
+ const gchar *file;
+ gchar **files;
+ gchar **structure;
+ GString *file_output;
+ GString *url_output;
+ GString *file_name;
+ GString *subdir;
+ GString *full_dir;
+ GDir *dir;
+ gint i, depth;
+ GPatternSpec *regex;
- telnet->sound[type].bus =
- gst_pipeline_get_bus (GST_PIPELINE (telnet->sound[type].play));
+ if(!telnet->sound[type].current_command)
+ return FALSE;
- if(type == MSP_TYPE_SOUND)
- gst_bus_add_watch (telnet->sound[type].bus, mud_telnet_msp_sound_bus_call, telnet);
- else
- gst_bus_add_watch (telnet->sound[type].bus, mud_telnet_msp_music_bus_call, telnet);
+ g_snprintf(sound_dir, 2048, "%s/.gnome-mud/audio/%s/",
+ g_get_home_dir(), telnet->sound[type].current_command->mud_name);
+ if(!g_file_test(sound_dir, G_FILE_TEST_IS_DIR))
+ mkdir(sound_dir, 0777 );
- gst_object_unref (telnet->sound[type].bus);
+ structure = g_strsplit(telnet->sound[type].current_command->fName, "/", 0);
+ depth = g_strv_length(structure);
- gst_element_set_state (telnet->sound[type].play, GST_STATE_PLAYING);
- }
-}
+ subdir = g_string_new(NULL);
-static gboolean
-mud_telnet_msp_get_files(MudTelnet *telnet, MudMSPTypes type)
-{
- gchar sound_dir[2048];
- const gchar *file;
- gchar **files;
- gchar **structure;
- GString *file_output;
- GString *url_output;
- GString *file_name;
- GString *subdir;
- GString *full_dir;
- GDir *dir;
- gint i, depth;
- GPatternSpec *regex;
-
- if(!telnet->sound[type].current_command)
- return FALSE;
-
- g_snprintf(sound_dir, 2048, "%s/.gnome-mud/audio/%s/",
- g_get_home_dir(), telnet->sound[type].current_command->mud_name);
- if(!g_file_test(sound_dir, G_FILE_TEST_IS_DIR))
- mkdir(sound_dir, 0777 );
+ for(i = 0; i < depth - 1; ++i)
+ {
+ g_string_append(subdir, structure[i]);
+ g_string_append_c(subdir, '/');
+ }
- structure = g_strsplit(telnet->sound[type].current_command->fName, "/", 0);
- depth = g_strv_length(structure);
+ file_name = g_string_new(structure[depth - 1]);
- subdir = g_string_new(NULL);
+ g_strfreev(structure);
- for(i = 0; i < depth - 1; ++i)
- {
- g_string_append(subdir, structure[i]);
- g_string_append_c(subdir, '/');
- }
+ full_dir = g_string_new(sound_dir);
+ g_string_append(full_dir, subdir->str);
- file_name = g_string_new(structure[depth - 1]);
+ if(telnet->sound[type].current_command->T)
+ g_string_append(full_dir, telnet->sound[type].current_command->T);
- g_strfreev(structure);
+ if(!g_file_test(full_dir->str, G_FILE_TEST_IS_DIR))
+ g_mkdir_with_parents(full_dir->str, 0777);
- full_dir = g_string_new(sound_dir);
- g_string_append(full_dir, subdir->str);
+ file_output = g_string_new(NULL);
+
+ regex = g_pattern_spec_new(file_name->str);
- if(telnet->sound[type].current_command->T)
- g_string_append(full_dir, telnet->sound[type].current_command->T);
+ dir = g_dir_open(full_dir->str, 0, NULL);
- if(!g_file_test(full_dir->str, G_FILE_TEST_IS_DIR))
- g_mkdir_with_parents(full_dir->str, 0777);
+ while((file = g_dir_read_name(dir)) != NULL)
+ {
+ if(g_pattern_match_string(regex, file))
+ {
+ g_string_append(file_output, "file://");
+ g_string_append(file_output, full_dir->str);
+ g_string_append_c(file_output, '/');
+ g_string_append(file_output, file);
+ g_string_append_c(file_output, '\n');
+ }
+ }
- file_output = g_string_new(NULL);
+ g_dir_close(dir);
- regex = g_pattern_spec_new(file_name->str);
+ // Try searching again in main directory since
+ // some servers ignore the standard concering the
+ // T parameter and don't put the sound in a T-named
+ // subdir.
+ if(file_output->len == 0 && telnet->sound[type].current_command->T)
+ {
+ g_string_free(full_dir, TRUE);
+ full_dir = g_string_new(sound_dir);
+ g_string_append(full_dir, subdir->str);
dir = g_dir_open(full_dir->str, 0, NULL);
while((file = g_dir_read_name(dir)) != NULL)
{
- if(g_pattern_match_string(regex, file))
- {
- g_string_append(file_output, "file://");
- g_string_append(file_output, full_dir->str);
- g_string_append_c(file_output, '/');
- g_string_append(file_output, file);
- g_string_append_c(file_output, '\n');
- }
+ if(g_pattern_match_string(regex, file))
+ {
+ g_string_append(file_output, "file://");
+ g_string_append(file_output, full_dir->str);
+ g_string_append_c(file_output, '/');
+ g_string_append(file_output, file);
+ g_string_append_c(file_output, '\n');
+ }
}
g_dir_close(dir);
+ }
- // Try searching again in main directory since
- // some servers ignore the standard concering the
- // T parameter and don't put the sound in a T-named
- // subdir.
- if(file_output->len == 0 && telnet->sound[type].current_command->T)
- {
- g_string_free(full_dir, TRUE);
- full_dir = g_string_new(sound_dir);
- g_string_append(full_dir, subdir->str);
-
- dir = g_dir_open(full_dir->str, 0, NULL);
-
- while((file = g_dir_read_name(dir)) != NULL)
- {
- if(g_pattern_match_string(regex, file))
- {
- g_string_append(file_output, "file://");
- g_string_append(file_output, full_dir->str);
- g_string_append_c(file_output, '/');
- g_string_append(file_output, file);
- g_string_append_c(file_output, '\n');
- }
- }
-
- g_dir_close(dir);
- }
+ g_pattern_spec_free(regex);
- g_pattern_spec_free(regex);
+ if(file_output->len == 0) // no matches, file doesn't exist.
+ {
+ url_output = g_string_new(NULL);
- if(file_output->len == 0) // no matches, file doesn't exist.
+ if(telnet->base_url || telnet->sound[type].current_command->U)
{
- url_output = g_string_new(NULL);
+ if(telnet->base_url)
+ g_string_append(url_output, telnet->base_url);
+ else
+ g_string_append(url_output, telnet->sound[type].current_command->U);
- if(telnet->base_url || telnet->sound[type].current_command->U)
- {
- if(telnet->base_url)
- g_string_append(url_output, telnet->base_url);
- else
- g_string_append(url_output, telnet->sound[type].current_command->U);
-
- if(subdir->len != 0)
- g_string_append(url_output, subdir->str);
-
- if(telnet->sound[type].current_command->T)
- {
- g_string_append(url_output, telnet->sound[type].current_command->T);
- g_string_append_c(url_output, '/');
- }
-
- g_string_append(url_output, file_name->str);
-
- g_string_append(file_output, full_dir->str);
- if(telnet->sound[type].current_command->T)
- g_string_append_c(file_output, '/');
- g_string_append(file_output, file_name->str);
-
- telnet->sound[type].current_command->priority = 0;
-
- mud_connection_view_queue_download(telnet->parent, url_output->str, file_output->str);
- }
-
- g_string_free(url_output, TRUE);
- g_string_free(file_output, TRUE);
- g_string_free(full_dir, TRUE);
- g_string_free(subdir, TRUE);
- g_string_free(file_name, TRUE);
+ if(subdir->len != 0)
+ g_string_append(url_output, subdir->str);
- return FALSE;
- }
+ if(telnet->sound[type].current_command->T)
+ {
+ g_string_append(url_output, telnet->sound[type].current_command->T);
+ g_string_append_c(url_output, '/');
+ }
+
+ g_string_append(url_output, file_name->str);
- files = g_strsplit(file_output->str, "\n", 0);
+ g_string_append(file_output, full_dir->str);
+ if(telnet->sound[type].current_command->T)
+ g_string_append_c(file_output, '/');
+ g_string_append(file_output, file_name->str);
- if(telnet->sound[type].files)
- g_strfreev(telnet->sound[type].files);
+ telnet->sound[type].current_command->priority = 0;
- telnet->sound[type].files = files;
- telnet->sound[type].files_len = g_strv_length(files) - 1;
+ mud_connection_view_queue_download(telnet->parent, url_output->str, file_output->str);
+ }
+ g_string_free(url_output, TRUE);
g_string_free(file_output, TRUE);
g_string_free(full_dir, TRUE);
g_string_free(subdir, TRUE);
g_string_free(file_name, TRUE);
- return TRUE;
+ return FALSE;
+ }
+
+ files = g_strsplit(file_output->str, "\n", 0);
+
+ if(telnet->sound[type].files)
+ g_strfreev(telnet->sound[type].files);
+
+ telnet->sound[type].files = files;
+ telnet->sound[type].files_len = g_strv_length(files) - 1;
+
+ g_string_free(file_output, TRUE);
+ g_string_free(full_dir, TRUE);
+ g_string_free(subdir, TRUE);
+ g_string_free(file_name, TRUE);
+
+ return TRUE;
}
static gboolean
mud_telnet_msp_sound_bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
- MudTelnet *telnet = (MudTelnet *)data;
+ MudTelnet *telnet = (MudTelnet *)data;
- switch (GST_MESSAGE_TYPE (msg))
- {
- case GST_MESSAGE_EOS:
- telnet->sound[MSP_TYPE_SOUND].playing = FALSE;
+ switch (GST_MESSAGE_TYPE (msg))
+ {
+ case GST_MESSAGE_EOS:
+ telnet->sound[MSP_TYPE_SOUND].playing = FALSE;
- telnet->sound[MSP_TYPE_SOUND].current_command->current_repeat_count--;
+ telnet->sound[MSP_TYPE_SOUND].current_command->current_repeat_count--;
- gst_element_set_state (telnet->sound[MSP_TYPE_SOUND].play, GST_STATE_NULL);
+ gst_element_set_state (telnet->sound[MSP_TYPE_SOUND].play, GST_STATE_NULL);
- if(telnet->sound[MSP_TYPE_SOUND].current_command->loop ||
- telnet->sound[MSP_TYPE_SOUND].current_command->current_repeat_count != 0)
- {
- gint num = 0;
+ if(telnet->sound[MSP_TYPE_SOUND].current_command->loop ||
+ telnet->sound[MSP_TYPE_SOUND].current_command->current_repeat_count != 0)
+ {
+ gint num = 0;
- if(telnet->sound[MSP_TYPE_SOUND].files_len != 0)
- num = rand() % telnet->sound[MSP_TYPE_SOUND].files_len;
+ if(telnet->sound[MSP_TYPE_SOUND].files_len != 0)
+ num = rand() % telnet->sound[MSP_TYPE_SOUND].files_len;
- g_object_set (G_OBJECT(telnet->sound[MSP_TYPE_SOUND].play),
- "uri", telnet->sound[MSP_TYPE_SOUND].files[num], NULL);
- g_object_set(G_OBJECT(telnet->sound[MSP_TYPE_SOUND].play),
- "volume", (double)telnet->sound[MSP_TYPE_SOUND].current_command->volume/100.0, NULL);
+ g_object_set (G_OBJECT(telnet->sound[MSP_TYPE_SOUND].play),
+ "uri", telnet->sound[MSP_TYPE_SOUND].files[num], NULL);
+ g_object_set(G_OBJECT(telnet->sound[MSP_TYPE_SOUND].play),
+ "volume", (double)telnet->sound[MSP_TYPE_SOUND].current_command->volume/100.0, NULL);
- gst_element_set_state (telnet->sound[MSP_TYPE_SOUND].play, GST_STATE_PLAYING);
- }
- else
- mud_telnet_msp_stop_playing(telnet, MSP_TYPE_SOUND);
- break;
+ gst_element_set_state (telnet->sound[MSP_TYPE_SOUND].play, GST_STATE_PLAYING);
+ }
+ else
+ mud_telnet_msp_stop_playing(telnet, MSP_TYPE_SOUND);
+ break;
- case GST_MESSAGE_ERROR:
- {
- gchar *debug;
- GError *err;
+ case GST_MESSAGE_ERROR:
+ {
+ gchar *debug;
+ GError *err;
- gst_message_parse_error (msg, &err, &debug);
- g_free (debug);
+ gst_message_parse_error (msg, &err, &debug);
+ g_free (debug);
- g_warning ("Error: %s", err->message);
- g_error_free (err);
+ g_warning ("Error: %s", err->message);
+ g_error_free (err);
- break;
- }
+ break;
+ }
- default:
- break;
- }
+ default:
+ break;
+ }
- return TRUE;
+ return TRUE;
}
static gboolean
mud_telnet_msp_music_bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
- MudTelnet *telnet = (MudTelnet *)data;
+ MudTelnet *telnet = (MudTelnet *)data;
- switch (GST_MESSAGE_TYPE (msg))
- {
- case GST_MESSAGE_EOS:
- telnet->sound[MSP_TYPE_MUSIC].playing = FALSE;
+ switch (GST_MESSAGE_TYPE (msg))
+ {
+ case GST_MESSAGE_EOS:
+ telnet->sound[MSP_TYPE_MUSIC].playing = FALSE;
- telnet->sound[MSP_TYPE_MUSIC].current_command->current_repeat_count--;
+ telnet->sound[MSP_TYPE_MUSIC].current_command->current_repeat_count--;
- gst_element_set_state (telnet->sound[MSP_TYPE_MUSIC].play, GST_STATE_NULL);
+ gst_element_set_state (telnet->sound[MSP_TYPE_MUSIC].play, GST_STATE_NULL);
- if(telnet->sound[MSP_TYPE_MUSIC].current_command->loop ||
- telnet->sound[MSP_TYPE_MUSIC].current_command->current_repeat_count != 0)
- {
- gint num = 0;
+ if(telnet->sound[MSP_TYPE_MUSIC].current_command->loop ||
+ telnet->sound[MSP_TYPE_MUSIC].current_command->current_repeat_count != 0)
+ {
+ gint num = 0;
- if(telnet->sound[MSP_TYPE_MUSIC].files_len != 0)
- num = rand() % telnet->sound[MSP_TYPE_MUSIC].files_len;
+ if(telnet->sound[MSP_TYPE_MUSIC].files_len != 0)
+ num = rand() % telnet->sound[MSP_TYPE_MUSIC].files_len;
- g_object_set (G_OBJECT(telnet->sound[MSP_TYPE_MUSIC].play),
- "uri", telnet->sound[MSP_TYPE_MUSIC].files[num], NULL);
- g_object_set(G_OBJECT(telnet->sound[MSP_TYPE_MUSIC].play),
- "volume", (double)telnet->sound[MSP_TYPE_MUSIC].current_command->volume/100.0, NULL);
+ g_object_set (G_OBJECT(telnet->sound[MSP_TYPE_MUSIC].play),
+ "uri", telnet->sound[MSP_TYPE_MUSIC].files[num], NULL);
+ g_object_set(G_OBJECT(telnet->sound[MSP_TYPE_MUSIC].play),
+ "volume", (double)telnet->sound[MSP_TYPE_MUSIC].current_command->volume/100.0, NULL);
- gst_element_set_state (telnet->sound[MSP_TYPE_MUSIC].play, GST_STATE_PLAYING);
- }
- else
- mud_telnet_msp_stop_playing(telnet, MSP_TYPE_MUSIC);
+ gst_element_set_state (telnet->sound[MSP_TYPE_MUSIC].play, GST_STATE_PLAYING);
+ }
+ else
+ mud_telnet_msp_stop_playing(telnet, MSP_TYPE_MUSIC);
- break;
+ break;
- case GST_MESSAGE_ERROR:
- {
- gchar *debug;
- GError *err;
+ case GST_MESSAGE_ERROR:
+ {
+ gchar *debug;
+ GError *err;
- gst_message_parse_error (msg, &err, &debug);
- g_free (debug);
+ gst_message_parse_error (msg, &err, &debug);
+ g_free (debug);
- g_warning ("Error: %s", err->message);
- g_error_free (err);
+ g_warning ("Error: %s", err->message);
+ g_error_free (err);
- break;
- }
+ break;
+ }
- default:
- break;
- }
+ default:
+ break;
+ }
- return TRUE;
+ return TRUE;
}
#endif
Modified: trunk/src/mud-telnet.c
==============================================================================
--- trunk/src/mud-telnet.c (original)
+++ trunk/src/mud-telnet.c Thu Feb 5 19:19:17 2009
@@ -36,7 +36,7 @@
#include "mud-telnet-zmp.h"
#ifdef ENABLE_MCCP
- #include "mud-telnet-mccp.h"
+#include "mud-telnet-mccp.h"
#endif
struct _MudTelnetPrivate
@@ -51,21 +51,21 @@
static void mud_telnet_send_iac(MudTelnet *telnet, guchar ch1, guchar ch2);
static void mud_telnet_on_handle_subnego(MudTelnet *telnet);
static void mud_telnet_on_enable_opt(MudTelnet *telnet,
- const guchar opt_no, gint him);
+ const guchar opt_no, gint him);
static void mud_telnet_on_disable_opt(MudTelnet *telnet,
- const guchar opt_no, gint him);
+ const guchar opt_no, gint him);
static guchar mud_telnet_get_telopt_state(guchar *storage, const guint bitshift);
static gint mud_telnet_get_telopt_queue(guchar *storage, const guint bitshift);
static void mud_telnet_set_telopt_state(guchar *storage,
- const enum TelnetOptionState state, const guint bitshift);
+ const enum TelnetOptionState state, const guint bitshift);
static gint mud_telnet_get_index_by_option(MudTelnet *telnet, guchar option_number);
static void mud_telnet_set_telopt_queue(guchar *storage,
- gint bit_on, const guint bitshift);
+ gint bit_on, const guint bitshift);
static gint mud_telnet_handle_positive_nego(MudTelnet *telnet,
- const guchar opt_no,
- const guchar affirmative,
- const guchar negative,
- gint him);
+ const guchar opt_no,
+ const guchar affirmative,
+ const guchar negative,
+ gint him);
static gint
mud_telnet_handle_negative_nego(MudTelnet *telnet,
const guchar opt_no,
@@ -73,76 +73,79 @@
const guchar negative,
gint him);
+
+gchar *mud_telnet_get_telopt_string(guchar c);
+
// MudTelnet class functions
GType
mud_telnet_get_type (void)
{
- static GType object_type = 0;
-
- g_type_init();
+ static GType object_type = 0;
- if (!object_type)
- {
- static const GTypeInfo object_info =
- {
- sizeof (MudTelnetClass),
- NULL,
- NULL,
- (GClassInitFunc) mud_telnet_class_init,
- NULL,
- NULL,
- sizeof (MudTelnet),
- 0,
- (GInstanceInitFunc) mud_telnet_init,
- };
+ g_type_init();
+
+ if (!object_type)
+ {
+ static const GTypeInfo object_info =
+ {
+ sizeof (MudTelnetClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) mud_telnet_class_init,
+ NULL,
+ NULL,
+ sizeof (MudTelnet),
+ 0,
+ (GInstanceInitFunc) mud_telnet_init,
+ };
- object_type = g_type_register_static(G_TYPE_OBJECT, "MudTelnet", &object_info, 0);
- }
+ object_type = g_type_register_static(G_TYPE_OBJECT, "MudTelnet", &object_info, 0);
+ }
- return object_type;
+ return object_type;
}
static void
mud_telnet_init (MudTelnet *telnet)
{
- telnet->priv = g_new0(MudTelnetPrivate, 1);
+ telnet->priv = g_new0(MudTelnetPrivate, 1);
- telnet->processed = g_string_new(NULL);
- telnet->prev_buffer = NULL;
+ telnet->processed = g_string_new(NULL);
+ telnet->prev_buffer = NULL;
}
static void
mud_telnet_class_init (MudTelnetClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
- object_class->finalize = mud_telnet_finalize;
+ object_class->finalize = mud_telnet_finalize;
}
static void
mud_telnet_finalize (GObject *object)
{
- MudTelnet *telnet;
- GObjectClass *parent_class;
+ MudTelnet *telnet;
+ GObjectClass *parent_class;
telnet = MUD_TELNET(object);
if(telnet->processed)
g_string_free(telnet->processed, TRUE);
- g_free(telnet->priv);
+ g_free(telnet->priv);
#ifdef ENABLE_MCCP
- if (telnet->compress_out != NULL)
- {
- inflateEnd(telnet->compress_out);
+ if (telnet->compress_out != NULL)
+ {
+ inflateEnd(telnet->compress_out);
- g_free(telnet->compress_out);
- g_free(telnet->compress_out_buf);
- }
+ g_free(telnet->compress_out);
+ g_free(telnet->compress_out_buf);
+ }
#endif
- parent_class = g_type_class_peek_parent(G_OBJECT_GET_CLASS(object));
- parent_class->finalize(object);
+ parent_class = g_type_class_peek_parent(G_OBJECT_GET_CLASS(object));
+ parent_class->finalize(object);
}
/*** Public Methods ***/
@@ -151,46 +154,47 @@
MudTelnet*
mud_telnet_new(MudConnectionView *parent, GConn *connection, gchar *mud_name)
{
- MudTelnet *telnet;
+ MudTelnet *telnet;
- telnet = g_object_new(MUD_TYPE_TELNET, NULL);
+ telnet = g_object_new(MUD_TYPE_TELNET, NULL);
- telnet->parent = parent;
- telnet->conn = connection;
- telnet->tel_state = TEL_STATE_TEXT;
- telnet->ttype_iteration = 0;
+ telnet->parent = parent;
+ telnet->conn = connection;
+ telnet->tel_state = TEL_STATE_TEXT;
+ telnet->ttype_iteration = 0;
- memset(telnet->telopt_states, 0, sizeof(telnet->telopt_states));
- memset(telnet->handlers, 0, sizeof(telnet->handlers));
+ memset(telnet->telopt_states, 0, sizeof(telnet->telopt_states));
+ memset(telnet->handlers, 0, sizeof(telnet->handlers));
- mud_telnet_register_handlers(telnet);
+ mud_telnet_register_handlers(telnet);
- telnet->eor_enabled = FALSE;
+ telnet->eor_enabled = FALSE;
- telnet->mud_name = g_strdup(mud_name);
+ telnet->mud_name = g_strdup(mud_name);
telnet->buffer = NULL;
- telnet->pos = 0;
+ telnet->pos = 0;
#ifdef ENABLE_GST
- telnet->sound[0].files = NULL;
- telnet->sound[0].current_command = NULL;
- telnet->sound[0].playing = FALSE;
- telnet->sound[0].files_len = 0;
-
- telnet->sound[1].files = NULL;
- telnet->sound[1].current_command = NULL;
- telnet->sound[1].playing = FALSE;
- telnet->sound[1].files_len = 0;
+ telnet->sound[0].files = NULL;
+ telnet->sound[0].current_command = NULL;
+ telnet->sound[0].playing = FALSE;
+ telnet->sound[0].files_len = 0;
+
+ telnet->sound[1].files = NULL;
+ telnet->sound[1].current_command = NULL;
+ telnet->sound[1].playing = FALSE;
+ telnet->sound[1].files_len = 0;
+
+ telnet->base_url = NULL;
+ telnet->msp_parser.enabled = FALSE;
- telnet->base_url = NULL;
- telnet->msp_parser.enabled = FALSE;
#endif
#ifdef ENABLE_MCCP
- telnet->mccp_new = TRUE;
+ telnet->mccp_new = TRUE;
#endif
- return telnet;
+ return telnet;
}
void
@@ -215,7 +219,7 @@
telnet->handlers[0].enable = MudHandler_TType_Enable;
telnet->handlers[0].disable = MudHandler_TType_Disable;
telnet->handlers[0].handle_sub_neg = MudHandler_TType_HandleSubNeg;
-
+#if 0
/* NAWS */
telnet->handlers[1].type = HANDLER_NAWS;
telnet->handlers[1].option_number = (guchar)TELOPT_NAWS;
@@ -255,7 +259,7 @@
telnet->handlers[5].enable = MudHandler_ZMP_Enable;
telnet->handlers[5].disable = MudHandler_ZMP_Disable;
telnet->handlers[5].handle_sub_neg = MudHandler_ZMP_HandleSubNeg;
-
+#endif
#ifdef ENABLE_GST
/* MSP */
telnet->handlers[6].type = HANDLER_MSP;
@@ -337,9 +341,10 @@
void
mud_telnet_process(MudTelnet *telnet, guchar * buf, guint32 c, gint *len, GString **out_buf)
{
- guint32 i;
- guint32 count;
- g_assert(telnet != NULL);
+ guint32 i;
+ guint32 count;
+ gchar *opt;
+ g_assert(telnet != NULL);
telnet->buffer = g_string_new(NULL);
@@ -368,224 +373,240 @@
count = telnet->buffer->len;
- for (i = 0; i < count; ++i)
+ for (i = 0; i < count; ++i)
+ {
+ switch (telnet->tel_state)
{
- switch (telnet->tel_state)
- {
- case TEL_STATE_TEXT:
+ case TEL_STATE_TEXT:
#ifdef ENABLE_MCCP
- /* The following is only done when compressing is first
- enabled in order to decompress any part of the buffer
- that remains after the subnegotation takes place */
- if(telnet->mccp && telnet->mccp_new)
- {
- GString *ret = NULL;
- telnet->mccp_new = FALSE;
-
- // decompress the rest of the buffer.
- //ret = mud_mccp_decompress(telnet, &buf[i], c - i);
-
- if(ret == NULL)
- {
- if(*out_buf != NULL) g_string_free(*out_buf, TRUE);
- *out_buf = g_string_new_len(telnet->processed->str, telnet->pos);
- *len = telnet->pos;
-
- telnet->pos= 0;
-
- if(telnet->processed)
- {
- g_string_free(telnet->processed, TRUE);
- telnet->processed = g_string_new(NULL);
- }
-
- if(telnet->buffer)
- {
- g_string_free(telnet->buffer, TRUE);
- telnet->buffer = NULL;
- }
-
- return;
- }
-
- if(telnet->buffer)
- {
- g_string_free(telnet->buffer, TRUE);
- telnet->buffer = NULL;
- }
-
- telnet->buffer = g_string_new(ret->str);
-
- if(telnet->buffer->len == 0)
- {
- if(*out_buf != NULL) g_string_free(*out_buf, TRUE);
- *out_buf = g_string_new_len(telnet->processed->str, telnet->pos);
- *len = telnet->pos;
-
- telnet->pos= 0;
-
- if(telnet->processed)
- {
- g_string_free(telnet->processed, TRUE);
- telnet->processed = g_string_new(NULL);
- }
-
- if(telnet->buffer)
- {
- g_string_free(telnet->buffer, TRUE);
- telnet->buffer = NULL;
- }
- return;
- }
-
- i = 0;
- count = telnet->buffer->len;
- }
+ /* The following is only done when compressing is first
+ enabled in order to decompress any part of the buffer
+ that remains after the subnegotation takes place */
+ if(telnet->mccp && telnet->mccp_new)
+ {
+ GString *ret = NULL;
+ telnet->mccp_new = FALSE;
+
+ // decompress the rest of the buffer.
+ //ret = mud_mccp_decompress(telnet, &buf[i], c - i);
+
+ if(ret == NULL)
+ {
+ if(*out_buf != NULL) g_string_free(*out_buf, TRUE);
+ *out_buf = g_string_new_len(telnet->processed->str, telnet->pos);
+ *len = telnet->pos;
+
+ telnet->pos= 0;
+
+ if(telnet->processed)
+ {
+ g_string_free(telnet->processed, TRUE);
+ telnet->processed = g_string_new(NULL);
+ }
+
+ if(telnet->buffer)
+ {
+ g_string_free(telnet->buffer, TRUE);
+ telnet->buffer = NULL;
+ }
+
+ return;
+ }
+
+ if(telnet->buffer)
+ {
+ g_string_free(telnet->buffer, TRUE);
+ telnet->buffer = NULL;
+ }
+
+ telnet->buffer = g_string_new(ret->str);
+
+ if(telnet->buffer->len == 0)
+ {
+ if(*out_buf != NULL) g_string_free(*out_buf, TRUE);
+ *out_buf = g_string_new_len(telnet->processed->str, telnet->pos);
+ *len = telnet->pos;
+
+ telnet->pos= 0;
+
+ if(telnet->processed)
+ {
+ g_string_free(telnet->processed, TRUE);
+ telnet->processed = g_string_new(NULL);
+ }
+
+ if(telnet->buffer)
+ {
+ g_string_free(telnet->buffer, TRUE);
+ telnet->buffer = NULL;
+ }
+ return;
+ }
+
+ i = 0;
+ count = telnet->buffer->len;
+ }
#endif
- if ((guchar)telnet->buffer->str[i] == (guchar)TEL_IAC)
- telnet->tel_state = TEL_STATE_IAC;
- else
- {
- g_string_append_c(telnet->processed, telnet->buffer->str[i]);
- telnet->pos++;
- }
- break;
-
- case TEL_STATE_IAC:
- switch ((guchar)telnet->buffer->str[i])
- {
- case (guchar)TEL_IAC:
- telnet->pos++;
- g_string_append_c(telnet->processed, telnet->buffer->str[i]);
- telnet->tel_state = TEL_STATE_TEXT;
- break;
-
- case (guchar)TEL_DO:
- telnet->tel_state = TEL_STATE_DO;
- break;
-
- case (guchar)TEL_DONT:
- telnet->tel_state = TEL_STATE_DONT;
- break;
-
- case (guchar)TEL_WILL:
- telnet->tel_state = TEL_STATE_WILL;
- break;
-
- case (guchar)TEL_NOP:
- telnet->tel_state = TEL_STATE_TEXT;
- break;
-
- case (guchar)TEL_GA:
- telnet->tel_state = TEL_STATE_TEXT;
- break;
-
- case (guchar)TEL_EOR_BYTE:
- telnet->tel_state = TEL_STATE_TEXT;
- break;
-
- case (guchar)TEL_WONT:
- telnet->tel_state = TEL_STATE_WONT;
- break;
-
- case (guchar)TEL_SB:
- telnet->tel_state = TEL_STATE_SB;
- telnet->subreq_pos = 0;
- break;
-
- default:
- g_warning("Illegal IAC command %d received", telnet->buffer->str[i]);
- telnet->tel_state = TEL_STATE_TEXT;
- break;
- }
- break;
-
- case TEL_STATE_DO:
- mud_telnet_handle_positive_nego(telnet, (guchar)telnet->buffer->str[i],
- (guchar)TEL_WILL, (guchar)TEL_WONT, FALSE);
- telnet->tel_state = TEL_STATE_TEXT;
-
- case TEL_STATE_WILL:
- mud_telnet_handle_positive_nego(telnet, (guchar)telnet->buffer->str[i],
- (guchar)TEL_DO, (guchar)TEL_DONT, TRUE);
- telnet->tel_state = TEL_STATE_TEXT;
- break;
-
- case TEL_STATE_DONT:
- mud_telnet_handle_negative_nego(telnet,
- (guchar)telnet->buffer->str[i], (guchar)TEL_WILL, (guchar)TEL_WONT, FALSE);
- telnet->tel_state = TEL_STATE_TEXT;
- break;
-
- case TEL_STATE_WONT:
- mud_telnet_handle_negative_nego(telnet,
- (guchar)telnet->buffer->str[i], (guchar)TEL_DO, (guchar)TEL_DONT, TRUE);
- telnet->tel_state = TEL_STATE_TEXT;
- break;
-
- case TEL_STATE_SB:
- if ((guchar)telnet->buffer->str[i] == (guchar)TEL_IAC)
- telnet->tel_state = TEL_STATE_SB_IAC;
- else
- {
- // FIXME: Handle overflow
- if (telnet->subreq_pos >= TEL_SUBREQ_BUFFER_SIZE)
- {
- g_warning("Subrequest buffer full. Oddities in output will happen. Sorry.");
- telnet->subreq_pos = 0;
- telnet->tel_state = TEL_STATE_TEXT;
- }
- else
- telnet->subreq_buffer[telnet->subreq_pos++] = (guchar)telnet->buffer->str[i];
- }
- break;
-
- case TEL_STATE_SB_IAC:
- if ((guchar)telnet->buffer->str[i] == (guchar)TEL_IAC)
- {
- if (telnet->subreq_pos >= TEL_SUBREQ_BUFFER_SIZE)
- {
- g_warning("Subrequest buffer full. Oddities in output will happen. Sorry.");
- telnet->subreq_pos = 0;
- telnet->tel_state = TEL_STATE_TEXT;
- }
- else
- telnet->subreq_buffer[telnet->subreq_pos++] = (guchar)telnet->buffer->str[i];
-
- telnet->tel_state = TEL_STATE_SB;
- }
- else if ((guchar)telnet->buffer->str[i] == (guchar)TEL_SE)
- {
- telnet->subreq_buffer[telnet->subreq_pos++] = (guchar)telnet->buffer->str[i];
- mud_telnet_on_handle_subnego(telnet);
- telnet->tel_state = TEL_STATE_TEXT;
- } else {
- g_warning("Erronous byte %d after an IAC inside a subrequest", telnet->buffer->str[i]);
- telnet->subreq_pos = 0;
- telnet->tel_state = TEL_STATE_TEXT;
- }
- break;
+ if ((guchar)telnet->buffer->str[i] == (guchar)TEL_IAC)
+ telnet->tel_state = TEL_STATE_IAC;
+ else
+ {
+ g_string_append_c(telnet->processed, telnet->buffer->str[i]);
+ telnet->pos++;
+ }
+ break;
+
+ case TEL_STATE_IAC:
+ switch ((guchar)telnet->buffer->str[i])
+ {
+ case (guchar)TEL_IAC:
+ telnet->pos++;
+ g_string_append_c(telnet->processed, telnet->buffer->str[i]);
+ telnet->tel_state = TEL_STATE_TEXT;
+ break;
+
+ case (guchar)TEL_DO:
+ telnet->tel_state = TEL_STATE_DO;
+ break;
+
+ case (guchar)TEL_DONT:
+ telnet->tel_state = TEL_STATE_DONT;
+ break;
+
+ case (guchar)TEL_WILL:
+ telnet->tel_state = TEL_STATE_WILL;
+ break;
+
+ case (guchar)TEL_NOP:
+ telnet->tel_state = TEL_STATE_TEXT;
+ break;
+
+ case (guchar)TEL_GA:
+ telnet->tel_state = TEL_STATE_TEXT;
+ break;
+
+ case (guchar)TEL_EOR_BYTE:
+ telnet->tel_state = TEL_STATE_TEXT;
+ break;
+
+ case (guchar)TEL_WONT:
+ telnet->tel_state = TEL_STATE_WONT;
+ break;
+
+ case (guchar)TEL_SB:
+ telnet->tel_state = TEL_STATE_SB;
+ telnet->subreq_pos = 0;
+ break;
+
+ default:
+ g_warning("Illegal IAC command %d received", telnet->buffer->str[i]);
+ telnet->tel_state = TEL_STATE_TEXT;
+ break;
+ }
+ break;
+
+ case TEL_STATE_DO:
+ opt = mud_telnet_get_telopt_string((guchar)telnet->buffer->str[i]);
+ g_message("Tel State DO %s", opt);
+ g_free(opt);
+
+ mud_telnet_handle_positive_nego(telnet, (guchar)telnet->buffer->str[i],
+ (guchar)TEL_WILL, (guchar)TEL_WONT, FALSE);
+ telnet->tel_state = TEL_STATE_TEXT;
+
+ case TEL_STATE_WILL:
+ opt = mud_telnet_get_telopt_string((guchar)telnet->buffer->str[i]);
+ g_message("Tel State WILL %s", opt);
+ g_free(opt);
+
+ mud_telnet_handle_positive_nego(telnet, (guchar)telnet->buffer->str[i],
+ (guchar)TEL_DO, (guchar)TEL_DONT, TRUE);
+ telnet->tel_state = TEL_STATE_TEXT;
+ break;
+
+ case TEL_STATE_DONT:
+ opt = mud_telnet_get_telopt_string((guchar)telnet->buffer->str[i]);
+ g_message("Tel State DONT %s", opt);
+ g_free(opt);
+
+ mud_telnet_handle_negative_nego(telnet,
+ (guchar)telnet->buffer->str[i], (guchar)TEL_WILL, (guchar)TEL_WONT, FALSE);
+ telnet->tel_state = TEL_STATE_TEXT;
+ break;
+
+ case TEL_STATE_WONT:
+ opt = mud_telnet_get_telopt_string((guchar)telnet->buffer->str[i]);
+ g_message("Tel State WONT %s", opt);
+ g_free(opt);
+
+ mud_telnet_handle_negative_nego(telnet,
+ (guchar)telnet->buffer->str[i], (guchar)TEL_DO, (guchar)TEL_DONT, TRUE);
+ telnet->tel_state = TEL_STATE_TEXT;
+ break;
+
+ case TEL_STATE_SB:
+ if ((guchar)telnet->buffer->str[i] == (guchar)TEL_IAC)
+ telnet->tel_state = TEL_STATE_SB_IAC;
+ else
+ {
+ // FIXME: Handle overflow
+ if (telnet->subreq_pos >= TEL_SUBREQ_BUFFER_SIZE)
+ {
+ g_warning("Subrequest buffer full. Oddities in output will happen. Sorry.");
+ telnet->subreq_pos = 0;
+ telnet->tel_state = TEL_STATE_TEXT;
}
+ else
+ telnet->subreq_buffer[telnet->subreq_pos++] = (guchar)telnet->buffer->str[i];
+ }
+ break;
+
+ case TEL_STATE_SB_IAC:
+ if ((guchar)telnet->buffer->str[i] == (guchar)TEL_IAC)
+ {
+ if (telnet->subreq_pos >= TEL_SUBREQ_BUFFER_SIZE)
+ {
+ g_warning("Subrequest buffer full. Oddities in output will happen. Sorry.");
+ telnet->subreq_pos = 0;
+ telnet->tel_state = TEL_STATE_TEXT;
+ }
+ else
+ telnet->subreq_buffer[telnet->subreq_pos++] = (guchar)telnet->buffer->str[i];
+
+ telnet->tel_state = TEL_STATE_SB;
+ }
+ else if ((guchar)telnet->buffer->str[i] == (guchar)TEL_SE)
+ {
+ telnet->subreq_buffer[telnet->subreq_pos++] = (guchar)telnet->buffer->str[i];
+ mud_telnet_on_handle_subnego(telnet);
+ telnet->tel_state = TEL_STATE_TEXT;
+ } else {
+ g_warning("Erronous byte %d after an IAC inside a subrequest", telnet->buffer->str[i]);
+ telnet->subreq_pos = 0;
+ telnet->tel_state = TEL_STATE_TEXT;
+ }
+ break;
}
+ }
- if(telnet->tel_state == TEL_STATE_TEXT)
- {
- if(*out_buf != NULL) g_string_free(*out_buf, TRUE);
- *out_buf = g_string_new_len(g_strdup(telnet->processed->str), telnet->pos);
- *len = telnet->pos;
+ if(telnet->tel_state == TEL_STATE_TEXT)
+ {
+ if(*out_buf != NULL) g_string_free(*out_buf, TRUE);
+ *out_buf = g_string_new_len(g_strdup(telnet->processed->str), telnet->pos);
+ *len = telnet->pos;
telnet->pos= 0;
if(telnet->processed)
{
- g_string_free(telnet->processed, TRUE);
- telnet->processed = g_string_new(NULL);
- }
+ g_string_free(telnet->processed, TRUE);
+ telnet->processed = g_string_new(NULL);
}
- else
- *out_buf = NULL;
+ }
+ else
+ *out_buf = NULL;
- if(telnet->buffer)
+ if(telnet->buffer)
{
g_string_free(telnet->buffer, TRUE);
telnet->buffer = NULL;
@@ -596,164 +617,189 @@
mud_telnet_get_telnet_string(guchar ch)
{
GString *string = g_string_new(NULL);
- gchar *ret = string->str;
+ gchar *ret;
- switch (ch)
- {
- case TEL_WILL:
- g_string_append(string, "WILL");
- case TEL_WONT:
- g_string_append(string, "WONT");
- case TEL_DO:
- g_string_append(string, "DO");
- case TEL_DONT:
- g_string_append(string, "DONT");
- case TEL_IAC:
- g_string_append(string, "IAC");
- default:
- g_string_append_c(string,ch);
- }
+ switch (ch)
+ {
+ case TEL_WILL:
+ g_string_append(string, "WILL");
+ case TEL_WONT:
+ g_string_append(string, "WONT");
+ case TEL_DO:
+ g_string_append(string, "DO");
+ case TEL_DONT:
+ g_string_append(string, "DONT");
+ case TEL_IAC:
+ g_string_append(string, "IAC");
+ default:
+ g_string_append_c(string,ch);
+ }
- g_string_free(string, FALSE);
+ ret = g_strdup(string->str);
+ g_string_free(string, TRUE);
- return ret;
+ return ret;
}
gchar*
mud_telnet_get_telopt_string(guchar ch)
{
GString *string = g_string_new(NULL);
- gchar *ret = string->str;
+ gchar *ret;
- switch (ch)
- {
- case TELOPT_ECHO:
- g_string_append(string, "ECHO");
- case TELOPT_TTYPE:
- g_string_append(string, "TTYPE");
- case TELOPT_EOR:
- g_string_append(string, "END-OF-RECORD");
- case TELOPT_NAWS:
- g_string_append(string, "NAWS");
- case TELOPT_CHARSET:
- g_string_append(string, "CHARSET");
- case TELOPT_MCCP:
- g_string_append(string, "COMPRESS");
- case TELOPT_MCCP2:
- g_string_append(string, "COMPRESS2");
- case TELOPT_CLIENT:
- g_string_append(string, "CLIENT");
- case TELOPT_CLIENTVER:
- g_string_append(string, "CLIENTVER");
- case TELOPT_MSP:
- g_string_append(string, "MSP");
- case TELOPT_MXP:
- g_string_append(string, "MXP");
- case TELOPT_ZMP:
- g_string_append(string, "ZMP");
- default:
- g_string_append_c(string, ch);
- }
+ switch (ch)
+ {
+ case TELOPT_ECHO:
+ g_string_append(string, "ECHO");
+ break;
+
+ case TELOPT_TTYPE:
+ g_string_append(string, "TTYPE");
+ break;
+
+ case TELOPT_EOR:
+ g_string_append(string, "END-OF-RECORD");
+ break;
+
+ case TELOPT_NAWS:
+ g_string_append(string, "NAWS");
+ break;
+
+ case TELOPT_CHARSET:
+ g_string_append(string, "CHARSET");
+ break;
+
+ case TELOPT_MCCP:
+ g_string_append(string, "COMPRESS");
+ break;
+
+ case TELOPT_MCCP2:
+ g_string_append(string, "COMPRESS2");
+ break;
+
+ case TELOPT_CLIENT:
+ g_string_append(string, "CLIENT");
+ break;
+
+ case TELOPT_CLIENTVER:
+ g_string_append(string, "CLIENTVER");
+ break;
+
+ case TELOPT_MSP:
+ g_string_append(string, "MSP");
+ break;
+
+ case TELOPT_MXP:
+ g_string_append(string, "MXP");
+ break;
+
+ case TELOPT_ZMP:
+ g_string_append(string, "ZMP");
+ break;
+ }
- return ret;
+ ret = g_strdup(string->str);
+ g_string_free(string, TRUE);
+
+ return ret;
}
void
mud_telnet_send_charset_req(MudTelnet *telnet, gchar *encoding)
{
guchar byte;
- guint32 i;
+ guint32 i;
- if(!encoding)
- return;
+ if(!encoding)
+ return;
/* Writes IAC SB CHARSET ACCEPTED <charset> IAC SE to server */
- byte = (guchar)TEL_IAC;
+ byte = (guchar)TEL_IAC;
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- byte = (guchar)TEL_SB;
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ byte = (guchar)TEL_SB;
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
byte = (guchar)TELOPT_CHARSET;
gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
byte = (guchar)TEL_CHARSET_ACCEPT;
gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- for (i = 0; i < strlen(encoding); ++i)
- {
- byte = (guchar)encoding[i];
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ for (i = 0; i < strlen(encoding); ++i)
+ {
+ byte = (guchar)encoding[i];
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- if (byte == (guchar)TEL_IAC)
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- }
+ if (byte == (guchar)TEL_IAC)
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ }
- byte = (guchar)TEL_IAC;
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- byte = (guchar)TEL_SE;
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ byte = (guchar)TEL_IAC;
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ byte = (guchar)TEL_SE;
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
}
void
mud_telnet_send_sub_req(MudTelnet *telnet, guint32 count, ...)
{
- guchar byte;
- guint32 i;
- va_list va;
- va_start(va, count);
+ guchar byte;
+ guint32 i;
+ va_list va;
+ va_start(va, count);
- byte = (guchar)TEL_IAC;
+ byte = (guchar)TEL_IAC;
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- byte = (guchar)TEL_SB;
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ byte = (guchar)TEL_SB;
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- for (i = 0; i < count; ++i)
- {
- byte = (guchar)va_arg(va, gint);
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ for (i = 0; i < count; ++i)
+ {
+ byte = (guchar)va_arg(va, gint);
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- if (byte == (guchar)TEL_IAC)
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- }
+ if (byte == (guchar)TEL_IAC)
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ }
- va_end(va);
+ va_end(va);
- byte = (guchar)TEL_IAC;
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- byte = (guchar)TEL_SE;
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ byte = (guchar)TEL_IAC;
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ byte = (guchar)TEL_SE;
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
}
void
mud_telnet_send_raw(MudTelnet *telnet, guint32 count, ...)
{
- guchar byte;
- guint32 i;
- va_list va;
- va_start(va, count);
+ guchar byte;
+ guint32 i;
+ va_list va;
+ va_start(va, count);
- for (i = 0; i < count; ++i)
- {
- byte = (guchar)va_arg(va, gint);
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ for (i = 0; i < count; ++i)
+ {
+ byte = (guchar)va_arg(va, gint);
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- if (byte == (guchar)TEL_IAC)
- gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
- }
+ if (byte == (guchar)TEL_IAC)
+ gnet_conn_write(telnet->conn, (gchar *)&byte, 1);
+ }
- va_end(va);
+ va_end(va);
}
/*** Private Methods ***/
static void
mud_telnet_send_iac(MudTelnet *telnet, guchar ch1, guchar ch2)
{
- guchar buf[3];
- buf[0] = (guchar)TEL_IAC;
- buf[1] = ch1;
- buf[2] = ch2;
+ guchar buf[3];
+ buf[0] = (guchar)TEL_IAC;
+ buf[1] = ch1;
+ buf[2] = ch2;
- gnet_conn_write(telnet->conn, (gchar *)buf, 3);
+ gnet_conn_write(telnet->conn, (gchar *)buf, 3);
}
static void
@@ -761,8 +807,8 @@
{
int index;
- if (telnet->subreq_pos < 1)
- return;
+ if (telnet->subreq_pos < 1)
+ return;
if((index = mud_telnet_get_index_by_option(telnet, telnet->subreq_buffer[0])) == -1)
{
@@ -772,7 +818,7 @@
if (mud_telnet_isenabled(telnet, telnet->subreq_buffer[0], FALSE))
telnet->handlers[index].handle_sub_neg(telnet, telnet->subreq_buffer + 1,
- telnet->subreq_pos - 1, &telnet->handlers[index]);
+ telnet->subreq_pos - 1, &telnet->handlers[index]);
}
static void
@@ -806,26 +852,26 @@
static guchar
mud_telnet_get_telopt_state(guint8 *storage, const guint bitshift)
{
- return (*storage >> bitshift) & 0x03u;
+ return (*storage >> bitshift) & 0x03u;
}
static gint
mud_telnet_get_telopt_queue(guchar *storage, const guint bitshift)
{
- return !!((*storage >> bitshift) & 0x04u);
+ return !!((*storage >> bitshift) & 0x04u);
}
static void
mud_telnet_set_telopt_state(guchar *storage, const enum TelnetOptionState state,
- const guint bitshift)
+ const guint bitshift)
{
- *storage = (*storage & ~(0x03u << bitshift)) | (state << bitshift);
+ *storage = (*storage & ~(0x03u << bitshift)) | (state << bitshift);
}
static void
mud_telnet_set_telopt_queue(guchar *storage, gint bit_on, const guint bitshift)
{
- *storage = bit_on ? (*storage | (0x04u << bitshift)) : (*storage & ~(0x04u << bitshift));
+ *storage = bit_on ? (*storage | (0x04u << bitshift)) : (*storage & ~(0x04u << bitshift));
}
// Otherwise handlers called on state changes could see the wrong options
@@ -833,118 +879,122 @@
static gint
mud_telnet_handle_positive_nego(MudTelnet *telnet,
const guchar opt_no,
- const guchar affirmative,
- const guchar negative,
- gint him)
+ const guchar affirmative,
+ const guchar negative,
+ gint him)
{
- const guint bitshift = him ? 4 : 0;
- guchar * opt = &(telnet->telopt_states[opt_no]);
- switch (mud_telnet_get_telopt_state(opt, bitshift))
- {
- case TELOPT_STATE_NO:
- // If we agree that server should enable telopt, set
- // his state to YES and send DO; otherwise send DONT
- // FIXME-US/HIM
- // FIXME: What to do in the opposite "him" gint value case?
- if (mud_telnet_isenabled(telnet, opt_no, him))
- {
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_YES, bitshift);
- mud_telnet_send_iac(telnet, affirmative, opt_no);
- mud_telnet_on_enable_opt(telnet, opt_no, him);
- return TRUE;
- } else {
- mud_telnet_send_iac(telnet, negative, opt_no);
- return FALSE;
- }
-
- case TELOPT_STATE_YES:
- // Ignore, he already supposedly has it enabled. Includes the case where
- // DONT was answered by WILL with himq = OPPOSITE to prevent loop.
- return FALSE;
-
- case TELOPT_STATE_WANTNO:
- if (mud_telnet_get_telopt_queue(opt, bitshift) == TELOPT_STATE_QUEUE_EMPTY)
- {
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
- g_warning("TELNET NEGOTIATION: DONT answered by WILL; ill-behaved server. Ignoring IAC WILL %d. him = NO\n", opt_no);
- return FALSE;
- } else { // The opposite is queued
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_YES, bitshift);
- mud_telnet_set_telopt_queue(opt, TELOPT_STATE_QUEUE_EMPTY, bitshift);
- g_warning("TELNET NEGOTIATION: DONT answered by WILL; ill-behaved server. Ignoring IAC WILL %d. him = YES, himq = EMPTY\n", opt_no);
- return FALSE;
- }
- break;
-
- case TELOPT_STATE_WANTYES:
- if (mud_telnet_get_telopt_queue(opt, bitshift) == TELOPT_STATE_QUEUE_EMPTY)
- {
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_YES, bitshift);
- mud_telnet_send_iac(telnet, affirmative, opt_no);
- mud_telnet_on_enable_opt(telnet, opt_no, him);
- return TRUE;
- } else { // The opposite is queued
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_WANTNO, bitshift);
- mud_telnet_set_telopt_queue(opt, TELOPT_STATE_QUEUE_EMPTY, bitshift);
- mud_telnet_send_iac(telnet, negative, opt_no);
- return FALSE;
- }
- default:
- g_warning("Something went really wrong\n");
- return FALSE;
- }
+ if(opt_no == TELOPT_TTYPE)
+ g_message("Handling Positive TTYPE");
+
+ const guint bitshift = him ? 4 : 0;
+ guchar * opt = &(telnet->telopt_states[opt_no]);
+
+ switch (mud_telnet_get_telopt_state(opt, bitshift))
+ {
+ case TELOPT_STATE_NO:
+ // If we agree that server should enable telopt, set
+ // his state to YES and send DO; otherwise send DONT
+ // FIXME-US/HIM
+ // FIXME: What to do in the opposite "him" gint value case?
+ if (mud_telnet_isenabled(telnet, opt_no, him))
+ {
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_YES, bitshift);
+ mud_telnet_send_iac(telnet, affirmative, opt_no);
+ mud_telnet_on_enable_opt(telnet, opt_no, him);
+ return TRUE;
+ } else {
+ mud_telnet_send_iac(telnet, negative, opt_no);
+ return FALSE;
+ }
+
+ case TELOPT_STATE_YES:
+ // Ignore, he already supposedly has it enabled. Includes the case where
+ // DONT was answered by WILL with himq = OPPOSITE to prevent loop.
+ return FALSE;
+
+ case TELOPT_STATE_WANTNO:
+ if (mud_telnet_get_telopt_queue(opt, bitshift) == TELOPT_STATE_QUEUE_EMPTY)
+ {
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
+ g_warning("TELNET NEGOTIATION: DONT answered by WILL; ill-behaved server. Ignoring IAC WILL %d. him = NO\n", opt_no);
+ return FALSE;
+ } else { // The opposite is queued
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_YES, bitshift);
+ mud_telnet_set_telopt_queue(opt, TELOPT_STATE_QUEUE_EMPTY, bitshift);
+ g_warning("TELNET NEGOTIATION: DONT answered by WILL; ill-behaved server. Ignoring IAC WILL %d. him = YES, himq = EMPTY\n", opt_no);
+ return FALSE;
+ }
+ break;
+
+ case TELOPT_STATE_WANTYES:
+ if (mud_telnet_get_telopt_queue(opt, bitshift) == TELOPT_STATE_QUEUE_EMPTY)
+ {
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_YES, bitshift);
+ mud_telnet_send_iac(telnet, affirmative, opt_no);
+ mud_telnet_on_enable_opt(telnet, opt_no, him);
+ return TRUE;
+ } else { // The opposite is queued
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_WANTNO, bitshift);
+ mud_telnet_set_telopt_queue(opt, TELOPT_STATE_QUEUE_EMPTY, bitshift);
+ mud_telnet_send_iac(telnet, negative, opt_no);
+ return FALSE;
+ }
+ default:
+ g_warning("Something went really wrong\n");
+ return FALSE;
+ }
}
static gint
mud_telnet_handle_negative_nego(MudTelnet *telnet,
const guchar opt_no,
- const guchar affirmative,
- const guchar negative,
- gint him)
+ const guchar affirmative,
+ const guchar negative,
+ gint him)
{
- const guint bitshift = him ? 4 : 0;
- guchar * opt = &(telnet->telopt_states[opt_no]);
+ const guint bitshift = him ? 4 : 0;
+ guchar * opt = &(telnet->telopt_states[opt_no]);
- switch (mud_telnet_get_telopt_state(opt, bitshift))
- {
- case TELOPT_STATE_NO:
- // Ignore, he already supposedly has it disabled
- return FALSE;
-
- case TELOPT_STATE_YES:
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
- mud_telnet_send_iac(telnet, negative, opt_no);
- mud_telnet_on_disable_opt(telnet, opt_no, him);
- return TRUE;
-
- case TELOPT_STATE_WANTNO:
- if (mud_telnet_get_telopt_queue(opt, bitshift) == TELOPT_STATE_QUEUE_EMPTY)
- {
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
- return FALSE;
- } else {
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_WANTYES, bitshift);
- mud_telnet_set_telopt_queue(opt, TELOPT_STATE_QUEUE_EMPTY, bitshift);
- mud_telnet_send_iac(telnet, affirmative, opt_no);
- mud_telnet_on_enable_opt(telnet, opt_no, him); // FIXME: Is this correct?
- return TRUE;
- }
-
- case TELOPT_STATE_WANTYES:
- if (mud_telnet_get_telopt_queue(opt, bitshift) == TELOPT_STATE_QUEUE_EMPTY)
- {
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
- return FALSE;
- } else { // The opposite is queued
- mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
- mud_telnet_set_telopt_queue(opt, TELOPT_STATE_QUEUE_EMPTY, bitshift);
- return FALSE;
- }
- default:
- g_warning("TELNET NEGOTIATION: Something went really wrong\n");
- return FALSE;
- }
+ switch (mud_telnet_get_telopt_state(opt, bitshift))
+ {
+ case TELOPT_STATE_NO:
+ // Ignore, he already supposedly has it disabled
+ return FALSE;
+
+ case TELOPT_STATE_YES:
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
+ mud_telnet_send_iac(telnet, negative, opt_no);
+ mud_telnet_on_disable_opt(telnet, opt_no, him);
+ return TRUE;
+
+ case TELOPT_STATE_WANTNO:
+ if (mud_telnet_get_telopt_queue(opt, bitshift) == TELOPT_STATE_QUEUE_EMPTY)
+ {
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
+ return FALSE;
+ } else {
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_WANTYES, bitshift);
+ mud_telnet_set_telopt_queue(opt, TELOPT_STATE_QUEUE_EMPTY, bitshift);
+ mud_telnet_send_iac(telnet, affirmative, opt_no);
+ mud_telnet_on_enable_opt(telnet, opt_no, him); // FIXME: Is this correct?
+ return TRUE;
+ }
+
+ case TELOPT_STATE_WANTYES:
+ if (mud_telnet_get_telopt_queue(opt, bitshift) == TELOPT_STATE_QUEUE_EMPTY)
+ {
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
+ return FALSE;
+ } else { // The opposite is queued
+ mud_telnet_set_telopt_state(opt, TELOPT_STATE_NO, bitshift);
+ mud_telnet_set_telopt_queue(opt, TELOPT_STATE_QUEUE_EMPTY, bitshift);
+ return FALSE;
+ }
+ default:
+ g_warning("TELNET NEGOTIATION: Something went really wrong\n");
+ return FALSE;
+ }
}
static gint
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]