|
49 | 49 | %% @end
|
50 | 50 | %%--------------------------------------------------------------------
|
51 | 51 |
|
52 |
| -start_link(Opts) when is_list(Opts) -> |
| 52 | +start_link(RawOpts) when is_list(RawOpts) -> |
| 53 | + Opts = lists:map(fun validate_opts/1, proplists:unfold(RawOpts)), |
53 | 54 | gen_server:start_link(?MODULE, {self(), Opts}, [?SERVER_OPTS]).
|
54 |
| -start(Opts) when is_list(Opts) -> |
| 55 | +start(RawOpts) when is_list(RawOpts) -> |
| 56 | + Opts = lists:map(fun validate_opts/1, proplists:unfold(RawOpts)), |
55 | 57 | gen_server:start(?MODULE, {self(), Opts}, [?SERVER_OPTS]).
|
56 | 58 |
|
57 | 59 | socket_link(Opts) when is_list(Opts) ->
|
@@ -93,7 +95,8 @@ recv(Socket) ->
|
93 | 95 | recv(Socket, Timeout) ->
|
94 | 96 | gen_server:call(Socket, {recv, Timeout}, infinity).
|
95 | 97 |
|
96 |
| -setopts(Socket, Opts) -> |
| 98 | +setopts(Socket, RawOpts) -> |
| 99 | + Opts = lists:map(fun validate_opts/1, proplists:unfold(RawOpts)), |
97 | 100 | gen_server:call(Socket, {setopts, Opts}).
|
98 | 101 |
|
99 | 102 | sockname(Socket) ->
|
@@ -227,7 +230,7 @@ init_socket(Owner, Type, Opts) ->
|
227 | 230 | process_flag(trap_exit, true),
|
228 | 231 | MqSState0 = #ezmq_socket{owner = Owner, mode = passive, recv_q = orddict:new(),
|
229 | 232 | connecting = orddict:new(), listen_trans = orddict:new(), transports = [], remote_ids = orddict:new()},
|
230 |
| - MqSState1 = lists:foldl(fun do_setopts/2, MqSState0, proplists:unfold(Opts)), |
| 233 | + MqSState1 = lists:foldl(fun do_setopts/2, MqSState0, Opts), |
231 | 234 | ezmq_socket_fsm:init(Type, Opts, MqSState1).
|
232 | 235 |
|
233 | 236 | %%--------------------------------------------------------------------
|
@@ -307,7 +310,7 @@ handle_call({send, Msg}, From, State) ->
|
307 | 310 | end;
|
308 | 311 |
|
309 | 312 | handle_call({setopts, Opts}, _From, State) ->
|
310 |
| - NewState = lists:foldl(fun do_setopts/2, State, proplists:unfold(Opts)), |
| 313 | + NewState = lists:foldl(fun do_setopts/2, State, Opts), |
311 | 314 | {reply, ok, NewState};
|
312 | 315 |
|
313 | 316 | handle_call(sockname, _From, #ezmq_socket{listen_trans = ListenTrans, transports = Transports} = State) ->
|
@@ -653,25 +656,50 @@ do_dequeue(Transport, Q) ->
|
653 | 656 | do_setopts({type, Type}, MqSState) ->
|
654 | 657 | MqSState#ezmq_socket{type = Type};
|
655 | 658 | do_setopts({identity, Id}, MqSState) ->
|
656 |
| - MqSState#ezmq_socket{identity = iolist_to_binary(Id)}; |
| 659 | + MqSState#ezmq_socket{identity = Id}; |
657 | 660 | do_setopts({active, once}, MqSState) ->
|
658 | 661 | run_recv_q(MqSState#ezmq_socket{mode = active_once});
|
659 | 662 | do_setopts({active, true}, MqSState) ->
|
660 | 663 | run_recv_q(MqSState#ezmq_socket{mode = active});
|
661 | 664 | do_setopts({active, false}, MqSState) ->
|
662 | 665 | MqSState#ezmq_socket{mode = passive};
|
663 |
| -do_setopts({need_events, NeedEvents}, MqSState) when is_boolean(NeedEvents) -> |
| 666 | +do_setopts({need_events, NeedEvents}, MqSState) -> |
664 | 667 | MqSState#ezmq_socket{need_events = NeedEvents};
|
665 | 668 | do_setopts({version, Version}, MqSState) ->
|
| 669 | + MqSState#ezmq_socket{version = Version}; |
| 670 | + |
| 671 | +do_setopts(_, MqSState) -> |
| 672 | + MqSState. |
| 673 | + |
| 674 | +validate_opts(Opt = {type, Type}) |
| 675 | + when Type == req; Type == rep; |
| 676 | + Type == dealer; Type == router; |
| 677 | + Type == pub; Type == sub -> |
| 678 | + Opt; |
| 679 | + |
| 680 | +validate_opts(Opt = {identity, Id}) when is_binary(Id) -> |
| 681 | + Opt; |
| 682 | +validate_opts({identity, Id}) when is_list(Id) -> |
| 683 | + {identity, iolist_to_binary(Id)}; |
| 684 | + |
| 685 | +validate_opts(Opt = {active, once}) -> Opt; |
| 686 | +validate_opts(Opt = {active, true}) -> Opt; |
| 687 | +validate_opts(Opt = {active, false}) -> Opt; |
| 688 | + |
| 689 | +validate_opts(Opt = {need_events, NeedEvents}) when is_boolean(NeedEvents) -> |
| 690 | + Opt; |
| 691 | + |
| 692 | +validate_opts(Opt = {version, Version}) -> |
666 | 693 | case lists:member(Version, ?SUPPORTED_VERSIONS) of
|
667 | 694 | true ->
|
668 |
| - MqSState#ezmq_socket{version = Version}; |
| 695 | + Opt; |
669 | 696 | _ ->
|
670 |
| - erlang:error(badargs, [{version, Version}]) |
| 697 | + erlang:error(badargs, [Opt]) |
671 | 698 | end;
|
672 | 699 |
|
673 |
| -do_setopts(_, MqSState) -> |
674 |
| - MqSState. |
| 700 | +validate_opts(Opt) -> |
| 701 | + erlang:error(badarg, [Opt]). |
| 702 | + |
675 | 703 |
|
676 | 704 | do_sockname(Transport, _Opts, Acc) ->
|
677 | 705 | case ezmq_tcp_socket:sockname(Transport) of
|
|
0 commit comments