diff --git a/src/include/v3270/filetransfer.h b/src/include/v3270/filetransfer.h
index bfa5575..88322d7 100644
--- a/src/include/v3270/filetransfer.h
+++ b/src/include/v3270/filetransfer.h
@@ -116,6 +116,8 @@
LIB3270_EXPORT GObject * v3270_ft_activity_new();
+ LIB3270_EXPORT void v3270_ft_activity_set_from_context(GObject * activity, GMarkupParseContext * context);
+
LIB3270_EXPORT const gchar * v3270_ft_activity_get_local_filename(GObject *object);
LIB3270_EXPORT const gchar * v3270_ft_activity_get_remote_filename(GObject *object);
LIB3270_EXPORT LIB3270_FT_OPTION v3270_ft_activity_get_options(GObject *object);
diff --git a/src/v3270ft/activity.c b/src/v3270ft/activity.c
index baa49d9..726dd27 100644
--- a/src/v3270ft/activity.c
+++ b/src/v3270ft/activity.c
@@ -192,3 +192,78 @@
G_V3270_FT_ACTIVITY(object)->values[id] = value;
}
+ static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, V3270FTActivity *activity, GError **error)
+ {
+ if(!g_ascii_strcasecmp(element_name,"file"))
+ {
+ const gchar *type;
+ const gchar *path;
+
+ if(!g_markup_collect_attributes(
+ element_name,names,values,error,
+ G_MARKUP_COLLECT_STRING, "type", &type,
+ G_MARKUP_COLLECT_STRING, "path", &path,
+ G_MARKUP_COLLECT_INVALID
+ )) {
+
+ return;
+
+ }
+
+ if(g_ascii_strcasecmp(type,"local") == 0)
+ v3270_ft_activity_set_local_filename(G_OBJECT(activity),path);
+ else if(g_ascii_strcasecmp(type,"remote") == 0)
+ v3270_ft_activity_set_remote_filename(G_OBJECT(activity),path);
+
+ }
+ else if(!g_ascii_strcasecmp(element_name,"option"))
+ {
+ const gchar *name;
+ const gchar *value;
+
+ if(!g_markup_collect_attributes(
+ element_name,names,values,error,
+ G_MARKUP_COLLECT_STRING, "name", &name,
+ G_MARKUP_COLLECT_STRING, "value", &value,
+ G_MARKUP_COLLECT_INVALID
+ )) {
+
+ return;
+
+ }
+
+
+ }
+ else if(!g_ascii_strcasecmp(element_name,"parameter"))
+ {
+ const gchar *name;
+ const gchar *value;
+
+ if(!g_markup_collect_attributes(
+ element_name,names,values,error,
+ G_MARKUP_COLLECT_STRING, "name", &name,
+ G_MARKUP_COLLECT_STRING, "value", &value,
+ G_MARKUP_COLLECT_INVALID
+ )) {
+
+ return;
+
+ }
+
+ }
+
+ }
+
+ void v3270_ft_activity_set_from_context(GObject * activity, GMarkupParseContext * context)
+ {
+ static const GMarkupParser parser = {
+ (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **)) element_start,
+ (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **)) NULL,
+ (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) NULL,
+ (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) NULL,
+ (void (*)(GMarkupParseContext *, GError *, gpointer)) NULL
+ };
+
+ g_markup_parse_context_push(context,&parser,activity);
+
+ }
diff --git a/src/v3270ft/activitylist.c b/src/v3270ft/activitylist.c
index 4526bfd..619d235 100644
--- a/src/v3270ft/activitylist.c
+++ b/src/v3270ft/activitylist.c
@@ -63,32 +63,6 @@
/*--[ Implement ]------------------------------------------------------------------------------------*/
- static const struct _option_list
- {
- LIB3270_FT_OPTION option;
- const gchar * name;
- const gchar * value;
- }
- option_list[] =
- {
-
- { LIB3270_FT_OPTION_SEND, "type", "send", },
- { LIB3270_FT_OPTION_RECEIVE, "type", "receive", },
- { LIB3270_FT_OPTION_ASCII, "format", "ascii", },
- { LIB3270_FT_OPTION_CRLF, "format", "crlf", },
- { LIB3270_FT_OPTION_APPEND, "format", "append", },
- { LIB3270_FT_OPTION_REMAP, "format", "remap", },
- { LIB3270_FT_OPTION_UNIX, "file-format", "unix", },
- { LIB3270_FT_RECORD_FORMAT_DEFAULT, "record-format", "default", },
- { LIB3270_FT_RECORD_FORMAT_FIXED, "record-format", "fixed", },
- { LIB3270_FT_RECORD_FORMAT_VARIABLE, "record-format", "variable", },
- { LIB3270_FT_RECORD_FORMAT_UNDEFINED, "record-format", "undefined", },
- { LIB3270_FT_ALLOCATION_UNITS_DEFAULT, "units", "default", },
- { LIB3270_FT_ALLOCATION_UNITS_TRACKS, "units", "tracks", },
- { LIB3270_FT_ALLOCATION_UNITS_CYLINDERS, "units", "cylinders", },
- { LIB3270_FT_ALLOCATION_UNITS_AVBLOCK, "units", "avblock", },
- };
-
static void dispose(GObject *object)
{
debug("%s",__FUNCTION__);
@@ -183,6 +157,59 @@
gtk_list_store_set((GtkListStore *) model, &iter, 0, activity, -1);
}
+ static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, V3270FTActivityList *widget, GError **error)
+ {
+ if(!g_ascii_strcasecmp(element_name,"entry"))
+ {
+ // Create new activity
+ GObject * activity = v3270_ft_activity_new();
+ v3270_ft_activity_set_from_context(activity,context);
+ v3270_activity_list_append(GTK_WIDGET(widget), activity);
+ }
+
+ }
+
+ static void element_end(GMarkupParseContext *context, const gchar *element_name, G_GNUC_UNUSED void *info,G_GNUC_UNUSED GError **error)
+ {
+ if(!g_ascii_strcasecmp(element_name,"entry"))
+ {
+ g_markup_parse_context_pop(context);
+ }
+ }
+
+ static void reload(GtkWidget *widget)
+ {
+ static const GMarkupParser parser = {
+ (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **)) element_start,
+ (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **)) element_end,
+ (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) NULL,
+ (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) NULL,
+ (void (*)(GMarkupParseContext *, GError *, gpointer)) NULL
+ };
+
+ GError * error = NULL;
+ g_autofree gchar * text = NULL;
+
+ if(g_file_get_contents(GTK_V3270_FT_ACTIVITY_LIST(widget)->filename,&text,NULL,&error)) {
+
+ GMarkupParseContext * context =
+ g_markup_parse_context_new(
+ &parser,
+ G_MARKUP_TREAT_CDATA_AS_TEXT|G_MARKUP_PREFIX_ERROR_POSITION,
+ widget,
+ NULL
+ );
+
+ /*
+ GMarkupParseContext * context = g_markup_parse_context_new(&parser,G_MARKUP_TREAT_CDATA_AS_TEXT|G_MARKUP_PREFIX_ERROR_POSITION,GTK_V3270FT(widget),NULL);
+ g_markup_parse_context_parse(context,text,strlen(text),&error);
+ g_markup_parse_context_free(context);
+ */
+
+ }
+
+ }
+
void v3270_activity_list_load(GtkWidget *widget)
{
V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget);
@@ -200,8 +227,11 @@
list->filename = filename;
}
+ reload(widget);
+
g_signal_emit(widget, v3270_activity_list_signals[V3270_ACTIVITY_LIST_HAS_FILE_SIGNAL], 0, (list->filename == NULL ? FALSE : TRUE));
+
}
void v3270_activity_list_save(GtkWidget *widget)
@@ -232,10 +262,10 @@
g_string_append_printf(str,"\t\t\n",v3270_ft_activity_get_remote_filename(activity));
LIB3270_FT_OPTION options = v3270_ft_activity_get_options(activity);
- for(ix = 0; ix < G_N_ELEMENTS(option_list);ix++)
+ for(ix = 0; ix < v3270_activity_list_options[ix].name;ix++)
{
- if(options & option_list[ix].option)
- g_string_append_printf(str,"\t\t\n",option_list[ix].name,option_list[ix].value);
+ if(options & v3270_activity_list_options[ix].option)
+ g_string_append_printf(str,"\t\t\n",v3270_activity_list_options[ix].name,v3270_activity_list_options[ix].value);
}
for(ix=0;ix