00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifdef __GNUG__
00033 # pragma implementation "StrSubChunk.h"
00034 #endif
00035
00036 #include "StrMod/StrSubChunk.h"
00037 #include "StrMod/StrChunkPtrT.h"
00038 #include "StrMod/StrChunkPtr.h"
00039 #include "StrMod/ChunkVisitor.h"
00040 #include <cassert>
00041
00042
00043 namespace strmod {
00044 namespace strmod {
00045
00046 const STR_ClassIdent StrSubChunk::identifier(18UL);
00047
00048 StrSubChunk::StrSubChunk(const StrChunkPtr &chunk, const LinearExtent &extent)
00049 : subchunk_(chunk), subext_(extent)
00050 {
00051 assert(subchunk_);
00052
00053 if (subchunk_->AreYouA(identifier))
00054 {
00055 StrChunkPtrT<StrSubChunk> subc
00056 = static_cast<StrSubChunk *>(subchunk_.GetPtr());
00057
00058 subext_ = subc->subext_.SubExtent(subext_);
00059 subchunk_ = subc->subchunk_;
00060 }
00061 else
00062 {
00063 unsigned int sublen = subchunk_->Length();
00064
00065 if ((subext_.Offset() + subext_.Length()) > sublen) {
00066 LinearExtent chunkext(0, sublen);
00067
00068
00069
00070 subext_ = chunkext.SubExtent(subext_);
00071
00072 }
00073 }
00074 }
00075
00076 void StrSubChunk::acceptVisitor(ChunkVisitor &visitor)
00077 throw(ChunkVisitor::halt_visitation)
00078 {
00079 call_visitStrChunk(visitor, subchunk_, subext_);
00080 }
00081
00082 }
00083 }