/run Torrent client/talkToJava.erl~

http://github.com/anonymous-admin/anonymous · Unknown · 161 lines · 136 code · 25 blank · 0 comment · 0 complexity · d5e0cc5625a3969fd708692bdefdf80c MD5 · raw file

  1. -module(talkToJava).
  2. -export([start_link/0, start_link/1, stop/0]).
  3. -export([init/1, terminate/2, handle_cast/2,
  4. handle_info/2, code_change/3, handle_call/3]).
  5. -behaviour(gen_server).
  6. -include("defs.hrl").
  7. start_link() ->
  8. start_link([]).
  9. start_link(_Args) ->
  10. ComputerName = net_adm:localhost(),
  11. NodeName = "javaNode@" ++ ComputerName,
  12. NodeAtom = list_to_atom(NodeName),
  13. gen_server:start_link({local, gui}, ?MODULE, [NodeAtom, dict:new()], []).
  14. stop() ->
  15. gen_server:cast(gui, stop).
  16. init([NodeAtom, TorrentIds]) ->
  17. timer:sleep(4000),
  18. {mailbox, NodeAtom} ! {self(), "startconnection"},
  19. gen_server:cast(msg_controller, {subscribe, gui, [{exit,-1}, {torrent_info,-1}, {torrent_status,-1},
  20. {tracker_info,-1}, {seeders,-1}, {leechers,-1},
  21. {uploaded,-1}, {downloaded,-1}, {left,-1},
  22. {torrent_size,-1}, {pieces,-1},
  23. {download_speed,-1}, {upload_speed,-1}, {filename,-1}, {default_path,-1}]}),
  24. {ok, {NodeAtom, TorrentIds}}.
  25. terminate(_Reason, {_NodeAtom, _TorrentIds}) ->
  26. gen_server:cast(gui, stop).
  27. handle_cast(stop, {_NodeAtom, _TorrentIds}) ->
  28. {stop, normal, {_NodeAtom, _TorrentIds}};
  29. handle_cast({notify, default_path, {-1, Value}}, {NodeAtom, TorrentIds}) ->
  30. Target ! {self(), TorrentId, 12, Value};
  31. {noreply, {NodeAtom, TorrentIds}};
  32. handle_cast({notify, _Tag, {-1, _Value}}, {NodeAtom, TorrentIds}) ->
  33. {noreply, {NodeAtom, TorrentIds}};
  34. handle_cast({notify, Tag, {Id, Value}}, {NodeAtom, TorrentIds}) ->
  35. %Check if the key already exists
  36. case lists:member(Id, dict:fetch_keys(TorrentIds)) of
  37. false -> NewDict = dict:append(Id, dict:size(TorrentIds)+1, TorrentIds);
  38. true -> NewDict = TorrentIds
  39. end,
  40. {ok, [TorrentId]} = dict:find(Id, NewDict),
  41. Target = {mailbox2, NodeAtom},
  42. %%receives from other erlang modules sends back to notice java
  43. case Tag of
  44. torrent_info ->
  45. Filename = Value#torrent.filename,
  46. %Seeders = Value#torrent.seeders,
  47. %Leechers = Value#torrent.leechers,
  48. Size = Value#torrent.size,
  49. Downloaded = Value#torrent.downloaded,
  50. {Files,_} = Value#torrent.files,
  51. %Target ! {self(), TorrentId, 5, Seeders},
  52. %Target ! {self(), TorrentId, 6, Leechers},
  53. Target ! {self(), TorrentId, 1, Size},
  54. Target ! {self(), TorrentId, 7, Downloaded},
  55. Target ! {self(), TorrentId, 0, Filename},
  56. sendFiles(Files, NodeAtom, TorrentId);
  57. error ->
  58. Target ! {self(), TorrentId, 11, Value};
  59. filename ->
  60. Target ! {self(), TorrentId, 0, Value};
  61. tracker_info ->
  62. Uploaded = Value#tracker_info.uploaded,
  63. Target ! {self(), TorrentId, 8, Uploaded};
  64. file_path ->
  65. Files = Value#torrent.files,
  66. Target ! {self(), TorrentId, 10, Files};
  67. torrent_status ->
  68. case Value of
  69. finished -> {mailbox2, NodeAtom} ! {self(), TorrentId, 9, Value};
  70. _ -> ok
  71. end;
  72. torrent_size ->
  73. Target ! {self(), TorrentId, 1, Value};
  74. download_speed ->
  75. Target ! {self(), TorrentId, 3, Value};
  76. upload_speed ->
  77. Target ! {self(), TorrentId, 4, Value};
  78. seeders ->
  79. Target ! {self(), TorrentId, 5, Value};
  80. leechers ->
  81. Target ! {self(), TorrentId, 6, Value};
  82. downloaded ->
  83. Target ! {self(), TorrentId, 7, Value};
  84. uploaded ->
  85. Target ! {self(), TorrentId, 8, Value};
  86. finished ->
  87. Target ! {self(), TorrentId, 9, "Torrent finished downloading"}
  88. end,
  89. {noreply, {NodeAtom, NewDict}}.
  90. handle_info(Info, {NodeAtom, TorrentIds}) ->
  91. case Info of
  92. %%receives from java
  93. {_, connok} ->
  94. io:format("Message received: ~p~n", [connectionok]);
  95. {_, exit} ->
  96. io:format("Message received: ~p~n", [exited]),
  97. gen_server:cast(msg_controller, {notify, exit, exit});
  98. {_, open,FileDir} ->
  99. io:format("Message received: ~p~n", [FileDir]),
  100. gen_server:cast(msg_controller, {notify, torrent_status, {-1, opened}}),
  101. gen_server:cast(msg_controller, {notify, torrent_filepath,{-1, FileDir}});
  102. {_, Id, start} ->
  103. io:format("Message received: ~p~n", [resumed]),
  104. gen_server:cast(msg_controller, {notify, torrent_status,{getIdAtom(Id, TorrentIds), resume}});
  105. {_, Id, stop} ->
  106. io:format("Message received: ~p~n", [stopped]),
  107. gen_server:cast(msg_controller, {notify, torrent_status,{getIdAtom(Id, TorrentIds), stopped}});
  108. {_, Id, pause} ->
  109. io:format("Message received: ~p~n", [paused]),
  110. gen_server:cast(msg_controller, {notify, torrent_status, {getIdAtom(Id, TorrentIds), paused}});
  111. {_, Id, delete} ->
  112. io:format("Message received: ~p for id: ~p~n", [deleted, getIdAtom(Id, TorrentIds)]),
  113. gen_server:cast(msg_controller, {notify, torrent_status, {getIdAtom(Id, TorrentIds), deleted}});
  114. {_, dir,DirList} ->
  115. io:format("directory: ~p~n", [DirList]),
  116. gen_server:cast(msg_controller, {notify, default_path,{-1, DirList}})
  117. end,
  118. {noreply, {NodeAtom, TorrentIds}}.
  119. sendFiles([],_,_) ->
  120. ok;
  121. sendFiles([[ToSend,_]|T], NodeAtom, TorrentId) ->
  122. {mailbox2, NodeAtom} ! {self(), TorrentId, 10, binary_to_list(hd(lists:reverse(ToSend)))},
  123. sendFiles(T, NodeAtom, TorrentId).
  124. getIdAtom([], _Num, _TorrentIds) ->
  125. {error, not_found};
  126. getIdAtom([H|T], Num, TorrentIds) ->
  127. case {ok, [Num]} == dict:find(H, TorrentIds) of
  128. true -> H;
  129. false -> getIdAtom(T, Num, TorrentIds)
  130. end.
  131. getIdAtom(Num, TorrentIds) ->
  132. getIdAtom(dict:fetch_keys(TorrentIds), Num, TorrentIds).
  133. code_change(_, _, _) ->
  134. ok.
  135. handle_call(_, _, _) ->
  136. ok.