root/headers/private/debug/DebugEventStream.h
/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef _DEBUG_EVENT_STREAM_H
#define _DEBUG_EVENT_STREAM_H

#include <SupportDefs.h>


class BDataIO;


struct debug_event_stream_header {
        char    signature[32];
        uint32  version;
        uint32  flags;
        uint32  event_mask;
        uint32  reserved;
};


// signature and version
#define B_DEBUG_EVENT_STREAM_SIGNATURE  "Haiku debug events"
#define B_DEBUG_EVENT_STREAM_VERSION    1


// flags
enum {
        B_DEBUG_EVENT_STREAM_FLAG_HOST_ENDIAN           = 0x00000001,
        B_DEBUG_EVENT_STREAM_FLAG_SWAPPED_ENDIAN        = 0x01000000,

        B_DEBUG_EVENT_STREAM_FLAG_ZIPPED                        = 0x00000002
};


class BDebugEventInputStream {
public:
                                                                BDebugEventInputStream();
                                                                ~BDebugEventInputStream();

                        status_t                        SetTo(BDataIO* stream);
                        status_t                        SetTo(const void* data, size_t size,
                                                                        bool takeOverOwnership);
                        void                            Unset();

                        status_t                        Seek(off_t streamOffset);

                        ssize_t                         ReadNextEvent(uint32* _event, uint32* _cpu,
                                                                        const void** _buffer,
                                                                        off_t* _streamOffset = NULL);

private:
                        status_t                        _Init();
                        ssize_t                         _Read(void* buffer, size_t size);
                        status_t                        _GetData(size_t size);

private:
                        BDataIO*                        fStream;
                        uint32                          fFlags;
                        uint32                          fEventMask;
                        uint8*                          fBuffer;
                        size_t                          fBufferCapacity;
                        size_t                          fBufferSize;
                        size_t                          fBufferPosition;
                        off_t                           fStreamPosition;
                        bool                            fOwnsBuffer;
};


class BDebugEventOutputStream {
public:
                                                                BDebugEventOutputStream();
                                                                ~BDebugEventOutputStream();

                        status_t                        SetTo(BDataIO* stream, uint32 flags,
                                                                        uint32 eventMask);
                        void                            Unset();

                        status_t                        Write(const void* buffer, size_t size);
                        status_t                        Flush();

private:
                        BDataIO*                        fStream;
                        uint32                          fFlags;
};


#endif  // _DEBUG_EVENT_STREAM_H