%% ---
%%  Excerpted from "Programming Erlang",
%%  published by The Pragmatic Bookshelf.
%%  Copyrights apply to this code. It may not be used to create training material,
%%  courses, books, articles, and the like. Contact us if you are in doubt.
%%  We make no guarantees that this code is fit for any purpose.
%%  Visit http://www.pragmaticprogrammer.com/titles/jaerlang for more book information.
%%  
%%  日本語版の『プログラミングErlang』、およびサンプルコードについては、
%%   http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06714-3 を確認してください。
%% ---
-module(chat_socket).

-compile(export_all).
 
%% サーバ:
%%  chat_socket:start_chat_server("joe", "123").
%%      "joe"が自分
%%       
%% クライアント:
%%  chat_socket:call("localhost","fred", "123").
%%      "fred"が自分
%%      呼び出し時には呼び出し相手の名前がわからないので、
%%      サーバが教えてくれるまで待つ必要がある


%% Secret = none | string
%%
%% Who = サーバを所有する人
%% START:interface

start_chat_server(Who, Secret) ->
    lib_auth_cs:start_server(3030, 
			     {?MODULE, chat_server, Who}, 
			     Secret, 
			     {yes, server}, 
			     50).

stop_echo_server() ->
    new_server:stop(3030).

%% クライアントからセッションを始める
%%    例 call("localhost", "joe", "foo123")

call(Host, From, Secret) ->
    lib_auth_cs:start_auth_client(Host, 
				  3030, 
				  {?MODULE, chat_client, {Host, From}}, 
				  Secret,
				  {yes, client}).
%% END: interface


%%----------------------------------------------------------------------
%% START:chat_server
chat_server(Client, Me) ->
    %% 起動時にI/Oウィジェットをポップアップする
    Widget = io_widget:start(self()),
    receive
	{msg, {hello, From}} ->
	    Client ! {msg, {hello, Me}},
	    io_widget:set_title(Widget, From),
	    relay(Client, Widget, Me)
    end.

relay(Pid, Widget, Who) ->
    receive
	{msg, {tell, Str}} ->
	    io_widget:insert(Widget, Str),
	    relay(Pid, Widget, Who);
	closed ->
	    void;
	{Widget, {data, Str}} ->
	    Str1 = Who ++ ":" ++ Str ++ "\n",
	    io_widget:insert(Widget, Str1),
	    Pid ! {msg, {tell, Str1}},
	    relay(Pid, Widget, Who);
	_Other ->
	    relay(Pid, Widget, Who)
    end.
%% END:chat_server

%% START:test_echo
chat_client(Server, {_Host, From}) ->
    Widget = io_widget:start(self()),
    Server ! {msg, {hello, From}},
    receive
	{msg, {hello, Me}} ->
	    io_widget:set_title(Widget, Me),
	    relay(Server, Widget, From)
    end.
%% END:test_echo
    
