Commit b2e81805e590890105faf3bd0d1b0082595f2913

Authored by David RENÉ
1 parent d12dd7c9

[ADD] add get and send file_ref in generic protocol

CXM_message_constants.anubis
@@ -46,9 +46,10 @@ public define Word32 _CXM_LOGIN = 0x33770C02. // @@ -46,9 +46,10 @@ public define Word32 _CXM_LOGIN = 0x33770C02. //
46 46
47 // **************** GENERIC PROTOCOL *************** 47 // **************** GENERIC PROTOCOL ***************
48 48
49 -public define Word32 _CXM_GENERIC_PROTOCOL_BASIS = 0x33771000. //  
50 -public define Word32 _CXM_ACK = 0x33771001. //  
51 -public define Word32 _CXM_ACK_RESULT_MSG = 0x33771002. // 49 +public define Word32 _CXM_GENERIC_PROTOCOL_BASIS = 0x33771000. //
  50 +public define Word32 _CXM_ACK = 0x33771001. //
  51 +public define Word32 _CXM_ACK_RESULT_MSG = 0x33771002. //
  52 +public define Word32 _CXM_GET_FILE_REF = 0x33771003. //get local or remote file without FTP service
52 53
53 // **************** FTP SERVICE *************** 54 // **************** FTP SERVICE ***************
54 55
net_services/CXM_generic_protocol.anubis
1 -/*  
2 - *  
3 - * User: David RENE  
4 - * Date: 25/04/2007  
5 - * Time: 16:20  
6 - * (c) Calexium  
7 - *  
8 - */  
9 -  
10 -read system/muscle.anubis  
11 -read system/data_io.anubis  
12 -read system/string.anubis  
13 -read tools/basis.anubis  
14 -read system/message_queue.anubis  
15 -read calexium_lib/CXM_message_constants.anubis  
16 -  
17 -public define Word32 _CXM_OK = 0.  
18 -public define Word32 _CXM_ERROR = 1.  
19 -public define Word32 _CXM_UNKNOW_CMD = 2.  
20 -public define Word32 _CXM_UNKNOW_SERVICE = 3.  
21 -public define Word32 _CXM_MISSING_REQUIRED_FIELD = 4.  
22 -public define Word32 _CXM_FORBIDDEN = 5.  
23 -public define Word32 _CXM_BAD_AUTHENTICATION = 6.  
24 -public define Word32 _CXM_TEMPORARY_ERROR = 7. // When received, the client should try later  
25 -  
26 -public type ProtocolResult:  
27 - failure,  
28 - timeout,  
29 - unknow_cmd,  
30 - error,  
31 - error(Word32, String),  
32 - ok,  
33 - ok_msg(Message).  
34 -  
35 -public define One  
36 - send_ACK_error  
37 - (  
38 - MessageQueue queue,  
39 - Word32 cmd_id,  
40 - Word32 error_code,  
41 - String error_string,  
42 - )=  
43 - with err_msg = message(_CXM_ACK),  
44 - forget(add_int32(err_msg, "CMD", cmd_id));  
45 - forget(add_int32(err_msg, "STATUS", error_code));  
46 - (if error_string /= "" then forget(add_string(err_msg, "STATUS_MSG", error_string))  
47 - else unique);  
48 - forget(queue.add_Message_to_send(err_msg)).  
49 -  
50 -public define One  
51 - send_ACK_error  
52 - (  
53 - MessageQueue queue,  
54 - Word32 cmd_id  
55 - )=  
56 - send_ACK_error(queue, cmd_id, _CXM_ERROR, "").  
57 -  
58 -public define One  
59 - send_ACK_ok  
60 - (  
61 - MessageQueue queue,  
62 - Word32 cmd_id  
63 - )=  
64 - with ok_msg = message(_CXM_ACK),  
65 - forget(add_int32(ok_msg, "CMD", cmd_id));  
66 - forget(add_int32(ok_msg, "STATUS", _CXM_OK));  
67 - forget(queue.add_Message_to_send(ok_msg))  
68 - .  
69 -  
70 -public define One  
71 - send_ACK_ok  
72 - (  
73 - MessageQueue queue,  
74 - Word32 cmd_id,  
75 - Message result  
76 - )=  
77 - with ok_msg = message(_CXM_ACK),  
78 - forget(add_int32(ok_msg, "CMD", cmd_id));  
79 - forget(add_int32(ok_msg, "STATUS", _CXM_OK));  
80 - forget(add_message(ok_msg, "RESULT", result));  
81 - forget(queue.add_Message_to_send(ok_msg))  
82 - .  
83 -  
84 -public define One  
85 - send_result  
86 - (  
87 - MessageQueue queue,  
88 - Word32 cmd_id,  
89 - Maybe(Message) mb_msg  
90 - )=  
91 - if mb_msg is  
92 - {  
93 - failure then send_ACK_error(queue, cmd_id),  
94 - success(msg) then send_ACK_ok(queue, cmd_id, msg)  
95 - }.  
96 -  
97 -public define One  
98 - send_result  
99 - (  
100 - MessageQueue queue,  
101 - Word32 cmd_id,  
102 - Result((Word32, String), Message) mb_msg  
103 - )=  
104 - if mb_msg is  
105 - {  
106 - error(err) then  
107 - if err is (err_code, err_string) then  
108 - send_ACK_error(queue, cmd_id, err_code, err_string),  
109 - ok(msg) then send_ACK_ok(queue, cmd_id, msg)  
110 - }.  
111 -  
112 -public define One  
113 - send_result  
114 - (  
115 - MessageQueue queue,  
116 - Word32 cmd_id,  
117 - Bool result  
118 - )=  
119 - if result then  
120 - send_ACK_ok(queue, cmd_id)  
121 - else  
122 - send_ACK_error(queue, cmd_id).  
123 -  
124 -public define ProtocolResult  
125 - wait_for_reply  
126 - (  
127 - MessageQueue mQ,  
128 - Word32 wait_cmd,  
129 - Int t_out  
130 - ) =  
131 - if mQ.get_next_received_Message(t_out) is  
132 - {  
133 - timeout then timeout,  
134 - closed then failure, //println("wait_for_reply closed");  
135 -  
136 - msg(_msg) then  
137 - if *_msg.what = _CXM_ACK then  
138 - if find_int32(_msg, "CMD") is  
139 - {  
140 - failure then failure, //println("wait_for_reply CMD");  
141 - success(cmd) then  
142 -// println("wait_for_reply CMD="+to_hexa(cmd));  
143 - if find_int32(_msg, "STATUS") is  
144 - {  
145 - failure then failure, //println("wait_for_reply STATUS");  
146 - success(status) then  
147 - if cmd = wait_cmd then  
148 - (  
149 - if status = _CXM_OK then  
150 - if find_message(_msg, "RESULT") is  
151 - {  
152 - failure then ok,  
153 - success(ok_message) then ok_msg(ok_message)  
154 - }  
155 - else if status = _CXM_ERROR then  
156 - error  
157 - else if status = _CXM_UNKNOW_CMD then  
158 - unknow_cmd  
159 - else  
160 - error(status, if find_string(_msg, "STATUS_MSG") is success(txt) then txt else "")  
161 - )  
162 - else  
163 - failure //println("wait_for_reply ");  
164 - }  
165 - }  
166 - else  
167 - failure //println("wait_for_reply not ACK");  
168 - }.  
169 -  
170 -public define Bool  
171 - simple_wait_for_reply  
172 - (  
173 - MessageQueue mQ,  
174 - Word32 wait_cmd,  
175 - Int t_out  
176 - ) =  
177 - if wait_for_reply(mQ, wait_cmd, t_out) is  
178 - {  
179 - failure then false,  
180 - timeout then false,  
181 - unknow_cmd then false,  
182 - error then false,  
183 - error(_, _) then false,  
184 - ok then true,  
185 - ok_msg(msg) then true  
186 - }. 1 +/*
  2 + *
  3 + * User: David RENE
  4 + * Date: 25/04/2007
  5 + * Time: 16:20
  6 + * (c) Calexium
  7 + *
  8 + */
  9 +
  10 +read system/muscle.anubis
  11 +read system/data_io.anubis
  12 +read system/string.anubis
  13 +read system/files.anubis
  14 +read tools/basis.anubis
  15 +read system/message_queue.anubis
  16 +read calexium_lib/CXM_message_constants.anubis
  17 +read calexium_lib/types/generated/file_ref.anubis
  18 +
  19 +
  20 +public define Word32 _CXM_OK = 0.
  21 +public define Word32 _CXM_ERROR = 1.
  22 +public define Word32 _CXM_UNKNOW_CMD = 2.
  23 +public define Word32 _CXM_UNKNOW_SERVICE = 3.
  24 +public define Word32 _CXM_MISSING_REQUIRED_FIELD = 4.
  25 +public define Word32 _CXM_FORBIDDEN = 5.
  26 +public define Word32 _CXM_BAD_AUTHENTICATION = 6.
  27 +public define Word32 _CXM_TEMPORARY_ERROR = 7. // When received, the client should try later
  28 +
  29 +public type ProtocolResult:
  30 + failure,
  31 + timeout,
  32 + unknow_cmd,
  33 + error,
  34 + error(Word32, String),
  35 + ok,
  36 + ok_msg(Message).
  37 +
  38 +public define One
  39 + send_ACK_error
  40 + (
  41 + MessageQueue queue,
  42 + Word32 cmd_id,
  43 + Word32 error_code,
  44 + String error_string,
  45 + )=
  46 + with err_msg = message(_CXM_ACK),
  47 + forget(add_int32(err_msg, "CMD", cmd_id));
  48 + forget(add_int32(err_msg, "STATUS", error_code));
  49 + (if error_string /= "" then forget(add_string(err_msg, "STATUS_MSG", error_string))
  50 + else unique);
  51 + forget(queue.add_Message_to_send(err_msg)).
  52 +
  53 +public define One
  54 + send_ACK_error
  55 + (
  56 + MessageQueue queue,
  57 + Word32 cmd_id
  58 + )=
  59 + send_ACK_error(queue, cmd_id, _CXM_ERROR, "").
  60 +
  61 +public define One
  62 + send_ACK_ok
  63 + (
  64 + MessageQueue queue,
  65 + Word32 cmd_id
  66 + )=
  67 + with ok_msg = message(_CXM_ACK),
  68 + forget(add_int32(ok_msg, "CMD", cmd_id));
  69 + forget(add_int32(ok_msg, "STATUS", _CXM_OK));
  70 + forget(queue.add_Message_to_send(ok_msg))
  71 + .
  72 +
  73 +public define One
  74 + send_ACK_ok
  75 + (
  76 + MessageQueue queue,
  77 + Word32 cmd_id,
  78 + Message result
  79 + )=
  80 + with ok_msg = message(_CXM_ACK),
  81 + forget(add_int32(ok_msg, "CMD", cmd_id));
  82 + forget(add_int32(ok_msg, "STATUS", _CXM_OK));
  83 + forget(add_message(ok_msg, "RESULT", result));
  84 + forget(queue.add_Message_to_send(ok_msg))
  85 + .
  86 +
  87 +public define One
  88 + send_result
  89 + (
  90 + MessageQueue queue,
  91 + Word32 cmd_id,
  92 + Maybe(Message) mb_msg
  93 + )=
  94 + if mb_msg is
  95 + {
  96 + failure then send_ACK_error(queue, cmd_id),
  97 + success(msg) then send_ACK_ok(queue, cmd_id, msg)
  98 + }.
  99 +
  100 +public define One
  101 + send_result
  102 + (
  103 + MessageQueue queue,
  104 + Word32 cmd_id,
  105 + Result((Word32, String), Message) mb_msg
  106 + )=
  107 + if mb_msg is
  108 + {
  109 + error(err) then
  110 + if err is (err_code, err_string) then
  111 + send_ACK_error(queue, cmd_id, err_code, err_string),
  112 + ok(msg) then send_ACK_ok(queue, cmd_id, msg)
  113 + }.
  114 +
  115 +public define One
  116 + send_result
  117 + (
  118 + MessageQueue queue,
  119 + Word32 cmd_id,
  120 + Bool result
  121 + )=
  122 + if result then
  123 + send_ACK_ok(queue, cmd_id)
  124 + else
  125 + send_ACK_error(queue, cmd_id).
  126 +
  127 +public define ProtocolResult
  128 + wait_for_reply
  129 + (
  130 + MessageQueue mQ,
  131 + Word32 wait_cmd,
  132 + Int t_out
  133 + ) =
  134 + if mQ.get_next_received_Message(t_out) is
  135 + {
  136 + timeout then timeout,
  137 + closed then failure, //println("wait_for_reply closed");
  138 +
  139 + msg(_msg) then
  140 + if *_msg.what = _CXM_ACK then
  141 + if find_int32(_msg, "CMD") is
  142 + {
  143 + failure then failure, //println("wait_for_reply CMD");
  144 + success(cmd) then
  145 +// println("wait_for_reply CMD="+to_hexa(cmd));
  146 + if find_int32(_msg, "STATUS") is
  147 + {
  148 + failure then failure, //println("wait_for_reply STATUS");
  149 + success(status) then
  150 + if cmd = wait_cmd then
  151 + (
  152 + if status = _CXM_OK then
  153 + if find_message(_msg, "RESULT") is
  154 + {
  155 + failure then ok,
  156 + success(ok_message) then ok_msg(ok_message)
  157 + }
  158 + else if status = _CXM_ERROR then
  159 + error
  160 + else if status = _CXM_UNKNOW_CMD then
  161 + unknow_cmd
  162 + else
  163 + error(status, if find_string(_msg, "STATUS_MSG") is success(txt) then txt else "")
  164 + )
  165 + else
  166 + failure //println("wait_for_reply ");
  167 + }
  168 + }
  169 + else
  170 + failure //println("wait_for_reply not ACK");
  171 + }.
  172 +
  173 +public define Bool
  174 + simple_wait_for_reply
  175 + (
  176 + MessageQueue mQ,
  177 + Word32 wait_cmd,
  178 + Int t_out
  179 + ) =
  180 + if wait_for_reply(mQ, wait_cmd, t_out) is
  181 + {
  182 + failure then false,
  183 + timeout then false,
  184 + unknow_cmd then false,
  185 + error then false,
  186 + error(_, _) then false,
  187 + ok then true,
  188 + ok_msg(msg) then true
  189 + }.
  190 +
  191 +public define Bool
  192 + get_file_ref
  193 + (
  194 + MessageQueue mQ,
  195 + File_ref f_ref,
  196 + String tmp_path
  197 + )=
  198 + //create the target
  199 + with target_file = tmp_path + "/" + f_ref.name,
  200 +
  201 + with msg = message(_CXM_GET_FILE_REF),
  202 + forget(add_message(msg, "GET_FILE_REF", to_Message(f_ref)));
  203 + forget(mQ.add_Message_to_send(msg));
  204 +
  205 + if wait_for_reply(mQ, _CXM_GET_FILE_REF, 10) is
  206 + {
  207 + failure then false,
  208 + timeout then false,
  209 + unknow_cmd then false,
  210 + error then false,
  211 + error(_, _) then false,
  212 + ok then false, //false because OK without result message is not allowed
  213 + ok_msg(rmsg) then
  214 + with size = if find_int64(rmsg, "SIZE") is {failure then f_ref.size, success(i64) then to_Int([i64])},
  215 + with mode = find_string(rmsg, "MODE", "NEW"),
  216 + if mode = "APPEND" then
  217 + if (Maybe(RWStream))file(target_file, append) is
  218 + {
  219 + failure then println("can't create target file"+target_file);false, //nothing to write
  220 + success(target) then
  221 + if copy_file_to_Connection(mQ.get_connection(unique), file(target), size) is
  222 + {
  223 + failure then false,
  224 + success(_) then true
  225 + }
  226 + }
  227 + else //by default the mode is new
  228 + if (Maybe(RWStream))file(target_file, append) is
  229 + {
  230 + failure then println("can't create target file"+target_file);false, //nothing to write
  231 + success(target) then
  232 + if copy_file_to_Connection(mQ.get_connection(unique), file(target), size) is
  233 + {
  234 + failure then false,
  235 + success(_) then true
  236 + }
  237 + }
  238 + }
  239 +.
  240 +
  241 +public define Bool
  242 + send_file_ref
  243 + (
  244 + MessageQueue mQ,
  245 + Message msg,
  246 + )=
  247 +
  248 + if *msg.what = _CXM_GET_FILE_REF then
  249 + if find_message(msg, "GET_FILE_REF") is {
  250 + failure then false
  251 + success(file_ref_obj_msg) then
  252 + if (Maybe(File_ref))from_Message(file_ref_obj_msg) is
  253 + {
  254 + failure then false,
  255 + success(f_ref) then
  256 +
  257 + //create the target
  258 + with source_file = f_ref.path + "/" + f_ref.name,
  259 + with msg = message(0),
  260 + with size = file_size(source_file),
  261 +
  262 + forget(add_string(msg, "MODE", "NEW"));
  263 + forget(add_int64(msg, "SIZE", to_Word64(size)));
  264 +
  265 + if (Maybe(RStream))file(source_file, read) is
  266 + {
  267 + failure then println("can't open source file"+source_file);false, //nothing to write
  268 + success(source) then
  269 + send_ACK_ok(mQ, _CXM_GET_FILE_REF, msg);
  270 + if copy_file_to_Connection(file(source), mQ.get_connection(unique), size) is
  271 + {
  272 + failure then false,
  273 + success(_) then true
  274 + }
  275 + }
  276 + }
  277 + }
  278 + else //not _CXM_GET_FILE_REF
  279 + false
  280 +.