1 // This file is under GNU General Public License 3.0
4 #include "pEp_internal.h"
9 #include "asn1_helper.h"
10 #include "../asn.1/DeviceGroup-Protocol.h"
12 // receive_sync_msg is defined in the sync_impl
14 PEP_STATUS receive_sync_msg(
20 DYNAMIC_API PEP_STATUS register_sync_callbacks(
23 messageToSend_t messageToSend,
24 notifyHandshake_t notifyHandshake,
25 inject_sync_msg_t inject_sync_msg,
26 retrieve_next_sync_msg_t retrieve_next_sync_msg
29 assert(session && management && messageToSend && notifyHandshake && inject_sync_msg && retrieve_next_sync_msg);
30 if (!(session && management && messageToSend && notifyHandshake && inject_sync_msg && retrieve_next_sync_msg))
31 return PEP_ILLEGAL_VALUE;
34 uuid_generate_random(uuid);
35 uuid_unparse_upper(uuid, session->sync_uuid);
37 session->sync_management = management;
38 session->messageToSend = messageToSend;
39 session->notifyHandshake = notifyHandshake;
40 session->inject_sync_msg = inject_sync_msg;
41 session->retrieve_next_sync_msg = retrieve_next_sync_msg;
43 // start state machine
44 session->sync_state = InitState;
46 PEP_STATUS status = fsm_DeviceState_inject(session, Init, NULL, NULL, &unused);
47 if (status != PEP_STATUS_OK)
48 unregister_sync_callbacks(session);
53 DYNAMIC_API PEP_STATUS attach_sync_session(
55 PEP_SESSION sync_session
58 assert(session && sync_session && sync_session->sync_management && sync_session->inject_sync_msg );
59 if (!(session && sync_session && sync_session->sync_management && sync_session->inject_sync_msg ))
60 return PEP_ILLEGAL_VALUE;
62 session->sync_session = sync_session;
63 // memcpy(session->sync_uuid, sync_session->sync_uuid, 37);
65 // session->sync_management = sync_session->sync_management;
66 // session->inject_sync_msg = sync_session->inject_sync_msg;
71 DYNAMIC_API PEP_STATUS detach_sync_session(PEP_SESSION session)
75 return PEP_ILLEGAL_VALUE;
77 session->sync_session = session;
78 // memset(session->sync_uuid, 0, 37);
80 // session->sync_management = NULL;
81 // session->inject_sync_msg = NULL;
86 int call_inject_sync_msg(PEP_SESSION session, void *msg)
88 if(session->sync_session->inject_sync_msg &&
89 session->sync_session->sync_management)
90 return session->sync_session->inject_sync_msg(msg,
91 session->sync_session->sync_management);
93 return PEP_SYNC_NO_INJECT_CALLBACK;
96 DYNAMIC_API void unregister_sync_callbacks(PEP_SESSION session) {
98 session->sync_state = DeviceState_state_NONE;
101 session->sync_management = NULL;
102 session->messageToSend = NULL;
103 session->notifyHandshake = NULL;
104 session->inject_sync_msg = NULL;
105 session->retrieve_next_sync_msg = NULL;
108 DYNAMIC_API PEP_STATUS deliverHandshakeResult(
111 sync_handshake_result result
116 return PEP_ILLEGAL_VALUE;
118 PEP_STATUS status = PEP_STATUS_OK;
120 DeviceState_event event;
121 bool need_partner = false;
124 case SYNC_HANDSHAKE_CANCEL:
127 case SYNC_HANDSHAKE_ACCEPTED:
129 event = HandshakeAccepted;
133 case SYNC_HANDSHAKE_REJECTED:
135 event = HandshakeRejected;
140 return PEP_ILLEGAL_VALUE;
143 pEp_identity *_partner = NULL;
145 _partner = identity_dup(partner);
146 if (_partner == NULL)
147 return PEP_OUT_OF_MEMORY;
149 status = inject_DeviceState_event(session, event, _partner, NULL);
154 DYNAMIC_API PEP_STATUS do_sync_protocol(
159 sync_msg_t *msg = NULL;
160 PEP_STATUS status = PEP_STATUS_OK;
163 assert(session && session->retrieve_next_sync_msg);
166 if (!(session && session->retrieve_next_sync_msg) || !obj)
167 return PEP_ILLEGAL_VALUE;
169 log_event(session, "sync_protocol thread started", "pEp sync protocol", NULL, NULL);
171 session->sync_obj = obj;
175 msg = (sync_msg_t *) session->retrieve_next_sync_msg(session->sync_management, &timeout);
176 if(msg == NULL && timeout == 0)
178 else if(msg == NULL && timeout != 0){
179 status = fsm_DeviceState_inject(session, Timeout, NULL, NULL, &timeout);
181 char buffer[MAX_LINELENGTH];
182 memset(buffer, 0, MAX_LINELENGTH);
183 snprintf(buffer, MAX_LINELENGTH, "problem with timeout event : %d\n", (int) status);
184 log_event(session, buffer, "pEp sync protocol", NULL, NULL);
189 status = receive_sync_msg(session, msg, &timeout);
190 if (status != PEP_STATUS_OK && status != PEP_MESSAGE_IGNORE) {
192 char buffer[MAX_LINELENGTH];
193 memset(buffer, 0, MAX_LINELENGTH);
194 snprintf(buffer, MAX_LINELENGTH, "problem with msg received: %d\n", (int) status);
195 log_event(session, buffer, "pEp sync protocol", NULL, NULL);
201 log_event(session, "sync_protocol thread shutdown", "pEp sync protocol", NULL, NULL);
203 session->sync_obj = NULL;
205 return PEP_STATUS_OK;
208 DYNAMIC_API PEP_STATUS decode_sync_msg(
214 PEP_STATUS status = PEP_STATUS_OK;
216 assert(data && text);
218 return PEP_ILLEGAL_VALUE;
222 DeviceGroup_Protocol_t *msg = NULL;
223 uper_decode_complete(NULL, &asn_DEF_DeviceGroup_Protocol, (void **) &msg,
226 return PEP_SYNC_ILLEGAL_MESSAGE;
228 growing_buf_t *dst = new_growing_buf();
230 status = PEP_OUT_OF_MEMORY;
234 asn_enc_rval_t er = xer_encode(&asn_DEF_DeviceGroup_Protocol, msg,
235 XER_F_BASIC, (asn_app_consume_bytes_f *) consume_bytes, (void *) dst);
236 if (er.encoded == -1) {
237 status = PEP_CANNOT_ENCODE;
245 free_growing_buf(dst);
246 ASN_STRUCT_FREE(asn_DEF_DeviceGroup_Protocol, msg);
250 DYNAMIC_API PEP_STATUS encode_sync_msg(
256 PEP_STATUS status = PEP_STATUS_OK;
258 assert(text && data && size);
259 if (!(text && data && size))
260 return PEP_ILLEGAL_VALUE;
265 DeviceGroup_Protocol_t *msg = NULL;
266 asn_dec_rval_t dr = xer_decode(NULL, &asn_DEF_DeviceGroup_Protocol,
267 (void **) &msg, (const void *) text, strlen(text));
268 if (dr.code != RC_OK) {
269 status = PEP_SYNC_ILLEGAL_MESSAGE;
273 char *payload = NULL;
274 ssize_t _size = uper_encode_to_new_buffer(&asn_DEF_DeviceGroup_Protocol,
275 NULL, msg, (void **) &payload);
277 status = PEP_CANNOT_ENCODE;
282 *size = (size_t) _size;
285 ASN_STRUCT_FREE(asn_DEF_DeviceGroup_Protocol, msg);