ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/package/utils/adbd/src/include/sysutils/SocketClient.h b/package/utils/adbd/src/include/sysutils/SocketClient.h
new file mode 100644
index 0000000..1004f06
--- /dev/null
+++ b/package/utils/adbd/src/include/sysutils/SocketClient.h
@@ -0,0 +1,88 @@
+#ifndef _SOCKET_CLIENT_H
+#define _SOCKET_CLIENT_H
+
+#include "List.h"
+
+#include <pthread.h>
+#include <cutils/atomic.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+
+class SocketClient {
+    int             mSocket;
+    bool            mSocketOwned;
+    pthread_mutex_t mWriteMutex;
+
+    // Peer process ID
+    pid_t mPid;
+
+    // Peer user ID
+    uid_t mUid;
+
+    // Peer group ID
+    gid_t mGid;
+
+    // Reference count (starts at 1)
+    pthread_mutex_t mRefCountMutex;
+    int mRefCount;
+
+    int mCmdNum;
+
+    bool mUseCmdNum;
+
+public:
+    SocketClient(int sock, bool owned);
+    SocketClient(int sock, bool owned, bool useCmdNum);
+    virtual ~SocketClient();
+
+    int getSocket() { return mSocket; }
+    pid_t getPid() const { return mPid; }
+    uid_t getUid() const { return mUid; }
+    gid_t getGid() const { return mGid; }
+    void setCmdNum(int cmdNum) {
+        android_atomic_release_store(cmdNum, &mCmdNum);
+    }
+    int getCmdNum() { return mCmdNum; }
+
+    // Send null-terminated C strings:
+    int sendMsg(int code, const char *msg, bool addErrno);
+    int sendMsg(int code, const char *msg, bool addErrno, bool useCmdNum);
+    int sendMsg(const char *msg);
+
+    // Provides a mechanism to send a response code to the client.
+    // Sends the code and a null character.
+    int sendCode(int code);
+
+    // Provides a mechanism to send binary data to client.
+    // Sends the code and a null character, followed by 4 bytes of
+    // big-endian length, and the data.
+    int sendBinaryMsg(int code, const void *data, int len);
+
+    // Sending binary data:
+    int sendData(const void *data, int len);
+    // iovec contents not preserved through call
+    int sendDatav(struct iovec *iov, int iovcnt);
+
+    // Optional reference counting.  Reference count starts at 1.  If
+    // it's decremented to 0, it deletes itself.
+    // SocketListener creates a SocketClient (at refcount 1) and calls
+    // decRef() when it's done with the client.
+    void incRef();
+    bool decRef(); // returns true at 0 (but note: SocketClient already deleted)
+
+    // return a new string in quotes with '\\' and '\"' escaped for "my arg"
+    // transmissions
+    static char *quoteArg(const char *arg);
+
+private:
+    void init(int socket, bool owned, bool useCmdNum);
+
+    // Sending binary data. The caller should make sure this is protected
+    // from multiple threads entering simultaneously.
+    // returns 0 if successful, -1 if there is a 0 byte write or if any
+    // other error occurred (use errno to get the error)
+    int sendDataLockedv(struct iovec *iov, int iovcnt);
+};
+
+typedef android::sysutils::List<SocketClient *> SocketClientCollection;
+#endif