android_system_core/include/sysutils/SocketClient.h
Selim Gurun 7bf4c45f84 Add a utility function to send a code + binary msg
Add a utility function to SocketClient to send a c-string code
prepended to a binary message. This is necessary to be able to
send a binary message while keeping compatible with underlying
text-based protocol.

Change-Id: Ifc6562003a687577d7deb50260533a5147ae4f97
2012-03-07 16:19:52 -08:00

82 lines
2.5 KiB
C++

#ifndef _SOCKET_CLIENT_H
#define _SOCKET_CLIENT_H
#include "List.h"
#include <pthread.h>
#include <cutils/atomic.h>
#include <sys/types.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);
// Provides a mechanism to send a response code to the client. The message uses
// the same format as in sendMsg method above.
// Sends the code, a space, and a null character.
int sendCode(int code);
// Provides a mechanism to send binary data to client. The message uses the
// same format as in sendMsg method above.
// Sends the code, a space, 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);
// 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)
private:
// Send null-terminated C strings
int sendMsg(const char *msg);
void init(int socket, bool owned, bool useCmdNum);
// Sending binary data. The caller should use make sure this is protected
// from multiple threads entering simultaneously.
// returns 0 if successful, -1 if there is a 0 byte write and -2 if any other
// error occurred (use errno to get the error)
int sendDataLocked(const void *data, int len);
};
typedef android::sysutils::List<SocketClient *> SocketClientCollection;
#endif