/* msi_initiation.h
*
* Has function for session initiation along with session description.
* It follows the Tox API ( http://wiki.tox.im/index.php/Messaging_Protocol ). !Red!
*
*
* Copyright (C) 2013 Tox project All Rights Reserved.
*
* This file is part of Tox.
*
* Tox is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tox is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tox. If not, see .
*
*/
#ifndef _MSI_IMPL_H_
#define _MSI_IMPL_H_
#include
#include "../toxcore/tox.h"
#include
#define MCBTYPE void
#define MCBARGS void* _arg
#define MCALLBACK MCBTYPE(*callback)(void* _arg)
#define MSI_PACKET 69
#define CT_AUDIO_HEADER_VALUE "AUDIO"
#define CT_VIDEO_HEADER_VALUE "VIDEO"
/* define size for call_id */
#define _CALL_ID_LEN 12
typedef enum {
type_audio = 1,
type_video,
} call_type;
typedef enum {
call_inviting, /* when sending call invite */
call_starting, /* when getting call invite */
call_active,
call_hold
} call_state;
typedef int crypto_key;
typedef struct msi_call_s { /* Call info structure */
call_state _state;
call_type _type_local;
call_type* _type_peer; /* Support for conference starts with this */
uint8_t _id[_CALL_ID_LEN]; /* Random value identifying the call */
crypto_key _key; /* What is the type again? */
uint16_t _participants; /* Number of participants */
uint32_t _timeoutst; /* Time of the timeout for some action to end; 0 if infinite */
int _outgoing_timer_id; /* Timer id */
} msi_call_t;
typedef struct msi_session_s {
pthread_mutex_t _mutex;
crypto_key _key; /* The key */
/* Call information/handler. ( Maybe only information? ) */
msi_call_t* _call;
/* Storage for message receiving */
struct msi_msg_s* _oldest_msg;
struct msi_msg_s* _last_msg; /* tail */
/*int _friend_id;*/
tox_IP_Port _friend_id;
int _last_error_id; /* Determine the last error */
const uint8_t* _last_error_str;
const uint8_t* _user_agent;
void* _agent_handler; /* Pointer to an object that is handling msi */
void* _core_handler; /* Pointer to networking core or to anything that
* should handle interaction with core/networking
*/
void* _event_handler; /* Pointer to an object which handles the events */
uint32_t _frequ;
uint32_t _call_timeout; /* Time of the timeout for some action to end; 0 if infinite */
} msi_session_t;
msi_session_t* msi_init_session ( void* _core_handler, const uint8_t* _user_agent );
int msi_terminate_session ( msi_session_t* _session );
pthread_t msi_start_main_loop ( msi_session_t* _session, uint32_t _frequms );
/* Registering callbacks */
/*void msi_register_callback_send(int (*callback) ( int, uint8_t*, uint32_t ) );*/
void msi_register_callback_send ( int ( *callback ) ( void* _core_handler, tox_IP_Port, uint8_t*, uint32_t ) );
/* Callbacks that handle the states */
void msi_register_callback_call_started ( MCALLBACK );
void msi_register_callback_call_canceled ( MCALLBACK );
void msi_register_callback_call_rejected ( MCALLBACK );
void msi_register_callback_call_ended ( MCALLBACK );
void msi_register_callback_recv_invite ( MCALLBACK );
void msi_register_callback_recv_ringing ( MCALLBACK );
void msi_register_callback_recv_starting ( MCALLBACK );
void msi_register_callback_recv_ending ( MCALLBACK );
void msi_register_callback_recv_error ( MCALLBACK );
void msi_register_callback_requ_timeout ( MCALLBACK );
/* -------- */
/* Function handling receiving from core */
/*static int msi_handlepacket ( tox_IP_Port ip_port, uint8_t* _data, uint16_t _lenght ); */
/* functions describing the usage of msi */
int msi_invite ( msi_session_t* _session, call_type _call_type, uint32_t _timeoutms );
int msi_hangup ( msi_session_t* _session );
int msi_answer ( msi_session_t* _session, call_type _call_type );
int msi_cancel ( msi_session_t* _session );
int msi_reject ( msi_session_t* _session );
int msi_send_msg ( msi_session_t* _session, struct msi_msg_s* _msg );
void msi_store_msg ( msi_session_t* _session, struct msi_msg_s* _msg );
#endif /* _MSI_IMPL_H_ */