示例#1
0
        public void Generate()
        {
            if (this._resourceList == null)
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ResourceWriterSaved"));
            }
            BinaryWriter  binaryWriter1 = new BinaryWriter(this._output, Encoding.UTF8);
            List <string> types         = new List <string>();

            binaryWriter1.Write(ResourceManager.MagicNumber);
            binaryWriter1.Write(ResourceManager.HeaderVersionNumber);
            MemoryStream memoryStream1         = new MemoryStream(240);
            BinaryWriter binaryWriter2         = new BinaryWriter((Stream)memoryStream1);
            string       assemblyQualifiedName = MultitargetingHelpers.GetAssemblyQualifiedName(typeof(ResourceReader), this.typeConverter);

            binaryWriter2.Write(assemblyQualifiedName);
            string str = ResourceManager.ResSetTypeName;

            binaryWriter2.Write(str);
            binaryWriter2.Flush();
            binaryWriter1.Write((int)memoryStream1.Length);
            binaryWriter1.Write(memoryStream1.GetBuffer(), 0, (int)memoryStream1.Length);
            binaryWriter1.Write(2);
            int count = this._resourceList.Count;

            if (this._preserializedData != null)
            {
                count += this._preserializedData.Count;
            }
            binaryWriter1.Write(count);
            int[]         keys          = new int[count];
            int[]         items         = new int[count];
            int           index1        = 0;
            MemoryStream  memoryStream2 = new MemoryStream(count * 40);
            BinaryWriter  binaryWriter3 = new BinaryWriter((Stream)memoryStream2, Encoding.Unicode);
            Stream        output        = (Stream)null;
            PermissionSet permissionSet = new PermissionSet(PermissionState.None);

            permissionSet.AddPermission((IPermission) new EnvironmentPermission(PermissionState.Unrestricted));
            permissionSet.AddPermission((IPermission) new FileIOPermission(PermissionState.Unrestricted));
            try
            {
                permissionSet.Assert();
                string tempFileName = Path.GetTempFileName();
                int    num1         = 8448;
                File.SetAttributes(tempFileName, (FileAttributes)num1);
                int num2       = 3;
                int num3       = 3;
                int num4       = 1;
                int bufferSize = 4096;
                int num5       = 201326592;
                output = (Stream) new FileStream(tempFileName, (FileMode)num2, (FileAccess)num3, (FileShare)num4, bufferSize, (FileOptions)num5);
            }
            catch (UnauthorizedAccessException ex)
            {
                output = (Stream) new MemoryStream();
            }
            catch (IOException ex)
            {
                output = (Stream) new MemoryStream();
            }
            finally
            {
                PermissionSet.RevertAssert();
            }
            using (output)
            {
                BinaryWriter binaryWriter4 = new BinaryWriter(output, Encoding.UTF8);
                IFormatter   objFormatter  = (IFormatter) new BinaryFormatter((ISurrogateSelector)null, new StreamingContext(StreamingContextStates.File | StreamingContextStates.Persistence));
                SortedList   sortedList    = new SortedList((IDictionary)this._resourceList, (IComparer)FastResourceComparer.Default);
                if (this._preserializedData != null)
                {
                    foreach (KeyValuePair <string, ResourceWriter.PrecannedResource> keyValuePair in this._preserializedData)
                    {
                        sortedList.Add((object)keyValuePair.Key, (object)keyValuePair.Value);
                    }
                }
                IDictionaryEnumerator enumerator = sortedList.GetEnumerator();
                while (enumerator.MoveNext())
                {
                    keys[index1]    = FastResourceComparer.HashFunction((string)enumerator.Key);
                    items[index1++] = (int)binaryWriter3.Seek(0, SeekOrigin.Current);
                    binaryWriter3.Write((string)enumerator.Key);
                    binaryWriter3.Write((int)binaryWriter4.Seek(0, SeekOrigin.Current));
                    object           obj      = enumerator.Value;
                    ResourceTypeCode typeCode = this.FindTypeCode(obj, types);
                    ResourceWriter.Write7BitEncodedInt(binaryWriter4, (int)typeCode);
                    ResourceWriter.PrecannedResource precannedResource = obj as ResourceWriter.PrecannedResource;
                    if (precannedResource != null)
                    {
                        binaryWriter4.Write(precannedResource.Data);
                    }
                    else
                    {
                        this.WriteValue(typeCode, obj, binaryWriter4, objFormatter);
                    }
                }
                binaryWriter1.Write(types.Count);
                for (int index2 = 0; index2 < types.Count; ++index2)
                {
                    binaryWriter1.Write(types[index2]);
                }
                Array.Sort <int, int>(keys, items);
                binaryWriter1.Flush();
                int num1 = (int)binaryWriter1.BaseStream.Position & 7;
                if (num1 > 0)
                {
                    for (int index2 = 0; index2 < 8 - num1; ++index2)
                    {
                        binaryWriter1.Write("PAD"[index2 % 3]);
                    }
                }
                foreach (int num2 in keys)
                {
                    binaryWriter1.Write(num2);
                }
                foreach (int num2 in items)
                {
                    binaryWriter1.Write(num2);
                }
                binaryWriter1.Flush();
                binaryWriter3.Flush();
                binaryWriter4.Flush();
                int num3 = (int)(binaryWriter1.Seek(0, SeekOrigin.Current) + memoryStream2.Length) + 4;
                binaryWriter1.Write(num3);
                binaryWriter1.Write(memoryStream2.GetBuffer(), 0, (int)memoryStream2.Length);
                binaryWriter3.Close();
                output.Position = 0L;
                output.CopyTo(binaryWriter1.BaseStream);
                binaryWriter4.Close();
            }
            binaryWriter1.Flush();
            this._resourceList = (Dictionary <string, object>)null;
        }
        public void Generate()
        {
            if (this._resourceList == null)
            {
                throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ResourceWriterSaved"));
            }
            BinaryWriter  binaryWriter = new BinaryWriter(this._output, Encoding.UTF8);
            List <string> list         = new List <string>();

            binaryWriter.Write(ResourceManager.MagicNumber);
            binaryWriter.Write(ResourceManager.HeaderVersionNumber);
            MemoryStream memoryStream  = new MemoryStream(240);
            BinaryWriter binaryWriter2 = new BinaryWriter(memoryStream);

            binaryWriter2.Write(MultitargetingHelpers.GetAssemblyQualifiedName(typeof(ResourceReader), this.typeConverter));
            binaryWriter2.Write(ResourceManager.ResSetTypeName);
            binaryWriter2.Flush();
            binaryWriter.Write((int)memoryStream.Length);
            binaryWriter.Write(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
            binaryWriter.Write(2);
            int num = this._resourceList.Count;

            if (this._preserializedData != null)
            {
                num += this._preserializedData.Count;
            }
            binaryWriter.Write(num);
            int[]         array         = new int[num];
            int[]         array2        = new int[num];
            int           num2          = 0;
            MemoryStream  memoryStream2 = new MemoryStream(num * 40);
            BinaryWriter  binaryWriter3 = new BinaryWriter(memoryStream2, Encoding.Unicode);
            Stream        stream        = null;
            PermissionSet permissionSet = new PermissionSet(PermissionState.None);

            permissionSet.AddPermission(new EnvironmentPermission(PermissionState.Unrestricted));
            permissionSet.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
            try
            {
                permissionSet.Assert();
                string tempFileName = Path.GetTempFileName();
                File.SetAttributes(tempFileName, FileAttributes.Temporary | FileAttributes.NotContentIndexed);
                stream = new FileStream(tempFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.DeleteOnClose | FileOptions.SequentialScan);
            }
            catch (UnauthorizedAccessException)
            {
                stream = new MemoryStream();
            }
            catch (IOException)
            {
                stream = new MemoryStream();
            }
            finally
            {
                PermissionSet.RevertAssert();
            }
            using (stream)
            {
                BinaryWriter binaryWriter4 = new BinaryWriter(stream, Encoding.UTF8);
                IFormatter   objFormatter  = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.File | StreamingContextStates.Persistence));
                SortedList   sortedList    = new SortedList(this._resourceList, FastResourceComparer.Default);
                if (this._preserializedData != null)
                {
                    foreach (KeyValuePair <string, ResourceWriter.PrecannedResource> keyValuePair in this._preserializedData)
                    {
                        sortedList.Add(keyValuePair.Key, keyValuePair.Value);
                    }
                }
                IDictionaryEnumerator enumerator2 = sortedList.GetEnumerator();
                while (enumerator2.MoveNext())
                {
                    array[num2]    = FastResourceComparer.HashFunction((string)enumerator2.Key);
                    array2[num2++] = (int)binaryWriter3.Seek(0, SeekOrigin.Current);
                    binaryWriter3.Write((string)enumerator2.Key);
                    binaryWriter3.Write((int)binaryWriter4.Seek(0, SeekOrigin.Current));
                    object           value            = enumerator2.Value;
                    ResourceTypeCode resourceTypeCode = this.FindTypeCode(value, list);
                    ResourceWriter.Write7BitEncodedInt(binaryWriter4, (int)resourceTypeCode);
                    ResourceWriter.PrecannedResource precannedResource = value as ResourceWriter.PrecannedResource;
                    if (precannedResource != null)
                    {
                        binaryWriter4.Write(precannedResource.Data);
                    }
                    else
                    {
                        this.WriteValue(resourceTypeCode, value, binaryWriter4, objFormatter);
                    }
                }
                binaryWriter.Write(list.Count);
                for (int i = 0; i < list.Count; i++)
                {
                    binaryWriter.Write(list[i]);
                }
                Array.Sort <int, int>(array, array2);
                binaryWriter.Flush();
                int num3 = (int)binaryWriter.BaseStream.Position & 7;
                if (num3 > 0)
                {
                    for (int j = 0; j < 8 - num3; j++)
                    {
                        binaryWriter.Write("PAD"[j % 3]);
                    }
                }
                foreach (int value2 in array)
                {
                    binaryWriter.Write(value2);
                }
                foreach (int value3 in array2)
                {
                    binaryWriter.Write(value3);
                }
                binaryWriter.Flush();
                binaryWriter3.Flush();
                binaryWriter4.Flush();
                int num4 = (int)(binaryWriter.Seek(0, SeekOrigin.Current) + memoryStream2.Length);
                num4 += 4;
                binaryWriter.Write(num4);
                binaryWriter.Write(memoryStream2.GetBuffer(), 0, (int)memoryStream2.Length);
                binaryWriter3.Close();
                stream.Position = 0L;
                stream.CopyTo(binaryWriter.BaseStream);
                binaryWriter4.Close();
            }
            binaryWriter.Flush();
            this._resourceList = null;
        }