vb@572: #include "pEp_internal.h" vb@572: vb@572: #include vb@572: #include vb@572: vb@951: #include "../asn.1/DeviceGroup-Protocol.h" vb@951: vb@1043: // receive_sync_msg is defined in the sync_actions vb@1043: vb@1043: PEP_STATUS receive_sync_msg( vb@1043: PEP_SESSION session, vb@1043: DeviceGroup_Protocol_t *msg vb@1043: ); vb@572: vb@572: DYNAMIC_API PEP_STATUS register_sync_callbacks( vb@599: PEP_SESSION session, vb@599: void *obj, vb@597: messageToSend_t messageToSend, vb@1043: showHandshake_t showHandshake, vb@1043: inject_sync_msg_t inject_sync_msg, vb@1043: retrieve_next_sync_msg_t retrieve_next_sync_msg vb@572: ) vb@572: { vb@1091: unsigned char uuid[16]; vb@1091: uuid_generate_random(uuid); vb@1091: uuid_unparse_upper(uuid, sync_uuid); vb@1091: vb@599: session->sync_obj = obj; vb@604: session->messageToSend = messageToSend; vb@604: session->showHandshake = showHandshake; vb@1043: session->inject_sync_msg = inject_sync_msg; vb@1043: session->retrieve_next_sync_msg = retrieve_next_sync_msg; vb@572: vb@976: // start state machine vb@976: session->sync_state = InitState; vb@976: PEP_STATUS status = fsm_DeviceState_inject(session, Init, NULL, NULL); vb@987: if (status != PEP_STATUS_OK) vb@987: unregister_sync_callbacks(session); vb@976: vb@976: return status; vb@572: } vb@572: vb@572: DYNAMIC_API void unregister_sync_callbacks(PEP_SESSION session) { vb@986: // stop state machine vb@986: session->sync_state = DeviceState_state_NONE; vb@986: vb@986: // unregister vb@602: session->sync_obj = NULL; vb@604: session->messageToSend = NULL; vb@604: session->showHandshake = NULL; vb@1043: session->retrieve_next_sync_msg = NULL; vb@572: } vb@572: vb@679: DYNAMIC_API PEP_STATUS deliverHandshakeResult( vb@609: PEP_SESSION session, vb@609: sync_handshake_result result vb@609: ) vb@609: { vb@609: assert(session); vb@609: if (!session) vb@609: return PEP_ILLEGAL_VALUE; vb@609: vb@1043: PEP_STATUS status = PEP_STATUS_OK; vb@1043: vb@609: switch (result) { vb@609: case SYNC_HANDSHAKE_CANCEL: vb@1043: status = fsm_DeviceState_inject(session, Cancel, NULL, 0); vb@609: break; vb@609: case SYNC_HANDSHAKE_ACCEPTED: vb@1043: status = fsm_DeviceState_inject(session, HandshakeAccepted, NULL, 0); vb@609: break; vb@609: case SYNC_HANDSHAKE_REJECTED: vb@1043: status = fsm_DeviceState_inject(session, HandshakeRejected, NULL, 0); vb@609: break; vb@609: default: vb@609: return PEP_ILLEGAL_VALUE; vb@609: } vb@609: vb@1043: return status; vb@1043: } vb@1043: vb@1043: DYNAMIC_API PEP_STATUS do_sync_protocol( vb@1043: PEP_SESSION session, vb@1043: void *management vb@1043: ) vb@1043: { vb@1078: DeviceGroup_Protocol_t *msg = NULL; vb@1043: PEP_STATUS status = PEP_STATUS_OK; vb@1043: vb@1043: assert(session && session->retrieve_next_sync_msg); vb@1043: assert(management); vb@1043: vb@1043: if (!(session && session->retrieve_next_sync_msg) || !management) vb@1043: return PEP_ILLEGAL_VALUE; vb@1043: vb@1043: log_event(session, "sync_protocol thread started", "pEp sync protocol", NULL, NULL); vb@1043: vb@1043: while ((msg = (DeviceGroup_Protocol_t *) session->retrieve_next_sync_msg(management))) vb@1043: { vb@1043: if ((status = receive_sync_msg(session, msg) != PEP_STATUS_OK)) { vb@1043: char buffer[MAX_LINELENGTH]; vb@1043: memset(buffer, 0, MAX_LINELENGTH); vb@1043: snprintf(buffer, MAX_LINELENGTH, "problem with msg received: %d\n", (int) status); vb@1043: log_event(session, buffer, "pEp sync protocol", NULL, NULL); vb@1043: } vb@1043: } vb@1043: vb@1043: log_event(session, "sync_protocol thread shutdown", "pEp sync protocol", NULL, NULL); vb@1043: vb@609: return PEP_STATUS_OK; vb@609: } vb@609: