/*******************************************************}

{                                                       }

{       File: output.h                                  }

{       Created by Tsviatko Jongov                      }

{       http://tsviatko.jongov.com                      }

{                                                       }

{       COutput class.                                  }

{                                                       }

{*******************************************************/

   

#ifndef __OUTPUT_H__

#define __OUTPUT_H__

   

#include "buffer.h"

   

#define OUTPUT_BUFFER_SIZE        200 * 1024

#define OUTPUT_WRITE_BUFFER_SIZE  OUTPUT_BUFFER_SIZE - 256

   

class COutput {

protected:

    void ChangeFileExtension(char * FileName, char * NewExtension)

    {

        char * dot = strrchr(FileName, '.');

        size_t lenToExt = strlen(FileName) - (dot ? strlen(dot) : 0);

        strncpy(FileName, FileName, lenToExt);

        strcpy(FileName + lenToExt , NewExtension);

    }

   

    CBuffer * m_Buffer;

    unsigned int m_StreamID;

    FILE * m_OutputFile;

    char m_FileName[MAX_PATH];

    bool m_Initialized;

   

public:

    COutput() :

      m_OutputFile(NULL),

      m_Initialized(false)

    {

   

    }

   

    ~COutput()

    {

        Uninitialize();

    }

   

    int Initialize(unsigned int StreamID, char * FileName)

    {

        if (m_Initialized)

        {

            Uninitialize();

        }

   

        m_StreamID = StreamID;     

        strcpy(m_FileName, FileName);

   

        char ext[MAX_PATH];  

        sprintf(ext, ".%.3x.bin", StreamID);   

        strupr(ext);

        ChangeFileExtension(m_FileName, ext);

   

        m_OutputFile = fopen(m_FileName, "wb");

        if (!m_OutputFile)

        {

          printf(TEXT("tsv: Error in COutput::COutput - can not open file.\n"));

          return -1;

        }

   

        m_Buffer = new CBuffer(OUTPUT_BUFFER_SIZE);

   

        m_Initialized = true;

   

        return 0;

    }

   

    int Uninitialize()

    {

        if (m_OutputFile)

        {

            if (m_Buffer->Len() > 0)

            {

                if (fwrite(m_Buffer->Head(), sizeof(char), m_Buffer->Len(), m_OutputFile) <= 0)

                {

                    printf(TEXT("tsv: Error in COutput::Uninitialize - cannot flush data.\n"));

                }

   

                m_Buffer->Empty();

            }

   

            fflush(m_OutputFile);

            fclose(m_OutputFile);

   

            m_OutputFile = NULL;

        }

   

        delete m_Buffer;

   

        m_Initialized = false;

   

        return 0;

    }

   

   

    int WriteData(unsigned char * Data, unsigned int Size)

    {

        if (!m_Initialized)

        {

            printf(TEXT("tsv: Error in COutput::WriteData - not initialized.\n"));

            return -1;

        }

   

        m_Buffer->Add(Data, Size);

   

        if (m_Buffer->Len() >= OUTPUT_WRITE_BUFFER_SIZE)

        {

            if (fwrite(m_Buffer->Head(), sizeof(char), m_Buffer->Len(), m_OutputFile) <= 0)

            {

                printf(TEXT("tsv: Error in COutput::WriteData - cannot write to output file.\n"));

                return -1;

            }

   

            m_Buffer->Empty();

        }

   

        return 0;

    }

};

   

#endif // __OUTPUT_H__