<html>
<head>
<style>
<!--
body { background-color:#ffffff }
.file { border:1px solid #eeeeee; margin-top:1em; margin-bottom:1em }
.pathname { font-family:monospace; float:right }
.fileheader { margin-bottom:.5em }
.diff { margin:0 }
.tasklist { padding:4px; border:1px dashed #000000; margin-top:1em }
.tasklist ul { margin-top:0; margin-bottom:0 }
tr.alt { background-color:#eeeeee }
#added { background-color:#ddffdd }
#addedchars { background-color:#99ff99; font-weight:bolder }
tr.alt #added { background-color:#ccf7cc }
#removed { background-color:#ffdddd }
#removedchars { background-color:#ff9999; font-weight:bolder }
tr.alt #removed { background-color:#f7cccc }
#info { color:#888888 }
#context { background-color:#eeeeee }
td {padding-left:.3em; padding-right:.3em }
tr.head { border-bottom-width:1px; border-bottom-style:solid }
tr.head td { padding:0; padding-top:.2em }
.task { background-color:#ffff00 }
.comment { padding:4px; border:1px dashed #000000; background-color:#ffffdd }
.error { color:red }
hr { border-width:0px; height:2px; background:black }
-->
</style>
</head>
<body>
<pre class="comment">Import TechBot</pre><pre class="diff" id="added">Added: trunk/irc/TechBot/
Added: trunk/irc/TechBot/CHMLibrary/
Added: trunk/irc/TechBot/CHMLibrary/AssemblyInfo.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/BinaryReaderHelp.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMBtree.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMFile.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMIdxhdr.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMStrings.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMSystem.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMTocidx.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMTopics.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMUrlstr.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMUrltable.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/DumpingInfo.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/FullTextEngine.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/HHCParser.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/HHCParser2.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/HHKParser.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/TopicEntry.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/UrlTableEntry.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/enumerations.cs
Added: trunk/irc/TechBot/CHMLibrary/CHMLibrary.cmbx
Added: trunk/irc/TechBot/CHMLibrary/CHMLibrary.prjx
Added: trunk/irc/TechBot/CHMLibrary/Category.cs
Added: trunk/irc/TechBot/CHMLibrary/ChmFileInfo.cs
Added: trunk/irc/TechBot/CHMLibrary/Default.build
Added: trunk/irc/TechBot/CHMLibrary/HtmlHelpSystem.cs
Added: trunk/irc/TechBot/CHMLibrary/HttpUtility.cs
Added: trunk/irc/TechBot/CHMLibrary/Index.cs
Added: trunk/irc/TechBot/CHMLibrary/IndexItem.cs
Added: trunk/irc/TechBot/CHMLibrary/IndexTopic.cs
Added: trunk/irc/TechBot/CHMLibrary/InformationType.cs
Added: trunk/irc/TechBot/CHMLibrary/Storage/
Added: trunk/irc/TechBot/CHMLibrary/Storage/CHMStream.cs
Added: trunk/irc/TechBot/CHMLibrary/TOCItem.cs
Added: trunk/irc/TechBot/CHMLibrary/TableOfContents.cs
Added: trunk/irc/TechBot/Compression/
Added: trunk/irc/TechBot/Compression/AssemblyInfo.cs
Added: trunk/irc/TechBot/Compression/Checksums/
Added: trunk/irc/TechBot/Compression/Checksums/Adler32.cs
Added: trunk/irc/TechBot/Compression/Checksums/CRC32.cs
Added: trunk/irc/TechBot/Compression/Checksums/IChecksum.cs
Added: trunk/irc/TechBot/Compression/Checksums/StrangeCRC.cs
Added: trunk/irc/TechBot/Compression/Compression.cmbx
Added: trunk/irc/TechBot/Compression/Compression.prjx
Added: trunk/irc/TechBot/Compression/Default.build
Added: trunk/irc/TechBot/Compression/Deflater.cs
Added: trunk/irc/TechBot/Compression/DeflaterConstants.cs
Added: trunk/irc/TechBot/Compression/DeflaterEngine.cs
Added: trunk/irc/TechBot/Compression/DeflaterHuffman.cs
Added: trunk/irc/TechBot/Compression/DeflaterPending.cs
Added: trunk/irc/TechBot/Compression/Inflater.cs
Added: trunk/irc/TechBot/Compression/InflaterDynHeader.cs
Added: trunk/irc/TechBot/Compression/InflaterHuffmanTree.cs
Added: trunk/irc/TechBot/Compression/PendingBuffer.cs
Added: trunk/irc/TechBot/Compression/Streams/
Added: trunk/irc/TechBot/Compression/Streams/DeflaterOutputStream.cs
Added: trunk/irc/TechBot/Compression/Streams/InflaterInputStream.cs
Added: trunk/irc/TechBot/Compression/Streams/OutputWindow.cs
Added: trunk/irc/TechBot/Compression/Streams/StreamManipulator.cs
Added: trunk/irc/TechBot/Compression/ZipException.cs
Added: trunk/irc/TechBot/Default.build
Added: trunk/irc/TechBot/TechBot/
Added: trunk/irc/TechBot/TechBot/App.config
Added: trunk/irc/TechBot/TechBot/AssemblyInfo.cs
Added: trunk/irc/TechBot/TechBot/Default.build
Added: trunk/irc/TechBot/TechBot/ServiceThread.cs
Added: trunk/irc/TechBot/TechBot/TechBot.prjx
Added: trunk/irc/TechBot/TechBot/TechBotService.cs
Added: trunk/irc/TechBot/TechBot.Console/
Added: trunk/irc/TechBot/TechBot.Console/App.config
Added: trunk/irc/TechBot/TechBot.Console/AssemblyInfo.cs
Added: trunk/irc/TechBot/TechBot.Console/Default.build
Added: trunk/irc/TechBot/TechBot.Console/Main.cs
Added: trunk/irc/TechBot/TechBot.Console/TechBot.Console.cmbx
Added: trunk/irc/TechBot/TechBot.Console/TechBot.Console.prjx
Added: trunk/irc/TechBot/TechBot.IRCLibrary/
Added: trunk/irc/TechBot/TechBot.IRCLibrary/AssemblyInfo.cs
Added: trunk/irc/TechBot/TechBot.IRCLibrary/Default.build
Added: trunk/irc/TechBot/TechBot.IRCLibrary/IRC.cs
Added: trunk/irc/TechBot/TechBot.IRCLibrary/IrcChannel.cs
Added: trunk/irc/TechBot/TechBot.IRCLibrary/IrcClient.cs
Added: trunk/irc/TechBot/TechBot.IRCLibrary/IrcException.cs
Added: trunk/irc/TechBot/TechBot.IRCLibrary/IrcMessage.cs
Added: trunk/irc/TechBot/TechBot.IRCLibrary/IrcUser.cs
Added: trunk/irc/TechBot/TechBot.IRCLibrary/TechBot.IRCLibrary.cmbx
Added: trunk/irc/TechBot/TechBot.IRCLibrary/TechBot.IRCLibrary.prjx
Added: trunk/irc/TechBot/TechBot.Library/
Added: trunk/irc/TechBot/TechBot.Library/ApiCommand.cs
Added: trunk/irc/TechBot/TechBot.Library/AssemblyInfo.cs
Added: trunk/irc/TechBot/TechBot.Library/Default.build
Added: trunk/irc/TechBot/TechBot.Library/HelpCommand.cs
Added: trunk/irc/TechBot/TechBot.Library/HresultCommand.cs
Added: trunk/irc/TechBot/TechBot.Library/ICommand.cs
Added: trunk/irc/TechBot/TechBot.Library/IrcService.cs
Added: trunk/irc/TechBot/TechBot.Library/NtStatusCommand.cs
Added: trunk/irc/TechBot/TechBot.Library/NumberParser.cs
Added: trunk/irc/TechBot/TechBot.Library/ServiceOutput.cs
Added: trunk/irc/TechBot/TechBot.Library/SvnCommand.cs
</pre><strong class="error">[truncated at 100 lines; 5 more skipped]</strong>
<hr /><div class="file">
<div class="fileheader"><big><b>Added: trunk/irc/TechBot/CHMLibrary/AssemblyInfo.cs</b></big></div>
<pre class="diff"><small id="info">--- trunk/irc/TechBot/CHMLibrary/AssemblyInfo.cs        2005-01-15 19:15:45 UTC (rev 13063)
+++ trunk/irc/TechBot/CHMLibrary/AssemblyInfo.cs        2005-01-15 19:27:25 UTC (rev 13064)
@@ -0,0 +1,32 @@
</small></pre><pre class="diff" id="added">+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following
+// attributes.
+//
+// change them to the information which is associated with the assembly
+// you compile.
+
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all values by your own or you can build default build and revision
+// numbers with the '*' character (the default):
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes specify the key for the sign of your assembly. See the
+// .NET Framework documentation for more information about signing.
+// This is not required, if you don't want signing let these attributes like they're.
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
</pre></div>
<hr /><div class="file">
<div class="fileheader"><big><b>Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/BinaryReaderHelp.cs</b></big></div>
<pre class="diff"><small id="info">--- trunk/irc/TechBot/CHMLibrary/CHMDecoding/BinaryReaderHelp.cs        2005-01-15 19:15:45 UTC (rev 13063)
+++ trunk/irc/TechBot/CHMLibrary/CHMDecoding/BinaryReaderHelp.cs        2005-01-15 19:27:25 UTC (rev 13064)
@@ -0,0 +1,274 @@
</small></pre><pre class="diff" id="added">+using System;
+using System.Collections;
+using System.IO;
+using System.Text;
+using System.Globalization;
+
+namespace HtmlHelp.ChmDecoding
+{
+        /// <summary>
+        /// The class <c>BinaryReaderHelp</c> implements static helper methods for extracting binary data
+        /// from a binary reader object.
+        /// </summary>
+        internal class BinaryReaderHelp
+        {
+                /// <summary>
+                /// Internal helper method to extract null-terminated strings from a binary reader
+                /// </summary>
+                /// <param name="binReader">reference to the binary reader</param>
+                /// <param name="offset">offset in the stream</param>
+                /// <param name="noOffset">true if the offset value should be used</param>
+                /// <param name="encoder">encoder used for text encoding</param>
+                /// <returns>An extracted string value</returns>
+                internal static string ExtractString(ref BinaryReader binReader, int offset, bool noOffset, Encoding encoder)
+                {
+                        string strReturn = "";
+
+                        if(encoder == null)
+                                encoder = Encoding.ASCII;
+
+                        ArrayList nameBytes = new ArrayList();
+                        byte curByte;
+                        
+                        if(!noOffset)
+                                binReader.BaseStream.Seek(offset, SeekOrigin.Begin);
+
+                        if(binReader.BaseStream.Position >= binReader.BaseStream.Length)
+                                return "";
+
+                        curByte = binReader.ReadByte();
+                        while( (curByte != (byte)0) && (binReader.BaseStream.Position < binReader.BaseStream.Length) )
+                        {        
+                                nameBytes.Add( curByte );
+                                curByte = binReader.ReadByte();
+                        }
+
+                        byte[] name = (byte[]) (nameBytes.ToArray(System.Type.GetType("System.Byte")));
+                        strReturn = encoder.GetString(name,0,name.Length);
+
+                        return strReturn;
+                }
+
+                /// <summary>
+                /// Internal helper method to extract a string with a specific length from the binary reader
+                /// </summary>
+                /// <param name="binReader">reference to the binary reader</param>
+                /// <param name="length">length of the string (number of bytes)</param>
+                /// <param name="offset">offset in the stream</param>
+                /// <param name="noOffset">true if the offset value should be used</param>
+                /// <param name="encoder">encoder used for text encoding</param>
+                /// <returns>An extracted string value</returns>
+                internal static string ExtractString(ref BinaryReader binReader, int length, int offset, bool noOffset, Encoding encoder)
+                {
+                        string strReturn = "";
+
+                        if(length == 0)
+                                return "";
+
+                        if(encoder == null)
+                                encoder = Encoding.ASCII;
+
+                        ArrayList nameBytes = new ArrayList();
+                        byte curByte;
+                        
+                        if(!noOffset)
+                                binReader.BaseStream.Seek(offset, SeekOrigin.Begin);
+
+                        if(binReader.BaseStream.Position >= binReader.BaseStream.Length)
+                                return "";
+
+                        curByte = binReader.ReadByte();
+                        while( (curByte != (byte)0) && (nameBytes.Count < length) && (binReader.BaseStream.Position < binReader.BaseStream.Length) )
+                        {        
+                                nameBytes.Add( curByte );
+
+                                if(nameBytes.Count < length)
+                                        curByte = binReader.ReadByte();
+                        }
+
+                        byte[] name = (byte[]) (nameBytes.ToArray(System.Type.GetType("System.Byte")));
+                        strReturn = encoder.GetString(name,0,name.Length);
+
+                        return strReturn;
+                }
+
+                /// <summary>
+                /// Internal helper method to extract a string with a specific length from the binary reader
+                /// </summary>
+                /// <param name="binReader">reference to the binary reader</param>
+                /// <param name="bFoundTerminator">reference to a bool vairable which will receive true if the
+                /// string terminator \0 was found. false indicates that the end of the stream was reached.</param>
+                /// <param name="offset">offset in the stream</param>
+                /// <param name="noOffset">true if the offset value should be used</param>
+                /// <param name="encoder">encoder used for text encoding</param>
+                /// <returns>An extracted string value</returns>
+                internal static string ExtractString(ref BinaryReader binReader, ref bool bFoundTerminator, int offset, bool noOffset, Encoding encoder)
+                {
+                        string strReturn = "";
+
+                        ArrayList nameBytes = new ArrayList();
+                        byte curByte;
+                        
+                        if(encoder == null)
+                                encoder = Encoding.ASCII;
+
+                        if(!noOffset)
+                                binReader.BaseStream.Seek(offset, SeekOrigin.Begin);
+
+                        if(binReader.BaseStream.Position >= binReader.BaseStream.Length)
+                                return "";
+
+                        curByte = binReader.ReadByte();
+                        while( (curByte != (byte)0) && (binReader.BaseStream.Position < binReader.BaseStream.Length) )
+                        {        
+                                nameBytes.Add( curByte );
+                                curByte = binReader.ReadByte();
+
+                                if( curByte == (byte)0 )
+                                {
+                                        bFoundTerminator = true;
+                                }
+                        }
+
+                        byte[] name = (byte[]) (nameBytes.ToArray(System.Type.GetType("System.Byte")));
+                        strReturn = encoder.GetString(name,0,name.Length);
+
+                        return strReturn;
+                }
+
+                /// <summary>
+                /// Internal helper method to extract a null-terminated UTF-16/UCS-2 strings from a binary reader
+                /// </summary>
+                /// <param name="binReader">reference to the binary reader</param>
+                /// <param name="offset">offset in the stream</param>
+                /// <param name="noOffset">true if the offset value should be used</param>
+                /// <param name="encoder">encoder used for text encoding</param>
+                /// <returns>An extracted string value</returns>
+                internal static string ExtractUTF16String(ref BinaryReader binReader, int offset, bool noOffset, Encoding encoder)
+                {
+                        string strReturn = "";
+
+                        ArrayList nameBytes = new ArrayList();
+                        byte curByte;
+                        int lastByte=-1;
+                        
+                        if(!noOffset)
+                                binReader.BaseStream.Seek(offset, SeekOrigin.Begin);
+
+                        if(binReader.BaseStream.Position >= binReader.BaseStream.Length)
+                                return "";
+
+                        if(encoder == null)
+                                encoder = Encoding.Unicode;
+
+                        curByte = binReader.ReadByte();
+                        int nCnt = 0;
+                        while( ((curByte != (byte)0) || (lastByte != 0) ) && (binReader.BaseStream.Position < binReader.BaseStream.Length) )
+                        {        
+                                nameBytes.Add( curByte );
+
+                                if(nCnt%2 == 0)
+                                        lastByte = (int)curByte;
+
+                                curByte = binReader.ReadByte();
+
+                                nCnt++;
+                        }
+
+                        byte[] name = (byte[]) (nameBytes.ToArray(System.Type.GetType("System.Byte")));
+                        strReturn = Encoding.Unicode.GetString(name,0,name.Length);
+
+                        // apply text encoding
+                        name = Encoding.Default.GetBytes(strReturn);
+                        strReturn = encoder.GetString(name,0,name.Length);
+
+                        return strReturn;
+                }
+
+                /// <summary>
+                /// Internal helper for reading ENCINT encoded integer values
+                /// </summary>
+                /// <param name="binReader">reference to the reader</param>
+                /// <returns>a long value</returns>
+                internal static long ReadENCINT(ref BinaryReader binReader)
+                {
+                        long nRet = 0;
+                        byte buffer = 0;
+                        int shift = 0;
+
+                        if(binReader.BaseStream.Position >= binReader.BaseStream.Length)
+                                return nRet;
+                        
+                        do
+                        {
+                                buffer = binReader.ReadByte();
+                                nRet |= ((long)((buffer & (byte)0x7F))) << shift;
+                                shift += 7;
+
+                        }while ( (buffer & (byte)0x80) != 0);
+
+                        return nRet;
+                }
+
+                /// <summary>
+                /// Reads an s/r encoded value from the byte array and decodes it into an integer
+                /// </summary>
+                /// <param name="wclBits">a byte array containing all bits (contains only 0 or 1 elements)</param>
+                /// <param name="s">scale param for encoding</param>
+                /// <param name="r">root param for encoding</param>
+                /// <param name="nBitIndex">current index in the wclBits array</param>
+                /// <returns>Returns an decoded integer value.</returns>
+                internal static int ReadSRItem(byte[] wclBits, int s, int r, ref int nBitIndex)
+                {
+                        int nRet = 0;
+                        int q = r;
+
+                        int nPref1Cnt = 0;
+
+                        while( wclBits[nBitIndex++] == 1)
+                        {
+                                nPref1Cnt++;
+                        }
+
+                        if(nPref1Cnt == 0)
+                        {
+                                int nMask = 0;
+
+                                for(int nbits=0; nbits<q;nbits++)
+                                {
+                                        nMask |= ( 0x01 & (int)wclBits[nBitIndex]) << (q-nbits-1);
+                                        nBitIndex++;
+                                }
+
+                                nRet = nMask;
+                        }
+                        else
+                        {
+                                q += (nPref1Cnt-1);
+
+                                int nMask = 0;
+                                int nRMaxValue = 0;
+
+                                for(int nbits=0; nbits<q;nbits++)
+                                {
+                                        nMask |= ( 0x01 & (int)wclBits[nBitIndex]) << (q-nbits-1);
+                                        nBitIndex++;
+                                }
+
+                                for(int nsv=0; nsv<r; nsv++)
+                                {
+                                        nRMaxValue = nRMaxValue << 1;
+                                        nRMaxValue |= 0x1;
+                                }
+        
+                                nRMaxValue++; // startvalue of s/r encoding with 1 prefixing '1'
+
+                                nRMaxValue *= (int) Math.Pow((double)2, (double)(nPref1Cnt-1));
+
+                                nRet = nRMaxValue + nMask;
+                        }
+
+                        return nRet;
+                }
+        }
+}
</pre></div>
<hr /><div class="file">
<div class="fileheader"><big><b>Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMBtree.cs</b></big></div>
<pre class="diff"><small id="info">--- trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMBtree.cs        2005-01-15 19:15:45 UTC (rev 13063)
+++ trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMBtree.cs        2005-01-15 19:27:25 UTC (rev 13064)
@@ -0,0 +1,325 @@
</small></pre><pre class="diff" id="added">+using System;
+using System.IO;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace HtmlHelp.ChmDecoding
+{
+        /// <summary>
+        /// The class <c>CHMBtree</c> implements methods/properties to decode the binary help index.
+        /// This class automatically creates an index arraylist for the current CHMFile instance.
+        /// It does not store the index internally !
+        /// </summary>
+        /// <remarks>The binary index can be found in the storage file $WWKeywordLinks/BTree</remarks>
+        internal sealed class CHMBtree : IDisposable
+        {
+                /// <summary>
+                /// Constant specifying the size of the string blocks
+                /// </summary>
+                private const int BLOCK_SIZE = 2048;
+                /// <summary>
+                /// Internal flag specifying if the object is going to be disposed
+                /// </summary>
+                private bool disposed = false;
+                /// <summary>
+                /// Internal member storing the binary file data
+                /// </summary>
+                private byte[] _binaryFileData = null;
+                /// <summary>
+                /// Internal member storing flags
+                /// </summary>
+                private int _flags = 0;
+                /// <summary>
+                /// Internal member storing the data format
+                /// </summary>
+                private byte[] _dataFormat = new byte[16];
+                /// <summary>
+                /// Internal member storing the index of the last listing block
+                /// </summary>
+                private int _indexOfLastListingBlock = 0;
+                /// <summary>
+                /// Internal member storing the index of the root block
+                /// </summary>
+                private int _indexOfRootBlock = 0;
+                /// <summary>
+                /// Internal member storing the number of blocks
+                /// </summary>
+                private int _numberOfBlocks = 0;
+                /// <summary>
+                /// Internal member storing the tree depth.
+                /// (1 if no index blocks, 2 one level of index blocks, ...)
+                /// </summary>
+                private int _treeDepth = 0;
+                /// <summary>
+                /// Internal member storing the number of keywords in the file
+                /// </summary>
+                private int _numberOfKeywords = 0;
+                /// <summary>
+                /// Internal member storing the codepage
+                /// </summary>
+                private int _codePage = 0;
+                /// <summary>
+                /// true if the index is from a CHI or CHM file, else CHW
+                /// </summary>
+                private bool _isCHI_CHM = true;
+                /// <summary>
+                /// Internal member storing the associated chmfile object
+                /// </summary>
+                private CHMFile _associatedFile = null;
+                /// <summary>
+                /// Internal flag specifying if we have to read listing or index blocks
+                /// </summary>
+                private bool _readListingBlocks = true;
+                /// <summary>
+                /// Internal member storing an indexlist of the current file.
+                /// </summary>
+                private ArrayList _indexList = new ArrayList();
+
+                /// <summary>
+                /// Constructor of the class
+                /// </summary>
+                /// <param name="binaryFileData">binary file data of the $WWKeywordLinks/BTree file</param>
+                /// <param name="associatedFile">associated chm file</param>
+                public CHMBtree(byte[] binaryFileData, CHMFile associatedFile)
+                {
+                        if( associatedFile == null)
+                        {
+                                throw new ArgumentException("CHMBtree.ctor() - Associated CHMFile must not be null !", "associatedFile");
+                        }
+
+                        _binaryFileData = binaryFileData;
+                        _associatedFile = associatedFile;
+                        DecodeData();
+
+                        // clear internal binary data after extraction
+                        _binaryFileData = null;
+                }
+
+                /// <summary>
+                /// Decodes the binary file data and fills the internal properties
+                /// </summary>
+                /// <returns>true if succeeded</returns>
+                private bool DecodeData()
+                {
+                        bool bRet = true;
+
+                        MemoryStream memStream = new MemoryStream(_binaryFileData);
+                        BinaryReader binReader = new BinaryReader(memStream);
+                        
+                        int nCurOffset = 0;
+                        int nTemp = 0;
+
+                        // decode header
+                        binReader.ReadChars(2); // 2chars signature (not important)
+                        
+                        _flags = (int)binReader.ReadInt16(); // WORD flags
+
+                        binReader.ReadInt16(); // size of blocks (always 2048)
+
+                        _dataFormat = binReader.ReadBytes(16);
+                        
+                        binReader.ReadInt32(); // unknown DWORD
+
+                        _indexOfLastListingBlock = binReader.ReadInt32();
+                        _indexOfRootBlock = binReader.ReadInt32();
+
+                        binReader.ReadInt32(); // unknown DWORD
+
+                        _numberOfBlocks = binReader.ReadInt32();
+                        _treeDepth = binReader.ReadInt16();
+                        _numberOfKeywords = binReader.ReadInt32();
+                        _codePage = binReader.ReadInt32();
+
+                        binReader.ReadInt32(); // lcid DWORD
+                        
+                        nTemp = binReader.ReadInt32();
+                        _isCHI_CHM = (nTemp==1);
+
+                        binReader.ReadInt32(); // unknown DWORD
+                        binReader.ReadInt32(); // unknown DWORD
+                        binReader.ReadInt32(); // unknown DWORD
+                        binReader.ReadInt32(); // unknown DWORD
+
+                        // end of header decode
+
+                        while( (memStream.Position < memStream.Length) && (bRet) )
+                        {
+                                nCurOffset = (int)memStream.Position;
+                                byte [] dataBlock = binReader.ReadBytes(BLOCK_SIZE);
+                                bRet &= DecodeBlock(dataBlock, ref nCurOffset, _treeDepth-1);
+                        }
+
+                        return bRet;
+                }
+
+                /// <summary>
+                /// Decodes a block of url-string data
+                /// </summary>
+                /// <param name="dataBlock">block of data</param>
+                /// <param name="nOffset">current file offset</param>
+                /// <param name="indexBlocks">number of index blocks</param>
+                /// <returns>true if succeeded</returns>
+                private bool DecodeBlock( byte[] dataBlock, ref int nOffset, int indexBlocks )
+                {
+                        bool bRet = true;
+                        int nblockOffset = nOffset;
+
+                        MemoryStream memStream = new MemoryStream(dataBlock);
+                        BinaryReader binReader = new BinaryReader(memStream);
+
+                        int freeSpace = binReader.ReadInt16(); // length of freespace
+                        int nrOfEntries = binReader.ReadInt16(); // number of entries
+
+                        bool bListingEndReached = false;
+
+                        //while( (memStream.Position < (memStream.Length-freeSpace)) && (bRet) )
+                        //{
+                                int nIndexOfPrevBlock = -1;
+                                int nIndexOfNextBlock = -1;
+                                int nIndexOfChildBlock = 0;
+                                
+                                if(_readListingBlocks)
+                                {
+                                        nIndexOfPrevBlock = binReader.ReadInt32(); // -1 if this is the header
+                                        nIndexOfNextBlock = binReader.ReadInt32(); // -1 if this is the last block
+                                }
+                                else
+                                {
+                                        nIndexOfChildBlock = binReader.ReadInt32();
+                                }
+
+                                for(int nE = 0; nE < nrOfEntries; nE++)
+                                {
+                                        if(_readListingBlocks)
+                                        {
+                                                bListingEndReached = (nIndexOfNextBlock==-1);
+
+                                                string keyWord = BinaryReaderHelp.ExtractUTF16String(ref binReader, 0, true, _associatedFile.TextEncoding);
+
+                                                bool isSeeAlsoKeyword = (binReader.ReadInt16()!=0);
+                                
+                                                int indent = binReader.ReadInt16(); // indent of entry
+                                                int nCharIndex = binReader.ReadInt32();
+
+                                                binReader.ReadInt32();
+
+                                                int numberOfPairs =        binReader.ReadInt32();
+
+                                                int[] nTopics = new int[numberOfPairs];
+                                                string[] seeAlso = new string[numberOfPairs];
+
+                                                for(int i=0; i < numberOfPairs; i++)
+                                                {
+                                                        if(isSeeAlsoKeyword)
+                                                        {
+                                                                seeAlso[i] = BinaryReaderHelp.ExtractUTF16String(ref binReader, 0, true, _associatedFile.TextEncoding);
+                                                        }
+                                                        else
+                                                        {
+                                                                nTopics[i] = binReader.ReadInt32();
+                                                        }
+                                                }
+
+                                                binReader.ReadInt32(); // unknown
+
+                                                int nIndexOfThisEntry = binReader.ReadInt32();
+
+                                                IndexItem newItem = new IndexItem(_associatedFile, keyWord, isSeeAlsoKeyword, indent, nCharIndex, nIndexOfThisEntry, seeAlso, nTopics);
+                                                _indexList.Add(newItem);
+                                        }
+                                        else
+                                        {
+                                                string keyWord = BinaryReaderHelp.ExtractUTF16String(ref binReader, 0, true, _associatedFile.TextEncoding);
+
+                                                bool isSeeAlsoKeyword = (binReader.ReadInt16()!=0);
+                                
+                                                int indent = binReader.ReadInt16(); // indent of entry
+                                                int nCharIndex = binReader.ReadInt32();
+
+                                                binReader.ReadInt32();
+
+                                                int numberOfPairs =        binReader.ReadInt32();
+
+                                                int[] nTopics = new int[numberOfPairs];
+                                                string[] seeAlso = new string[numberOfPairs];
+
+                                                for(int i=0; i < numberOfPairs; i++)
+                                                {
+                                                        if(isSeeAlsoKeyword)
+                                                        {
+                                                                seeAlso[i] = BinaryReaderHelp.ExtractUTF16String(ref binReader, 0, true, _associatedFile.TextEncoding);
+                                                        }
+                                                        else
+                                                        {
+                                                                nTopics[i] = binReader.ReadInt32();
+                                                        }
+                                                }
+
+                                                int nIndexChild = binReader.ReadInt32();
+                                                int nIndexOfThisEntry=-1;
+
+                                                IndexItem newItem = new IndexItem(_associatedFile, keyWord, isSeeAlsoKeyword, indent, nCharIndex, nIndexOfThisEntry, seeAlso, nTopics);
+                                                _indexList.Add(newItem);
+
+                                        }
+                                }
+                        //}
+
+                        binReader.ReadBytes(freeSpace);
+                        
+
+                        if( bListingEndReached )
+                                _readListingBlocks = false;
+
+                        return bRet;
+                }
+
+                /// <summary>
+                /// Gets the internal generated index list
+                /// </summary>
+                internal ArrayList IndexList
+                {
+                        get { return _indexList; }
+                }
+
+                /// <summary>
+                /// Implement IDisposable.
+                /// </summary>
+                public void Dispose()
+                {
+                        Dispose(true);
+                        // This object will be cleaned up by the Dispose method.
+                        // Therefore, you should call GC.SupressFinalize to
+                        // take this object off the finalization queue
+                        // and prevent finalization code for this object
+                        // from executing a second time.
+                        GC.SuppressFinalize(this);
+                }
+
+                /// <summary>
+                /// Dispose(bool disposing) executes in two distinct scenarios.
+                /// If disposing equals true, the method has been called directly
+                /// or indirectly by a user's code. Managed and unmanaged resources
+                /// can be disposed.
+                /// If disposing equals false, the method has been called by the
+                /// runtime from inside the finalizer and you should not reference
+                /// other objects. Only unmanaged resources can be disposed.
+                /// </summary>
+                /// <param name="disposing">disposing flag</param>
+                private void Dispose(bool disposing)
+                {
+                        // Check to see if Dispose has already been called.
+                        if(!this.disposed)
+                        {
+                                // If disposing equals true, dispose all managed
+                                // and unmanaged resources.
+                                if(disposing)
+                                {
+                                        // Dispose managed resources.
+                                        _binaryFileData = null;
+                                }
+                        }
+                        disposed = true;
+                }
+        }
+}
</pre></div>
<hr /><div class="file">
<div class="fileheader"><big><b>Added: trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMFile.cs</b></big></div>
<pre class="diff"><small id="info">--- trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMFile.cs        2005-01-15 19:15:45 UTC (rev 13063)
+++ trunk/irc/TechBot/CHMLibrary/CHMDecoding/CHMFile.cs        2005-01-15 19:27:25 UTC (rev 13064)
@@ -0,0 +1,2061 @@
</small></pre><pre class="diff" id="added">+using System;
+using System.Diagnostics;
+using System.Collections;
+using System.Collections.Specialized;
+using System.IO;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Globalization;
+// using HtmlHelp.Storage;
+
+namespace HtmlHelp.ChmDecoding
+{
+        /// <summary>
+        /// Internal enumeration for specifying the type of the html-help file
+        /// </summary>
+        internal enum HtmlHelpFileType
+        {
+                /// <summary>
+                /// CHM - compiled contents file
+                /// </summary>
+                /// <remarks>A file with this extension must always exist. If the file would be too long, some parts
+                /// can be splitted into the filestypes below.</remarks>
+                CHM = 0,
+                /// <summary>
+                /// CHI - compiled system file
+                /// </summary>
+                CHI = 1,
+                /// <summary>
+                /// CHQ - compiled fulltext search file
+                /// </summary>
+                CHQ = 2,
+                /// <summary>
+                /// CHW - compiled index file
+                /// </summary>
+                CHW = 3
+
+        }
+
+        /// <summary>
+        /// The class <c>CHMFile</c> implemts methods and properties for handling a single chmfile.
+        /// </summary>
+        public sealed class CHMFile : IDisposable
+        {
+                /// <summary>
+                /// Internal member storing a reference to the hosting HtmlHelpSystem instance
+                /// </summary>
+                private HtmlHelpSystem _systemInstance = null;
+                /// <summary>
+                /// Internal flag specifying if only system data has been loaded
+                /// </summary>
+                private bool _onlySystem = false;
+                /// <summary>
+                /// Internal flag specifying if the object is going to be disposed
+                /// </summary>
+                private bool disposed = false;
+                /// <summary>
+                /// Internal arraylist containing the table of contents
+                /// </summary>
+                private ArrayList _toc = new ArrayList();
+                /// <summary>
+                /// Internal arraylist containing items of the toc which are merge-Links
+                /// </summary>
+                private ArrayList _mergeLinks = new ArrayList();
+                /// <summary>
+                /// Internal member storing the read information types
+                /// </summary>
+                private ArrayList _informationTypes = new ArrayList();
+                /// <summary>
+                /// Internal member storing the read categories
+                /// </summary>
+                private ArrayList _categories = new ArrayList();
+                /// <summary>
+                /// Internal arraylist containing the index (klinks)
+                /// </summary>
+                private ArrayList _indexKLinks = new ArrayList();
+                /// <summary>
+                /// Internal arraylist containing the index (alinks)
+                /// </summary>
+                private ArrayList _indexALinks = new ArrayList();
+                /// <summary>
+                /// Internal member storing the full filename
+                /// </summary>
+                private string _chmFileName = "";
+                /// <summary>
+                /// Internal member storing the full filename of the chi-file (includes all system files)
+                /// The file name is zero-length if there is no chi-file
+                /// </summary>
+                private string _chiFileName = "";
+                /// <summary>
+                /// Internal member storing the full filename of the chw-file (includes the help index)
+                /// The file name is zero-length if there is no chw-file
+                /// </summary>
+                private string _chwFileName = "";
+                /// <summary>
+                /// Internal member storing the full filename of the chq-file (includes the fulltext contents)
+                /// The file name is zero-length if there is no chq-file
+                /// </summary>
+                private string _chqFileName = "";
+                /// <summary>
+                /// Internal member storing the decoded information from the internal #SYSTEM file
+                /// </summary>
+                private CHMSystem _systemFile = null;
+                /// <summary>
+                /// Internal member storing the decoded information from the internal #IDXHDR file
+                /// </summary>
+                private CHMIdxhdr _idxhdrFile = null;
+                /// <summary>
+                /// Internal member storing the decoded information from the internal #STRINGS file
+                /// </summary>
+                private CHMStrings _stringsFile = null;
+                /// <summary>
+                /// Internal member storing the decoded information from the internal #URLSTR file
+                /// </summary>
+                private CHMUrlstr _urlstrFile = null;
+                /// <summary>
+                /// Internal member storing the decoded information from the internal #URLTBL file
+                /// </summary>
+                private CHMUrltable _urltblFile = null;
+                /// <summary>
+                /// Internal member storing the decoded information from the internal #TOPICS file
+                /// </summary>
+                private CHMTopics _topicsFile = null;
+                /// <summary>
+                /// Internal member storing the decoded information from the internal #TOCIDX file
+                /// </summary>
+                private CHMTocidx _tocidxFile = null;
+                /// <summary>
+                /// Internal member storing the decoded information from the internal binary index file (KLinks).
+                /// </summary>
+                private CHMBtree _kLinks = null;
+                /// <summary>
+                /// Internal member storing the decoded information from the internal binary index file (ALinks).
+                /// </summary>
+                private CHMBtree _aLinks = null;
+                /// <summary>
+                /// Internal member storing the fulltext searcher for this file
+                /// </summary>
+                private FullTextEngine _ftSearcher = null;
+                /// <summary>
+                /// Internal member storing the default encoder
+                /// </summary>
+                private Encoding _textEncoding = Encoding.GetEncoding(1252); // standard windows-1252 encoder
+                /// <summary>
+                /// Internal memebr storing the chm file info
+                /// </summary>
+                private ChmFileInfo _chmFileInfo = null;
+                /// <summary>
+                /// Internal flag specifying if the dump must be written (if enabled)
+                /// </summary>
+                private bool _mustWriteDump = false;
+                /// <summary>
+                /// Internal flag specifying if data was read using the dump
+                /// </summary>
+                private bool _dumpRead = false;
+                /// <summary>
+                /// Internal member for specifying the number of dump-reading trys.
+                /// If dump-reading fails, this is used that it will not be opened a second time
+                /// (in CHM-Systems with CHM, CHI, etc. files)
+                /// </summary>
+                private int _dumpReadTrys = 0;
+                /// <summary>
+                /// Internal member storing the dumping info instance
+                /// </summary>
+                private DumpingInfo _dmpInfo = null;
+
+                private CHMStream.CHMStream _currentWrapper;
+                private CHMStream.CHMStream _baseStream=null;
+                public CHMStream.CHMStream BaseStream
+                {
+                        get
+                        {
+                                if (_baseStream==null)
+                                        _baseStream=new CHMStream.CHMStream(this.ChmFilePath);
+                                return _baseStream;
+                        }
+                }
+
+                /// <summary>
+                /// Creates a new instance of the class
+                /// </summary>
+                /// <param name="systemInstance">a reference to the hosting HtmlHelpSystem instance</param>
+                /// <param name="chmFile">chm file to read</param>
+                public CHMFile(HtmlHelpSystem systemInstance, string chmFile) : this(systemInstance, chmFile, false, null)
+                {
+                }
+
+                /// <summary>
+                /// Creates a new instance of the class
+                /// </summary>
+                /// <param name="systemInstance">a reference to the hosting HtmlHelpSystem instance</param>
+                /// <param name="chmFile">chm file to read</param>
+                /// <param name="dmpInfo">A dumping info class</param>
+                public CHMFile(HtmlHelpSystem systemInstance, string chmFile, DumpingInfo dmpInfo) : this(systemInstance, chmFile, false, dmpInfo)
+                {
+                }
+
+                /// <summary>
+                /// Creates a new instance of the class
+                /// </summary>
+                /// <param name="systemInstance">a reference to the hosting HtmlHelpSystem instance</param>
+                /// <param name="chmFile">chm file to read</param>
+                /// <param name="onlySystemData">true if only system data should be extracted (no index or toc)</param>
+                internal CHMFile(HtmlHelpSystem systemInstance, string chmFile, bool onlySystemData) : this(systemInstance, chmFile, onlySystemData, null)
+                {
+                }
+
+                /// <summary>
+                /// Creates a new instance of the class
+                /// </summary>
+                /// <param name="systemInstance">a reference to the hosting HtmlHelpSystem instance</param>
+                /// <param name="chmFile">chm file to read</param>
+                /// <param name="onlySystemData">true if only system data should be extracted (no index or toc)</param>
+                /// <param name="dmpInfo">A dumping info class</param>
+                internal CHMFile(HtmlHelpSystem systemInstance, string chmFile, bool onlySystemData, DumpingInfo dmpInfo)
+                {
+                        _systemInstance = systemInstance;
+                        _dumpReadTrys=0;
+
+                        _dmpInfo = dmpInfo;
+                        if(dmpInfo != null)
+                        {
+                                dmpInfo.ChmFile = this;
+                        }
+
+                        if( ! chmFile.ToLower().EndsWith(".chm") )
+                        {
+                                throw new ArgumentException("HtmlHelp file must have the extension .chm !", "chmFile");
+                        }
+
+                        _chmFileName = chmFile;
+                        _chiFileName = "";
+
+                        // Read the IStorage file system
+                        if( File.Exists(chmFile) )
+                        {
+                                _onlySystem = onlySystemData;
+                                
+                                DateTime dtStartHH = DateTime.Now;
+
+                                string sCHIName = _chmFileName.Substring(0, _chmFileName.Length-3) + "chi";
+                                string sCHQName = _chmFileName.Substring(0, _chmFileName.Length-3) + "chq";
+                                string sCHWName = _chmFileName.Substring(0, _chmFileName.Length-3) + "chw";
+
+                                // If there is a CHI file present (this file includes the internal system files for the current chm file)
+                                if( File.Exists(sCHIName) )
+                                {
+                                        _chiFileName = sCHIName;
+                                
+                                        ReadFile(_chiFileName, HtmlHelpFileType.CHI);
+                                }
+
+                                // If there is a CHW file present (this file includes the internal binary index of the help)
+                                if(( File.Exists(sCHWName) ) && (!_onlySystem) )
+                                {
+                                        _chwFileName = sCHWName;
+                                
+                                        ReadFile(_chwFileName, HtmlHelpFileType.CHW);
+                                }
+
+                                // If there is a CHQ file present (this file includes the fulltext-search data)
+                                if(( File.Exists(sCHQName) ) && (!_onlySystem) )
+                                {
+                                        _chqFileName = sCHQName;
+                                
+                                        ReadFile(_chqFileName, HtmlHelpFileType.CHQ);
+                                }
+
+                                ReadFile(chmFile, HtmlHelpFileType.CHM);
+
+                                if(_mustWriteDump)
+                                {                                        
+                                        _mustWriteDump = !SaveDump(dmpInfo);
+
+                                }
+
+                                // check the default-topic setting
+                                if(_systemFile.DefaultTopic.Length > 0)
+                                {
+                                        CHMStream.CHMStream iw=null;
+                                        iw = new CHMStream.CHMStream(chmFile);
+                                        _currentWrapper=iw;
+
+                                        // tryo to open the topic file
+                                        MemoryStream fileObject = iw.OpenStream( _systemFile.DefaultTopic);
+                                        if( fileObject != null)
+                                        {
+                                                // if succeed, the topic default topic is OK
+                                                fileObject.Close();
+                                        }
+                                        else
+                                        {
+                                                // set the first topic of the toc-tree as default topic
+                                                if(_toc.Count > 0)
+                                                {
+                                                        _systemFile.SetDefaultTopic( ((TOCItem) _toc[0]).Local );
+                                                }
+                                        }
+                                        _currentWrapper=null;
+                                }
+                                else
+                                {
+                                        // set the first topic of the toc-tree as default topic
+                                        if(_toc.Count > 0)
+                                        {
+                                                _systemFile.SetDefaultTopic( ((TOCItem) _toc[0]).Local );
+                                        }
+                                }
+
+                                _chmFileInfo = new ChmFileInfo(this);
+                        }
+                        else
+                        {
+                                throw new ArgumentException("File '" + chmFile + "' not found !", "chmFile");
+                        }
+                }
+
+                /// <summary>
+                /// Read a IStorage file
+                /// </summary>
+                /// <param name="fname">filename</param>
+                /// <param name="type">type of file</param>
+                private void ReadFile(string fname, HtmlHelpFileType type)
+                {
+                        CHMStream.CHMStream iw=null;
+                        iw=new CHMStream.CHMStream();                        
+                        iw.OpenCHM(fname);
+                        _currentWrapper=iw;
+                        MemoryStream fileObject=null;                        
+
+                        // ITStorageWrapper iw = null;
+
+                        // Open the internal chm system files and parse their content
+                        // FileObject fileObject = null;
+                        // iw = new ITStorageWrapper(fname, false);                        
+
+                        if( (type != HtmlHelpFileType.CHQ) && (type != HtmlHelpFileType.CHW) )
+                        {                                
+                                fileObject = iw.OpenStream("#SYSTEM");
+                                if ((fileObject != null) && (fileObject.Length>0))
+                                        _systemFile = new CHMSystem(fileObject.ToArray(), this);                                                                        
+
+                                fileObject = iw.OpenStream("#IDXHDR");
+                                if ((fileObject != null) && (fileObject.Length>0))
+                                        _idxhdrFile = new CHMIdxhdr(fileObject.ToArray(), this);                                        
+                                
+                                // try to read Dump
+                                if((!_dumpRead)&&(CheckDump(_dmpInfo))&&(_dumpReadTrys==0))
+                                {
+                                        _dumpReadTrys++;
</pre>
<strong class="error">[truncated at 1000 lines; 23868 more skipped]</strong>
</div>
</body>
</html>