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: FileContentBase.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/FileContentBase.cpp $
23
#include "FileContentBase.h"
24
#include "FileContentBuffered.h"
25
#include "FileContentDisk.h"
31
const FileContentBase::OffsetT maxBufferedSize = 1024L * 1024L * 4;
32
const FileContentBase::OffsetT maxAnySize = 0x8000000000000000ULL;//1024L * 1024L * 1024L * 2; // 2 GB limit
35
FileContentBase::InvalidModificationData FileContentBase::m_UndoInvalid;
37
FileContentBase* FileContentBase::BuildInstance( const wxString& fileName )
39
wxFile fl( fileName );
45
if ( (OffsetT)fl.Length() <= maxBufferedSize )
47
return new FileContentBuffered();
50
if ( (OffsetT)fl.Length() <= maxAnySize )
52
return new FileContentDisk();
60
FileContentBase::FileContentBase()
68
FileContentBase::~FileContentBase()
73
void FileContentBase::InsertAndApplyModification( ModificationData* mod )
75
RemoveUndoFrom( m_UndoCurrent );
78
mod->m_Prev = m_UndoLast;
82
m_UndoLast->m_Next = mod;
94
ApplyModification( mod );
100
void FileContentBase::ApplyModification( ModificationData* mod )
105
void FileContentBase::RevertModification( ModificationData* mod )
110
void FileContentBase::RemoveUndoFrom( ModificationData* mod )
114
m_UndoLast = mod->m_Prev;
118
m_UndoLast->m_Next = 0;
127
if ( mod == m_UndoSaved )
129
m_UndoSaved = &m_UndoInvalid;
132
ModificationData* tmp = mod;
138
FileContentBase::OffsetT FileContentBase::Remove( const ExtraUndoData& extraUndoData, OffsetT position, OffsetT length )
140
if ( !length ) return 0;
142
ModificationData* mod = BuildRemoveModification( position, length );
143
if ( !mod ) return 0;
145
mod->m_Data = extraUndoData;
147
InsertAndApplyModification( mod );
149
return mod->Length();
152
FileContentBase::OffsetT FileContentBase::Add( const ExtraUndoData& extraUndoData, OffsetT position, OffsetT length, void* data)
154
if ( !length ) return 0;
156
ModificationData* mod = BuildAddModification( position, length, data );
157
if ( !mod ) return 0;
159
mod->m_Data = extraUndoData;
161
InsertAndApplyModification( mod );
163
return mod->Length();
166
FileContentBase::OffsetT FileContentBase::Write( const ExtraUndoData& extraUndoData, const void* buff, OffsetT position, OffsetT length )
168
if ( !buff ) return 0;
169
if ( !length ) return 0;
171
ModificationData* mod = BuildChangeModification( position, length, buff );
172
if ( !mod ) return 0;
174
mod->m_Data = extraUndoData;
176
InsertAndApplyModification( mod );
178
return mod->Length();
181
bool FileContentBase::Modified()
183
return m_UndoSaved != m_UndoCurrent;
186
void FileContentBase::SetModified( bool modified )
188
m_UndoSaved = modified ? &m_UndoInvalid : m_UndoCurrent;
191
const FileContentBase::ExtraUndoData* FileContentBase::Redo()
193
if ( !m_UndoCurrent ) return 0;
195
ApplyModification( m_UndoCurrent );
196
const ExtraUndoData* ret = &m_UndoCurrent->m_Data;
198
m_UndoCurrent = m_UndoCurrent->m_Next;
203
const FileContentBase::ExtraUndoData* FileContentBase::Undo()
205
if ( m_UndoCurrent == m_UndoBuffer ) return 0;
207
if ( !m_UndoCurrent )
209
m_UndoCurrent = m_UndoLast;
210
assert ( m_UndoCurrent->m_Next == 0 );
214
assert( m_UndoCurrent->m_Prev != 0 );
215
m_UndoCurrent = m_UndoCurrent->m_Prev;
217
RevertModification( m_UndoCurrent );
219
return &m_UndoCurrent->m_Data;
222
bool FileContentBase::CanRedo()
224
return m_UndoCurrent != 0;
227
bool FileContentBase::CanUndo()
229
return m_UndoCurrent != m_UndoBuffer;