Commit a85d5f9660294b4d9852a091da45db0617f5bc6a

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

Trabalhando na inicializacao do interpretador rexx

src/plugins/rx3270/pluginmain.cc
... ... @@ -25,6 +25,11 @@
25 25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26 26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27 27 *
  28 + * Referencias:
  29 + *
  30 + * * http://www.oorexx.org/docs/rexxpg/x14097.htm
  31 + * * http://www.oorexx.org/docs/rexxpg/c2539.htm
  32 + *
28 33 */
29 34  
30 35 #define ENABLE_NLS
... ... @@ -217,8 +222,96 @@
217 222 extern "C"
218 223 {
219 224  
220   - static void call_rexx_script(const gchar *filename)
  225 + static RXSTRING * build_args(const gchar **arg, size_t *argc)
  226 + {
  227 + size_t sz = g_strv_length((gchar **)arg);
  228 + size_t szText = 0;
  229 + gchar * ptr;
  230 + int f;
  231 + RXSTRING * rxArgs;
  232 +
  233 + for(f=0;f< (int) sz;f++)
  234 + szText += strlen(arg[f])+1;
  235 +
  236 + *argc = sz;
  237 + rxArgs = (RXSTRING *) g_malloc0((sizeof(RXSTRING) * (sz+1))+szText);
  238 + ptr = (gchar *) &(rxArgs[sz+1]);
  239 +
  240 + for(f=0;f< (int) sz;f++)
  241 + {
  242 + strcpy(ptr,arg[f]);
  243 +
  244 + rxArgs[f].strptr = ptr;
  245 + rxArgs[f].strlength = strlen(ptr);
  246 + ptr += ((size_t) rxArgs[f].strlength+1);
  247 + }
  248 +
  249 + return rxArgs;
  250 + }
  251 +
  252 + static void call_rexx_script(GtkAction *action, GtkWidget *widget, const gchar *filename)
221 253 {
  254 + gchar * args = (gchar *) g_object_get_data(G_OBJECT(action),"args");
  255 +
  256 + RXSTRING * rxArgs;
  257 + int ret;
  258 + short rc;
  259 + size_t argc = 0;
  260 + RXSTRING retstr;
  261 + unsigned char userArea[10];
  262 +
  263 + if(args)
  264 + {
  265 + gchar ** arg = g_strsplit(args,",",-1);
  266 + rxArgs = build_args((const gchar **)arg,&argc);
  267 + g_strfreev(arg);
  268 + }
  269 + else
  270 + {
  271 + static const gchar *arg[] = { "", NULL };
  272 + rxArgs = build_args(arg,&argc);
  273 + }
  274 +
  275 + // set up default return
  276 + memset(&retstr,0,sizeof(retstr));
  277 +
  278 + memset(userArea,' ',10);
  279 + userArea[9] = 0;
  280 +
  281 + ret = RexxStart( argc, // argument count
  282 + (PCONSTRXSTRING) rxArgs, // argument array
  283 + (char *) filename, // REXX procedure name
  284 + (PRXSTRING) 0, // no instore used
  285 + PACKAGE_NAME, // default address name
  286 + RXCOMMAND, // calling as a subcommand
  287 + NULL, // EXITs for this call
  288 + &rc, // converted return code
  289 + &retstr); // returned result
  290 +
  291 + if(ret)
  292 + {
  293 + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  294 + GTK_DIALOG_DESTROY_WITH_PARENT,
  295 + GTK_MESSAGE_ERROR,
  296 + GTK_BUTTONS_CANCEL,
  297 + "%s", _( "Can't start script" ));
  298 +
  299 + gtk_window_set_title(GTK_WINDOW(dialog),_( "Startup error" ));
  300 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),_("Error %d starting rexx script"),ret);
  301 +
  302 + gtk_dialog_run(GTK_DIALOG (dialog));
  303 + gtk_widget_destroy(dialog);
  304 +
  305 + }
  306 + else
  307 + {
  308 + RexxWaitForTermination();
  309 + }
  310 +
  311 + if(RXSTRPTR(retstr))
  312 + RexxFreeMemory(RXSTRPTR(retstr));
  313 +
  314 + g_free(rxArgs);
222 315  
223 316 }
224 317  
... ... @@ -249,7 +342,7 @@ extern &quot;C&quot;
249 342 if(filename)
250 343 {
251 344 // Has filename, call it directly
252   - call_rexx_script(filename);
  345 + call_rexx_script(action,widget,filename);
253 346 }
254 347 else
255 348 {
... ... @@ -280,7 +373,7 @@ extern &quot;C&quot;
280 373  
281 374 if(filename)
282 375 {
283   - call_rexx_script(filename);
  376 + call_rexx_script(action,widget,filename);
284 377 g_free(filename);
285 378 }
286 379  
... ...
src/plugins/rx3270/rxapimain.cc
... ... @@ -207,3 +207,5 @@ int rx3270::wait_for_text_at(int row, int col, const char *key, int timeout)
207 207  
208 208 return ETIMEDOUT;
209 209 }
  210 +
  211 +
... ...