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