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)); }
/// <summary> /// 修改当个资源 /// </summary> /// <param name="resource"></param> /// <returns></returns> public int UpdateResource(ResResource resource) { return(_dataAccess.UpdateEntity(resource)); }
/// <summary> /// 添加单个资源 /// </summary> /// <param name="resource"></param> /// <returns></returns> public int AddResource(ResResource resource) { return(_dataAccess.AddEntity(resource)); }
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(); } }
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(); } }