Commit b349e0c4ee3b86ceac899a0c0734bd30d2a15de3
1 parent
68f3236d
Exists in
master
and in
1 other branch
Reimplementing load of queue from xml file.
Showing
5 changed files
with
168 additions
and
32 deletions
Show diff stats
src/include/v3270/filetransfer.h
| ... | ... | @@ -116,6 +116,8 @@ |
| 116 | 116 | |
| 117 | 117 | LIB3270_EXPORT GObject * v3270_ft_activity_new(); |
| 118 | 118 | |
| 119 | + LIB3270_EXPORT void v3270_ft_activity_set_from_context(GObject * activity, GMarkupParseContext * context); | |
| 120 | + | |
| 119 | 121 | LIB3270_EXPORT const gchar * v3270_ft_activity_get_local_filename(GObject *object); |
| 120 | 122 | LIB3270_EXPORT const gchar * v3270_ft_activity_get_remote_filename(GObject *object); |
| 121 | 123 | LIB3270_EXPORT LIB3270_FT_OPTION v3270_ft_activity_get_options(GObject *object); | ... | ... |
src/v3270ft/activity.c
| ... | ... | @@ -192,3 +192,78 @@ |
| 192 | 192 | G_V3270_FT_ACTIVITY(object)->values[id] = value; |
| 193 | 193 | } |
| 194 | 194 | |
| 195 | + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, V3270FTActivity *activity, GError **error) | |
| 196 | + { | |
| 197 | + if(!g_ascii_strcasecmp(element_name,"file")) | |
| 198 | + { | |
| 199 | + const gchar *type; | |
| 200 | + const gchar *path; | |
| 201 | + | |
| 202 | + if(!g_markup_collect_attributes( | |
| 203 | + element_name,names,values,error, | |
| 204 | + G_MARKUP_COLLECT_STRING, "type", &type, | |
| 205 | + G_MARKUP_COLLECT_STRING, "path", &path, | |
| 206 | + G_MARKUP_COLLECT_INVALID | |
| 207 | + )) { | |
| 208 | + | |
| 209 | + return; | |
| 210 | + | |
| 211 | + } | |
| 212 | + | |
| 213 | + if(g_ascii_strcasecmp(type,"local") == 0) | |
| 214 | + v3270_ft_activity_set_local_filename(G_OBJECT(activity),path); | |
| 215 | + else if(g_ascii_strcasecmp(type,"remote") == 0) | |
| 216 | + v3270_ft_activity_set_remote_filename(G_OBJECT(activity),path); | |
| 217 | + | |
| 218 | + } | |
| 219 | + else if(!g_ascii_strcasecmp(element_name,"option")) | |
| 220 | + { | |
| 221 | + const gchar *name; | |
| 222 | + const gchar *value; | |
| 223 | + | |
| 224 | + if(!g_markup_collect_attributes( | |
| 225 | + element_name,names,values,error, | |
| 226 | + G_MARKUP_COLLECT_STRING, "name", &name, | |
| 227 | + G_MARKUP_COLLECT_STRING, "value", &value, | |
| 228 | + G_MARKUP_COLLECT_INVALID | |
| 229 | + )) { | |
| 230 | + | |
| 231 | + return; | |
| 232 | + | |
| 233 | + } | |
| 234 | + | |
| 235 | + | |
| 236 | + } | |
| 237 | + else if(!g_ascii_strcasecmp(element_name,"parameter")) | |
| 238 | + { | |
| 239 | + const gchar *name; | |
| 240 | + const gchar *value; | |
| 241 | + | |
| 242 | + if(!g_markup_collect_attributes( | |
| 243 | + element_name,names,values,error, | |
| 244 | + G_MARKUP_COLLECT_STRING, "name", &name, | |
| 245 | + G_MARKUP_COLLECT_STRING, "value", &value, | |
| 246 | + G_MARKUP_COLLECT_INVALID | |
| 247 | + )) { | |
| 248 | + | |
| 249 | + return; | |
| 250 | + | |
| 251 | + } | |
| 252 | + | |
| 253 | + } | |
| 254 | + | |
| 255 | + } | |
| 256 | + | |
| 257 | + void v3270_ft_activity_set_from_context(GObject * activity, GMarkupParseContext * context) | |
| 258 | + { | |
| 259 | + static const GMarkupParser parser = { | |
| 260 | + (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **)) element_start, | |
| 261 | + (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **)) NULL, | |
| 262 | + (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) NULL, | |
| 263 | + (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) NULL, | |
| 264 | + (void (*)(GMarkupParseContext *, GError *, gpointer)) NULL | |
| 265 | + }; | |
| 266 | + | |
| 267 | + g_markup_parse_context_push(context,&parser,activity); | |
| 268 | + | |
| 269 | + } | ... | ... |
src/v3270ft/activitylist.c
| ... | ... | @@ -63,32 +63,6 @@ |
| 63 | 63 | |
| 64 | 64 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 65 | 65 | |
| 66 | - static const struct _option_list | |
| 67 | - { | |
| 68 | - LIB3270_FT_OPTION option; | |
| 69 | - const gchar * name; | |
| 70 | - const gchar * value; | |
| 71 | - } | |
| 72 | - option_list[] = | |
| 73 | - { | |
| 74 | - | |
| 75 | - { LIB3270_FT_OPTION_SEND, "type", "send", }, | |
| 76 | - { LIB3270_FT_OPTION_RECEIVE, "type", "receive", }, | |
| 77 | - { LIB3270_FT_OPTION_ASCII, "format", "ascii", }, | |
| 78 | - { LIB3270_FT_OPTION_CRLF, "format", "crlf", }, | |
| 79 | - { LIB3270_FT_OPTION_APPEND, "format", "append", }, | |
| 80 | - { LIB3270_FT_OPTION_REMAP, "format", "remap", }, | |
| 81 | - { LIB3270_FT_OPTION_UNIX, "file-format", "unix", }, | |
| 82 | - { LIB3270_FT_RECORD_FORMAT_DEFAULT, "record-format", "default", }, | |
| 83 | - { LIB3270_FT_RECORD_FORMAT_FIXED, "record-format", "fixed", }, | |
| 84 | - { LIB3270_FT_RECORD_FORMAT_VARIABLE, "record-format", "variable", }, | |
| 85 | - { LIB3270_FT_RECORD_FORMAT_UNDEFINED, "record-format", "undefined", }, | |
| 86 | - { LIB3270_FT_ALLOCATION_UNITS_DEFAULT, "units", "default", }, | |
| 87 | - { LIB3270_FT_ALLOCATION_UNITS_TRACKS, "units", "tracks", }, | |
| 88 | - { LIB3270_FT_ALLOCATION_UNITS_CYLINDERS, "units", "cylinders", }, | |
| 89 | - { LIB3270_FT_ALLOCATION_UNITS_AVBLOCK, "units", "avblock", }, | |
| 90 | - }; | |
| 91 | - | |
| 92 | 66 | static void dispose(GObject *object) |
| 93 | 67 | { |
| 94 | 68 | debug("%s",__FUNCTION__); |
| ... | ... | @@ -183,6 +157,59 @@ |
| 183 | 157 | gtk_list_store_set((GtkListStore *) model, &iter, 0, activity, -1); |
| 184 | 158 | } |
| 185 | 159 | |
| 160 | + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, V3270FTActivityList *widget, GError **error) | |
| 161 | + { | |
| 162 | + if(!g_ascii_strcasecmp(element_name,"entry")) | |
| 163 | + { | |
| 164 | + // Create new activity | |
| 165 | + GObject * activity = v3270_ft_activity_new(); | |
| 166 | + v3270_ft_activity_set_from_context(activity,context); | |
| 167 | + v3270_activity_list_append(GTK_WIDGET(widget), activity); | |
| 168 | + } | |
| 169 | + | |
| 170 | + } | |
| 171 | + | |
| 172 | + static void element_end(GMarkupParseContext *context, const gchar *element_name, G_GNUC_UNUSED void *info,G_GNUC_UNUSED GError **error) | |
| 173 | + { | |
| 174 | + if(!g_ascii_strcasecmp(element_name,"entry")) | |
| 175 | + { | |
| 176 | + g_markup_parse_context_pop(context); | |
| 177 | + } | |
| 178 | + } | |
| 179 | + | |
| 180 | + static void reload(GtkWidget *widget) | |
| 181 | + { | |
| 182 | + static const GMarkupParser parser = { | |
| 183 | + (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **)) element_start, | |
| 184 | + (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **)) element_end, | |
| 185 | + (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) NULL, | |
| 186 | + (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) NULL, | |
| 187 | + (void (*)(GMarkupParseContext *, GError *, gpointer)) NULL | |
| 188 | + }; | |
| 189 | + | |
| 190 | + GError * error = NULL; | |
| 191 | + g_autofree gchar * text = NULL; | |
| 192 | + | |
| 193 | + if(g_file_get_contents(GTK_V3270_FT_ACTIVITY_LIST(widget)->filename,&text,NULL,&error)) { | |
| 194 | + | |
| 195 | + GMarkupParseContext * context = | |
| 196 | + g_markup_parse_context_new( | |
| 197 | + &parser, | |
| 198 | + G_MARKUP_TREAT_CDATA_AS_TEXT|G_MARKUP_PREFIX_ERROR_POSITION, | |
| 199 | + widget, | |
| 200 | + NULL | |
| 201 | + ); | |
| 202 | + | |
| 203 | + /* | |
| 204 | + GMarkupParseContext * context = g_markup_parse_context_new(&parser,G_MARKUP_TREAT_CDATA_AS_TEXT|G_MARKUP_PREFIX_ERROR_POSITION,GTK_V3270FT(widget),NULL); | |
| 205 | + g_markup_parse_context_parse(context,text,strlen(text),&error); | |
| 206 | + g_markup_parse_context_free(context); | |
| 207 | + */ | |
| 208 | + | |
| 209 | + } | |
| 210 | + | |
| 211 | + } | |
| 212 | + | |
| 186 | 213 | void v3270_activity_list_load(GtkWidget *widget) |
| 187 | 214 | { |
| 188 | 215 | V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget); |
| ... | ... | @@ -200,8 +227,11 @@ |
| 200 | 227 | list->filename = filename; |
| 201 | 228 | } |
| 202 | 229 | |
| 230 | + reload(widget); | |
| 231 | + | |
| 203 | 232 | g_signal_emit(widget, v3270_activity_list_signals[V3270_ACTIVITY_LIST_HAS_FILE_SIGNAL], 0, (list->filename == NULL ? FALSE : TRUE)); |
| 204 | 233 | |
| 234 | + | |
| 205 | 235 | } |
| 206 | 236 | |
| 207 | 237 | void v3270_activity_list_save(GtkWidget *widget) |
| ... | ... | @@ -232,10 +262,10 @@ |
| 232 | 262 | g_string_append_printf(str,"\t\t<file type=\'remote\' path=\'%s\' />\n",v3270_ft_activity_get_remote_filename(activity)); |
| 233 | 263 | |
| 234 | 264 | LIB3270_FT_OPTION options = v3270_ft_activity_get_options(activity); |
| 235 | - for(ix = 0; ix < G_N_ELEMENTS(option_list);ix++) | |
| 265 | + for(ix = 0; ix < v3270_activity_list_options[ix].name;ix++) | |
| 236 | 266 | { |
| 237 | - if(options & option_list[ix].option) | |
| 238 | - g_string_append_printf(str,"\t\t<option name=\'%s\' value=\'%s\' />\n",option_list[ix].name,option_list[ix].value); | |
| 267 | + if(options & v3270_activity_list_options[ix].option) | |
| 268 | + g_string_append_printf(str,"\t\t<option name=\'%s\' value=\'%s\' />\n",v3270_activity_list_options[ix].name,v3270_activity_list_options[ix].value); | |
| 239 | 269 | } |
| 240 | 270 | |
| 241 | 271 | for(ix=0;ix<LIB3270_FT_VALUE_COUNT;ix++) { | ... | ... |
src/v3270ft/private.h
| ... | ... | @@ -97,9 +97,17 @@ |
| 97 | 97 | |
| 98 | 98 | }; |
| 99 | 99 | |
| 100 | - extern const struct v3270ft_option ft_option[]; | |
| 101 | - extern const struct v3270ft_type ft_type[]; | |
| 102 | - extern const struct v3270ft_value ft_value[]; | |
| 100 | + struct v3270_activity_list_option | |
| 101 | + { | |
| 102 | + LIB3270_FT_OPTION option; | |
| 103 | + const gchar * name; | |
| 104 | + const gchar * value; | |
| 105 | + }; | |
| 106 | + | |
| 107 | + G_GNUC_INTERNAL extern const struct v3270ft_option ft_option[]; | |
| 108 | + G_GNUC_INTERNAL extern const struct v3270ft_type ft_type[]; | |
| 109 | + G_GNUC_INTERNAL extern const struct v3270ft_value ft_value[]; | |
| 110 | + G_GNUC_INTERNAL extern const struct v3270_activity_list_option v3270_activity_list_options[]; | |
| 103 | 111 | |
| 104 | 112 | #define ENTRY_FILENAME_LENGTH FILENAME_MAX |
| 105 | 113 | struct v3270ft_entry { | ... | ... |
src/v3270ft/tables.c
| ... | ... | @@ -197,3 +197,24 @@ const struct v3270ft_value ft_value[] = { |
| 197 | 197 | |
| 198 | 198 | }; |
| 199 | 199 | |
| 200 | +const struct v3270_activity_list_option v3270_activity_list_options[] = | |
| 201 | +{ | |
| 202 | + | |
| 203 | + { LIB3270_FT_OPTION_SEND, "type", "send" }, | |
| 204 | + { LIB3270_FT_OPTION_RECEIVE, "type", "receive" }, | |
| 205 | + { LIB3270_FT_OPTION_ASCII, "format", "ascii" }, | |
| 206 | + { LIB3270_FT_OPTION_CRLF, "format", "crlf" }, | |
| 207 | + { LIB3270_FT_OPTION_APPEND, "format", "append" }, | |
| 208 | + { LIB3270_FT_OPTION_REMAP, "format", "remap" }, | |
| 209 | + { LIB3270_FT_OPTION_UNIX, "file-format", "unix" }, | |
| 210 | + { LIB3270_FT_RECORD_FORMAT_DEFAULT, "record-format", "default" }, | |
| 211 | + { LIB3270_FT_RECORD_FORMAT_FIXED, "record-format", "fixed" }, | |
| 212 | + { LIB3270_FT_RECORD_FORMAT_VARIABLE, "record-format", "variable" }, | |
| 213 | + { LIB3270_FT_RECORD_FORMAT_UNDEFINED, "record-format", "undefined" }, | |
| 214 | + { LIB3270_FT_ALLOCATION_UNITS_DEFAULT, "units", "default" }, | |
| 215 | + { LIB3270_FT_ALLOCATION_UNITS_TRACKS, "units", "tracks" }, | |
| 216 | + { LIB3270_FT_ALLOCATION_UNITS_CYLINDERS, "units", "cylinders" }, | |
| 217 | + { LIB3270_FT_ALLOCATION_UNITS_AVBLOCK, "units", "avblock" }, | |
| 218 | + { 0, NULL, NULL } | |
| 219 | +}; | |
| 220 | + | ... | ... |