SocketClient.h revision 8702bb17f40022e970e8acd40b348d074e39afc7
1fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#ifndef _SOCKET_CLIENT_H 2fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#define _SOCKET_CLIENT_H 3fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 4fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include "../../../frameworks/base/include/utils/List.h" 5fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 6fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <pthread.h> 78702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt#include <cutils/atomic.h> 830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root#include <sys/types.h> 9fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 10fa644ffe944c01a9b00f8d7676d58394fabee285San Mehatclass SocketClient { 11fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat int mSocket; 124520246d3534c087f3e9253c34f99dd1e45b7bd7Xianzhu Wang bool mSocketOwned; 13fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_mutex_t mWriteMutex; 14fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 1530abb7234de2a9caa1add4b00a189436f0b24560Kenny Root /* Peer process ID */ 1630abb7234de2a9caa1add4b00a189436f0b24560Kenny Root pid_t mPid; 1730abb7234de2a9caa1add4b00a189436f0b24560Kenny Root 1830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root /* Peer user ID */ 1930abb7234de2a9caa1add4b00a189436f0b24560Kenny Root uid_t mUid; 2030abb7234de2a9caa1add4b00a189436f0b24560Kenny Root 2130abb7234de2a9caa1add4b00a189436f0b24560Kenny Root /* Peer group ID */ 2230abb7234de2a9caa1add4b00a189436f0b24560Kenny Root gid_t mGid; 2330abb7234de2a9caa1add4b00a189436f0b24560Kenny Root 24648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick /* Reference count (starts at 1) */ 25648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick pthread_mutex_t mRefCountMutex; 26648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick int mRefCount; 27648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick 288702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt int mCmdNum; 298702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt 308702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt bool mUseCmdNum; 318702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt 32fa644ffe944c01a9b00f8d7676d58394fabee285San Mehatpublic: 334520246d3534c087f3e9253c34f99dd1e45b7bd7Xianzhu Wang SocketClient(int sock, bool owned); 348702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt SocketClient(int sock, bool owned, bool useCmdNum); 354520246d3534c087f3e9253c34f99dd1e45b7bd7Xianzhu Wang virtual ~SocketClient(); 36fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 37fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat int getSocket() { return mSocket; } 3830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root pid_t getPid() const { return mPid; } 3930abb7234de2a9caa1add4b00a189436f0b24560Kenny Root uid_t getUid() const { return mUid; } 4030abb7234de2a9caa1add4b00a189436f0b24560Kenny Root gid_t getGid() const { return mGid; } 418702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt void setCmdNum(int cmdNum) { android_atomic_release_store(cmdNum, &mCmdNum); } 428702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt int getCmdNum() { return mCmdNum; } 43fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 448c5669f9f9a228efebf4059fd4ceace5cece578bBrad Fitzpatrick // Send null-terminated C strings: 45db017545796747115b8797f03e662b0f398a7c7bSan Mehat int sendMsg(int code, const char *msg, bool addErrno); 468702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt int sendMsg(int code, const char *msg, bool addErrno, bool useCmdNum); 478c5669f9f9a228efebf4059fd4ceace5cece578bBrad Fitzpatrick 488702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt //Sending binary data: 498c5669f9f9a228efebf4059fd4ceace5cece578bBrad Fitzpatrick int sendData(const void *data, int len); 50648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick 51648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick // Optional reference counting. Reference count starts at 1. If 52648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick // it's decremented to 0, it deletes itself. 53648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick // SocketListener creates a SocketClient (at refcount 1) and calls 54648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick // decRef() when it's done with the client. 55648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick void incRef(); 564be4e69f0128b7d9b0a29651ef4b79d806ae3ce7Brad Fitzpatrick bool decRef(); // returns true at 0 (but note: SocketClient already deleted) 578702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt 588702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwaltprivate: 598702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt // Send null-terminated C strings 608702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt int sendMsg(const char *msg); 618702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt void init(int socket, bool owned, bool useCmdNum); 62fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat}; 63fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 64fa644ffe944c01a9b00f8d7676d58394fabee285San Mehattypedef android::List<SocketClient *> SocketClientCollection; 65fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#endif 66