Commit a6c60ba3bd5d7b1f363574ad2b90ae1c29ff5da2

Authored by perry.werneck@gmail.com
1 parent a3fdfc93

Adding trace support on rexx plugin

Makefile.in
... ... @@ -311,6 +311,7 @@ install-sdk:
311 311  
312 312 @$(MKDIR) $(DESTDIR)$(includedir)/pw3270
313 313 @$(INSTALL_DATA) src/include/pw3270/v3270.h $(DESTDIR)/$(includedir)/pw3270
  314 + @$(INSTALL_DATA) src/include/pw3270/trace.h $(DESTDIR)/$(includedir)/pw3270
314 315 @$(INSTALL_DATA) src/include/pw3270.h $(DESTDIR)/$(includedir)
315 316  
316 317 @$(MKDIR) $(DESTDIR)/$(libdir)/pkgconfig
... ...
src/include/pw3270/trace.h
... ... @@ -53,6 +53,7 @@
53 53 LIB3270_EXPORT void pw3270_trace_vprintf(GtkWidget *widget, const char *fmt, va_list args);
54 54 LIB3270_EXPORT void pw3270_trace_printf(GtkWidget *widget, const char *fmt, ... );
55 55 LIB3270_EXPORT gchar * pw3270_trace_get_command(GtkWidget *widget);
  56 + LIB3270_EXPORT void pw3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on);
56 57  
57 58 G_END_DECLS
58 59  
... ...
src/plugins/rx3270/pluginmain.cc
... ... @@ -45,6 +45,7 @@
45 45 #include <pw3270.h>
46 46 #include <pw3270/plugin.h>
47 47 #include <pw3270/v3270.h>
  48 + #include <pw3270/trace.h>
48 49 #include <lib3270/actions.h>
49 50 #include <lib3270/log.h>
50 51 #include <pw3270/class.h>
... ... @@ -65,6 +66,7 @@
65 66 {
66 67 GtkAction * action;
67 68 GtkWidget * widget;
  69 + GtkWidget * trace;
68 70 const gchar * filename;
69 71 };
70 72  
... ... @@ -135,42 +137,134 @@
135 137  
136 138 /*--[ Running rexx scripts ]---------------------------------------------------------------------------------*/
137 139  
  140 + static void trace_cleanup(GtkWidget *widget, gpointer dunno)
  141 + {
  142 + rexx_application_data *data = (rexx_application_data *) g_object_get_data(G_OBJECT(widget),"rexx_app_data");
  143 +
  144 + trace("%s: data=%p",__FUNCTION__,data);
  145 +
  146 + if(data)
  147 + data->trace = NULL;
  148 +
  149 + }
  150 +
  151 + static GtkWidget * get_trace_window(rexx_application_data *data)
  152 + {
  153 + if(data->trace)
  154 + return data->trace;
  155 +
  156 + data->trace = pw3270_trace_new();
  157 + g_signal_connect(G_OBJECT(data->trace), "destroy",G_CALLBACK(trace_cleanup), NULL);
  158 +
  159 + pw3270_trace_set_destroy_on_close(data->trace,TRUE);
  160 +
  161 + g_object_set_data(G_OBJECT(data->trace),"rexx_app_data",data);
  162 +
  163 + gtk_window_set_title(GTK_WINDOW(data->trace),_("Rexx trace"));
  164 +
  165 + gtk_window_set_transient_for(GTK_WINDOW(data->trace),GTK_WINDOW(gtk_widget_get_toplevel(data->widget)));
  166 + gtk_window_set_destroy_with_parent(GTK_WINDOW(data->trace),TRUE);
  167 +
  168 +
  169 + gtk_window_set_default_size(GTK_WINDOW(data->trace),590,430);
  170 + gtk_widget_show_all(data->trace);
  171 + return data->trace;
  172 + }
  173 +
  174 + static void read_line(struct rexx_application_data *data, PRXSTRING Retstr)
  175 + {
  176 + gchar *value = pw3270_trace_get_command(get_trace_window(data));
  177 +
  178 + if(value)
  179 + {
  180 + if(strlen(value) > (RXAUTOBUFLEN-1))
  181 + {
  182 + Retstr->strptr = (char *) RexxAllocateMemory(strlen(value)+1);
  183 + strcpy(Retstr->strptr,value);
  184 + }
  185 + else
  186 + {
  187 + g_snprintf(Retstr->strptr,RXAUTOBUFLEN-1,"%s",value);
  188 + }
  189 + g_free(value);
  190 + }
  191 + else
  192 + {
  193 + *Retstr->strptr = 0;
  194 + }
  195 +
  196 + Retstr->strlength = strlen(Retstr->strptr);
  197 +
  198 + }
  199 +
138 200 static int REXXENTRY Rexx_IO_exit(RexxExitContext *context, int exitnumber, int subfunction, PEXIT parmBlock)
139 201 {
140   - trace("%s call with ExitNumber: %d Subfunction: %d",__FUNCTION__,(int) exitnumber, (int) subfunction);
  202 +// trace("%s call with ExitNumber: %d Subfunction: %d",__FUNCTION__,(int) exitnumber, (int) subfunction);
141 203  
142   - if(subfunction == RXSIOSAY)
  204 + switch(subfunction)
143 205 {
144   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(((struct rexx_application_data * )context->GetApplicationData())->widget)),
145   - GTK_DIALOG_DESTROY_WITH_PARENT,
146   - GTK_MESSAGE_INFO,
147   - GTK_BUTTONS_OK_CANCEL,
148   - "%s", (((RXSIOSAY_PARM *) parmBlock)->rxsio_string).strptr );
  206 + case RXSIOSAY: // SAY a line to STDOUT
  207 + {
  208 + struct rexx_application_data *data = (struct rexx_application_data *) context->GetApplicationData();
149 209  
150   - gtk_window_set_title(GTK_WINDOW(dialog), _( "Script message" ) );
  210 + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(data->widget)),
  211 + GTK_DIALOG_DESTROY_WITH_PARENT,
  212 + GTK_MESSAGE_INFO,
  213 + GTK_BUTTONS_OK_CANCEL,
  214 + "%s", (((RXSIOSAY_PARM *) parmBlock)->rxsio_string).strptr );
151 215  
152   - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
153   - context->RaiseException0(Rexx_Error_Program_interrupted);
  216 + gtk_window_set_title(GTK_WINDOW(dialog), _( "Script message" ) );
154 217  
155   - gtk_widget_destroy(dialog);
  218 + if(data->trace)
  219 + pw3270_trace_printf(data->trace,"%s\n",(((RXSIOSAY_PARM *) parmBlock)->rxsio_string).strptr);
  220 +
  221 + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
  222 + context->RaiseException0(Rexx_Error_Program_interrupted);
  223 +
  224 + gtk_widget_destroy(dialog);
  225 + }
  226 + break;
  227 +
  228 + case RXSIOTRC: // Trace output
  229 + {
  230 + struct rexx_application_data *data = (struct rexx_application_data *) context->GetApplicationData();
  231 + lib3270_write_log(NULL, "rx3270", "%s", (((RXSIOTRC_PARM *) parmBlock)->rxsio_string).strptr);
  232 + pw3270_trace_printf(get_trace_window(data),"%s\n",(((RXSIOTRC_PARM *) parmBlock)->rxsio_string).strptr);
  233 + }
  234 + break;
  235 +
  236 + case RXSIOTRD: // Read from char stream
  237 + read_line((struct rexx_application_data *) context->GetApplicationData(), & (((RXSIODTR_PARM *) parmBlock)->rxsiodtr_retc) );
  238 + break;
  239 +
  240 + case RXSIODTR: // DEBUG read from char stream
  241 + read_line((struct rexx_application_data *) context->GetApplicationData(), & (((RXSIODTR_PARM *) parmBlock)->rxsiodtr_retc) );
  242 + break;
  243 +
  244 + default:
  245 + return RXEXIT_NOT_HANDLED;
156 246  
157   - return RXEXIT_HANDLED;
158 247 }
159 248  
160   - return RXEXIT_NOT_HANDLED;
  249 + return RXEXIT_HANDLED;
161 250 }
162 251  
163 252 static void call_rexx_script(GtkAction *action, GtkWidget *widget, const gchar *filename)
164 253 {
165 254 const gchar * args = (const gchar *) g_object_get_data(G_OBJECT(action),"args");
166 255  
167   - struct rexx_application_data appdata = { action, widget, filename };
  256 + struct rexx_application_data appdata;
168 257  
169 258 RexxInstance * instance;
170 259 RexxThreadContext * threadContext;
171 260 RexxOption options[25];
172 261 RexxContextExit exits[2];
173 262  
  263 + memset(&appdata,0,sizeof(appdata));
  264 + appdata.action = action;
  265 + appdata.widget = widget;
  266 + appdata.filename = filename;
  267 +
174 268 memset(options,0,sizeof(options));
175 269 memset(exits,0,sizeof(exits));
176 270  
... ... @@ -185,9 +279,6 @@
185 279 options[1].optionName = APPLICATION_DATA;
186 280 options[1].option = (void *) &appdata;
187 281  
188   -// options[0].optionName = LOAD_REQUIRED_LIBRARY;
189   -// options[0].option = "rx3270";
190   -
191 282 rx3270_set_package_option(&options[2]);
192 283  
193 284 options[3].optionName = EXTERNAL_CALL_PATH;
... ... @@ -277,6 +368,12 @@
277 368  
278 369 instance->Terminate();
279 370  
  371 + if(appdata.trace)
  372 + {
  373 + pw3270_trace_printf(appdata.trace,"%s","** Rexx script ends\n");
  374 + g_object_set_data(G_OBJECT(appdata.trace),"rexx_app_data",NULL);
  375 + }
  376 +
280 377 trace("%s ends",__FUNCTION__);
281 378 }
282 379  
... ...
src/plugins/rx3270/rxapimain.cc
... ... @@ -190,9 +190,6 @@ LIB3270_EXPORT void rx3270_set_package_option(RexxOption *option)
190 190 {
191 191 static const RexxLibraryPackage package = { "rx3270", &rx3270_package_entry };
192 192  
193   -// package.registeredName = "rx3270";
194   -// package.table = ;
195   -
196 193 option->optionName = REGISTER_LIBRARY;
197 194 option->option = (void *) &package;
198 195  
... ...
src/plugins/rx3270/sample/clipboard.rex
... ... @@ -5,6 +5,8 @@
5 5 *
6 6 */
7 7  
  8 +trace "?R"
  9 +
8 10 host = .rx3270~new("pw3270:a")
9 11  
10 12 if host~connected() = 0 then
... ...
src/pw3270/trace.c
... ... @@ -55,7 +55,8 @@
55 55 GtkWidget * entry;
56 56 GtkWidget * button;
57 57 gchar **line;
58   - gboolean * enabled;
  58 + gboolean * enabled;
  59 + gboolean destroy_on_close;
59 60 };
60 61  
61 62 const GtkWindowClass * pw3270_trace_get_parent_class(void);
... ... @@ -77,16 +78,20 @@
77 78 pw3270_trace * hwnd = PW3270_TRACE(window);
78 79  
79 80 trace("%s",__FUNCTION__);
  81 +
  82 + if(hwnd->enabled)
  83 + {
  84 + if(*hwnd->line)
  85 + g_free(*hwnd->line);
80 86  
81   - if(*hwnd->line)
82   - g_free(*hwnd->line);
  87 + *hwnd->line = g_strdup(gtk_entry_get_text(GTK_ENTRY(hwnd->entry)));
83 88  
84   - *hwnd->line = g_strdup(gtk_entry_get_text(GTK_ENTRY(hwnd->entry)));
  89 + gtk_widget_set_sensitive(hwnd->entry,FALSE);
  90 + gtk_widget_set_sensitive(hwnd->button,FALSE);
85 91  
86   - gtk_widget_set_sensitive(hwnd->entry,FALSE);
87   - gtk_widget_set_sensitive(hwnd->button,FALSE);
  92 + *hwnd->enabled = FALSE;
  93 + }
88 94  
89   - *hwnd->enabled = FALSE;
90 95 }
91 96  
92 97 #if GTK_CHECK_VERSION(3,0,0)
... ... @@ -96,9 +101,12 @@ static void destroy(GtkObject *widget)
96 101 #endif
97 102 {
98 103 pw3270_trace * hwnd = PW3270_TRACE(widget);
99   -
100   - hwnd->line = NULL;
101   - *hwnd->enabled = FALSE;
  104 +
  105 + if(hwnd->line)
  106 + *hwnd->line = NULL;
  107 +
  108 + if(hwnd->enabled)
  109 + *hwnd->enabled = FALSE;
102 110  
103 111 #if GTK_CHECK_VERSION(3,0,0)
104 112 GTK_WIDGET_CLASS(pw3270_trace_parent_class)->destroy(widget);
... ... @@ -110,10 +118,19 @@ static void destroy(GtkObject *widget)
110 118  
111 119 static gboolean delete_event(GtkWidget *widget, GdkEventAny *event)
112 120 {
113   - pw3270_trace * hwnd = PW3270_TRACE(widget);
114   - trace("%s",__FUNCTION__);
115   - hwnd->line = NULL;
116   - *hwnd->enabled = FALSE;
  121 + pw3270_trace * hwnd = PW3270_TRACE(widget);
  122 +
  123 + trace("%s destroy=%s",__FUNCTION__,hwnd->destroy_on_close ? "Yes" : "No");
  124 +
  125 + if(hwnd->line)
  126 + *hwnd->line = NULL;
  127 +
  128 + if(hwnd->enabled)
  129 + *hwnd->enabled = FALSE;
  130 +
  131 + if(hwnd->destroy_on_close)
  132 + return FALSE;
  133 +
117 134 gtk_widget_hide(widget);
118 135 return TRUE;
119 136 }
... ... @@ -242,6 +259,14 @@ static void destroy(GtkObject *widget)
242 259 {
243 260 gtk_main_iteration();
244 261 }
  262 +
  263 + hwnd->line = NULL;
  264 + hwnd->enabled = NULL;
245 265  
246 266 return line;
247 267 }
  268 +
  269 + LIB3270_EXPORT void pw3270_trace_set_destroy_on_close(GtkWidget *widget,gboolean on)
  270 + {
  271 + PW3270_TRACE(widget)->destroy_on_close = on;
  272 + }
... ...