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