Пример #1
0
        public override ResourceData GetResourceData(ResourceLang lang)
        {
            ResResource res = _resources.Find(r => r.Lang == lang);

            if (res == null)
            {
                throw new ArgumentException("ResourceLang not found");
            }

            _stream.Seek(res.DataOffset, SeekOrigin.Begin);

            Byte[] data = new Byte[res.DataLength];
            if (_stream.Read(data, 0, res.DataLength) != res.DataLength)
            {
                throw new AnolisException("Couldn't read all Resource Data");
            }

            return(ResourceData.FromResource(lang, data));
        }
Пример #2
0
 /// <summary>
 /// 修改当个资源
 /// </summary>
 /// <param name="resource"></param>
 /// <returns></returns>
 public int UpdateResource(ResResource resource)
 {
     return(_dataAccess.UpdateEntity(resource));
 }
Пример #3
0
 /// <summary>
 /// 添加单个资源
 /// </summary>
 /// <param name="resource"></param>
 /// <returns></returns>
 public int AddResource(ResResource resource)
 {
     return(_dataAccess.AddEntity(resource));
 }
Пример #4
0
        public override void Reload()
        {
            UnderlyingClear();

            _stream?.Close(); // consequtive calls to .Close() is safe
            _stream = new FileStream(FileInfo.FullName, FileMode.Open);
            if (!_stream.CanSeek)
            {
                throw new AnolisException("RES FileStream must support seeking");
            }

            _resources.Clear();

            // the RES format is quite simple, it's just a concatenated list of Resource Data instances, all with their header info

            _stream.Seek(0, SeekOrigin.Begin);

            var rdr = new BinaryReader(_stream, Encoding.Unicode);

            while (rdr.BaseStream.Position < rdr.BaseStream.Length)
            {
                ///////////////////////////////
                // Read the RESOURCEHEADER

                var start = rdr.BaseStream.Position;

                var header = new ResResourceHeader(rdr);
                if (header.DataSize == 0 && rdr.BaseStream.Position == rdr.BaseStream.Length)
                {
                    break;
                }

                var stop       = rdr.BaseStream.Position;
                var headerSize = (int)(stop - start);

                var res = new ResResource
                {
                    DataOffset = rdr.BaseStream.Position,
                    // HACK: this might cause problems for resources larger than 2GB
                    DataLength   = (int)header.DataSize,
                    HeaderOffset = start,
                    HeaderLength = header.HeaderSize
                };


                // Read past the Resource data
                _stream.Seek(header.DataSize, SeekOrigin.Current);

                // don't do anything if it's empty
                if (!(header.Type is string))
                {
                    var headerType = Convert.ToInt32(header.Type, CultureInfo.InvariantCulture);
                    if (headerType == 0)
                    {
                        rdr.Align4();
                        continue;
                    }
                }

                ///////////////////////////////
                // Create ResourceType, Name, and Lang instance

                var typeId = header.Type is string s
                    ? new ResourceTypeIdentifier(s)
                    : new ResourceTypeIdentifier(Convert.ToInt32(header.Type, CultureInfo.InvariantCulture));

                var type = UnderlyingFind(t => t.Identifier.Equals(typeId));
                if (type == null)
                {
                    type = new ResourceType(typeId, this);

                    UnderlyingAdd(type);
                }

                ///////////////////////////////////////////////////////////

                var nameId = header.Name is string headerName
                    ? new ResourceIdentifier(headerName)
                    : new ResourceIdentifier(Convert.ToInt32(header.Name, CultureInfo.InvariantCulture));
                var name = UnderlyingFind(type, n => n.Identifier.Equals(nameId));
                if (name == null)
                {
                    name = new ResourceName(nameId, type);

                    UnderlyingAdd(type, name);
                }

                ///////////////////////////////////////////////////////////

                // TODO: Maybe do some validation to ensure the same lang hasn't been added twice?

                var lang = new ResourceLang(header.LanguageId, name);

                UnderlyingAdd(name, lang);

                ///////////////////////////////////////////////////////////

                res.Lang = lang;

                _resources.Add(res);

                rdr.Align4();
            }
        }
Пример #5
0
        public override void Reload()
        {
            _resources.Clear();

            // the RES format is quite simple, it's just a concatenated list of Resource Data instances, all with their header info

            _stream.Seek(0, SeekOrigin.Begin);

            BinaryReader rdr = new BinaryReader(_stream, System.Text.Encoding.Unicode);

            while (rdr.BaseStream.Position < rdr.BaseStream.Length)
            {
                ///////////////////////////////
                // Read the RESOURCEHEADER

                Int64 start = rdr.BaseStream.Position;

                ResourceHeader header = new ResourceHeader(rdr);

                Int64 stop       = rdr.BaseStream.Position;
                Int32 headerSize = (int)(stop - start);

                ResResource res = new ResResource();
                res.DataOffset   = rdr.BaseStream.Position;
                res.DataLength   = (int)header.DataSize;               // HACK: this might cause problems for resources larger than 2GB
                res.HeaderOffset = start;
                res.HeaderLength = header.HeaderSize;

                // Read past the Resource data
                _stream.Seek(header.DataSize, SeekOrigin.Current);

                // don't do anything if it's empty
                if (!(header.Type is String))
                {
                    Int32 headerType = Convert.ToInt32(header.Type, Cult.InvariantCulture);
                    if (headerType == 0)
                    {
                        rdr.Align4();
                        continue;
                    }
                }

                ///////////////////////////////
                // Create ResourceType, Name, and Lang instance

                ResourceTypeIdentifier typeId = header.Type is String ? new ResourceTypeIdentifier((String)header.Type) : new ResourceTypeIdentifier(Convert.ToInt32(header.Type, Cult.InvariantCulture));

                ResourceType type = UnderlyingFind(t => t.Identifier.Equals(typeId));
                if (type == null)
                {
                    type = new ResourceType(typeId, this);

                    UnderlyingAdd(type);
                }

                ///////////////////////////////////////////////////////////

                ResourceIdentifier nameId = header.Name is String ? new ResourceIdentifier((String)header.Name) : new ResourceIdentifier(Convert.ToInt32(header.Name, Cult.InvariantCulture));
                ResourceName       name   = UnderlyingFind(type, n => n.Identifier.Equals(nameId));
                if (name == null)
                {
                    name = new ResourceName(nameId, type);

                    UnderlyingAdd(type, name);
                }

                ///////////////////////////////////////////////////////////

                // TODO: Maybe do some validation to ensure the same lang hasn't been added twice?

                ResourceLang lang = new ResourceLang(header.LanguageId, name);

                UnderlyingAdd(name, lang);

                ///////////////////////////////////////////////////////////

                res.Lang = lang;

                _resources.Add(res);

                rdr.Align4();
            }
        }