FrameworkListener.cpp revision 7e8529a8b528fd30586aa037f15a31b29582c537
1168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat/* 2168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * Copyright (C) 2008 The Android Open Source Project 3168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * 4168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * you may not use this file except in compliance with the License. 6168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * You may obtain a copy of the License at 7168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * 8168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * 10168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * Unless required by applicable law or agreed to in writing, software 11168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * See the License for the specific language governing permissions and 14168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat * limitations under the License. 15168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat */ 16168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <errno.h> 173d40729054803fae1c4d4bb5ac7554665a132b26San Mehat#include <string.h> 18168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 19168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#define LOG_TAG "FrameworkListener" 20168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 21168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <cutils/log.h> 22168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 23168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <sysutils/FrameworkListener.h> 24168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <sysutils/FrameworkCommand.h> 25fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <sysutils/SocketClient.h> 26168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 27168415b822cae1f8b54ef09c41c11a9b97b87f40San MehatFrameworkListener::FrameworkListener(const char *socketName) : 28168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat SocketListener(socketName, true) { 29168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat mCommands = new FrameworkCommandCollection(); 30168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat} 31168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 32fa644ffe944c01a9b00f8d7676d58394fabee285San Mehatbool FrameworkListener::onDataAvailable(SocketClient *c) { 33d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat char buffer[255]; 34168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat int len; 35168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 36fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat if ((len = read(c->getSocket(), buffer, sizeof(buffer) -1)) < 0) { 377e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGE("read() failed (%s)", strerror(errno)); 38168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat return errno; 39c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat } else if (!len) 40168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat return false; 41168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 42d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat int offset = 0; 43168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat int i; 44168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 45168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat for (i = 0; i < len; i++) { 46c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat if (buffer[i] == '\0') { 47d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat dispatchCommand(c, buffer + offset); 48d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat offset = i + 1; 49168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 50168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 51168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat return true; 52168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat} 53168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 54168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatvoid FrameworkListener::registerCmd(FrameworkCommand *cmd) { 55168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat mCommands->push_back(cmd); 56168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat} 57168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 58c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehatvoid FrameworkListener::dispatchCommand(SocketClient *cli, char *data) { 59c4a895b7094461c98101924cf096680bfb7856f1San Mehat FrameworkCommandCollection::iterator i; 60c4a895b7094461c98101924cf096680bfb7856f1San Mehat int argc = 0; 61c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat char *argv[FrameworkListener::CMD_ARGS_MAX]; 62c4a895b7094461c98101924cf096680bfb7856f1San Mehat char tmp[255]; 63c4a895b7094461c98101924cf096680bfb7856f1San Mehat char *p = data; 64c4a895b7094461c98101924cf096680bfb7856f1San Mehat char *q = tmp; 65c4a895b7094461c98101924cf096680bfb7856f1San Mehat bool esc = false; 66c4a895b7094461c98101924cf096680bfb7856f1San Mehat bool quote = false; 67c4a895b7094461c98101924cf096680bfb7856f1San Mehat int k; 68c4a895b7094461c98101924cf096680bfb7856f1San Mehat 69c4a895b7094461c98101924cf096680bfb7856f1San Mehat memset(argv, 0, sizeof(argv)); 70c4a895b7094461c98101924cf096680bfb7856f1San Mehat memset(tmp, 0, sizeof(tmp)); 71c4a895b7094461c98101924cf096680bfb7856f1San Mehat while(*p) { 72c4a895b7094461c98101924cf096680bfb7856f1San Mehat if (*p == '\\') { 73c4a895b7094461c98101924cf096680bfb7856f1San Mehat if (esc) { 74c4a895b7094461c98101924cf096680bfb7856f1San Mehat *q++ = '\\'; 75c4a895b7094461c98101924cf096680bfb7856f1San Mehat esc = false; 76c4a895b7094461c98101924cf096680bfb7856f1San Mehat } else 77c4a895b7094461c98101924cf096680bfb7856f1San Mehat esc = true; 78c4a895b7094461c98101924cf096680bfb7856f1San Mehat p++; 79c4a895b7094461c98101924cf096680bfb7856f1San Mehat continue; 80c4a895b7094461c98101924cf096680bfb7856f1San Mehat } else if (esc) { 81c4a895b7094461c98101924cf096680bfb7856f1San Mehat if (*p == '"') 82c4a895b7094461c98101924cf096680bfb7856f1San Mehat *q++ = '"'; 83c4a895b7094461c98101924cf096680bfb7856f1San Mehat else if (*p == '\\') 84c4a895b7094461c98101924cf096680bfb7856f1San Mehat *q++ = '\\'; 85c4a895b7094461c98101924cf096680bfb7856f1San Mehat else { 86c4a895b7094461c98101924cf096680bfb7856f1San Mehat cli->sendMsg(500, "Unsupported escape sequence", false); 87c4a895b7094461c98101924cf096680bfb7856f1San Mehat goto out; 88c4a895b7094461c98101924cf096680bfb7856f1San Mehat } 89c4a895b7094461c98101924cf096680bfb7856f1San Mehat p++; 90c4a895b7094461c98101924cf096680bfb7856f1San Mehat esc = false; 91c4a895b7094461c98101924cf096680bfb7856f1San Mehat continue; 92c4a895b7094461c98101924cf096680bfb7856f1San Mehat } 93c4a895b7094461c98101924cf096680bfb7856f1San Mehat 94c4a895b7094461c98101924cf096680bfb7856f1San Mehat if (*p == '"') { 95c4a895b7094461c98101924cf096680bfb7856f1San Mehat if (quote) 96c4a895b7094461c98101924cf096680bfb7856f1San Mehat quote = false; 97c4a895b7094461c98101924cf096680bfb7856f1San Mehat else 98c4a895b7094461c98101924cf096680bfb7856f1San Mehat quote = true; 99c4a895b7094461c98101924cf096680bfb7856f1San Mehat p++; 100c4a895b7094461c98101924cf096680bfb7856f1San Mehat continue; 101c4a895b7094461c98101924cf096680bfb7856f1San Mehat } 102c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat 103c4a895b7094461c98101924cf096680bfb7856f1San Mehat *q = *p++; 104c4a895b7094461c98101924cf096680bfb7856f1San Mehat if (!quote && *q == ' ') { 105c4a895b7094461c98101924cf096680bfb7856f1San Mehat *q = '\0'; 106c4a895b7094461c98101924cf096680bfb7856f1San Mehat argv[argc++] = strdup(tmp); 107c4a895b7094461c98101924cf096680bfb7856f1San Mehat memset(tmp, 0, sizeof(tmp)); 108c4a895b7094461c98101924cf096680bfb7856f1San Mehat q = tmp; 109c4a895b7094461c98101924cf096680bfb7856f1San Mehat continue; 110c4a895b7094461c98101924cf096680bfb7856f1San Mehat } 111c4a895b7094461c98101924cf096680bfb7856f1San Mehat q++; 112fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat } 113fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 114c4a895b7094461c98101924cf096680bfb7856f1San Mehat argv[argc++] = strdup(tmp); 115c4a895b7094461c98101924cf096680bfb7856f1San Mehat#if 0 116c4a895b7094461c98101924cf096680bfb7856f1San Mehat for (k = 0; k < argc; k++) { 1177e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("arg[%d] = '%s'", k, argv[k]); 118c4a895b7094461c98101924cf096680bfb7856f1San Mehat } 119c4a895b7094461c98101924cf096680bfb7856f1San Mehat#endif 120168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 121c4a895b7094461c98101924cf096680bfb7856f1San Mehat if (quote) { 122c4a895b7094461c98101924cf096680bfb7856f1San Mehat cli->sendMsg(500, "Unclosed quotes error", false); 123c4a895b7094461c98101924cf096680bfb7856f1San Mehat goto out; 124c4a895b7094461c98101924cf096680bfb7856f1San Mehat } 125c4a895b7094461c98101924cf096680bfb7856f1San Mehat 126168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat for (i = mCommands->begin(); i != mCommands->end(); ++i) { 127168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat FrameworkCommand *c = *i; 128168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 129c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat if (!strcmp(argv[0], c->getCommand())) { 130c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat if (c->runCommand(cli, argc, argv)) { 1317e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGW("Handler '%s' error (%s)", c->getCommand(), strerror(errno)); 132168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 133c4a895b7094461c98101924cf096680bfb7856f1San Mehat goto out; 134168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 135168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 136168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 137d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat cli->sendMsg(500, "Command not recognized", false); 138c4a895b7094461c98101924cf096680bfb7856f1San Mehatout: 139c4a895b7094461c98101924cf096680bfb7856f1San Mehat int j; 140c4a895b7094461c98101924cf096680bfb7856f1San Mehat for (j = 0; j < argc; j++) 141c4a895b7094461c98101924cf096680bfb7856f1San Mehat free(argv[j]); 142fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat return; 143168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat} 144