2
* This file is part of HexEditor plugin for Code::Blocks Studio
3
* Copyright (C) 2008-2009 Bartlomiej Swiecki
5
* HexEditor plugin is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 3 of the License, or
8
* (at your option) any later version.
10
* HexEditor pluging is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with HexEditor. If not, see <http://www.gnu.org/licenses/>.
19
* $Id: FileContentBuffered.cpp 5445 2009-02-07 00:35:09Z byo $
20
* $HeadURL: svn+ssh://jenslody@svn.berlios.de/svnroot/repos/codeblocks/trunk/src/plugins/contrib/HexEditor/FileContentBuffered.cpp $
23
#include "FileContentBuffered.h"
28
/** \brief Internal modification class */
29
class FileContentBuffered::IntModificationData: public FileContentBuffered::ModificationData
33
IntModificationData( std::vector< char >& buffer ): m_Buffer( buffer ) {}
37
change, ///< \brief Some content was changed
38
added, ///< \brief Some data was inserted
39
removed, ///< \brief Some data was removed
42
std::vector< char >& m_Buffer;
46
std::vector< char > m_OldData;
47
std::vector< char > m_NewData;
55
assert( m_Buffer.size() >= m_Position );
56
m_Buffer.insert( m_Buffer.begin() + m_Position, m_NewData.begin(), m_NewData.end() );
62
assert( m_Buffer.size() > m_Position );
63
assert( m_Buffer.size() >= m_Position + m_OldData.size() );
64
m_Buffer.erase( m_Buffer.begin() + m_Position, m_Buffer.begin() + m_Position + m_OldData.size() );
70
assert( m_Buffer.size() > m_Position );
71
assert( m_Buffer.size() >= m_Position + m_NewData.size() );
72
assert( m_OldData.size() == m_NewData.size() );
74
std::copy( m_NewData.begin(), m_NewData.end(), m_Buffer.begin() + m_Position );
86
assert( m_Buffer.size() >= m_Position );
87
m_Buffer.insert( m_Buffer.begin() + m_Position, m_OldData.begin(), m_OldData.end() );
93
assert( m_Buffer.size() > m_Position );
94
assert( m_Buffer.size() >= m_Position + m_NewData.size() );
95
m_Buffer.erase( m_Buffer.begin() + m_Position, m_Buffer.begin() + m_Position + m_NewData.size() );
101
assert( m_Buffer.size() > m_Position );
102
assert( m_Buffer.size() >= m_Position + m_OldData.size() );
103
assert( m_OldData.size() == m_NewData.size() );
105
std::copy( m_OldData.begin(), m_OldData.end(), m_Buffer.begin() + m_Position );
113
return m_OldData.empty() ? m_NewData.size() : m_OldData.size();
117
FileContentBuffered::FileContentBuffered()
121
FileContentBuffered::~FileContentBuffered()
125
FileContentBuffered::ModificationData* FileContentBuffered::BuildAddModification( OffsetT position, OffsetT length, const void* data )
127
IntModificationData* mod = new IntModificationData( m_Buffer );
128
mod->m_Type = IntModificationData::added;
129
mod->m_Position = position;
131
mod->m_NewData.resize( length );
134
std::copy( (char*)data, (char*)data + length, mod->m_NewData.begin() );
140
FileContentBuffered::ModificationData* FileContentBuffered::BuildRemoveModification( OffsetT position, OffsetT length )
142
if ( position > m_Buffer.size() ) return 0;
144
if ( position + length > m_Buffer.size() )
146
length = m_Buffer.size() - position;
147
if ( !length ) return 0;
150
IntModificationData* mod = new IntModificationData( m_Buffer );
151
mod->m_Type = IntModificationData::removed;
152
mod->m_Position = position;
153
mod->m_OldData.resize( length );
155
std::copy( m_Buffer.begin() + position, m_Buffer.begin() + position + length, mod->m_OldData.begin() );
160
FileContentBuffered::ModificationData* FileContentBuffered::BuildChangeModification( OffsetT position, OffsetT length, const void* data )
162
if ( position > m_Buffer.size() ) return 0;
163
if ( position + length > m_Buffer.size() )
165
length = m_Buffer.size() - position;
166
if ( !length ) return 0;
169
IntModificationData* mod = new IntModificationData( m_Buffer );
170
mod->m_Type = IntModificationData::change;
171
mod->m_Position = position;
172
mod->m_OldData.resize( length );
173
mod->m_NewData.resize( length );
175
std::copy( m_Buffer.begin() + position, m_Buffer.begin() + position + length, mod->m_OldData.begin() );
178
std::copy( (char*)data, (char*)data + length, mod->m_NewData.begin() );
184
FileContentBuffered::OffsetT FileContentBuffered::Read( void* buff, OffsetT position, OffsetT length)
186
if ( position > m_Buffer.size() ) return 0;
187
if ( position + length > m_Buffer.size() )
189
length = m_Buffer.size() - position;
190
if ( !length ) return 0;
193
memcpy( buff, &m_Buffer[ position ], length );
197
FileContentBuffered::OffsetT FileContentBuffered::GetSize()
199
return m_Buffer.size();
202
bool FileContentBuffered::WriteFile(const wxString& fileName)
204
wxFile fl( fileName, wxFile::write );
205
if ( !fl.IsOpened() ) return false;
206
if ( fl.Write( &m_Buffer[0], m_Buffer.size() ) == m_Buffer.size() )
214
bool FileContentBuffered::ReadFile(const wxString& fileName)
216
wxFile fl( fileName, wxFile::read );
217
if ( !fl.IsOpened() ) return false;
219
m_Buffer.resize( fl.Length() );
223
return (size_t)fl.Read( &m_Buffer[0], m_Buffer.size() ) == m_Buffer.size();