Exemplo n.º 1
0
        public void WriteFile(string filename, int[] stringReferences, int[] idReferences, ResourceInfo[] rawReferences)
        {
            if (!Directory.Exists(filename))
                Directory.CreateDirectory(filename);
            FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
            using (file)
            {
                BinaryWriter binWriter = new BinaryWriter(file);
                BinaryReader binReader = new BinaryReader(map.BaseStream);

                Tag.Info fileHeader = new Tag.Info();
                file.Position = Tag.Info.Size;
                fileHeader.type = this.type;

                fileHeader.metaLength = metaLength;
                fileHeader.metaOffset = (int)file.Position;
                binWriter.Write(bufferStream.GetBuffer(), 0, fileHeader.metaLength);

                if (rawReferences.Length > 0)
                {
                    binWriter.Write(Padding.GetBytes(file.Position, 512));
                    fileHeader.rawOffset = (int)file.Position;
                    fileHeader.rawLength = (int)file.Position;
                    for (int i = 0; i < rawReferences.Length; i++)
                    {
                        map.BaseStream.Position = rawReferences[i].Address;
                        binWriter.Write(binReader.ReadBytes(rawReferences[i].Length & 0x7FFFFFFF));
                        binWriter.Write(Padding.GetBytes(file.Position, 512));
                    }
                    fileHeader.rawLength = (int)file.Position - fileHeader.rawLength;

                    binReader = new BinaryReader(bufferStream);

                    binWriter.Write(Padding.GetBytes(file.Position, 512));
                    fileHeader.rawReferencesCount = rawReferences.Length;
                    fileHeader.rawReferencesOffset = (int)file.Position;
                    rawAddress = 0;
                    for (int i = 0; i < rawReferences.Length; i++)
                    {
                        binWriter.Write(rawAddress);
                        binWriter.Write(rawReferences[i].Length);

                        rawAddress += rawReferences[i].Length & 0x7FFFFFFF;
                        rawAddress += Padding.GetCount(rawAddress, 512);
                    }
                }

                if (stringReferences.Length > 0)
                {
                    binWriter.Write(Padding.GetBytes(file.Position, 512));
                    fileHeader.stringReferencesOffset = (int)file.Position;
                    fileHeader.stringReferencesCount = stringReferences.Length;
                    for (int i = 0; i < stringReferences.Length; i++)
                    {
                        string str = map.StringIdNames[stringReferences[i] & 0x0000FFFF];
                        binWriter.Write(Encoding.UTF8.GetBytes(str));
                        binWriter.Write(byte.MinValue);
                    }
                    if (stringReferences.Length > 1)
                        file.Position -= 1;
                    fileHeader.stringReferencesLength = (int)file.Position - fileHeader.stringReferencesOffset;
                }

                if (idReferences.Length > 0)
                {
                    binWriter.Write(Padding.GetBytes(file.Position, 512));
                    fileHeader.idReferencesOffset = (int)file.Position;
                    fileHeader.idReferencesCount = idReferences.Length;
                    for (int i = 0; i < idReferences.Length; i++)
                    {
                        string type = map.Index.TagEntries[idReferences[i] & 0x0000FFFF].Type.ToString();
                        type = Index.GetCleanType(type).Trim();
                        string tagname = map.Tagnames[idReferences[i] & 0x0000FFFF];
                        binWriter.Write(Encoding.UTF8.GetBytes(Path.ChangeExtension(tagname, type)));
                        binWriter.Write(byte.MinValue);
                    }
                    file.Position -= 1;
                    fileHeader.idReferencesLength = (int)file.Position - fileHeader.idReferencesOffset;
                }

                binWriter.Write(Padding.GetBytes(file.Position, 512));
                file.Position = 0;
                binWriter.Write(fileHeader.ToByteArray());
                binWriter.Flush();
            }
        }
Exemplo n.º 2
0
        public void BufferedWriteFile(string filename, int[] stringReferences, int[] idReferences, ResourceInfo[] rawReferences)
        {
            MemoryStream stream = new MemoryStream();
            BinaryWriter memWriter = new BinaryWriter(stream);
            BinaryReader binReader = new BinaryReader(map.BaseStream);

            Tag.Info fileHeader = new Tag.Info();
            stream.Position = Tag.Info.Size;
            fileHeader.type = this.type;

            fileHeader.cacheInformationOffset = (int)stream.Position;
            memWriter.Write(false);
            memWriter.Write(Padding.GetBytes(stream.Position, 4));
            memWriter.Write(rawCache.Count);
            for (int i = 0; i < rawCache.Count; i++)
                memWriter.Write(rawCache.Values[i].Offset0);
            int sidCount = 0, tidCount = 0;
            for (int i = 0; i < valueCache.Count; i++)
                switch (valueCache.Values[i].Type)
                {
                    case Value.ValueType.StringId:
                        sidCount++; break;
                    case Value.ValueType.TagId:
                        tidCount++; break;
                    case Value.ValueType.TagReference:
                        tidCount++; break;
                }
            memWriter.Write(sidCount);
            for (int i = 0; i < valueCache.Count; i++)
                if (valueCache.Values[i].Type == Value.ValueType.StringId)
                    memWriter.Write(valueCache.Values[i].Offset); 
            memWriter.Write(tidCount);
            for (int i = 0; i < valueCache.Count; i++)
                if (valueCache.Values[i].Type == Value.ValueType.TagId || valueCache.Values[i].Type == Value.ValueType.TagReference)
                    memWriter.Write(valueCache.Values[i].Offset);

            memWriter.Write(Padding.GetBytes(stream.Position, 512));


            fileHeader.metaLength = metaLength;
            fileHeader.metaOffset = (int)stream.Position;
            memWriter.Write(bufferStream.GetBuffer(), 0, fileHeader.metaLength);

            if (rawReferences.Length > 0)
            {
                memWriter.Write(Padding.GetBytes(stream.Position, 512));
                fileHeader.rawOffset = (int)stream.Position;
                fileHeader.rawLength = (int)stream.Position;
                for (int i = 0; i < rawReferences.Length; i++)
                {
                    map.BaseStream.Position = rawReferences[i].Address;
                    memWriter.Write(binReader.ReadBytes(rawReferences[i].Length & 0x7FFFFFFF));
                    memWriter.Write(Padding.GetBytes(stream.Position, 512));
                }
                fileHeader.rawLength = (int)stream.Position - fileHeader.rawLength;

                binReader = new BinaryReader(bufferStream);

                memWriter.Write(Padding.GetBytes(stream.Position, 512));
                fileHeader.rawReferencesCount = rawReferences.Length;
                fileHeader.rawReferencesOffset = (int)stream.Position;
                rawAddress = 0;
                for (int i = 0; i < rawReferences.Length; i++)
                {
                    memWriter.Write(rawAddress);
                    memWriter.Write(rawReferences[i].Length);

                    rawAddress += rawReferences[i].Length & 0x7FFFFFFF;
                    rawAddress += Padding.GetCount(rawAddress, 512);
                }
            }

            if (stringReferences.Length > 0)
            {
                memWriter.Write(Padding.GetBytes(stream.Position, 512));
                fileHeader.stringReferencesOffset = (int)stream.Position;
                fileHeader.stringReferencesCount = stringReferences.Length;
                for (int i = 0; i < stringReferences.Length; i++)
                {
                    string str = map.StringIdNames[stringReferences[i] & 0x0000FFFF];
                    memWriter.Write(Encoding.UTF8.GetBytes(str));
                    memWriter.Write(byte.MinValue);
                }
                if (stringReferences.Length > 1)
                    stream.Position -= 1;
                fileHeader.stringReferencesLength = (int)stream.Position - fileHeader.stringReferencesOffset;
            }

            if (idReferences.Length > 0)
            {
                memWriter.Write(Padding.GetBytes(stream.Position, 512));
                fileHeader.idReferencesOffset = (int)stream.Position;
                fileHeader.idReferencesCount = idReferences.Length;
                for (int i = 0; i < idReferences.Length; i++)
                {
                    string type = map.Index.TagEntries[idReferences[i] & 0x0000FFFF].Type.ToString();
                    type = Index.GetCleanType(type).Trim();
                    string tagname = map.Tagnames[idReferences[i] & 0x0000FFFF];
                    string filepath = Path.ChangeExtension(tagname, type) + Tag.Path.Extension;
                    filepath = Path.Combine(Directory.GetCurrentDirectory(), filepath);
                    memWriter.Write(Encoding.UTF8.GetBytes(filepath));
                    memWriter.Write(byte.MinValue);
                }
                stream.Position -= 1;
                fileHeader.idReferencesLength = (int)stream.Position - fileHeader.idReferencesOffset;
            }

            memWriter.Write(Padding.GetBytes(stream.Position, 512));
            stream.Position = 0;
            memWriter.Write(fileHeader.ToByteArray());

            WriteFileAsync(filename, stream.ToArray());
            //if (result != null)
            //    fw.EndInvoke(result);
            //result = fw.BeginInvoke(filename, stream.ToArray(), null, null);
        }