Skip to content

Commit

Permalink
truncate RT_GROUP_ICON when calling --set-icon
Browse files Browse the repository at this point in the history
  • Loading branch information
dominicletz committed Nov 8, 2023
1 parent ae54648 commit 52efe72
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 12 deletions.
2 changes: 1 addition & 1 deletion lib/libpe/flags.ex
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ defmodule LibPE.Flags do
name when is_binary(value) ->
case Enum.find(module.flags(), fn {ename, _, _} -> name == ename end) do
{_, value, _} -> value
nil -> raise "Unknown #{module} flag: #{inspect name}"
nil -> raise "Unknown #{module} flag: #{inspect(name)}"
end
end
end
Expand Down
36 changes: 27 additions & 9 deletions lib/libpe/resource_table.ex
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,30 @@ defmodule LibPE.ResourceTable do
```
"""
def set_resource(table, resource_type, entry_or_data, codepage \\ 0, language \\ 1033)

def set_resource(table = %ResourceTable{entries: entries}, resource_type, nil, _, _) do
type = LibPE.ResourceTypes.encode(resource_type)
if type == nil, do: raise("ResourceType #{resource_type} is unknown")

idx = Enum.find_index(entries, fn %DirEntry{name: name} -> type == name end)

entries =
if idx == nil do
entries
else
sorted_entries(%ResourceTable{table | entries: List.delete_at(entries, idx)})
end

%ResourceTable{table | entries: entries}
end

def set_resource(
table = %ResourceTable{entries: entries},
resource_type,
entry_or_data,
codepage \\ 0,
language \\ 1033
codepage,
language
) do
type = LibPE.ResourceTypes.encode(resource_type)
if type == nil, do: raise("ResourceType #{resource_type} is unknown")
Expand Down Expand Up @@ -502,13 +520,13 @@ defmodule LibPE.ResourceTable do
IO.puts("#{dup(level + 2)} :#{String.pad_trailing(key, 20)} = #{inspect(value)}")
end

# IO.puts("#{dup(level + 1)} Version Metadata =>")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("str_encoding", 20)} = #{inspect(version_info.strings_encoding)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("str_type", 20)} = #{inspect(version_info.strings_type)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("var", 20)} = #{inspect(version_info.var)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("var_type", 20)} = #{inspect(version_info.var_type)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("type", 20)} = #{inspect(version_info.type)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("tail", 20)} = #{inspect(version_info.tail)}")
# IO.puts("#{dup(level + 1)} Version Metadata =>")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("str_encoding", 20)} = #{inspect(version_info.strings_encoding)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("str_type", 20)} = #{inspect(version_info.strings_type)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("var", 20)} = #{inspect(version_info.var)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("var_type", 20)} = #{inspect(version_info.var_type)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("type", 20)} = #{inspect(version_info.type)}")
# IO.puts("#{dup(level + 2)} :#{String.pad_trailing("tail", 20)} = #{inspect(version_info.tail)}")

Keyword.get(opts, :values, false) ->
value =
Expand Down
2 changes: 1 addition & 1 deletion lib/libpe/version_info.ex
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ defmodule LibPE.VersionInfo do
var: <<9, 4, 228, 4>>,
var_type: 0,
tail: "",
type: 0,
type: 0
}
end

Expand Down
8 changes: 7 additions & 1 deletion lib/mix/tasks/update.ex
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,9 @@ defmodule Mix.Tasks.Pe.Update do
defp process_args(opts, ["--set-icon", filename | rest]) do
case File.read(filename) do
{:ok, data} ->
add_resource(opts, "RT_ICON", data)
opts
|> add_resource("RT_ICON", data)
|> drop_resource("RT_GROUP_ICON")
|> process_args(rest)

error ->
Expand Down Expand Up @@ -176,6 +178,10 @@ defmodule Mix.Tasks.Pe.Update do
|> process_args(rest)
end

defp drop_resource(opts, name) do
add_resource(opts, name, nil)
end

defp add_resource(opts, name, data) do
if not is_integer(name) and not LibPE.Flags.is_name(LibPE.ResourceTypes, name) do
error("""
Expand Down

0 comments on commit 52efe72

Please sign in to comment.