FrameworkListener.cpp revision 168415b822cae1f8b54ef09c41c11a9b97b87f40
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> 17168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 18168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#define LOG_TAG "FrameworkListener" 19168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 20168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <cutils/log.h> 21168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 22168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <sysutils/FrameworkListener.h> 23168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#include <sysutils/FrameworkCommand.h> 24168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 25168415b822cae1f8b54ef09c41c11a9b97b87f40San MehatFrameworkListener::FrameworkListener(const char *socketName) : 26168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat SocketListener(socketName, true) { 27168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat mCommands = new FrameworkCommandCollection(); 28168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat} 29168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 30168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatbool FrameworkListener::onDataAvailable(int socket) { 31168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat char buffer[101]; 32168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat int len; 33168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 34168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat if ((len = read(socket, buffer, sizeof(buffer) -1)) < 0) { 35168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat LOGE("read() failed (%s)", strerror(errno)); 36168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat return errno; 37168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } else if (!len) { 38168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat LOGW("Lost connection to client"); 39168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat return false; 40168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 41168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 42168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat int start = 0; 43168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat int i; 44168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 45168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat buffer[len] = '\0'; 46168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 47168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat for (i = 0; i < len; i++) { 48168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat if (buffer[i] == '\0') { 49168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat dispatchCommand(buffer + start); 50168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat start = i + 1; 51168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 52168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 53168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat return true; 54168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat} 55168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 56168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatvoid FrameworkListener::registerCmd(FrameworkCommand *cmd) { 57168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat mCommands->push_back(cmd); 58168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat} 59168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 60168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatvoid FrameworkListener::dispatchCommand(char *cmd) { 61168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat FrameworkCommandCollection::iterator i; 62168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 63168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat for (i = mCommands->begin(); i != mCommands->end(); ++i) { 64168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat FrameworkCommand *c = *i; 65168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 66168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat if (!strncmp(cmd, c->getCommand(), strlen(c->getCommand()))) { 67168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat if (c->runCommand(cmd)) { 68168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat LOGW("Handler '%s' error (%s)", c->getCommand(), strerror(errno)); 69168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 70168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat return; 71168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 72168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat } 73168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 74168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat LOGE("No cmd handlers defined for '%s'", cmd); 75168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat} 76168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 77