/*******************************************************}
{
}
{ 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__