MsfDirectory.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. //-----------------------------------------------------------------------------
  2. //
  3. // Copyright (c) Microsoft. All rights reserved.
  4. // This code is licensed under the Microsoft Public License.
  5. // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
  6. // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
  7. // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
  8. // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
  9. //
  10. //-----------------------------------------------------------------------------
  11. using System;
  12. namespace Microsoft.Cci.Pdb {
  13. internal class MsfDirectory {
  14. internal MsfDirectory(PdbReader reader, PdbFileHeader head, BitAccess bits) {
  15. int pages = reader.PagesFromSize(head.directorySize);
  16. // 0..n in page of directory pages.
  17. bits.MinCapacity(head.directorySize);
  18. int directoryRootPages = head.directoryRoot.Length;
  19. int pagesPerPage = head.pageSize / 4;
  20. int pagesToGo = pages;
  21. for (int i = 0; i < directoryRootPages; i++) {
  22. int pagesInThisPage = pagesToGo <= pagesPerPage ? pagesToGo : pagesPerPage;
  23. reader.Seek(head.directoryRoot[i], 0);
  24. bits.Append(reader.reader, pagesInThisPage * 4);
  25. pagesToGo -= pagesInThisPage;
  26. }
  27. bits.Position = 0;
  28. DataStream stream = new DataStream(head.directorySize, bits, pages);
  29. bits.MinCapacity(head.directorySize);
  30. stream.Read(reader, bits);
  31. // 0..3 in directory pages
  32. int count;
  33. bits.ReadInt32(out count);
  34. // 4..n
  35. int[] sizes = new int[count];
  36. bits.ReadInt32(sizes);
  37. // n..m
  38. streams = new DataStream[count];
  39. for (int i = 0; i < count; i++) {
  40. if (sizes[i] <= 0) {
  41. streams[i] = new DataStream();
  42. } else {
  43. streams[i] = new DataStream(sizes[i], bits,
  44. reader.PagesFromSize(sizes[i]));
  45. }
  46. }
  47. }
  48. internal DataStream[] streams;
  49. }
  50. }