1 //-----------------------------------------------------------------------------
3 // Copyright (C) Microsoft Corporation. All Rights Reserved.
5 //-----------------------------------------------------------------------------
9 namespace Microsoft
.Cci
.Pdb
{
10 internal class DataStream
{
11 internal DataStream() {
16 internal DataStream(int contentSize
, BitAccess bits
, int count
) {
17 this.contentSize
= contentSize
;
19 this.pages
= new int[count
];
20 bits
.ReadInt32(this.pages
);
24 internal void Read(PdbReader reader
, BitAccess bits
) {
25 bits
.MinCapacity(contentSize
);
26 Read(reader
, 0, bits
.Buffer
, 0, contentSize
);
29 internal void Read(PdbReader reader
, int position
,
30 byte[] bytes
, int offset
, int data
) {
31 if (position
+ data
> contentSize
) {
32 throw new PdbException("DataStream can't read off end of stream. " +
36 if (position
== contentSize
) {
41 int page
= position
/ reader
.pageSize
;
42 int rema
= position
% reader
.pageSize
;
44 // First get remained of first page.
46 int todo
= reader
.pageSize
- rema
;
51 reader
.Seek(pages
[page
], rema
);
52 reader
.Read(bytes
, offset
, todo
);
59 // Now get the remaining pages.
61 int todo
= reader
.pageSize
;
66 reader
.Seek(pages
[page
], 0);
67 reader
.Read(bytes
, offset
, todo
);
75 internal void Write(PdbWriter writer
, byte[] bytes
) {
76 Write(writer
, bytes
, bytes
.Length
);
79 internal void Write(PdbWriter writer
, byte[] bytes
, int data
) {
80 if (bytes
== null || data
== 0) {
86 int rema
= contentSize
% writer
.pageSize
;
88 int todo
= writer
.pageSize
- rema
;
93 int lastPage
= pages
[pages
.Length
- 1];
94 writer
.Seek(lastPage
, rema
);
95 writer
.Write(bytes
, used
, todo
);
101 int count
= (left
+ writer
.pageSize
- 1) / writer
.pageSize
;
102 int page0
= writer
.AllocatePages(count
);
104 writer
.Seek(page0
, 0);
105 writer
.Write(bytes
, used
, left
);
107 AddPages(page0
, count
);
113 private void AddPages(int page0
, int count
) {
115 pages
= new int[count
];
116 for (int i
= 0; i
< count
; i
++) {
117 pages
[i
] = page0
+ i
;
121 int used
= old
.Length
;
123 pages
= new int[used
+ count
];
124 Array
.Copy(old
, pages
, used
);
125 for (int i
= 0; i
< count
; i
++) {
126 pages
[used
+ i
] = page0
+ i
;
132 get { return pages == null ? 0 : pages.Length; }
135 internal int Length
{
136 get { return contentSize; }
139 internal int GetPage(int index
) {
143 internal int contentSize
;
144 internal int[] pages
;