FrameworkListener.cpp revision 03f0d27f6c49530a91402ed42f8ca4b2fda04b9f
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 LOGW("Lost connection to client"); 41 return false; 42 } 43 44 int offset = 0; 45 int i; 46 47 for (i = 0; i < len; i++) { 48 if (buffer[i] == '\n') { 49 buffer[i] = '\0'; 50 dispatchCommand(c, buffer + offset); 51 offset = i + 1; 52 } 53 } 54 return true; 55} 56 57void FrameworkListener::registerCmd(FrameworkCommand *cmd) { 58 mCommands->push_back(cmd); 59} 60 61void FrameworkListener::dispatchCommand(SocketClient *cli, char *cmd) { 62 char *next = cmd; 63 char *cm; 64 char *arg; 65 66 if (!(cm = strsep(&next, ":"))) { 67 cli->sendMsg(500, "Malformatted message", false); 68 return; 69 } 70 71 FrameworkCommandCollection::iterator i; 72 73 for (i = mCommands->begin(); i != mCommands->end(); ++i) { 74 FrameworkCommand *c = *i; 75 76 if (!strcmp(cm, c->getCommand())) { 77 if (c->runCommand(cli, next)) { 78 LOGW("Handler '%s' error (%s)", c->getCommand(), strerror(errno)); 79 } 80 return; 81 } 82 } 83 84 cli->sendMsg(500, "Command not recognized", false); 85 return; 86} 87