1168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat/* 223f04107dcedcef22556c1f57502cdddbfa2663fMark Salyzyn * Copyright (C) 2008-2014 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#ifndef _SOCKETLISTENER_H 17168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#define _SOCKETLISTENER_H 18168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 19fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <pthread.h> 20fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 21fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <sysutils/SocketClient.h> 2223f04107dcedcef22556c1f57502cdddbfa2663fMark Salyzyn#include "SocketClientCommand.h" 23fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 24168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatclass SocketListener { 258702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt bool mListen; 26fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat const char *mSocketName; 278702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt int mSock; 28fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat SocketClientCollection *mClients; 29fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_mutex_t mClientsLock; 30fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat int mCtrlPipe[2]; 31fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_t mThread; 328702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt bool mUseCmdNum; 33168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 34168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatpublic: 35cf9e1003ce69a2aea2c64cd82d54a0d3e8917dbbDavid 'Digit' Turner SocketListener(const char *socketName, bool listen); 368702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt SocketListener(const char *socketName, bool listen, bool useCmdNum); 37fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat SocketListener(int socketFd, bool listen); 38168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 39c4a895b7094461c98101924cf096680bfb7856f1San Mehat virtual ~SocketListener(); 40fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat int startListener(); 41581edc1b6c3799238cfb674dfddb97db44f2818eMark Salyzyn int startListener(int backlog); 42fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat int stopListener(); 43fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 44db017545796747115b8797f03e662b0f398a7c7bSan Mehat void sendBroadcast(int code, const char *msg, bool addErrno); 45168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat 4623f04107dcedcef22556c1f57502cdddbfa2663fMark Salyzyn void runOnEachSocket(SocketClientCommand *command); 4723f04107dcedcef22556c1f57502cdddbfa2663fMark Salyzyn 4844b99c22af84331068935a9bc3e807165a88237cMark Salyzyn bool release(SocketClient *c) { return release(c, true); } 4944b99c22af84331068935a9bc3e807165a88237cMark Salyzyn 50168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehatprotected: 51fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat virtual bool onDataAvailable(SocketClient *c) = 0; 52fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 53fa644ffe944c01a9b00f8d7676d58394fabee285San Mehatprivate: 5444b99c22af84331068935a9bc3e807165a88237cMark Salyzyn bool release(SocketClient *c, bool wakeup); 55fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat static void *threadStart(void *obj); 56fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat void runListener(); 578702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt void init(const char *socketName, int socketFd, bool listen, bool useCmdNum); 58168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat}; 59168415b822cae1f8b54ef09c41c11a9b97b87f40San Mehat#endif 60