Packages

Video and Image Converter for Erlang/Elixir

Current section

Files

Jump to
vice src vice_command.erl
Raw

src/vice_command.erl

% @hidden
-module(vice_command).
-compile([{parse_transform, lager_transform}]).
-export([exec/3]).
exec(Command, Module, Ref) ->
Port = erlang:open_port({spawn, Command}, [stream, in, eof, hide, exit_status, stderr_to_stdout]),
vice_prv_status:port(Ref, Port),
get_data(Port, Module, Ref, {undefined, undefined, 0.0}).
get_data(Port, Module, Ref, Sofar) ->
receive
{Port, {data, Bytes}} ->
{_, _, Percent} = NSofar = Module:progress(Bytes, Sofar),
vice_prv_status:value(Ref, Percent),
lager:debug("[~p] convert ~p%", [Ref, Percent]),
get_data(Port, Module, Ref, NSofar);
{Port, eof} ->
Port ! {self(), close},
receive
{Port, closed} ->
true
end,
receive
{'EXIT', Port, _} ->
ok
after 1 ->
ok
end,
receive
{Port, {exit_status, 0}} ->
{ok, 0, Sofar};
{Port, {exit_status, Code}} ->
{error, Code, Sofar}
end
end.