FrameworkListener.cpp revision c73a3a5771a2d29d1bae666bfde12f751d66fc96
1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16#include <errno.h> 17#include <string.h> 18 19#define LOG_TAG "FrameworkListener" 20 21#include <cutils/log.h> 22 23#include <sysutils/FrameworkListener.h> 24#include <sysutils/FrameworkCommand.h> 25#include <sysutils/SocketClient.h> 26 27FrameworkListener::FrameworkListener(const char *socketName) : 28 SocketListener(socketName, true) { 29 mCommands = new FrameworkCommandCollection(); 30} 31 32bool FrameworkListener::onDataAvailable(SocketClient *c) { 33 char buffer[255]; 34 int len; 35 36 if ((len = read(c->getSocket(), buffer, sizeof(buffer) -1)) < 0) { 37 LOGE("read() failed (%s)", strerror(errno)); 38 return errno; 39 } else if (!len) 40 return false; 41 42 int offset = 0; 43 int i; 44 45 for (i = 0; i < len; i++) { 46 if (buffer[i] == '\0') { 47 dispatchCommand(c, buffer + offset); 48 offset = i + 1; 49 } 50 } 51 return true; 52} 53 54void FrameworkListener::registerCmd(FrameworkCommand *cmd) { 55 mCommands->push_back(cmd); 56} 57 58void FrameworkListener::dispatchCommand(SocketClient *cli, char *data) { 59 int argc; 60 char *argv[FrameworkListener::CMD_ARGS_MAX]; 61 62 if (!index(data, '"')) { 63 char *next = data; 64 char *field; 65 int i; 66 67 for (i = 0; (i < FrameworkListener::CMD_ARGS_MAX) && 68 (argv[i] = strsep(&next, " ")); i++); 69 argc = i+1; 70 } else { 71 LOGD("blehhh not supported"); 72 return; 73 } 74 75 FrameworkCommandCollection::iterator i; 76 77 for (i = mCommands->begin(); i != mCommands->end(); ++i) { 78 FrameworkCommand *c = *i; 79 80 if (!strcmp(argv[0], c->getCommand())) { 81 if (c->runCommand(cli, argc, argv)) { 82 LOGW("Handler '%s' error (%s)", c->getCommand(), strerror(errno)); 83 } 84 return; 85 } 86 } 87 88 cli->sendMsg(500, "Command not recognized", false); 89 return; 90} 91