ftp_client.anubis
4.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
*
* User: David RENE
* Date: 11/05/2007
* Time: 22:34
* (c) Calexium
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
read calexium_lib/CXM_message_constants.anubis
read calexium_lib/net_services/CXM_generic_protocol.anubis
read system/message_queue.anubis
read system/message_transceiver.anubis
read system/muscle.anubis
read system/files.anubis
read tools/basis.anubis
define Maybe(One)
receive_data
(
MessageQueue mQ,
WStream fd,
Int32 so_far,
Int32 left_read
)=
//println("receive_data ");
if mQ.get_next_received_Message(30) is
{
timeout then failure,
closed then failure,
msg(_msg) then
with last_block = if find_bool(_msg, "End") is {failure then false, success(r) then r},
if find_raw(_msg, "Data") is
{
failure then println("Can't find raw Data"); send_ACK_error(mQ, _CXM_FTP_DATA); failure,
success(data) then
if write(fd, data) is
{
failure then println("Can't write into file"); send_ACK_error(mQ, _CXM_FTP_DATA);failure,
success(len) then
send_ACK_ok(mQ, _CXM_FTP_DATA);
if last_block then
println("File received successfully");
success(unique)
else
// println("Bytes received : " + (so_far + len));
receive_data(mQ, fd, so_far + len, left_read - len)
}
}
}
.
define Maybe(One)
start_get_file_transtert
(
MessageQueue mQ,
String local_file,
Int32 size
)=
make_directories(local_file);
if file(local_file, new) is
{
failure then println("Can't create \""+local_file+"\" file"); failure,
success(fd) then //the local file is open
with start = message(_CXM_FTP_START_TRANSFERT),
mQ.add_Message_to_send(start);
receive_data(mQ, weaken(fd), 0, size)
}
.
define Maybe(One)
get_file
(
MessageQueue mQ,
String remote_file,
String local_file
)=
with get_file_msg = message(_CXM_FTP_GET_FILE),
if add_string(get_file_msg, "FileName", remote_file) is
{
failure then failure,
success(_) then
mQ.add_Message_to_send(get_file_msg);
if wait_for_reply(mQ, _CXM_FTP_GET_FILE, 30) is
{
failure then println("get_file failure");failure,
timeout then println("get_file timeout");failure,
unknow_cmd then println("get_file unknow_cmd");failure,
error then println("get_file remote error msg");failure,
ok then println("get_file ok");failure,
ok_msg(msg)then
if find_int32(msg, "FileSize") is
{
failure then println("file size not found"); failure,
success(size) then println("file size "+size);
start_get_file_transtert(mQ, local_file, size)
}
}
}.
define Bool
request_for_service
(
MessageQueue queue
)=
with test_msg = message(_CXM_REQUEST_FOR_SERVICE),
forget(add_int32(test_msg, "service", _CXM_FTP_SERVICE_ID));
forget(add_int32(test_msg, "version", 1));
queue.add_Message_to_send(test_msg);
if queue.get_next_received_Message(30) is
{
timeout then println("request_for_service receive timeout");false,
closed then println("request_for_service socket closed");false,
msg(msg) then
if find_int32(msg, "STATUS") is
{
failure then println("status not found");false,
success(v) then
if v = _CXM_OK then
true
else
false
}
}.
public define Maybe(One)
ftp_get_file
(
String server,
Int32 ip_port,
String remote_file,
String local_file
)=
if dns(server) is ok(ip_adr) then
if connect( ip_adr, ip_port) is
{
error(_) then println("can't connect to ftp server"); failure,
ok(conn) then
with queue = create_MessageQueue("ftp_get_file"),
message_transceiver(conn, queue);
if request_for_service(queue) then
with result = get_file(queue, remote_file, local_file),
queue.quit(unique);result
else
queue.quit(unique);
println("Service not found");failure
}
else
println("server "+server+" DNS error");failure
.