blob: 9cf5b452810d51a551240e7dd3ccf95920b68ea4 [file] [log] [blame]
/*
* Copyright 2011, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __GLTRACE_TRANSPORT_H_
#define __GLTRACE_TRANSPORT_H_
#include <pthread.h>
#include "gltrace.pb.h"
namespace android {
namespace gltrace {
/**
* TCPStream provides a TCP based communication channel from the device to
* the host for transferring GLMessages.
*/
class TCPStream {
int mSocket;
pthread_mutex_t mSocketWriteMutex;
public:
/** Create a TCP based communication channel over @socket */
TCPStream(int socket);
~TCPStream();
/** Close the channel. */
void closeStream();
/** Send @data of size @len to host. . Returns -1 on error, 0 on success. */
int send(void *data, size_t len);
/**
* Receive @len bytes of data into @buf from the remote end. This is a blocking call.
* Returns -1 on failure, 0 on success.
*/
int receive(void *buf, size_t len);
};
/**
* BufferedOutputStream provides buffering of data sent to the underlying
* unbuffered channel.
*/
class BufferedOutputStream {
TCPStream *mStream;
size_t mBufferSize;
std::string mStringBuffer;
/** Enqueue message into internal buffer. */
void enqueueMessage(GLMessage *msg);
public:
/**
* Construct a Buffered stream of size @bufferSize, using @stream as
* its underlying channel for transport.
*/
BufferedOutputStream(TCPStream *stream, size_t bufferSize);
/**
* Send @msg. The message could be buffered and sent later with a
* subsequent message. Returns -1 on error, 0 on success.
*/
int send(GLMessage *msg);
/** Send any buffered messages, returns -1 on error, 0 on success. */
int flush();
};
/**
* Utility method: start a server listening at @sockName (unix domain socket,
* abstract namespace path), and wait for a client connection.
* Returns the connected client socket on success, or -1 on failure.
*/
int acceptClientConnection(char *sockName);
};
};
#endif