% Copyright (c) 2016, Yuce Tekol . % All rights reserved. % % Redistribution and use in source and binary forms, with or without % modification, are permitted provided that the following conditions are % met: % % * Redistributions of source code must retain the above copyright % notice, this list of conditions and the following disclaimer. % % * Redistributions in binary form must reproduce the above copyright % notice, this list of conditions and the following disclaimer in the % documentation and/or other materials provided with the distribution. % % * The names of its contributors may not be used to endorse or promote % products derived from this software without specific prior written % permission. % % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS % "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT % LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR % A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT % OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, % SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT % LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, % DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY % THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT % (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE % OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -module(tcp@teacup). -behaviour(teacup_transport). -export([connect/4, close/1, send/2, raw_socket/1, loop/1]). -define(SOCKET(Socket), {?MODULE, Socket}). %% == Callbacks connect(Host, Port, Opts, undefined) -> connect(Host, Port, Opts, 5000); connect(Host, Port, Opts, Timeout) -> case gen_tcp:connect(Host, Port, Opts, Timeout) of {ok, Socket} -> {ok, ?SOCKET(Socket)}; Other -> Other end. close(?SOCKET(Socket)) -> gen_tcp:close(Socket). send(?SOCKET(Socket), Bin) -> gen_tcp:send(Socket, Bin). raw_socket(?SOCKET(Socket)) -> Socket. loop(Parent) -> receive {tcp, Socket, Data} -> Parent ! {transport_data, ?SOCKET(Socket), Data}, loop(Parent); {tcp_closed, Socket} -> Parent ! {transport_closed, ?SOCKET(Socket)}; stop -> ok end.