diff --git a/daemon/Makefile.am b/daemon/Makefile.am index a644c9823..a89769731 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -2,7 +2,26 @@ bin_PROGRAMS=linphone-daemon linphone-daemon-pipetest -linphone_daemon_SOURCES=daemon.cc +linphone_daemon_SOURCES=daemon.cc \ + commands/answer.cc \ + commands/audio-codec-disable.cc \ + commands/audio-codec-enable.cc \ + commands/audio-codec-get.cc \ + commands/audio-codec-move.cc \ + commands/audio-stream-start.cc \ + commands/audio-stream-stop.cc \ + commands/call.cc \ + commands/call-stats.cc \ + commands/call-status.cc \ + commands/help.cc \ + commands/pop-event.cc \ + commands/ptime.cc \ + commands/register.cc \ + commands/register-status.cc \ + commands/terminate.cc \ + commands/unregister.cc \ + commands/quit.cc + linphone_daemon_pipetest_SOURCES=daemon-pipetest.c diff --git a/daemon/commands/answer.cc b/daemon/commands/answer.cc new file mode 100644 index 000000000..82e643034 --- /dev/null +++ b/daemon/commands/answer.cc @@ -0,0 +1,41 @@ +#include "answer.h" + +using namespace std; + +AnswerCommand::AnswerCommand() : + DaemonCommand("answer", "answer ", "Answer an incoming call.") { +} +void AnswerCommand::exec(Daemon *app, const char *args) { + LinphoneCore *lc = app->getCore(); + int cid; + LinphoneCall *call; + if (sscanf(args, "%i", &cid) == 1) { + call = app->findCall(cid); + if (call == NULL) { + app->sendResponse(Response("No call with such id.")); + return; + } else { + LinphoneCallState cstate = linphone_call_get_state(call); + if (cstate == LinphoneCallIncomingReceived || cstate == LinphoneCallIncomingEarlyMedia) { + if (linphone_core_accept_call(lc, call) == 0) { + app->sendResponse(Response()); + return; + } + } + app->sendResponse(Response("Can't accept this call.")); + return; + } + } else { + for (const MSList* elem = linphone_core_get_calls(lc); elem != NULL; elem = elem->next) { + call = (LinphoneCall*) elem->data; + LinphoneCallState cstate = linphone_call_get_state(call); + if (cstate == LinphoneCallIncomingReceived || cstate == LinphoneCallIncomingEarlyMedia) { + if (linphone_core_accept_call(lc, call) == 0) { + app->sendResponse(Response()); + return; + } + } + } + } + app->sendResponse(Response("No call to accept.")); +} diff --git a/daemon/commands/answer.h b/daemon/commands/answer.h new file mode 100644 index 000000000..38e7e5e7a --- /dev/null +++ b/daemon/commands/answer.h @@ -0,0 +1,12 @@ +#ifndef COMMAND_ANSWER_H_ +#define COMMAND_ANSWER_H_ + +#include "../daemon.h" + +class AnswerCommand: public DaemonCommand { +public: + AnswerCommand(); + virtual void exec(Daemon *app, const char *args); +}; + +#endif //COMMAND_ANSWER_H_ diff --git a/daemon/commands/audio-codec-disable.cc b/daemon/commands/audio-codec-disable.cc new file mode 100644 index 000000000..317c4f697 --- /dev/null +++ b/daemon/commands/audio-codec-disable.cc @@ -0,0 +1,27 @@ +#include "audio-codec-disable.h" + +using namespace std; + +AudioCodecDisableCommand::AudioCodecDisableCommand() : + DaemonCommand("audio-codec-disable", "audio-codec-disable ", "Disable an audio codec.") { +} + +void AudioCodecDisableCommand::exec(Daemon *app, const char *args) { + int payload_type; + if (sscanf(args, "%d", &payload_type) == 1) { + int index = 0; + for (const MSList *node = linphone_core_get_audio_codecs(app->getCore()); node != NULL; node = ms_list_next(node)) { + PayloadType *payload = reinterpret_cast(node->data); + if (payload_type == linphone_core_get_payload_type_number(app->getCore(), payload)) { + linphone_core_enable_payload_type(app->getCore(), payload, false); + app->sendResponse(PayloadTypeResponse(app->getCore(), payload, index)); + return; + } + ++index; + } + app->sendResponse(Response("Audio codec not found.")); + } else { + app->sendResponse(Response("Missing/Incorrect parameter(s).")); + } +} + diff --git a/daemon/commands/audio-codec-disable.h b/daemon/commands/audio-codec-disable.h new file mode 100644 index 000000000..040622c27 --- /dev/null +++ b/daemon/commands/audio-codec-disable.h @@ -0,0 +1,12 @@ +#ifndef COMMAND_AUDIO_CODEC_DISABLE_H_ +#define COMMAND_AUDIO_CODEC_DISABLE_H_ + +#include "../daemon.h" + +class AudioCodecDisableCommand: public DaemonCommand { +public: + AudioCodecDisableCommand(); + virtual void exec(Daemon *app, const char *args); +}; + +#endif //COMMAND_AUDIO_CODEC_DISABLE_H_ diff --git a/daemon/commands/audio-codec-enable.cc b/daemon/commands/audio-codec-enable.cc new file mode 100644 index 000000000..3aacf1424 --- /dev/null +++ b/daemon/commands/audio-codec-enable.cc @@ -0,0 +1,25 @@ +#include "audio-codec-enable.h" + +using namespace std; + +AudioCodecEnableCommand::AudioCodecEnableCommand() : + DaemonCommand("audio-codec-enable", "audio-codec-enable ", "Enable an audio codec.") { +} +void AudioCodecEnableCommand::exec(Daemon *app, const char *args) { + int payload_type; + if (sscanf(args, "%d", &payload_type) == 1) { + int index = 0; + for (const MSList *node = linphone_core_get_audio_codecs(app->getCore()); node != NULL; node = ms_list_next(node)) { + PayloadType *payload = reinterpret_cast(node->data); + if (payload_type == linphone_core_get_payload_type_number(app->getCore(), payload)) { + linphone_core_enable_payload_type(app->getCore(), payload, true); + app->sendResponse(PayloadTypeResponse(app->getCore(), payload, index)); + return; + } + ++index; + } + app->sendResponse(Response("Audio codec not found.")); + } else { + app->sendResponse(Response("Missing/Incorrect parameter(s).")); + } +} diff --git a/daemon/commands/audio-codec-enable.h b/daemon/commands/audio-codec-enable.h new file mode 100644 index 000000000..c2f410281 --- /dev/null +++ b/daemon/commands/audio-codec-enable.h @@ -0,0 +1,12 @@ +#ifndef COMMAND_AUDIO_CODEC_ENABLE_H_ +#define COMMAND_AUDIO_CODEC_ENABLE_H_ + +#include "../daemon.h" + +class AudioCodecEnableCommand: public DaemonCommand { +public: + AudioCodecEnableCommand(); + virtual void exec(Daemon *app, const char *args); +}; + +#endif //COMMAND_AUDIO_CODEC_ENABLE_H_ diff --git a/daemon/commands/audio-codec-get.cc b/daemon/commands/audio-codec-get.cc new file mode 100644 index 000000000..373913b46 --- /dev/null +++ b/daemon/commands/audio-codec-get.cc @@ -0,0 +1,33 @@ +#include "audio-codec-get.h" + +#include + +using namespace std; + +AudioCodecGetCommand::AudioCodecGetCommand() : + DaemonCommand("audio-codec-get", "audio-codec-get ", "Get an audio codec if codec-mime is defined, otherwise return the audio codec list.") { +} +void AudioCodecGetCommand::exec(Daemon *app, const char *args) { + int payload_type; + bool list = sscanf(args, "%d", &payload_type) != 1; + bool find = list; + int index = 0; + ostringstream ostr; + for (const MSList *node = linphone_core_get_audio_codecs(app->getCore()); node != NULL; node = ms_list_next(node)) { + PayloadType *payload = reinterpret_cast(node->data); + if (list) { + ostr << PayloadTypeResponse(app->getCore(), payload, index).getBody() << "\n"; + } else if (payload_type == linphone_core_get_payload_type_number(app->getCore(), payload)) { + ostr << PayloadTypeResponse(app->getCore(), payload, index).getBody(); + find = true; + break; + } + ++index; + } + + if (!find) { + app->sendResponse(Response("Audio codec not found.")); + } else { + app->sendResponse(Response(ostr.str().c_str(), Response::Ok)); + } +} diff --git a/daemon/commands/audio-codec-get.h b/daemon/commands/audio-codec-get.h new file mode 100644 index 000000000..14ff63d66 --- /dev/null +++ b/daemon/commands/audio-codec-get.h @@ -0,0 +1,12 @@ +#ifndef COMMAND_AUDIO_CODEC_GET_H_ +#define COMMAND_AUDIO_CODEC_GET_H_ + +#include "../daemon.h" + +class AudioCodecGetCommand: public DaemonCommand { +public: + AudioCodecGetCommand(); + virtual void exec(Daemon *app, const char *args); +}; + +#endif //COMMAND_AUDIO_CODEC_GET_H_ diff --git a/daemon/commands/audio-codec-move.cc b/daemon/commands/audio-codec-move.cc new file mode 100644 index 000000000..b26452119 --- /dev/null +++ b/daemon/commands/audio-codec-move.cc @@ -0,0 +1,49 @@ +#include "audio-codec-move.h" + +#include + +using namespace std; + +AudioCodecMoveCommand::AudioCodecMoveCommand() : + DaemonCommand("audio-codec-move", "audio-codec-move ", "Move a codec to the an index.") { +} +void AudioCodecMoveCommand::exec(Daemon *app, const char *args) { + int payload_type; + int index; + if (sscanf(args, "%d %d", &payload_type, &index) == 2 && index >= 0) { + PayloadType *selected_payload = NULL; + for (const MSList *node = linphone_core_get_audio_codecs(app->getCore()); node != NULL; node = ms_list_next(node)) { + PayloadType *payload = reinterpret_cast(node->data); + if (payload_type == linphone_core_get_payload_type_number(app->getCore(), payload)) { + selected_payload = payload; + break; + } + } + if (selected_payload == NULL) { + app->sendResponse(Response("Audio codec not found.")); + return; + } + int i = 0; + MSList *mslist = NULL; + for (const MSList *node = linphone_core_get_audio_codecs(app->getCore()); node != NULL; node = ms_list_next(node)) { + PayloadType *payload = reinterpret_cast(node->data); + if (i == index) { + mslist = ms_list_append(mslist, selected_payload); + ++i; + } + if (selected_payload != payload) { + mslist = ms_list_append(mslist, payload); + ++i; + } + } + if (i <= index) { + index = i; + mslist = ms_list_append(mslist, selected_payload); + } + linphone_core_set_audio_codecs(app->getCore(), mslist); + + app->sendResponse(PayloadTypeResponse(app->getCore(), selected_payload, index)); + } else { + app->sendResponse(Response("Missing/Incorrect parameter(s).")); + } +} diff --git a/daemon/commands/audio-codec-move.h b/daemon/commands/audio-codec-move.h new file mode 100644 index 000000000..ce299dd9b --- /dev/null +++ b/daemon/commands/audio-codec-move.h @@ -0,0 +1,12 @@ +#ifndef COMMAND_AUDIO_CODEC_MOVE_H_ +#define COMMAND_AUDIO_CODEC_MOVE_H_ + +#include "../daemon.h" + +class AudioCodecMoveCommand: public DaemonCommand { +public: + AudioCodecMoveCommand(); + virtual void exec(Daemon *app, const char *args); +}; + +#endif //COMMAND_AUDIO_CODEC_MOVE_H_ diff --git a/daemon/commands/audio-stream-start.cc b/daemon/commands/audio-stream-start.cc new file mode 100644 index 000000000..26a673ecb --- /dev/null +++ b/daemon/commands/audio-stream-start.cc @@ -0,0 +1,32 @@ +#include "audio-stream-start.h" + +#include + +using namespace std; + +AudioStreamStartCommand::AudioStreamStartCommand() : + DaemonCommand("audio-stream-start", "audio-stream-start ", "Start an audio stream.") { +} + +void AudioStreamStartCommand::exec(Daemon *app, const char *args) { + char addr[256]; + int port; + int payload_type; + if (sscanf(args, "%255s %d %d", addr, &port, &payload_type) == 3) { + int local_port = linphone_core_get_audio_port(app->getCore()); + const int jitt = linphone_core_get_audio_jittcomp(app->getCore()); + const bool_t echo_canceller = linphone_core_echo_cancellation_enabled(app->getCore()); + MSSndCardManager *manager = ms_snd_card_manager_get(); + MSSndCard *capture_card = ms_snd_card_manager_get_card(manager, linphone_core_get_capture_device(app->getCore())); + MSSndCard *play_card = ms_snd_card_manager_get_card(manager, linphone_core_get_playback_device(app->getCore())); + AudioStream *stream = audio_stream_new(local_port, false); + if (audio_stream_start_now(stream, &av_profile, addr, port, port + 1, payload_type, jitt, play_card, capture_card, echo_canceller) != 0) { + app->sendResponse(Response("Error during audio stream creation.")); + } + ostringstream ostr; + ostr << "Id: " << app->setAudioStreamId(stream) << "\n"; + app->sendResponse(Response(ostr.str().c_str(), Response::Ok)); + } else { + app->sendResponse(Response("Missing/Incorrect parameter(s).")); + } +} diff --git a/daemon/commands/audio-stream-start.h b/daemon/commands/audio-stream-start.h new file mode 100644 index 000000000..e32f9192f --- /dev/null +++ b/daemon/commands/audio-stream-start.h @@ -0,0 +1,12 @@ +#ifndef COMMAND_AUDIO_STREAM_START_H_ +#define COMMAND_AUDIO_STREAM_START_H_ + +#include "../daemon.h" + +class AudioStreamStartCommand: public DaemonCommand { +public: + AudioStreamStartCommand(); + virtual void exec(Daemon *app, const char *args); +}; + +#endif //COMMAND_AUDIO_STREAM_START_H_ diff --git a/daemon/commands/audio-stream-stop.cc b/daemon/commands/audio-stream-stop.cc new file mode 100644 index 000000000..5326932d6 --- /dev/null +++ b/daemon/commands/audio-stream-stop.cc @@ -0,0 +1,21 @@ +#include "audio-stream-stop.h" + +using namespace std; + +AudioStreamStopCommand::AudioStreamStopCommand() : + DaemonCommand("audio-stream-stop", "audio-stream-stop