diff --git a/lib/libpe/flags.ex b/lib/libpe/flags.ex index 88becf8..9c983e1 100644 --- a/lib/libpe/flags.ex +++ b/lib/libpe/flags.ex @@ -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 diff --git a/lib/libpe/resource_table.ex b/lib/libpe/resource_table.ex index eae3143..2c3d8a0 100644 --- a/lib/libpe/resource_table.ex +++ b/lib/libpe/resource_table.ex @@ -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") @@ -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 = diff --git a/lib/libpe/version_info.ex b/lib/libpe/version_info.ex index d978fb8..c495116 100644 --- a/lib/libpe/version_info.ex +++ b/lib/libpe/version_info.ex @@ -45,7 +45,7 @@ defmodule LibPE.VersionInfo do var: <<9, 4, 228, 4>>, var_type: 0, tail: "", - type: 0, + type: 0 } end diff --git a/lib/mix/tasks/update.ex b/lib/mix/tasks/update.ex index c225874..1256c11 100644 --- a/lib/mix/tasks/update.ex +++ b/lib/mix/tasks/update.ex @@ -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 -> @@ -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("""