Add FTP protocol debugging facilities.
[dftpd.git] / DataBufferFile.cpp
blob379ff15ffdb477203ad1761c2c9f487aef55d46e
1 #include <string.h>
2 #include "DataBufferFile.hpp"
4 DataBufferFile::DataBufferFile( FILE* f, int secondaryBufferSize, Mode mode )
5 : m_file( f )
6 , m_buf( new char[BufSize] )
7 , m_buf2( new char[BufSize] )
8 , m_secBuf( new char[secondaryBufferSize] )
9 , m_secBufSize( 0 )
10 , m_mode( mode )
11 , m_threadRunning( false )
13 if( mode == M_WRITE )
15 m_offset = 0;
17 else
19 m_offset = BufSize;
23 DataBufferFile::~DataBufferFile()
25 // Dump buffer to disk if needed
26 if( m_mode == M_WRITE && m_offset != 0 )
28 SaveBuffer();
30 if( m_threadRunning )
32 pthread_join( m_thread, NULL );
35 delete[] m_buf;
36 delete[] m_buf2;
37 delete[] m_secBuf;
39 fclose( m_file );
42 int DataBufferFile::Read( void* ptr, int size )
44 int bufSize = m_secBufSize;
45 m_secBufSize = 0;
47 memcpy( ptr, m_secBuf, bufSize );
49 return fread( (char*)ptr + bufSize, 1, size - bufSize, m_file ) + bufSize;
52 int DataBufferFile::Write( void* _ptr, int _size )
54 int size = _size;
55 char* ptr = (char*)_ptr;
57 while( size != 0 )
59 int dataToWrite = std::min( size, BufSize - m_offset );
60 memcpy( m_buf + m_offset, ptr, dataToWrite );
61 ptr += dataToWrite;
62 m_offset += dataToWrite;
63 size -= dataToWrite;
65 if( m_offset == BufSize )
67 SaveBuffer();
71 return _size;
74 void DataBufferFile::Store( void* ptr, int size )
76 memcpy( m_secBuf, ptr, size );
77 m_secBufSize = size;
80 void DataBufferFile::SaveBuffer()
82 if( m_threadRunning )
84 pthread_join( m_thread, NULL );
87 m_offsetToWrite = m_offset;
88 m_offset = 0;
89 std::swap( m_buf, m_buf2 );
91 pthread_create( &m_thread, NULL, &DataBufferFile::SaveBuffer, (void*)this );
92 m_threadRunning = true;
95 void* DataBufferFile::SaveBuffer( void* _ptr )
97 DataBufferFile* ptr = static_cast<DataBufferFile*>( _ptr );
99 if( ptr->m_offsetToWrite == BufSize )
101 fwrite( ptr->m_buf2, BufSize, 1, ptr->m_file );
103 else
105 fwrite( ptr->m_buf2, 1, ptr->m_offsetToWrite, ptr->m_file );
108 return NULL;