00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 #include "config.h"
00028 
00029 #include <glib.h>
00030 #include <stdlib.h> 
00031 #include <getopt.h>
00032 #include <string.h>
00033 
00034 #include <liberipc/eripc.h>
00035 
00036 #define DBUS_SERVICE            "com.irexnet.popupmenu"
00037 
00038 static gboolean verbose_flag = FALSE;
00039 int activated_handler = -1;
00040 eripc_context_t *eripcContext = NULL;
00041 
00042 enum cmd_type
00043 {
00044   CMD_UNKNOWN,
00045   CMD_ADD,
00046   CMD_REMOVE,
00047   CMD_SET_STATE,
00048   CMD_SHOW,
00049   CMD_HIDE,
00050   NUM_CMD
00051 };
00052 
00053 enum prop_type
00054 {
00055   PROP_UNKNOWN,
00056   PROP_GROUP,
00057   PROP_STATUSITEM,
00058   PROP_MENUITEM,
00059   PROP_MENU,
00060   NUM_PROP
00061 };
00062 
00063 static const gchar* eripcErrorStr(eripc_error_t errorcode) 
00064 {
00065     switch (errorcode) 
00066     {
00067     case ERIPC_ERROR_SUCCESS:
00068         return "No error (ERIPC_ERROR_SUCCESS)";
00069     case ERIPC_ERROR:
00070         return "Some kind of error occurred (ERIPC_ERROR)";
00071     case ERIPC_ERROR_INVALID:
00072         return "At least one parameter is invalid (ERIPC_ERROR_INVALID)";
00073     case ERIPC_ERROR_OOM:
00074         return "Out of memory error (ERIPC_ERROR_OOM)";
00075     case ERIPC_ERROR_TIMEOUT:
00076         return "Timeout error (ERIPC_ERROR_TIMEOUT)";
00077     default:
00078         return "Unknown/Undefined";
00079     }
00080 }
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123 
00124 
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 
00143 
00144 
00145 static void set_item_state(eripc_context_t *ctx, const char *iname, const char *pname, const char *state) 
00146 {
00147     eripc_error_t result;
00148     
00149     g_return_if_fail(pname != NULL);
00150     g_return_if_fail(state != NULL);
00151     
00152     result = eripc_send_varargs_and_wait(ctx,
00153                                 NULL,
00154                                 ERIPC_BUS_SESSION,
00155                                 DBUS_SERVICE,
00156                                 "setItemState",
00157                                 ERIPC_TYPE_STRING, iname,
00158                                 ERIPC_TYPE_STRING, pname,
00159                                 ERIPC_TYPE_STRING, state,
00160                                 ERIPC_TYPE_INVALID);
00161 
00162     if (result != ERIPC_ERROR_SUCCESS) 
00163    {
00164         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00165     }
00166 }
00167 
00168 
00169 static void set_group_state(eripc_context_t *ctx, const char *pname, const char *state) 
00170 {
00171     eripc_error_t result;
00172     
00173     g_return_if_fail(pname != NULL);
00174     g_return_if_fail(state != NULL);
00175     
00176     result = eripc_send_varargs_and_wait(ctx,
00177                                 NULL,
00178                                 ERIPC_BUS_SESSION,
00179                                 DBUS_SERVICE,
00180                                 "setGroupState",
00181                                 ERIPC_TYPE_STRING, pname,
00182                                 ERIPC_TYPE_STRING, state,
00183                                 ERIPC_TYPE_INVALID);
00184 
00185     if (result != ERIPC_ERROR_SUCCESS) 
00186    {
00187         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00188     }
00189 }
00190 
00191 static void set_popup_state(eripc_context_t *ctx, const char *state) 
00192 {
00193     eripc_error_t result;
00194     
00195     g_return_if_fail(state != NULL);
00196   
00197     result = eripc_send_varargs_and_wait(ctx,
00198                                 NULL,
00199                                 ERIPC_BUS_SESSION,
00200                                 DBUS_SERVICE,
00201                                 "setPopupState",
00202                                 ERIPC_TYPE_STRING, state,
00203                                 ERIPC_TYPE_INVALID);
00204 
00205     if (result != ERIPC_ERROR_SUCCESS) 
00206    {
00207         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00208     }
00209 }
00210 
00211 
00212 static void set_statusitem_state(eripc_context_t *ctx, const char *iname, const char *state) 
00213 {
00214     eripc_error_t result;
00215     
00216     g_return_if_fail(iname != NULL);
00217     g_return_if_fail(state != NULL);
00218 
00219     result = eripc_send_varargs_and_wait(ctx,
00220                                 NULL,
00221                                 ERIPC_BUS_SESSION,
00222                                 DBUS_SERVICE,
00223                                 "setStatusItemState",
00224                                 ERIPC_TYPE_STRING, iname,
00225                                 ERIPC_TYPE_STRING, state,
00226                                 ERIPC_TYPE_INVALID);
00227 
00228     if (result != ERIPC_ERROR_SUCCESS) 
00229    {
00230         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00231     }
00232 }
00233 
00234 
00235 static void show_statusitem(eripc_context_t *ctx, const char *iname) 
00236 {
00237     eripc_error_t result;
00238     
00239     g_return_if_fail(iname != NULL);
00240     
00241     result = eripc_send_varargs_and_wait(ctx,
00242                                 NULL,
00243                                 ERIPC_BUS_SESSION,
00244                                 DBUS_SERVICE,
00245                                 "showStatusItem",
00246                                 ERIPC_TYPE_STRING, iname,
00247                                 ERIPC_TYPE_INVALID);
00248 
00249     if (result != ERIPC_ERROR_SUCCESS) 
00250    {
00251         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00252     }
00253 }
00254 
00255 
00256 static void hide_statusitem(eripc_context_t *ctx, const char *iname) 
00257 {
00258     eripc_error_t result;
00259     
00260     g_return_if_fail(iname != NULL);
00261 
00262     result = eripc_send_varargs_and_wait(ctx,
00263                                 NULL,
00264                                 ERIPC_BUS_SESSION,
00265                                 DBUS_SERVICE,
00266                                 "hideStatusItem",
00267                                 ERIPC_TYPE_STRING, iname,
00268                                 ERIPC_TYPE_INVALID);
00269 
00270     if (result != ERIPC_ERROR_SUCCESS) 
00271    {
00272         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00273     }
00274 }
00275 
00276 
00277 static void remove_group(eripc_context_t *ctx, const char *name) 
00278 {
00279     eripc_error_t result;
00280     
00281     g_return_if_fail(name != NULL);
00282 
00283     result = eripc_send_varargs_and_wait(ctx,
00284                                 NULL,
00285                                 ERIPC_BUS_SESSION,
00286                                 DBUS_SERVICE,
00287                                 "removeGroup",
00288                                 ERIPC_TYPE_STRING, name,
00289                                 ERIPC_TYPE_INVALID);
00290 
00291     if (result != ERIPC_ERROR_SUCCESS) 
00292    {
00293         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00294     }
00295 }
00296 
00297 
00298 static void remove_item(eripc_context_t *ctx, const char *name, const char *parent) 
00299 {
00300     eripc_error_t result;
00301     
00302     g_return_if_fail(name != NULL);
00303 
00304     result = eripc_send_varargs_and_wait(ctx,
00305                                 NULL,
00306                                 ERIPC_BUS_SESSION,
00307                                 DBUS_SERVICE,
00308                                 "removeItem",
00309                                 ERIPC_TYPE_STRING, name,
00310                                 ERIPC_TYPE_STRING, parent,
00311                                 ERIPC_TYPE_INVALID);
00312 
00313     if (result != ERIPC_ERROR_SUCCESS) 
00314    {
00315         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00316     }
00317 }
00318 
00319 static void remove_menu(eripc_context_t *ctx, const char *name) 
00320 {
00321     eripc_error_t result;
00322     
00323     g_return_if_fail(name != NULL);
00324     
00325     result = eripc_send_varargs_and_wait(ctx,
00326                                 NULL,
00327                                 ERIPC_BUS_SESSION,
00328                                 DBUS_SERVICE,
00329                                 "removeMenu",
00330                                 ERIPC_TYPE_STRING, name,
00331                                 ERIPC_TYPE_INVALID);
00332 
00333     if (result != ERIPC_ERROR_SUCCESS) 
00334    {
00335         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00336     }
00337 }
00338 
00339 
00340 static void show_menu(eripc_context_t *ctx, const char *name) 
00341 {
00342     eripc_error_t result;
00343     
00344     g_return_if_fail(name != NULL);
00345         
00346     result = eripc_send_varargs_and_wait(ctx,
00347                                 NULL,
00348                                 ERIPC_BUS_SESSION,
00349                                 DBUS_SERVICE,
00350                                 "showMenu",
00351                                 ERIPC_TYPE_STRING, name,
00352                                 ERIPC_TYPE_INVALID);
00353 
00354     if (result != ERIPC_ERROR_SUCCESS) 
00355     {
00356         g_error("Error launching the RPC (%s)\n", eripcErrorStr(result));
00357     }
00358 }
00359 
00360 void usage()
00361 {
00362     g_print("Usage: %s -r -s -n newstate -i item -g group -m menu -t statusitem\n", "menuapitest");
00363     g_print("\t-r --remove\t\tRemove command, followed by item, group or menu\n");
00364     g_print("\t-s --show\t\tShow command, followed by menu\n");
00365     g_print("\t-n --newstate <newstate>\tSet new state to:\n");
00366     g_print("\t\t\titem:\tNORMAL, SELECTED, DISABLED\n");
00367     g_print("\t\t\tgroup:\tNORMAL, DISABLED\n");
00368     g_print("\t\t\tmenu:\tSHOW, HIDE, TOGGLE\n");
00369     g_print("\t\t\tstatus:\tname of status\n");
00370     g_print("\t-i --item=<item>\tItem to operate command (group must be specified first)\n");
00371     g_print("\t-g --group=<group>\tGroup to operate command\n");
00372     g_print("\t-m --menu[=<menu>]\tMenu to operate command (menu name not required for 'newstate')\n");
00373     g_print("\t-t --statusitem=<statusitem>\tStatus item to operate command\n");
00374     g_print("Example: %s --show --menu=uds_menu_reading\n", "menuapitest");
00375     g_print("Example: %s --newstate=SELECTED --group=system --item=rotate_screen\n", "menuapitest");
00376     g_print("Example: %s --newstate=cha040 --statusitem=battery\n", "menuapitest");
00377     g_print("Example: %s --newstate=TOGGLE --menu\n", "menuapitest");
00378 }
00379 
00380 int main (int argc, char **argv)
00381 {
00382     int c;
00383     
00384     enum cmd_type command = CMD_UNKNOWN;
00385     enum prop_type property = PROP_UNKNOWN;
00386     GMainLoop *gloop = NULL;
00387     GString *iname = NULL;
00388     GString *pname = NULL;
00389     GString *state = NULL;
00390 
00391     gloop = g_main_loop_new(NULL, FALSE);
00392     eripcContext = eripc_init("menuapitest", "1.0", NULL);
00393     if (eripcContext == NULL) 
00394     {
00395        g_error("Failed to initialize IPC API\n");
00396     }
00397 
00398     eripc_set_timeout(eripcContext, 2000);
00399 
00400     while (1)
00401     {
00402        static struct option long_options[] =
00403          {
00404            
00405            {"verbose", no_argument,       &verbose_flag, TRUE},
00406            
00407 
00408            {"remove",   no_argument,       NULL, 'r'},
00409            {"show",     no_argument,       NULL, 's'},
00410            {"hide",     no_argument,       NULL, 'h'},
00411            {"item",     required_argument, NULL, 'i'},
00412            {"group",    required_argument, NULL, 'g'},
00413            {"menu",     optional_argument, NULL, 'm'},
00414            {"newstate", required_argument, NULL, 'n'},
00415            {"statusitem",required_argument,NULL, 't'},
00416            {0, 0, 0, 0}
00417          };
00418        
00419        int option_index = 0;
00420  
00421         c = getopt_long (argc, argv, "rshi:g:n:t:m::", long_options, &option_index);
00422  
00423        
00424        if (c == -1)
00425          break;
00426  
00427        switch (c)
00428          {
00429          case 0:
00430            
00431            if (long_options[option_index].flag != 0)
00432              break;
00433            g_print("option %s", long_options[option_index].name);
00434            if (optarg)
00435              g_print(" with arg %s", optarg);
00436            g_print("\n");
00437            break;
00438  
00439          case 'r':
00440            command = CMD_REMOVE;
00441            g_print("option -r\n");
00442            break;
00443  
00444          case 's':
00445            command = CMD_SHOW;
00446            g_print("option -s\n");
00447            break;
00448  
00449          case 'h':
00450            command = CMD_HIDE;
00451            g_print("option -h\n");
00452            break;
00453                      
00454          case 'i':
00455            if (pname != NULL)
00456            {
00457              g_print("option -i with value `%s'\n", optarg);
00458              property = PROP_MENUITEM;
00459              iname = g_string_new(optarg);
00460            }
00461            else 
00462            {
00463              g_error("option -g must be set before -i\n");
00464            }
00465            break;
00466  
00467          case 't':
00468            g_print("option -t with value `%s'\n", optarg);
00469            property = PROP_STATUSITEM;
00470            iname = g_string_new(optarg);
00471            break;
00472                      
00473          case 'g':
00474            g_print("option -g with value `%s'\n", optarg);
00475            property = PROP_GROUP;
00476            pname = g_string_new(optarg);
00477            break;
00478  
00479          case 'm':
00480            pname = g_string_new(optarg);
00481            if (optarg != NULL)
00482            {
00483                 g_print("option -m with value `%s'\n", optarg);
00484            }
00485            else
00486            {
00487                 g_print("option -m\n");
00488            }
00489                      
00490            if (property==PROP_UNKNOWN) 
00491            {
00492                property = PROP_MENU;
00493            }
00494            break;
00495  
00496          case 'n':
00497            g_print("option -n with value `%s'\n", optarg);
00498            command = CMD_SET_STATE;
00499            state = g_string_new(optarg);
00500            break;
00501  
00502          case '?':
00503            
00504            usage();
00505            break;
00506  
00507          default:
00508            usage();
00509            break;
00510          }
00511     }
00512  
00513    if (verbose_flag)
00514      g_print("verbose flag is set");
00515  
00516    if (optind < argc)
00517      {
00518        g_print("unsupported options: ");
00519        while (optind < argc)
00520          g_print("%s ", argv[optind++]);
00521        g_print("\n");
00522      }
00523  
00524     switch (command)
00525     {
00526     case CMD_REMOVE:
00527       switch (property)
00528       {
00529       case PROP_MENUITEM:
00530         remove_item(eripcContext, iname->str, pname->str);
00531         break;
00532       case PROP_GROUP:
00533         remove_group(eripcContext, pname->str);
00534         break;
00535       case PROP_MENU:
00536         remove_menu(eripcContext, pname->str);
00537         break;
00538       default:
00539         break;
00540       }
00541       break;
00542         
00543     case CMD_SET_STATE:
00544       switch (property)
00545       {
00546       case PROP_STATUSITEM:
00547         set_statusitem_state(eripcContext, iname->str, state->str);
00548         break;
00549       case PROP_MENUITEM:
00550         set_item_state(eripcContext, iname->str, pname->str, state->str);
00551         break;
00552       case PROP_GROUP:
00553         set_group_state(eripcContext, pname->str, state->str);
00554         break;
00555       case PROP_MENU:
00556         set_popup_state(eripcContext, state->str);
00557         break;
00558       default:
00559         break;
00560       }
00561       break;
00562         
00563     case CMD_SHOW:
00564       switch (property)
00565       {
00566       case PROP_MENU:
00567         show_menu(eripcContext, pname->str);     
00568         break;
00569       case PROP_STATUSITEM:
00570         show_statusitem(eripcContext, iname->str);
00571         break;
00572       default:
00573         break;
00574       }
00575       break;
00576         
00577     case CMD_HIDE:
00578       switch (property)
00579       {
00580       case PROP_STATUSITEM:
00581         hide_statusitem(eripcContext, iname->str);
00582         break;
00583       default:
00584         break;
00585       }
00586       break;
00587         
00588     default:
00589       break;
00590     }
00591     
00592     eripcContext = NULL;
00593     return EXIT_SUCCESS;    
00594 }