service.cpp revision 94afecf4b6f437b3ee9a076242402e421c6c07a6
194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood/* 294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * Command line access to services. 394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood * 494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood */ 594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <binder/Parcel.h> 794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <binder/ProcessState.h> 894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <binder/IServiceManager.h> 994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <utils/TextOutput.h> 1094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 1194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <getopt.h> 1294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <stdlib.h> 1394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <stdio.h> 1494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <string.h> 1594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <unistd.h> 1694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood#include <sys/time.h> 1794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 1894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodusing namespace android; 1994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 2094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodvoid writeString16(Parcel& parcel, const char* string) 2194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{ 2294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (string != NULL) 2394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 2494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood parcel.writeString16(String16(string)); 2594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 2694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood else 2794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 2894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood parcel.writeInt32(-1); 2994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 3094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 3194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 3294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood// get the name of the generic interface we hold a reference to 3394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodstatic String16 get_interface_name(sp<IBinder> service) 3494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{ 3594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (service != NULL) { 3694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood Parcel data, reply; 3794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood status_t err = service->transact(IBinder::INTERFACE_TRANSACTION, data, &reply); 3894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (err == NO_ERROR) { 3994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood return reply.readString16(); 4094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 4194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 4294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood return String16(); 4394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 4494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 4594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodstatic String8 good_old_string(const String16& src) 4694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{ 4794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood String8 name8; 4894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char ch8[2]; 4994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood ch8[1] = 0; 5094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood for (unsigned j = 0; j < src.size(); j++) { 5194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char16_t ch = src[j]; 5294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (ch < 128) ch8[0] = (char)ch; 5394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood name8.append(ch8); 5494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 5594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood return name8; 5694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 5794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 5894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwoodint main(int argc, char* const argv[]) 5994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood{ 6094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood sp<IServiceManager> sm = defaultServiceManager(); 6194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood fflush(stdout); 6294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (sm == NULL) { 6394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: Unable to get default service manager!" << endl; 6494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood return 20; 6594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 6694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 6794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood bool wantsUsage = false; 6894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood int result = 0; 6994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 7094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood while (1) { 7194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood int ic = getopt(argc, argv, "h?"); 7294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (ic < 0) 7394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood break; 7494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 7594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood switch (ic) { 7694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood case 'h': 7794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood case '?': 7894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood wantsUsage = true; 7994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood break; 8094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood default: 8194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: Unknown option -" << ic << endl; 8294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood wantsUsage = true; 8394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood result = 10; 8494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood break; 8594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 8694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 8794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 8894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (optind >= argc) { 8994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood wantsUsage = true; 9094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else if (!wantsUsage) { 9194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (strcmp(argv[optind], "check") == 0) { 9294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood optind++; 9394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (optind < argc) { 9494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood sp<IBinder> service = sm->checkService(String16(argv[optind])); 9594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aout << "Service " << argv[optind] << 9694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood (service == NULL ? ": not found" : ": found") << endl; 9794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else { 9894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: No service specified for check" << endl; 9994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood wantsUsage = true; 10094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood result = 10; 10194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 10294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 10394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood else if (strcmp(argv[optind], "list") == 0) { 10494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood Vector<String16> services = sm->listServices(); 10594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aout << "Found " << services.size() << " services:" << endl; 10694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood for (unsigned i = 0; i < services.size(); i++) { 10794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood String16 name = services[i]; 10894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood sp<IBinder> service = sm->checkService(name); 10994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aout << i 11094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << "\t" << good_old_string(name) 11194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << ": [" << good_old_string(get_interface_name(service)) << "]" 11294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << endl; 11394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 11494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else if (strcmp(argv[optind], "call") == 0) { 11594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood optind++; 11694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (optind+1 < argc) { 11794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood int serviceArg = optind; 11894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood sp<IBinder> service = sm->checkService(String16(argv[optind++])); 11994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood String16 ifName = get_interface_name(service); 12094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood int32_t code = atoi(argv[optind++]); 12194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (service != NULL && ifName.size() > 0) { 12294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood Parcel data, reply; 12394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 12494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // the interface name is first 12594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood data.writeInterfaceToken(ifName); 12694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 12794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // then the rest of the call arguments 12894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood while (optind < argc) { 12994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (strcmp(argv[optind], "i32") == 0) { 13094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood optind++; 13194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (optind >= argc) { 13294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: no integer supplied for 'i32'" << endl; 13394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood wantsUsage = true; 13494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood result = 10; 13594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood break; 13694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 13794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood data.writeInt32(atoi(argv[optind++])); 13894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else if (strcmp(argv[optind], "s16") == 0) { 13994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood optind++; 14094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (optind >= argc) { 14194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: no string supplied for 's16'" << endl; 14294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood wantsUsage = true; 14394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood result = 10; 14494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood break; 14594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 14694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood data.writeString16(String16(argv[optind++])); 14794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else if (strcmp(argv[optind], "null") == 0) { 14894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood optind++; 14994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood data.writeStrongBinder(NULL); 15094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else if (strcmp(argv[optind], "intent") == 0) { 15194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 15294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char* action = NULL; 15394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char* dataArg = NULL; 15494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char* type = NULL; 15594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood int launchFlags = 0; 15694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char* component = NULL; 15794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood int categoryCount = 0; 15894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char* categories[16]; 15994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 16094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char* context1 = NULL; 16194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 16294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood optind++; 16394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 16494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood while (optind < argc) 16594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 16694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char* key = strtok_r(argv[optind], "=", &context1); 16794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char* value = strtok_r(NULL, "=", &context1); 16894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 16994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // we have reached the end of the XXX=XXX args. 17094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (key == NULL) break; 17194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 17294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (strcmp(key, "action") == 0) 17394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 17494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood action = value; 17594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 17694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood else if (strcmp(key, "data") == 0) 17794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 17894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood dataArg = value; 17994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 18094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood else if (strcmp(key, "type") == 0) 18194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 18294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood type = value; 18394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 18494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood else if (strcmp(key, "launchFlags") == 0) 18594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 18694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood launchFlags = atoi(value); 18794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 18894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood else if (strcmp(key, "component") == 0) 18994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 19094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood component = value; 19194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 19294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood else if (strcmp(key, "categories") == 0) 19394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 19494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood char* context2 = NULL; 19594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood int categoryCount = 0; 19694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood categories[categoryCount] = strtok_r(value, ",", &context2); 19794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 19894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood while (categories[categoryCount] != NULL) 19994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 20094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood categoryCount++; 20194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood categories[categoryCount] = strtok_r(NULL, ",", &context2); 20294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 20394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 20494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 20594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood optind++; 20694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 20794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 20894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood writeString16(data, action); 20994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood writeString16(data, dataArg); 21094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood writeString16(data, type); 21194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood data.writeInt32(launchFlags); 21294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood writeString16(data, component); 21394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 21494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (categoryCount > 0) 21594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 21694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood data.writeInt32(categoryCount); 21794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood for (int i = 0 ; i < categoryCount ; i++) 21894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 21994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood writeString16(data, categories[i]); 22094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 22194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 22294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood else 22394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood { 22494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood data.writeInt32(0); 22594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 22694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 22794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood // for now just set the extra field to be null. 22894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood data.writeInt32(-1); 22994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else { 23094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: unknown option " << argv[optind] << endl; 23194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood wantsUsage = true; 23294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood result = 10; 23394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood break; 23494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 23594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 23694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 23794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood service->transact(code, data, &reply); 23894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aout << "Result: " << reply << endl; 23994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else { 24094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: Service " << argv[serviceArg] 24194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood << " does not exist" << endl; 24294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood result = 10; 24394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 24494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else { 24594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (optind < argc) { 24694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: No service specified for call" << endl; 24794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else { 24894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: No code specified for call" << endl; 24994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 25094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood wantsUsage = true; 25194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood result = 10; 25294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 25394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } else { 25494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aerr << "service: Unknown command " << argv[optind] << endl; 25594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood wantsUsage = true; 25694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood result = 10; 25794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 25894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 25994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 26094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood if (wantsUsage) { 26194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood aout << "Usage: service [-h|-?]\n" 26294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood " service list\n" 26394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood " service check SERVICE\n" 26494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood " service call SERVICE CODE [i32 INT | s16 STR] ...\n" 26594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood "Options:\n" 26694afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood " i32: Write the integer INT into the send parcel.\n" 26794afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood " s16: Write the UTF-16 string STR into the send parcel.\n"; 26894afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood// " intent: Write and Intent int the send parcel. ARGS can be\n" 26994afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood// " action=STR data=STR type=STR launchFlags=INT component=STR categories=STR[,STR,...]\n"; 27094afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood return result; 27194afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood } 27294afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 27394afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood return result; 27494afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood} 27594afecf4b6f437b3ee9a076242402e421c6c07a6Mike Lockwood 276