Ticket #461: spawn.2.diff

File spawn.2.diff, 4.0 KB (added by tryagain, 11 years ago)

Now using attr_to_text function to get textual representation so attributes of virtually any type can be used as parameter for spawn. Also internal command joinstr(separator, arg1, arg2, arg3, ...) added - it joins several strings into one, adding separator between them.

  • navit.c

     
    6666#include "vehicleprofile.h"
    6767#include "sunriset.h"
    6868#include "bookmarks.h"
     69#ifdef HAVE_API_WIN32_BASE
     70#include <windows.h>
     71#include "util.h"
     72#endif
    6973
    7074/**
    7175 * @defgroup navit the navit core instance. navit is the object containing nearly everything: A set of maps, one or more vehicle, a graphics object for rendering the map, a gui object for displaying the user interface, a route object, a navigation object and so on. Be warned that it is theoretically possible to have more than one navit object
     
    941945        }
    942946}
    943947
     948/**
     949 * Join several string attributes into one
     950 *
     951 * @param navit The navit instance
     952 * @param function unused (needed to match command function signiture)
     953 * @param in input attributes in[0] - separator, in[1..] - attributes to join
     954 * @param out output attribute input attributes joined into single string
     955 * @param valid unused
     956 * @returns nothing
     957 */
     958static void
     959navit_cmd_strjoin(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid)
     960{
     961        struct attr attr;
     962        gchar *ret, *sep;
     963        int i;
     964        attr.type=attr_type_string_begin;
     965        attr.u.str=NULL;
     966        if(in[0] && in[1]) {
     967                sep=attr_to_text(in[0],NULL,1);
     968                ret=attr_to_text(in[1],NULL,1);
     969                for(i=2;in[i];i++) {
     970                        gchar *in_i=attr_to_text(in[i],NULL,1);
     971                        gchar *r=g_strjoin(sep,ret,in_i,NULL);
     972                        g_free(in_i);
     973                        g_free(ret);
     974                        ret=r;
     975                }
     976                g_free(sep);
     977                attr.u.str=ret;
     978                if(out) {
     979                        *out=attr_generic_add_attr(*out, &attr);
     980                }
     981                g_free(ret);
     982        }
     983}
     984
     985/**
     986 * Call external program
     987 *
     988 * @param navit The navit instance
     989 * @param function unused (needed to match command function signiture)
     990 * @param in input attributes in[0] - name of executable, in[1..] - parameters
     991 * @param out output attribute unused
     992 * @param valid unused
     993 * @returns nothing
     994 */
     995static void
     996navit_cmd_spawn(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid)
     997{
     998        int i,j, nparms, nvalid;
     999        const char ** spawn_params=NULL;
     1000
     1001        nparms=0;
     1002        nvalid=0;
     1003        if(in) {
     1004                while(in[nparms]) {
     1005                        if (in[nparms]->type!=attr_none)
     1006                                nvalid++;
     1007                        nparms++;
     1008                }
     1009        }
     1010       
     1011        if(nvalid>0) {
     1012                spawn_params=g_new(char*,nvalid+1);
     1013                for(i=0,j=0;in[i];i++) {
     1014                        if(in[i]->type!=attr_none ) {
     1015                                spawn_params[j++]=attr_to_text(in[i],NULL,1);
     1016                        } else {
     1017                                dbg(0,"Parameter #%i is attr_none - skipping\n",i);
     1018                        }
     1019                }
     1020                spawn_params[j]=NULL;
     1021#ifdef USE_EXEC
     1022                if(fork()==0) {
     1023                        execvp(spawn_params[0], spawn_params);
     1024                        /*Shouldn't reach here*/
     1025                        exit(1);
     1026                }
     1027                for(i=0;spawn_params[i];i++)
     1028                        g_free(spawn_params[i]);
     1029                g_free(spawn_params);
     1030                return;
     1031#else
     1032#ifdef HAVE_API_WIN32_BASE
     1033        {
     1034                char *cmdline;
     1035                PROCESS_INFORMATION pr;
     1036                LPCWSTR cmd,args;
     1037                cmdline=g_strjoinv(" ",spawn_params+1);
     1038                cmd = newSysString(spawn_params[0]);
     1039                args=newSysString(cmdline);
     1040                CreateProcess(cmd, args, NULL, NULL, 0, 0, NULL, NULL, NULL, &pr);
     1041                dbg(0, "CreateProcess(%s,%s)\n",spawn_params[0],cmdline);
     1042                g_free(cmdline);
     1043                g_free(cmd);
     1044                g_free(args);
     1045                for(i=0;spawn_params[i];i++)
     1046                        g_free(spawn_params[i]);
     1047                g_free(spawn_params);
     1048                return;
     1049        }
     1050#else
     1051        {
     1052                char *cmdline;
     1053                cmdline=g_strjoinv(" ",spawn_params);
     1054                system(cmdline);
     1055                g_free(cmdline);
     1056                for(i=0;spawn_params[i];i++)
     1057                        g_free(spawn_params[i]);
     1058                g_free(spawn_params);
     1059                return;
     1060        }
     1061#endif
     1062#endif
     1063        for(i=0;spawn_params[i];i++)
     1064                g_free(spawn_params[i]);
     1065        g_free(spawn_params);
     1066        }
     1067}
     1068
     1069
    9441070static struct command_table commands[] = {
    9451071        {"zoom_in",command_cast(navit_cmd_zoom_in)},
    9461072        {"zoom_out",command_cast(navit_cmd_zoom_out)},
     
    9561082        {"pop_int",command_cast(navit_cmd_pop_int)},
    9571083        {"int_stack_size",command_cast(navit_cmd_int_stack_size)},
    9581084        {"toggle_layer",command_cast(navit_cmd_toggle_layer)},
     1085        {"strjoin",command_cast(navit_cmd_strjoin)},
     1086        {"spawn",command_cast(navit_cmd_spawn)},
    9591087};
    9601088       
    9611089void