1+ /***************************************************************************
2+
3+ Rtf Dom Parser
4+
5+ Copyright (c) 2010 sinosoft , written by yuans.
6+ http://www.sinoreport.net
7+
8+ This program is free software; you can redistribute it and/or
9+ modify it under the terms of the GNU General Public License
10+ as published by the Free Software Foundation; either version 2
11+ of the License, or (at your option) any later version.
12+
13+ This program is distributed in the hope that it will be useful,
14+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16+ GNU General Public License for more details.
17+
18+ You should have received a copy of the GNU General Public License
19+ along with this program; if not, write to the Free Software
20+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21+
22+ ****************************************************************************/
23+
24+ using System ;
25+ using System . Windows . Forms ;
26+
27+ namespace XDesigner . RTF
28+ {
29+ /// <summary>
30+ /// Binary data buffer
31+ /// </summary>
32+ public class ByteBuffer
33+ {
34+ /// <summary>
35+ /// Initialize instance
36+ /// </summary>
37+ public ByteBuffer ( )
38+ {
39+ }
40+
41+ /// <summary>
42+ /// Current contains validate bytes
43+ /// </summary>
44+ protected int intCount = 0 ;
45+ /// <summary>
46+ /// byte array
47+ /// </summary>
48+ protected byte [ ] bsBuffer = new byte [ 16 ] ;
49+
50+ /// <summary>
51+ /// Clear object's data
52+ /// </summary>
53+ public virtual void Clear ( )
54+ {
55+ bsBuffer = new byte [ 16 ] ;
56+ intCount = 0 ;
57+ }
58+
59+ /// <summary>
60+ /// Reset current position without clear buffer
61+ /// </summary>
62+ public void Reset ( )
63+ {
64+ intCount = 0 ;
65+ }
66+
67+ /// <summary>
68+ /// Set of get byte at special index which starts with 0
69+ /// </summary>
70+ public byte this [ int index ]
71+ {
72+ get
73+ {
74+ if ( index >= 0 && index < intCount )
75+ return bsBuffer [ index ] ;
76+ else
77+ throw new IndexOutOfRangeException ( "index" ) ;
78+ }
79+ set
80+ {
81+ if ( index >= 0 && index < intCount )
82+ bsBuffer [ index ] = value ;
83+ else
84+ throw new IndexOutOfRangeException ( "index" ) ;
85+ }
86+ }
87+ /// <summary>
88+ /// Validate bytes count
89+ /// </summary>
90+ public virtual int Count
91+ {
92+ get
93+ {
94+ return intCount ;
95+ }
96+ }
97+
98+ /// <summary>
99+ /// Add a byte
100+ /// </summary>
101+ /// <param name="b">byte data</param>
102+ public void Add ( byte b )
103+ {
104+ FixBuffer ( intCount + 1 ) ;
105+ bsBuffer [ intCount ] = b ;
106+ intCount ++ ;
107+ }
108+
109+ /// <summary>
110+ /// Add bytes
111+ /// </summary>
112+ /// <param name="bs">bytes</param>
113+ public void Add ( byte [ ] bs )
114+ {
115+ if ( bs != null )
116+ Add ( bs , 0 , bs . Length ) ;
117+ }
118+ /// <summary>
119+ /// Add bytes
120+ /// </summary>
121+ /// <param name="bs">Bytes</param>
122+ /// <param name="StartIndex">Start index</param>
123+ /// <param name="Length">Length</param>
124+ public void Add ( byte [ ] bs , int StartIndex , int Length )
125+ {
126+ if ( bs != null && StartIndex >= 0 && ( StartIndex + Length ) <= bs . Length && Length > 0 )
127+ {
128+ FixBuffer ( intCount + Length ) ;
129+ Array . Copy ( bs , StartIndex , bsBuffer , intCount , Length ) ;
130+ intCount += Length ;
131+ }
132+ }
133+
134+ /// <summary>
135+ /// Get validate bytes array
136+ /// </summary>
137+ /// <returns>bytes array</returns>
138+ public byte [ ] ToArray ( )
139+ {
140+ if ( intCount > 0 )
141+ {
142+ byte [ ] bs = new byte [ intCount ] ;
143+ Array . Copy ( bsBuffer , 0 , bs , 0 , intCount ) ;
144+ return bs ;
145+ }
146+ else
147+ return null ;
148+ }
149+
150+ /// <summary>
151+ /// Convert bytes data to a string
152+ /// </summary>
153+ /// <param name="encoding">string encoding</param>
154+ /// <returns>string data</returns>
155+ public string GetString ( System . Text . Encoding encoding )
156+ {
157+ if ( encoding == null )
158+ throw new System . ArgumentNullException ( "encoding" ) ;
159+ if ( intCount > 0 )
160+ return encoding . GetString ( bsBuffer , 0 , intCount ) ;
161+ else
162+ return "" ;
163+ }
164+ /// <summary>
165+ /// Fix inner buffer so it can fit to new size of buffer
166+ /// </summary>
167+ /// <param name="NewSize">new size</param>
168+ protected void FixBuffer ( int NewSize )
169+ {
170+ if ( NewSize <= bsBuffer . Length )
171+ return ;
172+ if ( NewSize < ( int ) ( bsBuffer . Length * 1.5 ) )
173+ NewSize = ( int ) ( bsBuffer . Length * 1.5 ) ;
174+
175+ byte [ ] bs = new byte [ NewSize ] ;
176+ Buffer . BlockCopy ( bsBuffer , 0 , bs , 0 , bsBuffer . Length ) ;
177+ //Array.Copy( bsBuffer , 0 , bs , 0 , bsBuffer.Length );
178+ bsBuffer = bs ;
179+ }
180+ }
181+ }
0 commit comments