/****************************************************************************
 *
 *  Copyright (C) 2000-2001 RealNetworks, Inc. All rights reserved.
 *
 *  This program is free software.  It may be distributed under the terms
 *  in the file LICENSE, found in the top level of the source distribution.
 *
 */

#ifndef _STREAM_H
#define _STREAM_H

#include "types.h"
#include "str.h"
#include "tlist.h"

#ifdef _UNIX
    // some custom bits (we rely on pollfd events being a 16-bit type)
    // note that these are combined with POLLIN/POLLOUT
    #define XPOLLACC    0x00010000  /* accept */
    #define XPOLLCNX    0x00020000  /* connect */

    #include <sys/poll.h>
    typedef pollfd              waitobj_t;
    typedef INT32               waitevents_t;
   #define WAITOBJ_MAX          0xffff

    #define WAITOBJ_IS_VALID(obj)       (obj.fd != -1)
    #define WAIT_EVENT_ACCEPT(wevt)     (wevt & XPOLLACC)
    #define WAIT_EVENT_CONNECT(wevt)    (wevt & XPOLLCNX)
    #define WAIT_EVENT_READ(wevt)       (wevt & POLLIN)
    #define WAIT_EVENT_WRITE(wevt)      (wevt & POLLOUT)
    #define WAIT_EVENT_EXCEPT(wevt)     (wevt & POLLPRI)
#endif
#ifdef _WIN32
    typedef HANDLE              waitobj_t;
    typedef WSANETWORKEVENTS    waitevents_t;
    #define WAITOBJ_MAX         MAXIMUM_WAIT_OBJECTS

    #define WAITOBJ_IS_VALID(obj)       (obj != NULL)
    #define WAIT_EVENT_ACCEPT(wevt)     (wevt.lNetworkEvents & FD_ACCEPT)
    #define WAIT_EVENT_CONNECT(wevt)    (wevt.lNetworkEvents & FD_CONNECT)
    #define WAIT_EVENT_READ(wevt)       (wevt.lNetworkEvents & FD_READ)
    #define WAIT_EVENT_WRITE(wevt)      (wevt.lNetworkEvents & FD_WRITE)
    #define WAIT_EVENT_EXCEPT(wevt)     (wevt.lNetworkEvents & FD_OOB)
#endif

class CStreamResponse
{
public:
    virtual void OnConnectDone( int err ) = 0;
    virtual void OnReadReady  ( void ) = 0;
    virtual void OnWriteReady ( void ) = 0;
    virtual void OnExceptReady( void ) = 0;
    virtual void OnClosed     ( void ) = 0;
};

class CStream
{
//    friend class CEventThread;

private: // Unimplemented
    CStream( const CStream& );
    CStream& operator=( const CStream& );

public:
    CStream( void );
    CStream( CStreamResponse* pResponse );
    virtual ~CStream( void );

    virtual bool    IsOpen( void ) = 0;
    virtual void    Close( void ) = 0;
    virtual size_t  Read( PVOID pbuf, size_t nLen ) = 0;
    virtual size_t  Write( CPVOID pbuf, size_t nLen ) = 0;

    void    SetResponse( CStreamResponse* pResponse );
    bool    Read( CBuffer* pbuf );
    bool    Write( const CBuffer& buf );

protected:
    inline CStreamResponse* GetResponse( void ) { return m_pResponse; }

protected:
    CStreamResponse* m_pResponse;
};
typedef TDoubleList<CStream*> CStreamList;

#endif //ndef _STREAM_H


syntax highlighted by Code2HTML, v. 0.9.1