From 3c15d3a37088a7db442bf40fdb880a0f178df3de Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Thu, 3 Feb 2011 14:06:27 +0100 Subject: [PATCH 01/19] mnesia cleanup to keep erlang convention --- Mnesia/gamedb.erl | 31 -------------- Mnesia/gamedb.hrl | 6 --- Mnesia/gamedb_usage.txt | 12 ------ games/tic-tac-toe-js/js/TicTacToeClient.js | 2 +- games/tic-tac-toe/TODO | 8 +--- games/tic-tac-toe/e.png | Bin 2565 -> 187 bytes games/tic-tac-toe/tictactoeboard.py | 11 +++++ games/tic-tac-toe/tictactoeboard.pyc | Bin 2379 -> 2379 bytes src/ggs_server.erl | 46 ++++----------------- 9 files changed, 22 insertions(+), 94 deletions(-) delete mode 100644 Mnesia/gamedb.erl delete mode 100644 Mnesia/gamedb.hrl delete mode 100644 Mnesia/gamedb_usage.txt diff --git a/Mnesia/gamedb.erl b/Mnesia/gamedb.erl deleted file mode 100644 index 9d6bbbe..0000000 --- a/Mnesia/gamedb.erl +++ /dev/null @@ -1,31 +0,0 @@ -%Test Mnesia --module(gamedb). --import(mnesia). --export([init/0,insert_player/1,example_player/0,read_player/1,test_player/0]). --include("gamedb.hrl"). - -init() -> - mnesia:create_table(player, [{attributes, record_info(fields, player)}]). - -test_player() -> - insert_player(example_player()), - read_player(0001). - -insert_player(Player) -> - Fun = fun() -> - mnesia:write(Player) - end, - mnesia:transaction(Fun). - -example_player() -> - #player{id = 0001, - name = "Tux"}. - -read_player(Player_Key) -> - Fun = fun() -> - [P] = mnesia:read(player, Player_Key), - Name = P#player.name, - io:format("Player name: ~s~n",[Name]) - end, - mnesia:transaction(Fun). - diff --git a/Mnesia/gamedb.hrl b/Mnesia/gamedb.hrl deleted file mode 100644 index 1ae9c8f..0000000 --- a/Mnesia/gamedb.hrl +++ /dev/null @@ -1,6 +0,0 @@ -%% gamedb.hrl - --record(player, {id, name}). - - - diff --git a/Mnesia/gamedb_usage.txt b/Mnesia/gamedb_usage.txt deleted file mode 100644 index b3a07a0..0000000 --- a/Mnesia/gamedb_usage.txt +++ /dev/null @@ -1,12 +0,0 @@ -1. From terminal: erl -mnesia dir '"/home/user/dir/to/GGS/GameDB.Player"' -2. mnesia:create_schema([node()]). -3. mnesia:start(). -4. c(gamedb). -5. gamedb:init(). -6. mnesia:info(). -7. gamedb:test_player(). - -Last output should be: - Player name: Tux - {atomic,ok} - diff --git a/games/tic-tac-toe-js/js/TicTacToeClient.js b/games/tic-tac-toe-js/js/TicTacToeClient.js index 80f8ef1..79e4064 100644 --- a/games/tic-tac-toe-js/js/TicTacToeClient.js +++ b/games/tic-tac-toe-js/js/TicTacToeClient.js @@ -90,4 +90,4 @@ TicTacToeClient.prototype.updateBoard = function(gameBoardData) { this.spots[k++].innerHTML = t; } } -} \ No newline at end of file +} diff --git a/games/tic-tac-toe/TODO b/games/tic-tac-toe/TODO index 07c0710..a957a1f 100644 --- a/games/tic-tac-toe/TODO +++ b/games/tic-tac-toe/TODO @@ -1,12 +1,6 @@ -- background image -- subimages for game_area:s -- subimages for game markers (X or 0) -- rectangle collision on game_area:s +- background - redraw background then all game_area:s -- board_state: a hashtable where key is game_area_index - and value is either'x' 'o' or ' ' - board contains nr_of_squares = 9 board contains array of squares with nr_of_squares elements board contains x, y, width and height board contains a frame diff --git a/games/tic-tac-toe/e.png b/games/tic-tac-toe/e.png index 4cbf977f58bdbe47864f563ba90a313820b2af27..1b1d7f7bb08b08b11a4f2d93597d2cfb9ba1360e 100644 GIT binary patch delta 117 zcmZn_+08h?ke@Bd+uel$41PNAuAiu<5G~KA!xiM)-VYSC_H=O!i8%cBoFO9v0|&Fh q*81l&58P)Ky5RY0{>tfF@Blq-Mh)h~7JYG5klCKDelF{r5}E+K7A{=? delta 2516 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 delta 16 XcmX>tbXthrpNE(0V3*TIb{9?nEB^$> diff --git a/src/ggs_server.erl b/src/ggs_server.erl index d7be36e..f440cde 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -1,13 +1,15 @@ %%%---------------------------------------------------- %%% @author Jonatan PÃ¥lsson %%% @copyright 2010 Jonatan PÃ¥lsson -%%% @doc RPC over TCP server %%% @end %%%---------------------------------------------------- -module(ggs_server). -behaviour(gen_server). +% import +-import(ggs_connection). + %% API -export([start_link/1, start_link/0, @@ -16,8 +18,7 @@ ]). %% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, - handle_info/2, terminate/2, code_change/3]). +-export([terminate/2, code_change/3]). -define(SERVER, ?MODULE). @@ -61,28 +62,6 @@ stop() -> %%----------------------------------------------------- %% gen_server callbacks %%----------------------------------------------------- - -init([Port]) -> - {ok, LSock} = gen_tcp:listen(Port, [{active, true}, - {reuseaddr, true}]), - {ok, #state{port = Port, lsock = LSock}, 0}. - -handle_call(get_count, _From, State) -> - {reply, {ok, State#state.client_vm_map}, State}. - -handle_cast(stop, State) -> - {stop, normal, State}. - -handle_info({tcp, Socket, RawData}, State) -> - NewState = do_JSCall(Socket, RawData, State), - OldMap = State#state.client_vm_map, - io:format("Old map: ~p NewState: ~p~n", [OldMap, NewState]), - {noreply, State#state{client_vm_map = OldMap ++ [NewState]}}; - -handle_info(timeout, #state{lsock = LSock} = State) -> - {ok, _Sock} = gen_tcp:accept(LSock), - {noreply, State}. - terminate(_Reason, _State) -> ok. @@ -92,7 +71,6 @@ code_change(_OldVsn, State, _Extra) -> %%----------------------------------------------------- %% Internal functions %%----------------------------------------------------- - do_JSCall(Socket, Data, State) -> JSVM = js_runner:boot(), js_runner:define(JSVM, "function userCommand(cmd, par) {return cmd+' '+ par}"), @@ -103,23 +81,23 @@ do_JSCall(Socket, Data, State) -> Ret = js_runner:call(JSVM, "userCommand", [list_to_binary(Command), list_to_binary(Parameter)]), - send(Socket, "RefID", "JS says: ", Ret), + connection:send(Socket, "RefID", "JS says: ", Ret), []; % Set the new state to the reference generated, and JSVM associated {hello} -> Client = getRef(), - send(Socket, Client, "__ok_hello"), + connection:send(Socket, Client, "__ok_hello"), {Client, JSVM}; {echo, RefID, _, MSG} -> - send(Socket, RefID, "Your VM is ", getJSVM(RefID, State)), + connection:send(Socket, RefID, "Your VM is ", getJSVM(RefID, State)), []; {crash, Zero} -> 10/Zero; {vms} -> - send(Socket, "RefID", State); + connection:send(Socket, "RefID", State); % Set the new state to [] Other -> - send(Socket, "RefID", "__error"), + ggs_connection:send(Socket, "RefID", "__error"), [] end, % Return the new state @@ -136,9 +114,3 @@ getJSVM(RefID, State) -> VMs = State#state.client_vm_map, {value, {_,VM}} = lists:keysearch(RefID, 1, VMs), VM. - -send(Socket, RefID, String) -> - gen_tcp:send(Socket, io_lib:fwrite("~p ~p~n", [RefID,String])). - -send(Socket, RefID, String1, String2) -> - gen_tcp:send(Socket, io_lib:fwrite("~p ~p ~p~n", [RefID, String1, String2])). From f59d59814a627b55732edbf2b7a2838eaa00d58c Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Thu, 3 Feb 2011 14:09:57 +0100 Subject: [PATCH 02/19] renaming Mnesia/ to mnesia/ --- mnesia/.gamedb.erl.swp | Bin 0 -> 12288 bytes mnesia/gamedb.erl | 50 ++++++++++++++++++++++++++++++++++++++++ mnesia/gamedb.hrl | 6 +++++ mnesia/gamedb_usage.txt | 12 ++++++++++ 4 files changed, 68 insertions(+) create mode 100644 mnesia/.gamedb.erl.swp create mode 100644 mnesia/gamedb.erl create mode 100644 mnesia/gamedb.hrl create mode 100644 mnesia/gamedb_usage.txt diff --git a/mnesia/.gamedb.erl.swp b/mnesia/.gamedb.erl.swp new file mode 100644 index 0000000000000000000000000000000000000000..469b1f85b2ecf7663f6f99f957c41243aa53c9d9 GIT binary patch literal 12288 zcmeI2zfTlF6vqcEQBk9XjV9wE^c~uUwxG9A3wj3SpnmAjS;oFXpP_fq7W5WsLG#cJs2}=` z*tenA&^%Ow94N`@1lEK?CIUo&2oM1xKm>@u|3rXec*zmXaifJFiH1>upT8UXg)*~~ z>5#r#WV<)}R~3ve1=%yL;PBeT2;Jn`8LfGIzc+H@1JWO|Mq+22omqCbw2|9xebwV&MdL9H&}jaz%JyTka;4q><#@S!BC3>)Gzy4_c#PjEwfs92d$g zeDw@9$s((11KAk4Xhgj&_xgNpO&Ft9Jx0hyu4N<8?xOOSg8Y(_Z5Pkd9xtpfAbI60 zlk|Vj0invbZ5$|a&pud5`Hgn$%6u+6_TAF$9KtKfl`zmIKWF2tIK{3yRjS4AN?}1q zeKFlpwTffYEh!vShrbk{ec%Od40`En@qpXv@LICLF(fp^C$W{KAKaj^+l+SvsEbH) z>}FiYzERkptP}oRXk`n+an@anrYxtnjUZgrs@XD}k2uvTuc1mxM0`dXBXtxd^zbqf jn-*N!@$V9T6Fa9h3+=0-$)+b%yW9vo`z7sdlVX1X$Qr-k literal 0 HcmV?d00001 diff --git a/mnesia/gamedb.erl b/mnesia/gamedb.erl new file mode 100644 index 0000000..751eb92 --- /dev/null +++ b/mnesia/gamedb.erl @@ -0,0 +1,50 @@ +%%%%---------------------------------------------------- +%%% @author Mattias Pettersson +%%% @copyright 2011 Mattias Pettersson +%%% @doc Database for runtime game variable storage. +%%% @end + + Test Mnesia +-module(gamedb). +-import(mnesia). +-export([init/0,insert_player/1,example_player/0,read_player/1,test_player/0]). +-include("gamedb.hrl"). + +%%----------------------------------------------------- +%% Creation +%%----------------------------------------------------- +init() -> + mnesia:create_table(player, [{attributes, record_info(fields, player)}]). + +%%----------------------------------------------------- +%% Test +%%----------------------------------------------------- +test_player() -> + insert_player(example_player()), + read_player(0001). + +example_player() -> + #player{id = 0001, + name = "Tux"}. + +%%----------------------------------------------------- +%% Insertions +%%----------------------------------------------------- +insert_player(Player) -> + Fun = fun() -> + mnesia:write(Player) + end, + mnesia:transaction(Fun). + + +%%----------------------------------------------------- +%% Querries +%%----------------------------------------------------- +read_player(Player_Key) -> + Fun = fun() -> + [P] = mnesia:read(player, Player_Key), + Name = P#player.name, + io:format("Player name: ~s~n",[Name]) + end, + mnesia:transaction(Fun). + diff --git a/mnesia/gamedb.hrl b/mnesia/gamedb.hrl new file mode 100644 index 0000000..1ae9c8f --- /dev/null +++ b/mnesia/gamedb.hrl @@ -0,0 +1,6 @@ +%% gamedb.hrl + +-record(player, {id, name}). + + + diff --git a/mnesia/gamedb_usage.txt b/mnesia/gamedb_usage.txt new file mode 100644 index 0000000..b3a07a0 --- /dev/null +++ b/mnesia/gamedb_usage.txt @@ -0,0 +1,12 @@ +1. From terminal: erl -mnesia dir '"/home/user/dir/to/GGS/GameDB.Player"' +2. mnesia:create_schema([node()]). +3. mnesia:start(). +4. c(gamedb). +5. gamedb:init(). +6. mnesia:info(). +7. gamedb:test_player(). + +Last output should be: + Player name: Tux + {atomic,ok} + From 468d701c0df622de612b916fc770af70032eccf7 Mon Sep 17 00:00:00 2001 From: niklas Date: Thu, 3 Feb 2011 17:54:23 +0100 Subject: [PATCH 03/19] Change to ggs_server(not finished) --- src/ggs_server.erl | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/ggs_server.erl b/src/ggs_server.erl index d7be36e..bbb0e90 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -47,8 +47,11 @@ start_link() -> %% Count = integer() %% @end %%----------------------------------------------------- -get_count() -> - gen_server:call(?SERVER, get_count). +get_count() -> gen_server:call(?SERVER, get_count). +_crash() -> gen_server:call(?SERVER, _crash). +_vms() -> gen_server:call(?SERVER, _vms). +_hello() -> gen_server:call(?SERVER, _hello). +_echo() -> gen_server:call(?SERVER, {_echo, RefID, _, MSG}). %%----------------------------------------------------- %% @doc Stops the server. @@ -68,7 +71,27 @@ init([Port]) -> {ok, #state{port = Port, lsock = LSock}, 0}. handle_call(get_count, _From, State) -> - {reply, {ok, State#state.client_vm_map}, State}. + {reply, {ok, State#state.client_vm_map}, State}; + +handle_call(_crash, _From, State) -> + Zero/10. + {reply, sdas , State}; + +%handle_call(_hello, _From, State) -> +% Client = getRef(); +% send(Socket, Client, "_ok_hello"), +% {Client, JVSM) +%{reply, Client, State}; + +%handle_call(_vms, _From, State) -> +% send(Socket, "RefID", State) +%{reply, , State}; + +%handle_call(_echo, RefID, _, MSG) -> +%{reply, ,State}; + +handle_call(_Message, _From, State) + {reply, error, State}. handle_cast(stop, State) -> {stop, normal, State}. From 71fa6f30ba69d1502f57df24d80ba77849aa2604 Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Fri, 4 Feb 2011 14:10:23 +0100 Subject: [PATCH 04/19] Moved the parts of network out of server. Partly added extensions to tic-tac-toe py. --- games/tic-tac-toe/data.py | 15 ++++ games/tic-tac-toe/data.pyc | Bin 0 -> 531 bytes games/tic-tac-toe/player.py | 15 ++++ games/tic-tac-toe/server.py | 23 +++++ games/tic-tac-toe/test_data.py | 14 +++ src/.ggs_connection.erl.swp | Bin 0 -> 12288 bytes src/ggs_network.beam | Bin 0 -> 2820 bytes src/ggs_network.erl | 160 +++++++++++++++++++++++++++++++++ src/ggs_server.beam | Bin 0 -> 616 bytes src/ggs_server.erl | 84 +++-------------- 10 files changed, 237 insertions(+), 74 deletions(-) create mode 100644 games/tic-tac-toe/data.py create mode 100644 games/tic-tac-toe/data.pyc create mode 100644 games/tic-tac-toe/player.py create mode 100644 games/tic-tac-toe/server.py create mode 100644 games/tic-tac-toe/test_data.py create mode 100644 src/.ggs_connection.erl.swp create mode 100644 src/ggs_network.beam create mode 100644 src/ggs_network.erl create mode 100644 src/ggs_server.beam diff --git a/games/tic-tac-toe/data.py b/games/tic-tac-toe/data.py new file mode 100644 index 0000000..b83c3ad --- /dev/null +++ b/games/tic-tac-toe/data.py @@ -0,0 +1,15 @@ +def greatest_sequence(match, pattern): + m = match + p = pattern + size = 0 + max_size = 0 + + for p in pattern: + if m == p: + size += 1 + else: + if size > max_size: + max_size = size + size = 0 + + return max_size diff --git a/games/tic-tac-toe/data.pyc b/games/tic-tac-toe/data.pyc new file mode 100644 index 0000000000000000000000000000000000000000..682dfaaa9031d0195431a988ddaa757e082356a8 GIT binary patch literal 531 zcmb_YO-sW-5S?tBR-`$2^X4@dyGK!^hziAn?V$%jkg_C88rn_L{eUXT%^&WYRM3M* zcQbF_%)FhvWI0JrucuGX8U0!j_#MI}fSl-)=oKWQRVq-)7?6bgqkOgrW3WbfuWc1rWO{7E5Zsj?I-K;YD_JO`o%CgP=@p{ZGFM(roA+>rIfd1@>-^g3eb7~=*@!y_ qP&7JjF{V*8i4rkEo`^-tlD{winC#iVIprU5YwA4g^sG0?{=NWR({FA7 literal 0 HcmV?d00001 diff --git a/games/tic-tac-toe/player.py b/games/tic-tac-toe/player.py new file mode 100644 index 0000000..081112c --- /dev/null +++ b/games/tic-tac-toe/player.py @@ -0,0 +1,15 @@ +from pygame.mouse import get_pos +from point import Point + +class Player(object): + def __init__(self, id, shape, board): + self.shape = shape + self.board = board + self.id = id + + + def turn(self): + #Ask mouse for position + board.make_turn(Point(get_pos()[0],get_pos()[1])) + + diff --git a/games/tic-tac-toe/server.py b/games/tic-tac-toe/server.py new file mode 100644 index 0000000..91e32b5 --- /dev/null +++ b/games/tic-tac-toe/server.py @@ -0,0 +1,23 @@ +#server.py +import json +from socket import socket, AF_INET, SOCK_STREAM + + +class server(object): + def __init__(self, port=None): + self.port = port + self.world = GGS.init() + self.socket = socket(AF_INET, SOCK_STREAM) + self.socket.connect(("www.???.com", 80)) + + def turn(self, id, index): + rows = sqrt(board.nr_of_rectangles) + x = int(index / rows) + y = int(index % rows) + + json.dumps({"x": x, "y": y} + world.callCommand("tictactoe", "set", json.dumps({"x": x, "y": y})) + + sent = 0 + length = len( + while sent diff --git a/games/tic-tac-toe/test_data.py b/games/tic-tac-toe/test_data.py new file mode 100644 index 0000000..38282f0 --- /dev/null +++ b/games/tic-tac-toe/test_data.py @@ -0,0 +1,14 @@ +import unittest +import data + + +class TestData(unittest.TestCase): + def setUp(self): + array = [0,1,1,1,3,4,5,2,2,3,3,3,3,3,33,4,2,2] + + self.assertTrue(data.greatest_sequence(array, 3) == 5) + +if __name__ == '__main__': + unittest.main() + + diff --git a/src/.ggs_connection.erl.swp b/src/.ggs_connection.erl.swp new file mode 100644 index 0000000000000000000000000000000000000000..0c009f8287377d2e3763a3fb7610231c3237d3fb GIT binary patch literal 12288 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 literal 0 HcmV?d00001 diff --git a/src/ggs_network.erl b/src/ggs_network.erl new file mode 100644 index 0000000..1ee46f6 --- /dev/null +++ b/src/ggs_network.erl @@ -0,0 +1,160 @@ +%%%---------------------------------------------------- +%%% @author Jonatan Pålsson +%%% @copyright 2010 Jonatan Pålsson +%%% @doc RPC over TCP server +%%% @end +%%%---------------------------------------------------- +%%% @author Mattias Pettersson +%%% @doc Socket module for GGS +%%% @end +%%%---------------------------------------------------- + + +-module(ggs_network). + +-behaviour(gen_server). + +%define +-define(SERVER, ?MODULE). +-define(DEFAULT_PORT, 1055). + + +% export +-export([start_link/0,start_link/1]). +-export([init/1, handle_call/3, handle_cast/2, handle_info/2]). +-export([get_count/1, send/3, send/4]). +-export([stop/0]). + +%% gen_server callbacks +-export([terminate/2, code_change/3]). + +%state +-record(state, {port, lsock, client_vm_map = []}). + + +%%----------------------------------------------------- +%% @doc Starts gen_server +%% @end +%%----------------------------------------------------- +start_link() -> + start_link(?DEFAULT_PORT). + +start_link(Port) -> + process_flag(trap_exit, true), + gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []). + +%%----------------------------------------------------- +%% Creation +%%----------------------------------------------------- +init([Port]) -> + {ok, LSock} = gen_tcp:listen(Port, [{active, true}, + {reuseaddr, true}]), + {ok, #state{port = Port, lsock = LSock}, 0}. + +%%----------------------------------------------------- +%% @doc Fetches the number of requests made to this server +%% @spec get_count() -> {ok, Count} +%% where +%% Count = integer() +%% @end +%%----------------------------------------------------- +get_count(get_count) -> + gen_server:call(?SERVER, get_count). + +%%----------------------------------------------------- +%% @doc Stops the server. +%% @spec stop() -> ok +%% @end +%%----------------------------------------------------- +stop() -> + gen_server:cast(?SERVER, stop). + +%%----------------------------------------------------- +%% Handlers +%%----------------------------------------------------- +handle_call(get_count, _From, State) -> + {reply, {ok, State#state.client_vm_map}, State}. + +handle_cast(stop, State) -> + {stop, normal, State}. + +handle_info({tcp, Socket, RawData}, State) -> %parameters coming from gen_server + NewState = do_JSCall(Socket, RawData, State), %TODO + OldMap = State#state.client_vm_map, + io:format("Old map: ~p NewState: ~p~n", [OldMap, NewState]), + {noreply, State#state{client_vm_map = OldMap ++ [NewState]}}; + +handle_info(timeout, #state{lsock = LSock} = State) -> + {ok, _Sock} = gen_tcp:accept(LSock), + {noreply, State}. + + +%%----------------------------------------------------- +%% TCP Calls +%%----------------------------------------------------- +send(Socket, RefID, String) -> + gen_tcp:send(Socket, io_lib:fwrite("~p ~p~n", [RefID,String])). + +send(Socket, RefID, String1, String2) -> + gen_tcp:send(Socket, io_lib:fwrite("~p ~p ~p~n", [RefID, String1, String2])). + + +%%----------------------------------------------------- +%% gen_server callbacks +%%----------------------------------------------------- +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%----------------------------------------------------- +%% Internal functions +%%----------------------------------------------------- +do_JSCall(Socket, Data, State) -> + JSVM = js_runner:boot(), + js_runner:define(JSVM, "function userCommand(cmd, par) {return cmd+' '+ par}"), + Parsed = ggs_protocol:parse(Data), + NewState = case Parsed of + {cmd, Command, Parameter} -> + % Set the new state to [] + Ret = js_runner:call(JSVM, "userCommand", + [list_to_binary(Command), + list_to_binary(Parameter)]), + connection:send(Socket, "RefID", "JS says: ", Ret), + []; + % Set the new state to the reference generated, and JSVM associated + {hello} -> + Client = getRef(), + connection:send(Socket, Client, "__ok_hello"), + {Client, JSVM}; + {echo, RefID, _, MSG} -> + connection:send(Socket, RefID, "Your VM is ", getJSVM(RefID, State)), + []; + {crash, Zero} -> + 10/Zero; + {vms} -> + connection:send(Socket, "RefID", State); + % Set the new state to [] + Other -> + ggs_connection:send(Socket, "RefID", "__error"), + [] + end, + % Return the new state + NewState. + +%%----------------------------------------------------- +%% Helpers +%%----------------------------------------------------- +getRef() -> + {A1,A2,A3} = now(), + random:seed(A1, A2, A3), + random:uniform(1000). + +%%----------------------------------------------------- +%% Helpers +%%----------------------------------------------------- +getJSVM(RefID, State) -> + VMs = State#state.client_vm_map, + {value, {_,VM}} = lists:keysearch(RefID, 1, VMs), + VM. diff --git a/src/ggs_server.beam b/src/ggs_server.beam new file mode 100644 index 0000000000000000000000000000000000000000..8818249268afb82e14ee2ed7b316d9b5a9b4d5c5 GIT binary patch literal 616 zcmY+Cv2GJV5Qb;>&KGPGaXMbWiV_JLUqDDSDb83Sie#L~MwB?~^X7cEZ}+sjHZ+kU zAt4HiJVKiEl$2EIQ`7StnK^6`M*435`DZjc(%##X!3zL>_U5qjuH$q803VThBg^c_ zO0$xtW}PsuNrsZ{lQ#24<%|}&n%6VwMyXyZ=Ub=CW}zp`g&gJTTnExDgvy>!#{(On zt0xlgNRbes=p)-mz(OAF0BfPa_ECl`>4zaZ<kpXs{ zL|91J56nXLEAgI^(K_{D=*)YZ3&%xCXAcPw5AhL-jb>|I!*iplm*NppN66o3e)##n znOp1nV?0SyG?0fgXf_3T9HDu%2Wbl4(<$v)?bdP5pnmpcfnPS|6Yy46Rf!5g_o6?~ zFK+I>erw+T-2K32v+l7v$IkCnzfb*Jx^%f#c2*_$mKL)))Lyk;w_lRyyS$LoV2m68 z7F_sZThzoJRRXJ*CY5tIh^M-cF}|*nlQK8L$+$E+GomPRmBoKwIX*fX#@3|qzyGF< Lm04$O9qt78!%2Cj literal 0 HcmV?d00001 diff --git a/src/ggs_server.erl b/src/ggs_server.erl index f440cde..c3514e7 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -5,27 +5,19 @@ %%%---------------------------------------------------- -module(ggs_server). --behaviour(gen_server). % import --import(ggs_connection). +-import(ggs_network). %% API --export([start_link/1, - start_link/0, +-export([start/0, + start/1, get_count/0, stop/0 ]). -%% gen_server callbacks --export([terminate/2, code_change/3]). --define(SERVER, ?MODULE). --define(DEFAULT_PORT, 1055). - --record(state, {port, lsock, client_vm_map = []}). - %%%==================================================== %%% API %%%==================================================== @@ -34,12 +26,12 @@ %% @doc Starts the server %% @end %%----------------------------------------------------- -start_link(Port) -> - process_flag(trap_exit, true), - gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []). +start() -> + ggs_network:start_link(). + +start(Port) -> + ggs_network:start_link(Port). -start_link() -> - start_link(?DEFAULT_PORT). %%----------------------------------------------------- %% @doc Fetches the number of requests made to this server @@ -49,7 +41,7 @@ start_link() -> %% @end %%----------------------------------------------------- get_count() -> - gen_server:call(?SERVER, get_count). + ggs_network:get_count(get_count). %%----------------------------------------------------- %% @doc Stops the server. @@ -57,60 +49,4 @@ get_count() -> %% @end %%----------------------------------------------------- stop() -> - gen_server:cast(?SERVER, stop). - -%%----------------------------------------------------- -%% gen_server callbacks -%%----------------------------------------------------- -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%----------------------------------------------------- -%% Internal functions -%%----------------------------------------------------- -do_JSCall(Socket, Data, State) -> - JSVM = js_runner:boot(), - js_runner:define(JSVM, "function userCommand(cmd, par) {return cmd+' '+ par}"), - Parsed = ggs_protocol:parse(Data), - NewState = case Parsed of - {cmd, Command, Parameter} -> - % Set the new state to [] - Ret = js_runner:call(JSVM, "userCommand", - [list_to_binary(Command), - list_to_binary(Parameter)]), - connection:send(Socket, "RefID", "JS says: ", Ret), - []; - % Set the new state to the reference generated, and JSVM associated - {hello} -> - Client = getRef(), - connection:send(Socket, Client, "__ok_hello"), - {Client, JSVM}; - {echo, RefID, _, MSG} -> - connection:send(Socket, RefID, "Your VM is ", getJSVM(RefID, State)), - []; - {crash, Zero} -> - 10/Zero; - {vms} -> - connection:send(Socket, "RefID", State); - % Set the new state to [] - Other -> - ggs_connection:send(Socket, "RefID", "__error"), - [] - end, - % Return the new state - NewState. -%%----------------------------------------------------- -%% Helpers -%%----------------------------------------------------- -getRef() -> - {A1,A2,A3} = now(), - random:seed(A1, A2, A3), - random:uniform(1000). - -getJSVM(RefID, State) -> - VMs = State#state.client_vm_map, - {value, {_,VM}} = lists:keysearch(RefID, 1, VMs), - VM. + ggs_network:stop(). From 730b29e5cbcc8c1ccb31847a5e668e23f5b725be Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Fri, 4 Feb 2011 14:21:48 +0100 Subject: [PATCH 05/19] Moving ggs_server parts to ggs_network. Stop method changed. --- src/ggs_server.erl | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ggs_server.erl b/src/ggs_server.erl index f6131a2..41cfee3 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -57,10 +57,7 @@ _echo() -> gen_server:call(?SERVER, {_echo, RefID, _, MSG}). %% @end %%----------------------------------------------------- stop() -> -<<<<<<< HEAD ggs_network:stop(). -======= - gen_server:cast(?SERVER, stop). %%----------------------------------------------------- %% gen_server callbacks From 68658bf74c1437c3b3342c2949061a8e76aee330 Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Fri, 4 Feb 2011 14:35:57 +0100 Subject: [PATCH 06/19] Resolving conflicts of ggs_network and ggs_server. --- src/ggs_network.erl | 11 ++++- src/ggs_server.erl | 112 ++------------------------------------------ 2 files changed, 15 insertions(+), 108 deletions(-) diff --git a/src/ggs_network.erl b/src/ggs_network.erl index 1ee46f6..5489069 100644 --- a/src/ggs_network.erl +++ b/src/ggs_network.erl @@ -22,7 +22,8 @@ % export -export([start_link/0,start_link/1]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2]). --export([get_count/1, send/3, send/4]). +-export([get_count/1,crash/0,vms/0,hello/0,echo/0]). +-export([send/3, send/4]). -export([stop/0]). %% gen_server callbacks @@ -61,6 +62,14 @@ init([Port]) -> get_count(get_count) -> gen_server:call(?SERVER, get_count). +crash() -> gen_server:call(?server, _crash). +vms() -> gen_server:call(?SERVER, _vms). +hello() -> gen_server:call(?SERVER, _hello). +echo() -> gen_server:call(?SERVER, {_echo, RefID, _, MSG}). + + + + %%----------------------------------------------------- %% @doc Stops the server. %% @spec stop() -> ok diff --git a/src/ggs_server.erl b/src/ggs_server.erl index 41cfee3..95a53dd 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -40,16 +40,13 @@ start(Port) -> %% Count = integer() %% @end %%----------------------------------------------------- -<<<<<<< HEAD get_count() -> ggs_network:get_count(get_count). -======= -get_count() -> gen_server:call(?SERVER, get_count). -_crash() -> gen_server:call(?SERVER, _crash). -_vms() -> gen_server:call(?SERVER, _vms). -_hello() -> gen_server:call(?SERVER, _hello). -_echo() -> gen_server:call(?SERVER, {_echo, RefID, _, MSG}). ->>>>>>> 02b72e54457112cb8d576cdcf3e982d2e34407fc + +_crash() -> gen_network:crash(). +_vms() -> gen_network:vms(). +_hello() -> gen_network:hello(). +_echo() -> gen_network:echo(). %%----------------------------------------------------- %% @doc Stops the server. @@ -58,102 +55,3 @@ _echo() -> gen_server:call(?SERVER, {_echo, RefID, _, MSG}). %%----------------------------------------------------- stop() -> ggs_network:stop(). - -%%----------------------------------------------------- -%% gen_server callbacks -%%----------------------------------------------------- - -init([Port]) -> - {ok, LSock} = gen_tcp:listen(Port, [{active, true}, - {reuseaddr, true}]), - {ok, #state{port = Port, lsock = LSock}, 0}. - -handle_call(get_count, _From, State) -> - {reply, {ok, State#state.client_vm_map}, State}; - -handle_call(_crash, _From, State) -> - Zero/10. - {reply, sdas , State}; - -%handle_call(_hello, _From, State) -> -% Client = getRef(); -% send(Socket, Client, "_ok_hello"), -% {Client, JVSM) -%{reply, Client, State}; - -%handle_call(_vms, _From, State) -> -% send(Socket, "RefID", State) -%{reply, , State}; - -%handle_call(_echo, RefID, _, MSG) -> -%{reply, ,State}; - -handle_call(_Message, _From, State) - {reply, error, State}. - -handle_cast(stop, State) -> - {stop, normal, State}. - -handle_info({tcp, Socket, RawData}, State) -> - NewState = do_JSCall(Socket, RawData, State), - OldMap = State#state.client_vm_map, - io:format("Old map: ~p NewState: ~p~n", [OldMap, NewState]), - {noreply, State#state{client_vm_map = OldMap ++ [NewState]}}; - -handle_info(timeout, #state{lsock = LSock} = State) -> - {ok, _Sock} = gen_tcp:accept(LSock), - {noreply, State}. - -terminate(_Reason, _State) -> - ok. - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - -%%----------------------------------------------------- -%% Internal functions -%%----------------------------------------------------- -do_JSCall(Socket, Data, State) -> - JSVM = js_runner:boot(), - js_runner:define(JSVM, "function userCommand(cmd, par) {return cmd+' '+ par}"), - Parsed = ggs_protocol:parse(Data), - NewState = case Parsed of - {cmd, Command, Parameter} -> - % Set the new state to [] - Ret = js_runner:call(JSVM, "userCommand", - [list_to_binary(Command), - list_to_binary(Parameter)]), - connection:send(Socket, "RefID", "JS says: ", Ret), - []; - % Set the new state to the reference generated, and JSVM associated - {hello} -> - Client = getRef(), - connection:send(Socket, Client, "__ok_hello"), - {Client, JSVM}; - {echo, RefID, _, MSG} -> - connection:send(Socket, RefID, "Your VM is ", getJSVM(RefID, State)), - []; - {crash, Zero} -> - 10/Zero; - {vms} -> - connection:send(Socket, "RefID", State); - % Set the new state to [] - Other -> - ggs_connection:send(Socket, "RefID", "__error"), - [] - end, - % Return the new state - NewState. -%%----------------------------------------------------- -%% Helpers -%%----------------------------------------------------- -getRef() -> - {A1,A2,A3} = now(), - random:seed(A1, A2, A3), - random:uniform(1000). - -getJSVM(RefID, State) -> - VMs = State#state.client_vm_map, - {value, {_,VM}} = lists:keysearch(RefID, 1, VMs), - VM. ->>>>>>> 02b72e54457112cb8d576cdcf3e982d2e34407fc From ffeaa3bdc1741ddb1d3ab080a6d2a4988820cbd6 Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Fri, 4 Feb 2011 14:46:29 +0100 Subject: [PATCH 07/19] Fixed spelling errors line in ggs_server line 46-49. --- src/ggs_server.erl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ggs_server.erl b/src/ggs_server.erl index 95a53dd..aed9a0f 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -43,10 +43,10 @@ start(Port) -> get_count() -> ggs_network:get_count(get_count). -_crash() -> gen_network:crash(). -_vms() -> gen_network:vms(). -_hello() -> gen_network:hello(). -_echo() -> gen_network:echo(). +_crash() -> gss_network:crash(). +_vms() -> gss_network:vms(). +_hello() -> gss_network:hello(). +_echo() -> gss_network:echo(). %%----------------------------------------------------- %% @doc Stops the server. From ea4fdfc362191b1f3313deac541f638f59c0b2f0 Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Fri, 4 Feb 2011 14:58:21 +0100 Subject: [PATCH 08/19] Buggfixes in server and network. --- src/ggs_network.erl | 11 ++++++----- src/ggs_server.erl | 17 +++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/ggs_network.erl b/src/ggs_network.erl index 5489069..97e2568 100644 --- a/src/ggs_network.erl +++ b/src/ggs_network.erl @@ -22,7 +22,8 @@ % export -export([start_link/0,start_link/1]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2]). --export([get_count/1,crash/0,vms/0,hello/0,echo/0]). +%-export([get_count/1,crash/0,vms/0,hello/0,echo/0]). +-export([get_count/1]). -export([send/3, send/4]). -export([stop/0]). @@ -62,10 +63,10 @@ init([Port]) -> get_count(get_count) -> gen_server:call(?SERVER, get_count). -crash() -> gen_server:call(?server, _crash). -vms() -> gen_server:call(?SERVER, _vms). -hello() -> gen_server:call(?SERVER, _hello). -echo() -> gen_server:call(?SERVER, {_echo, RefID, _, MSG}). +%crash() -> gen_server:call(?SERVER, crash). +%vms() -> gen_server:call(?SERVER, vms). +%hello() -> gen_server:call(?SERVER, hello). +%echo() -> gen_server:call(?SERVER, {echo, RefID, _, MSG}). diff --git a/src/ggs_server.erl b/src/ggs_server.erl index aed9a0f..f47c064 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -10,12 +10,9 @@ -import(ggs_network). %% API --export([start/0, - start/1, - get_count/0, - stop/0 - ]). - +-export([start/0, start/1, stop/0 ]). +%-export([crash/0, vms/0, hello/0, echo/0]). +-export([get_count/0]). %%%==================================================== @@ -43,10 +40,10 @@ start(Port) -> get_count() -> ggs_network:get_count(get_count). -_crash() -> gss_network:crash(). -_vms() -> gss_network:vms(). -_hello() -> gss_network:hello(). -_echo() -> gss_network:echo(). +%crash() -> gss_network:crash(). +%vms() -> gss_network:vms(). +%hello() -> gss_network:hello(). +%echo() -> gss_network:echo(). %%----------------------------------------------------- %% @doc Stops the server. From 386e386ecf62424b0764f6e0711e1aa96fea18a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20P=C3=A5lsson?= Date: Fri, 4 Feb 2011 16:33:42 +0100 Subject: [PATCH 09/19] ggs_server needs start_link/0 and start_link/1 to function --- src/ggs_network.beam | Bin 2820 -> 0 bytes src/ggs_server.beam | Bin 616 -> 0 bytes src/ggs_server.erl | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 src/ggs_network.beam delete mode 100644 src/ggs_server.beam diff --git a/src/ggs_network.beam b/src/ggs_network.beam deleted file mode 100644 index c5531b6b4340e2b4bbcbad0ab9a4d291efacd769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2820 zcmZ8jeQX>@6`$SNyIWtp&fM)ePSPaacrX6QIlisWAw4IR#yLT%N4tb)`)M{Du*Ms?|c4- z_8^S9o?o>pOD4yi^eE&I9WOeGGohHt!~;9DD|Xd(!x*?@pjhZsZLc0ity0OZg;HR< z<*4Jq)+VBp2Ym-vg|=UHT;R8??P?BQk6(=C0 zf4BvseCQknf%e#w)b$QVeUQYf0$;lvtGf>F5p)fA?0tAw1cL-kv-aV@w*1m`3t`FPW05o8qWJ&GV*e3Q494wTGy1R7_rF!hGg&dX-;Qd6Mqd z4B?EJyhDU@{LX@b3m3&?JYfh|GMDMq{7rrErp||TLWgxj&D^AySj`yKau^un$CGBx z)K%d+H#NGOjS075bxIRtmiZgK!?=b{cg%RJsj7mUfXNjwnanFH9aIw30QNet&ka*; zB%>tscw37x##NnuE;TcbOjIex=JQG`&~9B2J)^XO;szPjK!!D@geuD^)Inxrh9I|s;_?dEaXSp! zlm=a?paWMGxpLrohC@%HvUZLM@=A2&g1ky$;~b8-kZWvf(S7Xy-B*Kq2WWX8KTjd? z8W`%3Xe~1|WCZ5})^%V_gSEYx8wrW4AXl2xff%{S&GCggy24X5k&3bFd8LzXqe^Gn zQKo2I(KRJ)C>sR1QDKJCscuzalE*hH>*E=vLy*^Vv!?R2&IhP$+y>?yiL^wNZrqf4 z6wO>6h#9vRH5vekIBNgj9W$(#x`?HBu}ADk7wKYMS}`)-rO`&V4NFU)!r(w5V;0lp(lI6{kZBrN zHU^Bd0u^(GbWZ2ynMVB>EM~|_Zk_`RY?bD)sMtp+bv9`o<`9(URk7sue1)euEWY!?)(9YM_vJoda!ynLWC`F#+kgb2}*O* zQfV5nlTA>X1WHrq2^H41<&|ED-h0mnLFrZFgJ9OdtZTzMTcFj8kvA>9uW}#c*a``= z_&s3qNeYl{>K2g_5na1fOhmp ztyB@G z?`JQ(7ysd@uC7-P#r)H^j=a6{iMD;mK7D2NkH6Ud&6B_S!u(HHzIkHj=j|WNU%Qd{ zMf+d=Idk^Wv(J^!w)wr^IP$^q8-H$kSorMSTXScgIrF>y(Kn7f(Q`LDyX)sK{D*YR zJn|$VJG~NWfVG5rZULY^836v@SGFu%!KQqx3KzJk?84PFYnpqrfnUnrbD!;lDdaUY5roi?{{lLRLn{CP diff --git a/src/ggs_server.beam b/src/ggs_server.beam deleted file mode 100644 index 8818249268afb82e14ee2ed7b316d9b5a9b4d5c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmY+Cv2GJV5Qb;>&KGPGaXMbWiV_JLUqDDSDb83Sie#L~MwB?~^X7cEZ}+sjHZ+kU zAt4HiJVKiEl$2EIQ`7StnK^6`M*435`DZjc(%##X!3zL>_U5qjuH$q803VThBg^c_ zO0$xtW}PsuNrsZ{lQ#24<%|}&n%6VwMyXyZ=Ub=CW}zp`g&gJTTnExDgvy>!#{(On zt0xlgNRbes=p)-mz(OAF0BfPa_ECl`>4zaZ<kpXs{ zL|91J56nXLEAgI^(K_{D=*)YZ3&%xCXAcPw5AhL-jb>|I!*iplm*NppN66o3e)##n znOp1nV?0SyG?0fgXf_3T9HDu%2Wbl4(<$v)?bdP5pnmpcfnPS|6Yy46Rf!5g_o6?~ zFK+I>erw+T-2K32v+l7v$IkCnzfb*Jx^%f#c2*_$mKL)))Lyk;w_lRyyS$LoV2m68 z7F_sZThzoJRRXJ*CY5tIh^M-cF}|*nlQK8L$+$E+GomPRmBoKwIX*fX#@3|qzyGF< Lm04$O9qt78!%2Cj diff --git a/src/ggs_server.erl b/src/ggs_server.erl index f47c064..097151f 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -10,7 +10,7 @@ -import(ggs_network). %% API --export([start/0, start/1, stop/0 ]). +-export([start_link/0, start_link/1, stop/0 ]). %-export([crash/0, vms/0, hello/0, echo/0]). -export([get_count/0]). @@ -23,10 +23,10 @@ %% @doc Starts the server %% @end %%----------------------------------------------------- -start() -> +start_link() -> ggs_network:start_link(). -start(Port) -> +start_link(Port) -> ggs_network:start_link(Port). From cb53cd6908fe8939e4f38dd991fee89c4932ec8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20P=C3=A5lsson?= Date: Fri, 4 Feb 2011 16:35:36 +0100 Subject: [PATCH 10/19] ggs_connection / connection modules do not exist, removing them from send calls --- src/ggs_network.erl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ggs_network.erl b/src/ggs_network.erl index 97e2568..be1b9d1 100644 --- a/src/ggs_network.erl +++ b/src/ggs_network.erl @@ -131,23 +131,23 @@ do_JSCall(Socket, Data, State) -> Ret = js_runner:call(JSVM, "userCommand", [list_to_binary(Command), list_to_binary(Parameter)]), - connection:send(Socket, "RefID", "JS says: ", Ret), + send(Socket, "RefID", "JS says: ", Ret), []; % Set the new state to the reference generated, and JSVM associated {hello} -> Client = getRef(), - connection:send(Socket, Client, "__ok_hello"), + send(Socket, Client, "__ok_hello"), {Client, JSVM}; {echo, RefID, _, MSG} -> - connection:send(Socket, RefID, "Your VM is ", getJSVM(RefID, State)), + send(Socket, RefID, "Your VM is ", getJSVM(RefID, State)), []; {crash, Zero} -> 10/Zero; {vms} -> - connection:send(Socket, "RefID", State); + send(Socket, "RefID", State); % Set the new state to [] Other -> - ggs_connection:send(Socket, "RefID", "__error"), + send(Socket, "RefID", "__error"), [] end, % Return the new state From 6166a109fc7b9c7bbb8a19f97dcc5c4259f63511 Mon Sep 17 00:00:00 2001 From: Jeena Paradies Date: Sun, 6 Feb 2011 19:17:08 +0100 Subject: [PATCH 11/19] added function to test callErlang() in js --- .gitignore | 1 + erlang_js | 2 +- python_client | 6 ++++-- start | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 3f2a73f..d176978 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.swp *.dump *.beam +Mnesia.* diff --git a/erlang_js b/erlang_js index 5350ed2..cbac148 160000 --- a/erlang_js +++ b/erlang_js @@ -1 +1 @@ -Subproject commit 5350ed21606606dbee5ecb07e974f2abb9106270 +Subproject commit cbac148c440a93db44bad767a43c6d8619f6871f diff --git a/python_client b/python_client index 4dd82ae..f79ff6e 100755 --- a/python_client +++ b/python_client @@ -29,9 +29,9 @@ s.send( "Token: %s\n\ Command: define\n\ Content-Type: text\n\ -Content-Length: 42\n\ +Content-Length: 49\n\ \n\ -function myFun() {return 'Hello world!' ;}" % token) +function myFun() {return callErlang('a', 'b') ;}" % token) fs = s.makefile() data = fs.readline() print "Token:", token @@ -54,6 +54,7 @@ print "Data: ", ' '.join(data.split(" ")[1:]) s.close() +""" HOST = 'localhost' # The remote host PORT = int(sys.argv[1]) # The same port as used by the server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -74,3 +75,4 @@ print "Token:", token print "Data: ", ' '.join(data.split(" ")[1:]) s.close() +""" diff --git a/start b/start index 6de5737..7dd9673 100755 --- a/start +++ b/start @@ -1,3 +1,3 @@ #!/usr/bin/env bash -erl -sname ggs -mnesia -boot start_sasl -pa erlang_js/ebin/ -pa ebin -pa src -s start_ggs +erl -sname ggs -mnesia -boot start_sasl -pa erlang_js/ebin/ -pa ebin -pa src -s start_ggs -sname ggs From c67bcc32e7452f1064330ca1db0bfe8ce37a45f2 Mon Sep 17 00:00:00 2001 From: Jeena Paradies Date: Mon, 7 Feb 2011 01:21:51 -0800 Subject: [PATCH 12/19] removed double -sname --- start | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 start diff --git a/start b/start old mode 100755 new mode 100644 index 7dd9673..6de5737 --- a/start +++ b/start @@ -1,3 +1,3 @@ #!/usr/bin/env bash -erl -sname ggs -mnesia -boot start_sasl -pa erlang_js/ebin/ -pa ebin -pa src -s start_ggs -sname ggs +erl -sname ggs -mnesia -boot start_sasl -pa erlang_js/ebin/ -pa ebin -pa src -s start_ggs From fa63ea104bf036e2bd822260b946593847e2ad9c Mon Sep 17 00:00:00 2001 From: Jeena Paradies Date: Fri, 11 Feb 2011 12:28:34 +0100 Subject: [PATCH 13/19] can't remember --- HOWTO | 2 +- build | 2 +- client | 17 +++++++++++++++++ erlang_js | 2 +- games/tic-tac-toe-js/index.html | 12 ++++++++++-- games/tic-tac-toe-js/proxy.rb | 0 python_client | 2 +- src/key_value_store.erl | 22 ++++++++++++++++++++++ start | 0 9 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 client create mode 100644 games/tic-tac-toe-js/proxy.rb create mode 100644 src/key_value_store.erl mode change 100644 => 100755 start diff --git a/HOWTO b/HOWTO index 064d127..2d28ea8 100644 --- a/HOWTO +++ b/HOWTO @@ -3,7 +3,7 @@ python version 2.x set to default. INSTALL 1. Cd into directory where you to have the project -2. git-clone git@github.com:jeena/GGS.git (remember to have a local key) +2. git clone git@github.com:jeena/GGS.git (remember to have a local key) 3. cd GGS/ 4. git submodule init 5. git submodule update diff --git a/build b/build index d468113..a9c1c79 100755 --- a/build +++ b/build @@ -3,4 +3,4 @@ for i in `find src -name "*.erl"` do erlc -o ebin $i -done +done \ No newline at end of file diff --git a/client b/client new file mode 100644 index 0000000..dff11aa --- /dev/null +++ b/client @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby -wKU + +require 'socket' # Sockets are in standard library + +hostname = 'localhost' +port = 7000 + +s = TCPSocket.open(hostname, port) + + + +s.print(q.chop) + +while line = s.gets # Read lines from the socket + puts "Got Echo: " + line.chop # And print with platform line terminator +end +s.close # Close the socket when done diff --git a/erlang_js b/erlang_js index cbac148..5350ed2 160000 --- a/erlang_js +++ b/erlang_js @@ -1 +1 @@ -Subproject commit cbac148c440a93db44bad767a43c6d8619f6871f +Subproject commit 5350ed21606606dbee5ecb07e974f2abb9106270 diff --git a/games/tic-tac-toe-js/index.html b/games/tic-tac-toe-js/index.html index 97d3c4f..5bdb286 100644 --- a/games/tic-tac-toe-js/index.html +++ b/games/tic-tac-toe-js/index.html @@ -12,8 +12,16 @@ function init() { GameServer.addGame(game_name, main()); - GameServer.addClient(game_name, new TicTacToeClient(frames.player1.document.getElementById("p1"), GameServer)); - GameServer.addClient(game_name, new TicTacToeClient(frames.player2.document.getElementById("p2"), GameServer)); + GameServer.addClient( + game_name, + new TicTacToeClient(frames.player1.document.getElementById("p1"), + GameServer + )); + GameServer.addClient( + game_name, + new TicTacToeClient(frames.player2.document.getElementById("p2"), + GameServer + )); } diff --git a/games/tic-tac-toe-js/proxy.rb b/games/tic-tac-toe-js/proxy.rb new file mode 100644 index 0000000..e69de29 diff --git a/python_client b/python_client index f79ff6e..9a1f1a9 100755 --- a/python_client +++ b/python_client @@ -31,7 +31,7 @@ Command: define\n\ Content-Type: text\n\ Content-Length: 49\n\ \n\ -function myFun() {return callErlang('a', 'b') ;}" % token) +function myFun() {return 'Hello World!' ;}" % token) fs = s.makefile() data = fs.readline() print "Token:", token diff --git a/src/key_value_store.erl b/src/key_value_store.erl new file mode 100644 index 0000000..70a2dc6 --- /dev/null +++ b/src/key_value_store.erl @@ -0,0 +1,22 @@ +-module(key_value_store). +-export(start/0,stop/0,set_item/2,get_item/1,get/1,length(0,clean/0). + +start() -> + spawn_link(fun() -> loop([]) end). + +stop() -> + self() ! {stop} + +loop(Touples) -> + receive -> + {set_item, Key, Value} -> + Touple = find(Touples, Key) + {stop} -> + {'EXIT', normal} + +find([], _) -> false; +find([{Key, _}|Tuples], Match) -> + case Key == Match of + true -> true; + false -> find(Tuples, Match) + end. \ No newline at end of file diff --git a/start b/start old mode 100644 new mode 100755 From 3ccef1e7114fc1bae4a6e8d7913f910932d5e115 Mon Sep 17 00:00:00 2001 From: Jeena Paradies Date: Fri, 11 Feb 2011 13:58:59 +0100 Subject: [PATCH 14/19] removed file --- src/key_value_store.erl | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 src/key_value_store.erl diff --git a/src/key_value_store.erl b/src/key_value_store.erl deleted file mode 100644 index 70a2dc6..0000000 --- a/src/key_value_store.erl +++ /dev/null @@ -1,22 +0,0 @@ --module(key_value_store). --export(start/0,stop/0,set_item/2,get_item/1,get/1,length(0,clean/0). - -start() -> - spawn_link(fun() -> loop([]) end). - -stop() -> - self() ! {stop} - -loop(Touples) -> - receive -> - {set_item, Key, Value} -> - Touple = find(Touples, Key) - {stop} -> - {'EXIT', normal} - -find([], _) -> false; -find([{Key, _}|Tuples], Match) -> - case Key == Match of - true -> true; - false -> find(Tuples, Match) - end. \ No newline at end of file From 8c1fe0b4fdd4f380edf0d7be0dd479bbc10a819f Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Sun, 13 Feb 2011 16:44:11 +0100 Subject: [PATCH 15/19] Port to process. --- src/ggs_server.erl | 4 ++-- src/js_runner.erl | 32 +++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/ggs_server.erl b/src/ggs_server.erl index 68b1625..91ea620 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -106,13 +106,13 @@ handle_cast({call, Token, Payload}, State) -> io:format("Got call request: ~p~n", [Payload]), JSVM = getJSVM(Token, State), erlang:display(erlang:port_info(JSVM)), - {ok, Ret} = js_runner:call(JSVM, Payload, []),%Payload, []), + {ok, Ret} = js_runner:call(JSVM, Payload, []), send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), {noreply, State}; % Set the new state to the reference generated, and JSVM associated handle_cast({hello, _, _}, State) -> - JSVM = js_runner:boot(), + JSVM = js_runner:boot(), Client = getRef(), send(State#state.lsock, Client, "This is your refID"), OldMap = State#state.client_vm_map, diff --git a/src/js_runner.erl b/src/js_runner.erl index ca866c4..780bfe1 100644 --- a/src/js_runner.erl +++ b/src/js_runner.erl @@ -1,13 +1,35 @@ -module(js_runner). --export([define/2,call/3, boot/0]). +-export([boot/0,define/2,call/3]). -boot() -> +%Mattias +boot() -> erlang_js:start(), {ok, Port} = js_driver:new(), + PortPid = spawn(fun() -> + port_process(Port) end ), + register(port_pid, PortPid), Port. -define(Port, Data) -> - ok = js:define(Port, list_to_binary(Data)). + +port_process(Port) -> +receive + {get_port, From} -> + From!{ok,Port}, + port_process(Port); + {define,From, JSVM, Data} -> + ok = js:define(JSVM, list_to_binary(Data)), + From!{ok}, + port_process(Port); + {call, From, JSVM, Func, Params} -> + {ok,Ret} = js:call(JSVM, list_to_binary(Func), Params), + From!{ok,Ret}, + port_process(Port) +end. + +define(Port, Data) -> + port_pid!{define,self(),Port,Data}. + + call(Port, Func, Params) -> - js:call(Port, list_to_binary(Func), Params). + port_pid!{call, self(), Port, Func, Params}. From e945bb0d31676fc3f2ec1db38df898f28cb5c26a Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Mon, 14 Feb 2011 15:09:01 +0100 Subject: [PATCH 16/19] From one port process to many. --- src/ggs_server.erl | 36 +++++++++++++++++++++++++----------- src/js_runner.erl | 26 ++++++++++++-------------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/ggs_server.erl b/src/ggs_server.erl index 91ea620..aae268e 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -97,28 +97,42 @@ handle_cast(stop, State) -> % Handle javascript defines handle_cast({define, Token, Payload}, State) -> JSVM = getJSVM(Token, State), - js_runner:define(JSVM, Payload), + %js_runner:define(JSVM, Payload), + JSVM!{define,self(),Payload}, send(State#state.lsock, Token, "Okay, defined that for you!"), {noreply, State}; % Handle javascript calls handle_cast({call, Token, Payload}, State) -> + io:format("test1~n"), io:format("Got call request: ~p~n", [Payload]), - JSVM = getJSVM(Token, State), - erlang:display(erlang:port_info(JSVM)), - {ok, Ret} = js_runner:call(JSVM, Payload, []), - send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), - {noreply, State}; - + io:format("test2~n"), + JSVM = getJSVM(Token, State), + JSVM!{get_port, self()}, + receive + {ok, Port} -> erlang:display(erlang:port_info(Port)), + io:format("test1~n") + end, + %erlang:display(erlang:port_info(Port)), + %{ok, Ret} = js_runner:call(JSVM, Payload, []), + JSVM!{call, self(), Payload, []}, + receive + {ok, Ret} -> + send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), + {noreply, State} + end; % Set the new state to the reference generated, and JSVM associated handle_cast({hello, _, _}, State) -> - JSVM = js_runner:boot(), + JSVM = js_runner:boot(), Client = getRef(), send(State#state.lsock, Client, "This is your refID"), OldMap = State#state.client_vm_map, - NewState = State#state{client_vm_map = OldMap ++ [{Client, JSVM}]}, - gen_server:cast(ggs_backup, {set_backup, NewState}), - {noreply, NewState}. + JSVM!{get_port, self()}, + receive + {ok, Port} -> NewState = State#state{client_vm_map = OldMap ++ [{Client, Port}]}, + gen_server:cast(ggs_backup, {set_backup, NewState}), + {noreply, NewState} + end. %%----------------------------------------------------- %% Helpers %%----------------------------------------------------- diff --git a/src/js_runner.erl b/src/js_runner.erl index 780bfe1..65511e9 100644 --- a/src/js_runner.erl +++ b/src/js_runner.erl @@ -1,14 +1,12 @@ -module(js_runner). --export([boot/0,define/2,call/3]). +-export([boot/0]). %Mattias boot() -> erlang_js:start(), {ok, Port} = js_driver:new(), - PortPid = spawn(fun() -> - port_process(Port) end ), - register(port_pid, PortPid), - Port. + PortPid = spawn(fun() -> port_process(Port) end ), + PortPid. port_process(Port) -> @@ -16,20 +14,20 @@ receive {get_port, From} -> From!{ok,Port}, port_process(Port); - {define,From, JSVM, Data} -> - ok = js:define(JSVM, list_to_binary(Data)), + {define, From, Data} -> + ok = js:define(From, list_to_binary(Data)), From!{ok}, port_process(Port); - {call, From, JSVM, Func, Params} -> - {ok,Ret} = js:call(JSVM, list_to_binary(Func), Params), + {call, From, Func, Params} -> + {ok,Ret} = js:call(From, list_to_binary(Func), Params), %Port unsure From!{ok,Ret}, port_process(Port) end. - -define(Port, Data) -> - port_pid!{define,self(),Port,Data}. +%These two babies will be ambigiuous +%define(Port, Data) -> +% port_pid!{define,self(),Port,Data}. -call(Port, Func, Params) -> - port_pid!{call, self(), Port, Func, Params}. +%call(Port, Func, Params) -> +% port_pid!{call, self(), Port, Func, Params}. From 05d5b60a9f5501641173f25688c2b81ef8296b9f Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Mon, 14 Feb 2011 15:36:53 +0100 Subject: [PATCH 17/19] merge with master. --- src/ggs_server.erl | 156 +++++++++++++++++++++++++++++++++++++++++++++ src/js_runner.erl | 33 ++++++++++ 2 files changed, 189 insertions(+) create mode 100644 src/ggs_server.erl create mode 100644 src/js_runner.erl diff --git a/src/ggs_server.erl b/src/ggs_server.erl new file mode 100644 index 0000000..aae268e --- /dev/null +++ b/src/ggs_server.erl @@ -0,0 +1,156 @@ +%%%---------------------------------------------------- +%%% @author Jonatan PÃ¥lsson +%%% @copyright 2010 Jonatan PÃ¥lsson +%%% @doc RPC over TCP server +%%% @end +%%%---------------------------------------------------- + +-module(ggs_server). +-behaviour(gen_server). + +%% API +-export([start_link/1, + start_link/0, + stop/0 + ]). + +%% gen_server callbacks +-export([init/1, handle_call/3, handle_cast/2, + handle_info/2, terminate/2, code_change/3]). + + +-define(SERVER, ?MODULE). +-define(DEFAULT_PORT, 1055). + +-record(state, {port, lsock, client_vm_map = []}). + +%%%==================================================== +%%% API +%%%==================================================== + +%%----------------------------------------------------- +%% @doc Starts the server +%% @end +%%----------------------------------------------------- +start_link(Port) -> + gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []). + +start_link() -> + start_link(?DEFAULT_PORT). + +%%----------------------------------------------------- +%% @doc Stops the server. +%% @spec stop() -> ok +%% @end +%%----------------------------------------------------- +stop() -> + gen_server:cast(?SERVER, stop). + +%%----------------------------------------------------- +%% gen_server callbacks +%%----------------------------------------------------- + +init([Port]) -> + case gen_server:call(ggs_backup, get_backup) of + {backup_state, not_initialized} -> + {ok, LSock} = gen_tcp:listen(Port, [{active, true}, + {reuseaddr, true}]), + {ok, #state{port = Port, lsock = LSock}, 0}; + {backup_state, State} -> + {ok, LSock} = gen_tcp:listen(Port, [{active, true}, + {reuseaddr, true}]), + {ok, State#state{lsock = LSock}, 0} + end. + +handle_call({backup_state, OldState}, _From, State) -> + io:format("Received old state from backup~n"), + {noreply, OldState}. + + +handle_info({tcp, Socket, RawData}, State) -> + ggs_protocol:parse(RawData), + {noreply, State#state{lsock = Socket}}; + +handle_info({tcp_closed, Socket}, State) -> + gen_tcp:close(Socket), + {stop, "Client closed socket", State}; + +handle_info(timeout, #state{lsock = LSock} = State) -> + {ok, _Sock} = gen_tcp:accept(LSock), + {noreply, State}; + +handle_info(Other, State) -> + erlang:display(Other). + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%----------------------------------------------------- +%% Internal functions +%%----------------------------------------------------- +handle_cast(stop, State) -> + {stop, normal, State}; + +% Handle javascript defines +handle_cast({define, Token, Payload}, State) -> + JSVM = getJSVM(Token, State), + %js_runner:define(JSVM, Payload), + JSVM!{define,self(),Payload}, + send(State#state.lsock, Token, "Okay, defined that for you!"), + {noreply, State}; + +% Handle javascript calls +handle_cast({call, Token, Payload}, State) -> + io:format("test1~n"), + io:format("Got call request: ~p~n", [Payload]), + io:format("test2~n"), + JSVM = getJSVM(Token, State), + JSVM!{get_port, self()}, + receive + {ok, Port} -> erlang:display(erlang:port_info(Port)), + io:format("test1~n") + end, + %erlang:display(erlang:port_info(Port)), + %{ok, Ret} = js_runner:call(JSVM, Payload, []), + JSVM!{call, self(), Payload, []}, + receive + {ok, Ret} -> + send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), + {noreply, State} + end; +% Set the new state to the reference generated, and JSVM associated +handle_cast({hello, _, _}, State) -> + JSVM = js_runner:boot(), + Client = getRef(), + send(State#state.lsock, Client, "This is your refID"), + OldMap = State#state.client_vm_map, + JSVM!{get_port, self()}, + receive + {ok, Port} -> NewState = State#state{client_vm_map = OldMap ++ [{Client, Port}]}, + gen_server:cast(ggs_backup, {set_backup, NewState}), + {noreply, NewState} + end. +%%----------------------------------------------------- +%% Helpers +%%----------------------------------------------------- +getRef() -> + %{A1,A2,A3} = now(), + %#random:seed(A1, A2, A3), + %random:uniform(1000). + string:strip(os:cmd("uuidgen"), right, $\n ). + +getJSVM(RefID, State) -> + VMs = State#state.client_vm_map, + erlang:display(RefID), + erlang:display(VMs), + {value, {_,VM}} = lists:keysearch(RefID, 1, VMs), + VM. + +send(Socket, RefID, String) -> + gen_tcp:send(Socket, string:join([RefID,String,"\n"], " ")). + +send(Socket, RefID, String1, String2) -> + gen_tcp:send(Socket, string:join([RefID,String1, String2,"\n"], " ")). diff --git a/src/js_runner.erl b/src/js_runner.erl new file mode 100644 index 0000000..65511e9 --- /dev/null +++ b/src/js_runner.erl @@ -0,0 +1,33 @@ +-module(js_runner). +-export([boot/0]). + +%Mattias +boot() -> + erlang_js:start(), + {ok, Port} = js_driver:new(), + PortPid = spawn(fun() -> port_process(Port) end ), + PortPid. + + +port_process(Port) -> +receive + {get_port, From} -> + From!{ok,Port}, + port_process(Port); + {define, From, Data} -> + ok = js:define(From, list_to_binary(Data)), + From!{ok}, + port_process(Port); + {call, From, Func, Params} -> + {ok,Ret} = js:call(From, list_to_binary(Func), Params), %Port unsure + From!{ok,Ret}, + port_process(Port) +end. + +%These two babies will be ambigiuous +%define(Port, Data) -> +% port_pid!{define,self(),Port,Data}. + + +%call(Port, Func, Params) -> +% port_pid!{call, self(), Port, Func, Params}. From 1e08fe0015b936fdecfaceb4177e628d2d25b275 Mon Sep 17 00:00:00 2001 From: Kallfaktorn Date: Mon, 14 Feb 2011 17:50:22 +0100 Subject: [PATCH 18/19] Interface modifications. Methods for vm handling. --- src/ggs_server.erl | 43 ++++++++++++++----------------------------- src/ggs_vm_runner.erl | 28 ++++++++++++++++++++++++++++ src/js_runner.erl | 33 --------------------------------- 3 files changed, 42 insertions(+), 62 deletions(-) create mode 100644 src/ggs_vm_runner.erl delete mode 100644 src/js_runner.erl diff --git a/src/ggs_server.erl b/src/ggs_server.erl index aae268e..34d297f 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -95,44 +95,29 @@ handle_cast(stop, State) -> {stop, normal, State}; % Handle javascript defines -handle_cast({define, Token, Payload}, State) -> - JSVM = getJSVM(Token, State), - %js_runner:define(JSVM, Payload), - JSVM!{define,self(),Payload}, +handle_cast({define, Token, SourceCode}, State) -> + GameVM = getJSVM(Token, State), + ggs_vm_runner:define(GameVM, SourceCode), send(State#state.lsock, Token, "Okay, defined that for you!"), {noreply, State}; % Handle javascript calls -handle_cast({call, Token, Payload}, State) -> - io:format("test1~n"), - io:format("Got call request: ~p~n", [Payload]), - io:format("test2~n"), - JSVM = getJSVM(Token, State), - JSVM!{get_port, self()}, - receive - {ok, Port} -> erlang:display(erlang:port_info(Port)), - io:format("test1~n") - end, - %erlang:display(erlang:port_info(Port)), - %{ok, Ret} = js_runner:call(JSVM, Payload, []), - JSVM!{call, self(), Payload, []}, - receive - {ok, Ret} -> - send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), - {noreply, State} - end; +handle_cast({call, Token, Command}, State) -> + GameVM = getJSVM(Token, State), + ggs_vm_runner:user_command(GameVM, "User", Command, []), + %send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), Unessecary + {noreply, State}; + % Set the new state to the reference generated, and JSVM associated handle_cast({hello, _, _}, State) -> - JSVM = js_runner:boot(), + GameVM = ggs_vm_runner:start_link(), Client = getRef(), send(State#state.lsock, Client, "This is your refID"), OldMap = State#state.client_vm_map, - JSVM!{get_port, self()}, - receive - {ok, Port} -> NewState = State#state{client_vm_map = OldMap ++ [{Client, Port}]}, - gen_server:cast(ggs_backup, {set_backup, NewState}), - {noreply, NewState} - end. + NewState = State#state{client_vm_map = OldMap ++ [{Client, GameVM}]}, + gen_server:cast(ggs_backup, {set_backup, NewState}), + {noreply, NewState}. + %%----------------------------------------------------- %% Helpers %%----------------------------------------------------- diff --git a/src/ggs_vm_runner.erl b/src/ggs_vm_runner.erl new file mode 100644 index 0000000..cf633f0 --- /dev/null +++ b/src/ggs_vm_runner.erl @@ -0,0 +1,28 @@ +-module(ggs_vm_runner). +-export([start_link/0, define/2, user_command/4]). + +%Mattias +start_link() -> + erlang_js:start(), + {ok, Port} = js_driver:new(), + js:define(Port, <<"function userCommand(user, command, args){}">>), + PortPid = spawn_link(fun() -> loop(Port) end ), + PortPid. + + +loop(Port) -> +receive + {define, SourceCode} -> + ok = js:define(Port, list_to_binary(SourceCode)), + loop(Port); + {user_command, User, Command, Args} -> + {ok, Ret} = js:call(Port, <<"userCommand">>, list_to_binary([User,Command,Args])), + loop(Port) +end. + + +define(GameVM, SourceCode) -> + GameVM ! {define,SourceCode}. + +user_command(GameVM, User, Command, Args) -> + GameVM ! {user_command, User, Command, Args}. diff --git a/src/js_runner.erl b/src/js_runner.erl deleted file mode 100644 index 65511e9..0000000 --- a/src/js_runner.erl +++ /dev/null @@ -1,33 +0,0 @@ --module(js_runner). --export([boot/0]). - -%Mattias -boot() -> - erlang_js:start(), - {ok, Port} = js_driver:new(), - PortPid = spawn(fun() -> port_process(Port) end ), - PortPid. - - -port_process(Port) -> -receive - {get_port, From} -> - From!{ok,Port}, - port_process(Port); - {define, From, Data} -> - ok = js:define(From, list_to_binary(Data)), - From!{ok}, - port_process(Port); - {call, From, Func, Params} -> - {ok,Ret} = js:call(From, list_to_binary(Func), Params), %Port unsure - From!{ok,Ret}, - port_process(Port) -end. - -%These two babies will be ambigiuous -%define(Port, Data) -> -% port_pid!{define,self(),Port,Data}. - - -%call(Port, Func, Params) -> -% port_pid!{call, self(), Port, Func, Params}. From bf98e1fee2c9338466ea58b2d08c9a277cf370ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20P=C3=A5lsson?= Date: Mon, 14 Feb 2011 19:32:46 +0100 Subject: [PATCH 19/19] Fixed ggs_vm_runner --- src/ggs_server.erl | 4 ++-- src/ggs_vm_runner.erl | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/ggs_server.erl b/src/ggs_server.erl index 34d297f..c695fd6 100644 --- a/src/ggs_server.erl +++ b/src/ggs_server.erl @@ -104,8 +104,8 @@ handle_cast({define, Token, SourceCode}, State) -> % Handle javascript calls handle_cast({call, Token, Command}, State) -> GameVM = getJSVM(Token, State), - ggs_vm_runner:user_command(GameVM, "User", Command, []), - %send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), Unessecary + Ret = ggs_vm_runner:user_command(GameVM, "User", Command, []), + send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)), {noreply, State}; % Set the new state to the reference generated, and JSVM associated diff --git a/src/ggs_vm_runner.erl b/src/ggs_vm_runner.erl index cf633f0..6c66378 100644 --- a/src/ggs_vm_runner.erl +++ b/src/ggs_vm_runner.erl @@ -4,25 +4,41 @@ %Mattias start_link() -> erlang_js:start(), - {ok, Port} = js_driver:new(), - js:define(Port, <<"function userCommand(user, command, args){}">>), - PortPid = spawn_link(fun() -> loop(Port) end ), + PortPid = spawn_link( fun() -> + process_flag(trap_exit, true), + {ok, Port} = js_driver:new(), + js:define(Port, <<"function userCommand(user, command, args){return 'Hello world';}">>), + loop(Port) + end ), PortPid. loop(Port) -> -receive - {define, SourceCode} -> - ok = js:define(Port, list_to_binary(SourceCode)), - loop(Port); - {user_command, User, Command, Args} -> - {ok, Ret} = js:call(Port, <<"userCommand">>, list_to_binary([User,Command,Args])), - loop(Port) -end. + io:format("I am PID"), + erlang:display(self()), + receive + {define, SourceCode} -> + ok = js:define(Port, list_to_binary(SourceCode)), + loop(Port); + {user_command, User, Command, Args, From, Ref} -> + {ok, Ret} = js:call(Port, <<"userCommand">>, + [ list_to_binary(User), + list_to_binary(Command), + list_to_binary(Args) + ]), + From ! {Ref, Ret}, + loop(Port) + end. define(GameVM, SourceCode) -> GameVM ! {define,SourceCode}. user_command(GameVM, User, Command, Args) -> - GameVM ! {user_command, User, Command, Args}. + Ref = make_ref(), + GameVM ! {user_command, User, Command, Args, self(), Ref}, + receive + {Ref, RetVal} -> + RetVal; + Other -> Other + end.