Skip to content

Commit

Permalink
Refactored string table.
Browse files Browse the repository at this point in the history
  • Loading branch information
lkinsella committed Aug 13, 2016
1 parent 598150e commit bfa7d8c
Showing 1 changed file with 96 additions and 128 deletions.
224 changes: 96 additions & 128 deletions Src/Workshell.PE.Resources/Strings/StringTableResource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,6 @@
namespace Workshell.PE.Resources
{

public enum StringTableSaveFormat
{
Raw,
Resource
}

public sealed class StringTableEntry
{

Expand Down Expand Up @@ -106,94 +100,20 @@ public bool IsEmpty

}

public sealed class StringTableResource : IEnumerable<StringTableEntry>
public sealed class StringTable : IEnumerable<StringTableEntry>
{

private Resource resource;
private StringTableResource resource;
private uint language_id;
private StringTableEntry[] strings;

internal StringTableResource(Resource sourceResource, uint languageId, byte[] data)
internal StringTable(StringTableResource tableResource, uint languageId, StringTableEntry[] tableEntries)
{
resource = sourceResource;
resource = tableResource;
language_id = languageId;

List<string> list = new List<string>();
MemoryStream mem = resource.Type.Resources.Image.MemoryStreamProvider.GetStream(data);

using (mem)
{
while (mem.Position < mem.Length)
{
ushort count = Utils.ReadUInt16(mem);

if (count == 0)
{
list.Add(null);
}
else
{
StringBuilder builder = new StringBuilder(count);

for (var i = 0; i < count; i++)
{
ushort value = Utils.ReadUInt16(mem);

builder.Append((char)value);
}

list.Add(builder.ToString());
}
}
}

strings = new StringTableEntry[list.Count];

ushort base_id = Convert.ToUInt16((resource.Id - 1) << 4);

for(var i = 0; i < list.Count; i++)
{
StringTableEntry entry;
string value = list[i];

if (value == null)
{
entry = new StringTableEntry(0, value);
}
else
{
ushort id = Convert.ToUInt16(base_id + i);

entry = new StringTableEntry(id, value);
}

strings[i] = entry;
}
}

#region Static Methods

public static StringTableResource Load(Resource resource)
{
return Load(resource, Resource.DEFAULT_LANGUAGE);
}

public static StringTableResource Load(Resource resource, uint language)
{
if (!resource.Languages.Contains(language))
return null;

if (resource.Type.Id != ResourceType.RT_STRING)
return null;

byte[] data = resource.GetBytes(language);
StringTableResource result = new StringTableResource(resource, language, data);

return result;
strings = tableEntries;
}

#endregion

#region Methods

public IEnumerator<StringTableEntry> GetEnumerator()
Expand All @@ -207,84 +127,132 @@ IEnumerator IEnumerable.GetEnumerator()
return GetEnumerator();
}

public void Save(string fileName)
#endregion

#region Properties

public StringTableResource Resource
{
Save(fileName, VersionSaveFormat.Raw);
get
{
return resource;
}
}

public void Save(Stream stream)
public uint Language
{
Save(stream, VersionSaveFormat.Raw);
get
{
return language_id;
}
}

public void Save(string fileName, VersionSaveFormat format)
public int Count
{
using (FileStream file = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
get
{
Save(file, format);
file.Flush();
return strings.Length;
}
}

public void Save(Stream stream, VersionSaveFormat format)
public StringTableEntry this[int index]
{
switch (format)
get
{
case VersionSaveFormat.Raw:
SaveRaw(stream);
break;
case VersionSaveFormat.Resource:
SaveResource(stream);
break;
return strings[index];
}
}

private void SaveRaw(Stream stream)
{
byte[] data = resource.GetBytes(language_id);
#endregion

stream.Write(data, 0, data.Length);
}

public sealed class StringTableResource : Resource
{

private Resource resource;
private uint language_id;
private StringTableEntry[] strings;

public StringTableResource(ResourceType owningType, ResourceDirectoryEntry directoryEntry) : base(owningType, directoryEntry)
{
}

private void SaveResource(Stream stream)
#region Static Methods

public static bool Register()
{
throw new NotImplementedException();
ResourceId resource_type = new ResourceId(ResourceType.RT_STRING);

return ResourceType.Register(resource_type, typeof(StringTableResource));
}

#endregion

#region Properties
#region Methods

public Resource Resource
public StringTable ToTable()
{
get
{
return resource;
}
return ToTable(DEFAULT_LANGUAGE);
}

public uint Language
public StringTable ToTable(uint languageId)
{
get
{
return language_id;
}
}
byte[] data = GetBytes(languageId);

public int Count
{
get
List<string> list = new List<string>();

using (MemoryStream mem = new MemoryStream(data))
{
return strings.Length;
while (mem.Position < mem.Length)
{
ushort count = Utils.ReadUInt16(mem);

if (count == 0)
{
list.Add(null);
}
else
{
StringBuilder builder = new StringBuilder(count);

for (var i = 0; i < count; i++)
{
ushort value = Utils.ReadUInt16(mem);

builder.Append((char)value);
}

list.Add(builder.ToString());
}
}
}
}

public StringTableEntry this[int index]
{
get
StringTableEntry[] strings = new StringTableEntry[list.Count];
ushort base_id = Convert.ToUInt16((resource.Id - 1) << 4);

for (var i = 0; i < list.Count; i++)
{
return strings[index];
StringTableEntry entry;
string value = list[i];

if (value == null)
{
entry = new StringTableEntry(0, value);
}
else
{
ushort id = Convert.ToUInt16(base_id + i);

entry = new StringTableEntry(id, value);
}

strings[i] = entry;
}

StringTable table = new StringTable(this, languageId, strings);

return table;
}

#endregion
Expand Down

0 comments on commit bfa7d8c

Please sign in to comment.