#ifndef _H_XFERCORE
#define _H_XFERCORE
#include <Security/ip++.h>
#include <Security/selector.h>
#include <Security/buffers.h>
#include <Security/streams.h>
#include <cstdarg>
#if defined(SOCKS_SUPPORT)
# include <Security/socks++.h>
# define TCPClientSocket SocksClientSocket
# define TCPServerSocket SocksServerSocket
#endif
using Security::Buffer;
using namespace IPPlusPlus;
namespace Security {
namespace Network {
class TransferEngine : public Selector {
public:
TransferEngine() { }
virtual ~TransferEngine() { }
public:
class Client : public Selector::Client {
friend class TransferEngine;
public:
Client();
virtual ~Client();
public:
enum InputMode {
invalidInput, connecting, rawInput, lineInput, autoReadInput,
autoIODone };
InputMode mode() const { return mMode; }
void mode(InputMode m); void mode(Sink &sink, size_t byteCount = 0);
void mode(Source &source, size_t byteCount = 0);
bool autoWriteActive() const { return mSource; }
enum Event { inputAvailable, connectionDone, autoReadDone, autoWriteDone, endOfInput, ioError };
virtual void transit(Event event, char *data = NULL, size_t length = 0) = 0;
virtual void transitError(const CssmCommonError &error) = 0;
virtual int fileDesc() const = 0;
public:
virtual size_t read(void *data, size_t size);
virtual size_t write(const void *data, size_t size);
virtual bool atEnd() const;
protected:
void printf(const char *format, ...);
void printfe(const char *format, ...);
void vprintf(const char *format, va_list args);
void vprintfe(const char *format, va_list args);
void flushOutput(bool autoFlush = true);
void flushInput();
void tickle();
private:
void notify(int fd, Type type);
private:
void rawInputTransit();
bool lineInputTransit();
void autoReadInputTransit();
void startOutput();
size_t autoCopy();
private:
InputMode mMode; bool mAutoCopyOut; Sink *mSink; Source *mSource; size_t mResidualReadCount; size_t mResidualWriteCount; bool mAutoFlush; bool mInputFlushed;
FileDesc io;
Buffer mReadBuffer;
Buffer mWriteBuffer;
};
public:
void add(Client *client);
void remove(Client *client);
};
} }
#endif //_H_XFERCORE