diff --git a/daemon/commands/adaptive-jitter-compensation.cc b/daemon/commands/adaptive-jitter-compensation.cc index ecbfd8157..313de6ee4 100644 --- a/daemon/commands/adaptive-jitter-compensation.cc +++ b/daemon/commands/adaptive-jitter-compensation.cc @@ -32,7 +32,7 @@ public: AdaptiveBufferCompensationResponse(LinphoneCore *core, StreamType type); private: - void outputAdaptiveBufferCompensation(LinphoneCore *core, ostringstream &ost, const char *header, bool_t value); + void outputAdaptiveBufferCompensation(LinphoneCore *core, ostringstream &ost, const string& header, bool_t value); }; AdaptiveBufferCompensationResponse::AdaptiveBufferCompensationResponse(LinphoneCore *core, StreamType type) : Response() { @@ -54,10 +54,10 @@ AdaptiveBufferCompensationResponse::AdaptiveBufferCompensationResponse(LinphoneC outputAdaptiveBufferCompensation(core, ost, "Video", enabled); break; } - setBody(ost.str().c_str()); + setBody(ost.str()); } -void AdaptiveBufferCompensationResponse::outputAdaptiveBufferCompensation(LinphoneCore *core, ostringstream &ost, const char *header, bool_t value) { +void AdaptiveBufferCompensationResponse::outputAdaptiveBufferCompensation(LinphoneCore *core, ostringstream &ost, const string& header, bool_t value) { ost << header << ": "; if (value) { ost << "enabled\n"; @@ -86,48 +86,51 @@ AdaptiveBufferCompensationCommand::AdaptiveBufferCompensationCommand() : "Video: enabled")); } -void AdaptiveBufferCompensationCommand::exec(Daemon *app, const char *args) { +void AdaptiveBufferCompensationCommand::exec(Daemon *app, const string& args) { string stream; string state; istringstream ist(args); + ist >> stream; if (ist.fail()) { app->sendResponse(AdaptiveBufferCompensationResponse(app->getCore(), AdaptiveBufferCompensationResponse::AllStreams)); - } else { - ist >> state; - if (ist.fail()) { - if (stream.compare("audio") == 0) { - app->sendResponse(AdaptiveBufferCompensationResponse(app->getCore(), AdaptiveBufferCompensationResponse::AudioStream)); - } else if (stream.compare("video") == 0) { - app->sendResponse(AdaptiveBufferCompensationResponse(app->getCore(), AdaptiveBufferCompensationResponse::VideoStream)); - } else { - app->sendResponse(Response("Incorrect stream parameter.", Response::Error)); - } - } else { - AdaptiveBufferCompensationResponse::StreamType type; - bool enabled; - if (stream.compare("audio") == 0) { - type = AdaptiveBufferCompensationResponse::AudioStream; - } else if (stream.compare("video") == 0) { - type = AdaptiveBufferCompensationResponse::VideoStream; - } else { - app->sendResponse(Response("Incorrect stream parameter.", Response::Error)); - return; - } - if (state.compare("enable") == 0) { - enabled = TRUE; - } else if (state.compare("disable") == 0) { - enabled = FALSE; - } else { - app->sendResponse(Response("Incorrect parameter.", Response::Error)); - return; - } - if (type == AdaptiveBufferCompensationResponse::AudioStream) { - linphone_core_enable_audio_adaptive_jittcomp(app->getCore(), enabled); - } else if (type == AdaptiveBufferCompensationResponse::VideoStream) { - linphone_core_enable_video_adaptive_jittcomp(app->getCore(), enabled); - } - app->sendResponse(AdaptiveBufferCompensationResponse(app->getCore(), AdaptiveBufferCompensationResponse::AllStreams)); - } + return; } + + ist >> state; + if (ist.fail()) { + if (stream.compare("audio") == 0) { + app->sendResponse(AdaptiveBufferCompensationResponse(app->getCore(), AdaptiveBufferCompensationResponse::AudioStream)); + } else if (stream.compare("video") == 0) { + app->sendResponse(AdaptiveBufferCompensationResponse(app->getCore(), AdaptiveBufferCompensationResponse::VideoStream)); + } else { + app->sendResponse(Response("Incorrect stream parameter.", Response::Error)); + } + return; + } + + AdaptiveBufferCompensationResponse::StreamType type; + bool enabled; + if (stream.compare("audio") == 0) { + type = AdaptiveBufferCompensationResponse::AudioStream; + } else if (stream.compare("video") == 0) { + type = AdaptiveBufferCompensationResponse::VideoStream; + } else { + app->sendResponse(Response("Incorrect stream parameter.", Response::Error)); + return; + } + if (state.compare("enable") == 0) { + enabled = TRUE; + } else if (state.compare("disable") == 0) { + enabled = FALSE; + } else { + app->sendResponse(Response("Incorrect parameter.", Response::Error)); + return; + } + if (type == AdaptiveBufferCompensationResponse::AudioStream) { + linphone_core_enable_audio_adaptive_jittcomp(app->getCore(), enabled); + } else if (type == AdaptiveBufferCompensationResponse::VideoStream) { + linphone_core_enable_video_adaptive_jittcomp(app->getCore(), enabled); + } + app->sendResponse(AdaptiveBufferCompensationResponse(app->getCore(), AdaptiveBufferCompensationResponse::AllStreams)); } diff --git a/daemon/commands/adaptive-jitter-compensation.h b/daemon/commands/adaptive-jitter-compensation.h index cfbe070dd..c8a901c02 100644 --- a/daemon/commands/adaptive-jitter-compensation.h +++ b/daemon/commands/adaptive-jitter-compensation.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_ADAPTIVE_BUFFER_COMPENSATION_H_ -#define COMMAND_ADAPTIVE_BUFFER_COMPENSATION_H_ +#ifndef LINPHONE_DAEMON_COMMAND_ADAPTIVE_BUFFER_COMPENSATION_H_ +#define LINPHONE_DAEMON_COMMAND_ADAPTIVE_BUFFER_COMPENSATION_H_ -#include "../daemon.h" +#include "daemon.h" class AdaptiveBufferCompensationCommand: public DaemonCommand { public: AdaptiveBufferCompensationCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_ADAPTIVE_BUFFER_COMPENSATION_H_ +#endif // LINPHONE_DAEMON_COMMAND_ADAPTIVE_BUFFER_COMPENSATION_H_ diff --git a/daemon/commands/answer.cc b/daemon/commands/answer.cc index 9c5da9f74..2c347fd0d 100644 --- a/daemon/commands/answer.cc +++ b/daemon/commands/answer.cc @@ -38,37 +38,40 @@ AnswerCommand::AnswerCommand() : "Reason: No call to accept.")); } -void AnswerCommand::exec(Daemon *app, const char *args) { +void AnswerCommand::exec(Daemon *app, const string& args) { LinphoneCore *lc = app->getCore(); int cid; LinphoneCall *call; - if (sscanf(args, "%i", &cid) == 1) { + istringstream ist(args); + ist >> cid; + if (ist.fail()) { + 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; + } + } + } + } else { 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; - } + + 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; } + app->sendResponse(Response("No call to accept.")); } diff --git a/daemon/commands/answer.h b/daemon/commands/answer.h index a65c1bac7..7dcd94972 100644 --- a/daemon/commands/answer.h +++ b/daemon/commands/answer.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_ANSWER_H_ -#define COMMAND_ANSWER_H_ +#ifndef LINPHONE_DAEMON_COMMAND_ANSWER_H_ +#define LINPHONE_DAEMON_COMMAND_ANSWER_H_ -#include "../daemon.h" +#include "daemon.h" class AnswerCommand: public DaemonCommand { public: AnswerCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_ANSWER_H_ +#endif // LINPHONE_DAEMON_COMMAND_ANSWER_H_ diff --git a/daemon/commands/audio-codec-get.cc b/daemon/commands/audio-codec-get.cc index 01372da2c..c529c8789 100644 --- a/daemon/commands/audio-codec-get.cc +++ b/daemon/commands/audio-codec-get.cc @@ -52,12 +52,12 @@ AudioCodecGetCommand::AudioCodecGetCommand() : "Reason: Audio codec not found.")); } -void AudioCodecGetCommand::exec(Daemon *app, const char *args) { +void AudioCodecGetCommand::exec(Daemon *app, const string& args) { bool list = false; bool found = false; istringstream ist(args); ostringstream ost; - PayloadType *pt=NULL; + PayloadType *pt = NULL; if (ist.peek() == EOF) { found = list = true; @@ -88,6 +88,6 @@ void AudioCodecGetCommand::exec(Daemon *app, const char *args) { if (!found) { app->sendResponse(Response("Audio codec not found.", Response::Error)); } else { - app->sendResponse(Response(ost.str().c_str(), Response::Ok)); + app->sendResponse(Response(ost.str(), Response::Ok)); } } diff --git a/daemon/commands/audio-codec-get.h b/daemon/commands/audio-codec-get.h index d298e6cf5..8a8075321 100644 --- a/daemon/commands/audio-codec-get.h +++ b/daemon/commands/audio-codec-get.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_AUDIO_CODEC_GET_H_ -#define COMMAND_AUDIO_CODEC_GET_H_ +#ifndef LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_GET_H_ +#define LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_GET_H_ -#include "../daemon.h" +#include "daemon.h" class AudioCodecGetCommand: public DaemonCommand { public: AudioCodecGetCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_AUDIO_CODEC_GET_H_ +#endif // LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_GET_H_ diff --git a/daemon/commands/audio-codec-move.cc b/daemon/commands/audio-codec-move.cc index 23f28b4ad..be2f955e2 100644 --- a/daemon/commands/audio-codec-move.cc +++ b/daemon/commands/audio-codec-move.cc @@ -49,7 +49,7 @@ AudioCodecMoveCommand::AudioCodecMoveCommand() : "Enabled: false")); } -void AudioCodecMoveCommand::exec(Daemon *app, const char *args) { +void AudioCodecMoveCommand::exec(Daemon *app, const string& args) { istringstream ist(args); if (ist.peek() == EOF) { diff --git a/daemon/commands/audio-codec-move.h b/daemon/commands/audio-codec-move.h index eab54d677..a19fa7b84 100644 --- a/daemon/commands/audio-codec-move.h +++ b/daemon/commands/audio-codec-move.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_AUDIO_CODEC_MOVE_H_ -#define COMMAND_AUDIO_CODEC_MOVE_H_ +#ifndef LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_MOVE_H_ +#define LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_MOVE_H_ -#include "../daemon.h" +#include "daemon.h" class AudioCodecMoveCommand: public DaemonCommand { public: AudioCodecMoveCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_AUDIO_CODEC_MOVE_H_ +#endif // LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_MOVE_H_ diff --git a/daemon/commands/audio-codec-set.cc b/daemon/commands/audio-codec-set.cc index 3b893d4ef..65cd09032 100644 --- a/daemon/commands/audio-codec-set.cc +++ b/daemon/commands/audio-codec-set.cc @@ -78,7 +78,7 @@ static PayloadType *findPayload(LinphoneCore *lc, int payload_type, int *index){ return NULL; } -void AudioCodecSetCommand::exec(Daemon *app, const char *args) { +void AudioCodecSetCommand::exec(Daemon *app, const string& args) { istringstream ist(args); if (ist.peek() == EOF) { diff --git a/daemon/commands/audio-codec-set.h b/daemon/commands/audio-codec-set.h index 54025fb18..0d90b2842 100644 --- a/daemon/commands/audio-codec-set.h +++ b/daemon/commands/audio-codec-set.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_AUDIO_CODEC_SET_H_ -#define COMMAND_AUDIO_CODEC_SET_H_ +#ifndef LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_SET_H_ +#define LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_SET_H_ -#include "../daemon.h" +#include "daemon.h" class AudioCodecSetCommand: public DaemonCommand { public: AudioCodecSetCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_AUDIO_CODEC_SET_H_ +#endif // LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_SET_H_ diff --git a/daemon/commands/audio-codec-toggle.cc b/daemon/commands/audio-codec-toggle.cc index ed5949b00..57deeb882 100644 --- a/daemon/commands/audio-codec-toggle.cc +++ b/daemon/commands/audio-codec-toggle.cc @@ -26,7 +26,7 @@ AudioCodecToggleCommand::AudioCodecToggleCommand(const char *name, const char *p DaemonCommand(name, proto, help), mEnable(enable) { } -void AudioCodecToggleCommand::exec(Daemon *app, const char *args) { +void AudioCodecToggleCommand::exec(Daemon *app, const string& args) { istringstream ist(args); if (ist.peek() == EOF) { diff --git a/daemon/commands/audio-codec-toggle.h b/daemon/commands/audio-codec-toggle.h index 47c196e41..36dce4300 100644 --- a/daemon/commands/audio-codec-toggle.h +++ b/daemon/commands/audio-codec-toggle.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_AUDIO_CODEC_TOGGLE_H_ -#define COMMAND_AUDIO_CODEC_TOGGLE_H_ +#ifndef LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_TOGGLE_H_ +#define LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_TOGGLE_H_ -#include "../daemon.h" +#include "daemon.h" class AudioCodecToggleCommand: public DaemonCommand { public: AudioCodecToggleCommand(const char *name, const char *proto, const char *help, bool enable); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); protected: bool mEnable; }; @@ -40,4 +40,4 @@ public: AudioCodecDisableCommand(); }; -#endif //COMMAND_AUDIO_CODEC_TOGGLE_H_ +#endif // LINPHONE_DAEMON_COMMAND_AUDIO_CODEC_TOGGLE_H_ diff --git a/daemon/commands/audio-stream-start.cc b/daemon/commands/audio-stream-start.cc index a961d742e..3e85cc391 100644 --- a/daemon/commands/audio-stream-start.cc +++ b/daemon/commands/audio-stream-start.cc @@ -31,65 +31,66 @@ AudioStreamStartCommand::AudioStreamStartCommand() : static PayloadType *getPayloadType(LinphoneCore *lc, const MSList *codecs, int number){ const MSList *elem; - for (elem=codecs;elem!=NULL;elem=elem->next){ - PayloadType *pt=(PayloadType*)elem->data; - if (linphone_core_get_payload_type_number(lc, pt)==number) + for (elem = codecs; elem != NULL; elem = elem->next) { + PayloadType *pt = (PayloadType*)elem->data; + if (linphone_core_get_payload_type_number(lc, pt) == number) return pt; } return NULL; } -void AudioStreamStartCommand::exec(Daemon *app, const char *args) { - char addr[256]; +void AudioStreamStartCommand::exec(Daemon *app, const string& args) { + string addr; int port; int payload_type; - MSFactory* factory ; - - factory = (app->getCore())->factory; + MSFactory* factory = app->getCore()->factory; - if (sscanf(args, "%255s %d %d", addr, &port, &payload_type) == 3) { - int local_port = linphone_core_get_audio_port(app->getCore()); - int jitt = linphone_core_get_audio_jittcomp(app->getCore()); - bool_t echo_canceller = linphone_core_echo_cancellation_enabled(app->getCore()); - int ptime=linphone_core_get_upload_ptime(app->getCore()); - MSSndCardManager *manager = ms_factory_get_snd_card_manager(factory); - 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())); - RtpProfile *prof=rtp_profile_new("stream"); - PayloadType *pt=getPayloadType(app->getCore(), linphone_core_get_audio_codecs(app->getCore()), payload_type); - - if (!pt){ - app->sendResponse(Response("No payload type were assigned to this number.")); - return; - } - AudioStream *stream = audio_stream_new(factory, local_port, local_port + 1, linphone_core_ipv6_enabled(app->getCore())); - audio_stream_set_features(stream,linphone_core_get_audio_features(app->getCore())); - - pt=payload_type_clone(pt); - if (ptime!=0){ - char fmtp[32]; - snprintf(fmtp,sizeof(fmtp)-1,"ptime=%i",ptime); - payload_type_append_send_fmtp(pt,fmtp); - } - rtp_profile_set_payload(prof,payload_type,pt); - if (linphone_core_generic_confort_noise_enabled(app->getCore())){ - rtp_profile_set_payload(prof,13,payload_type_clone(&payload_type_cn)); - } - - - audio_stream_enable_adaptive_jittcomp(stream, linphone_core_audio_adaptive_jittcomp_enabled(app->getCore())); - rtp_session_set_symmetric_rtp(stream->ms.sessions.rtp_session, linphone_core_symmetric_rtp_enabled(app->getCore())); - - int err=audio_stream_start_now(stream, prof, addr, port, port + 1, payload_type, jitt, play_card, capture_card, echo_canceller); - - if (err != 0) { - app->sendResponse(Response("Error during audio stream creation.")); - return; - } - ostringstream ostr; - ostr << "Id: " << app->updateAudioStreamId(stream) << "\n"; - app->sendResponse(Response(ostr.str().c_str(), Response::Ok)); - } else { + istringstream ist(args); + ist >> addr; + ist >> port; + ist >> payload_type; + if (ist.fail()) { app->sendResponse(Response("Missing/Incorrect parameter(s).")); + return; } + + int local_port = linphone_core_get_audio_port(app->getCore()); + int jitt = linphone_core_get_audio_jittcomp(app->getCore()); + bool_t echo_canceller = linphone_core_echo_cancellation_enabled(app->getCore()); + int ptime = linphone_core_get_upload_ptime(app->getCore()); + MSSndCardManager *manager = ms_factory_get_snd_card_manager(factory); + 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())); + RtpProfile *prof = rtp_profile_new("stream"); + PayloadType *pt = getPayloadType(app->getCore(), linphone_core_get_audio_codecs(app->getCore()), payload_type); + + if (!pt){ + app->sendResponse(Response("No payload type were assigned to this number.")); + return; + } + AudioStream *stream = audio_stream_new(factory, local_port, local_port + 1, linphone_core_ipv6_enabled(app->getCore())); + audio_stream_set_features(stream, linphone_core_get_audio_features(app->getCore())); + + pt = payload_type_clone(pt); + if (ptime != 0) { + char fmtp[32]; + snprintf(fmtp, sizeof(fmtp) - 1, "ptime=%i", ptime); + payload_type_append_send_fmtp(pt, fmtp); + } + rtp_profile_set_payload(prof, payload_type,pt); + if (linphone_core_generic_confort_noise_enabled(app->getCore())){ + rtp_profile_set_payload(prof, 13, payload_type_clone(&payload_type_cn)); + } + audio_stream_enable_adaptive_jittcomp(stream, linphone_core_audio_adaptive_jittcomp_enabled(app->getCore())); + rtp_session_set_symmetric_rtp(stream->ms.sessions.rtp_session, linphone_core_symmetric_rtp_enabled(app->getCore())); + + int err = audio_stream_start_now(stream, prof, addr.c_str(), port, port + 1, payload_type, jitt, play_card, capture_card, echo_canceller); + if (err != 0) { + app->sendResponse(Response("Error during audio stream creation.")); + return; + } + + ostringstream ostr; + ostr << "Id: " << app->updateAudioStreamId(stream) << "\n"; + app->sendResponse(Response(ostr.str(), Response::Ok)); } diff --git a/daemon/commands/audio-stream-start.h b/daemon/commands/audio-stream-start.h index 29372681d..4d8dc878e 100644 --- a/daemon/commands/audio-stream-start.h +++ b/daemon/commands/audio-stream-start.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_AUDIO_STREAM_START_H_ -#define COMMAND_AUDIO_STREAM_START_H_ +#ifndef LINPHONE_DAEMON_COMMAND_AUDIO_STREAM_START_H_ +#define LINPHONE_DAEMON_COMMAND_AUDIO_STREAM_START_H_ -#include "../daemon.h" +#include "daemon.h" class AudioStreamStartCommand: public DaemonCommand { public: AudioStreamStartCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_AUDIO_STREAM_START_H_ +#endif // LINPHONE_DAEMON_COMMAND_AUDIO_STREAM_START_H_ diff --git a/daemon/commands/audio-stream-stats.cc b/daemon/commands/audio-stream-stats.cc index 93e51c36e..ca663e5d4 100644 --- a/daemon/commands/audio-stream-stats.cc +++ b/daemon/commands/audio-stream-stats.cc @@ -45,21 +45,21 @@ AudioStreamStatsCommand::AudioStreamStatsCommand() : "Reason: No audio stream with such id.")); } -void AudioStreamStatsCommand::exec(Daemon *app, const char *args) { +void AudioStreamStatsCommand::exec(Daemon *app, const string& args) { int sid; AudioStreamAndOther *stream = NULL; - if (sscanf(args, "%i", &sid) == 1) { - stream = app->findAudioStreamAndOther(sid); - if (!stream) { - app->sendResponse(Response("No audio stream with such id.")); - return; - } - } else { + istringstream ist(args); + ist >> sid; + if (ist.fail()) { app->sendResponse(Response("No stream specified.")); return; } - ostringstream ostr; - ostr << AudioStreamStatsResponse(app, stream->stream, &stream->stats, false).getBody(); - app->sendResponse(Response(ostr.str().c_str(), Response::Ok)); + stream = app->findAudioStreamAndOther(sid); + if (!stream) { + app->sendResponse(Response("No audio stream with such id.")); + return; + } + + app->sendResponse(Response(AudioStreamStatsResponse(app, stream->stream, &stream->stats, false).getBody(), Response::Ok)); } diff --git a/daemon/commands/audio-stream-stats.h b/daemon/commands/audio-stream-stats.h index 6e27e8d52..f63fbb17c 100644 --- a/daemon/commands/audio-stream-stats.h +++ b/daemon/commands/audio-stream-stats.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_AUDIO_STREAM_STATS_H_ -#define COMMAND_AUDIO_STREAM_STATS_H_ +#ifndef LINPHONE_DAEMON_COMMAND_AUDIO_STREAM_STATS_H_ +#define LINPHONE_DAEMON_COMMAND_AUDIO_STREAM_STATS_H_ -#include "../daemon.h" +#include "daemon.h" class AudioStreamStatsCommand: public DaemonCommand { public: AudioStreamStatsCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_AUDIO_STREAM_STATS_H_ +#endif // LINPHONE_DAEMON_COMMAND_AUDIO_STREAM_STATS_H_ diff --git a/daemon/commands/audio-stream-stop.cc b/daemon/commands/audio-stream-stop.cc index a1290a852..2ef0d7559 100644 --- a/daemon/commands/audio-stream-stop.cc +++ b/daemon/commands/audio-stream-stop.cc @@ -30,20 +30,23 @@ AudioStreamStopCommand::AudioStreamStopCommand() : "Reason: No Audio Stream with such id.")); } -void AudioStreamStopCommand::exec(Daemon *app, const char *args) { +void AudioStreamStopCommand::exec(Daemon *app, const string& args) { int id; - if (sscanf(args, "%d", &id) == 1) { - AudioStream *stream = app->findAudioStream(id); - if (stream == NULL) { - app->sendResponse(Response("No Audio Stream with such id.")); - return; - } - app->removeAudioStream(id); - RtpProfile *prof=rtp_session_get_profile(stream->ms.sessions.rtp_session); - audio_stream_stop(stream); - rtp_profile_destroy(prof); - app->sendResponse(Response()); - } else { + istringstream ist(args); + ist >> id; + if (ist.fail()) { app->sendResponse(Response("Missing/Incorrect parameter(s).")); + return; } + + AudioStream *stream = app->findAudioStream(id); + if (stream == NULL) { + app->sendResponse(Response("No Audio Stream with such id.")); + return; + } + app->removeAudioStream(id); + RtpProfile *prof=rtp_session_get_profile(stream->ms.sessions.rtp_session); + audio_stream_stop(stream); + rtp_profile_destroy(prof); + app->sendResponse(Response()); } diff --git a/daemon/commands/audio-stream-stop.h b/daemon/commands/audio-stream-stop.h index b885b0ff4..44dd7166d 100644 --- a/daemon/commands/audio-stream-stop.h +++ b/daemon/commands/audio-stream-stop.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_AUDIO_STREAM_STOP_H_ -#define COMMAND_AUDIO_STREAM_STOP_H_ +#ifndef LINPHONE_DAEMON_COMMAND_AUDIO_STREAM_STOP_H_ +#define LINPHONE_DAEMON_COMMAND_AUDIO_STREAM_STOP_H_ -#include "../daemon.h" +#include "daemon.h" class AudioStreamStopCommand: public DaemonCommand { public: AudioStreamStopCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_AUDIO_STREAM_STOP_H_ +#endif // LINPHONE_DAEMON_COMMAND_AUDIO_STREAM_STOP_H_ diff --git a/daemon/commands/auth-infos-clear.cc b/daemon/commands/auth-infos-clear.cc index ec247daee..33b938899 100644 --- a/daemon/commands/auth-infos-clear.cc +++ b/daemon/commands/auth-infos-clear.cc @@ -34,7 +34,7 @@ AuthInfosClearCommand::AuthInfosClearCommand() : "Reason: No auth info with such id.")); } -void AuthInfosClearCommand::exec(Daemon *app, const char *args) { +void AuthInfosClearCommand::exec(Daemon *app, const string& args) { string param; int pid; ostringstream ostr; @@ -49,7 +49,7 @@ void AuthInfosClearCommand::exec(Daemon *app, const char *args) { int previous_size = app->maxAuthInfoId(); linphone_core_clear_all_auth_info(app->getCore()); ostr << "Successfully cleared " << previous_size - app->maxAuthInfoId() << " auth infos." << endl; - app->sendResponse(Response(ostr.str().c_str(), Response::Ok)); + app->sendResponse(Response(ostr.str(), Response::Ok)); } else { LinphoneAuthInfo *auth_info = NULL; ist.clear(); @@ -66,6 +66,6 @@ void AuthInfosClearCommand::exec(Daemon *app, const char *args) { } linphone_core_remove_auth_info(app->getCore(), auth_info); ostr << "Successfully cleared auth info " << pid << "." << endl; - app->sendResponse(Response(ostr.str().c_str(), Response::Ok)); + app->sendResponse(Response(ostr.str(), Response::Ok)); } } diff --git a/daemon/commands/auth-infos-clear.h b/daemon/commands/auth-infos-clear.h index 20a27afcd..35df2165a 100644 --- a/daemon/commands/auth-infos-clear.h +++ b/daemon/commands/auth-infos-clear.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_AUTH_INFOS_CLEAR_H_ -#define COMMAND_AUTH_INFOS_CLEAR_H_ +#ifndef LINPHONE_DAEMON_COMMAND_AUTH_INFOS_CLEAR_H_ +#define LINPHONE_DAEMON_COMMAND_AUTH_INFOS_CLEAR_H_ -#include "../daemon.h" +#include "daemon.h" class AuthInfosClearCommand: public DaemonCommand { public: AuthInfosClearCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_AUTH_INFOS_CLEAR_H_ +#endif // LINPHONE_DAEMON_COMMAND_AUTH_INFOS_CLEAR_H_ diff --git a/daemon/commands/call-mute.cc b/daemon/commands/call-mute.cc index a244b4cf4..81b41db4a 100644 --- a/daemon/commands/call-mute.cc +++ b/daemon/commands/call-mute.cc @@ -19,7 +19,9 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "call-mute.h" -CallMute::CallMute() : +using namespace std; + +CallMuteCommand::CallMuteCommand() : DaemonCommand("call-mute", "call-mute 0|1", "mute/unmute the microphone (1 to mute, 0 to unmute). No argument means MUTE.") { addExample(new DaemonCommandExample("call-mute 1", @@ -36,24 +38,25 @@ CallMute::CallMute() : "Reason: No call in progress. Can't mute.")); } -void CallMute::exec(Daemon* app, const char* args) +void CallMuteCommand::exec(Daemon* app, const string& args) { LinphoneCore *lc = app->getCore(); - int muted = TRUE; // no arg means MUTE + int muted; LinphoneCall *call = linphone_core_get_current_call(lc); - if( call == NULL ){ + if (call == NULL) { app->sendResponse(Response("No call in progress. Can't mute.")); return; } - if (sscanf(args, "%i", &muted) == 1) { - linphone_core_enable_mic(lc, !muted); + istringstream ist(args); + ist >> muted; + if (ist.fail() || (muted != 0)) { + muted = TRUE; } else { - linphone_core_enable_mic(lc, !muted); + muted = FALSE; } + linphone_core_enable_mic(lc, !muted); - app->sendResponse(Response(muted?"Microphone Muted" - :"Microphone Unmuted", - Response::Ok)); + app->sendResponse(Response(muted ? "Microphone Muted" : "Microphone Unmuted", Response::Ok)); } diff --git a/daemon/commands/call-mute.h b/daemon/commands/call-mute.h index 772c6cd0b..bab2fe128 100644 --- a/daemon/commands/call-mute.h +++ b/daemon/commands/call-mute.h @@ -17,16 +17,16 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef CALLMUTE_H -#define CALLMUTE_H +#ifndef LINPHONE_DAEMON_COMMAND_CALL_MUTE_H +#define LINPHONE_DAEMON_COMMAND_CALL_MUTE_H #include "daemon.h" -class CallMute : public DaemonCommand +class CallMuteCommand : public DaemonCommand { public: - CallMute(); - virtual void exec(Daemon *app, const char *args); + CallMuteCommand(); + virtual void exec(Daemon *app, const std::string& args); }; -#endif // CALLMUTE_H +#endif // LINPHONE_DAEMON_COMMAND_CALL_MUTE_H diff --git a/daemon/commands/call-pause.cc b/daemon/commands/call-pause.cc index 9bceb0ffc..0f2f76808 100644 --- a/daemon/commands/call-pause.cc +++ b/daemon/commands/call-pause.cc @@ -19,7 +19,9 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "call-pause.h" -CallPause::CallPause() : +using namespace std; + +CallPauseCommand::CallPauseCommand() : DaemonCommand("call-pause", "call-pause ", "Pause a call (pause current if no id is specified).") @@ -37,30 +39,31 @@ CallPause::CallPause() : "Reason: No current call available.")); } -void CallPause::exec(Daemon* app, const char* args) +void CallPauseCommand::exec(Daemon* app, const string& args) { LinphoneCore *lc = app->getCore(); int cid; LinphoneCall *call = NULL; bool current = false; - if (sscanf(args, "%i", &cid) == 1) { - call = app->findCall(cid); - if (call == NULL) { - app->sendResponse(Response("No call with such id.")); - return; - } - } else { + istringstream ist(args); + ist >> cid; + if (ist.fail()) { call = linphone_core_get_current_call(lc); current = true; if (call == NULL) { app->sendResponse(Response("No current call available.")); return; } + } else { + call = app->findCall(cid); + if (call == NULL) { + app->sendResponse(Response("No call with such id.")); + return; + } } - if( linphone_core_pause_call(lc, call) == 0 ) { - app->sendResponse(Response(current?"Current call was paused": - "Call was paused", Response::Ok)); + if (linphone_core_pause_call(lc, call) == 0) { + app->sendResponse(Response(current ? "Current call was paused" : "Call was paused", Response::Ok)); } else { app->sendResponse(Response("Error pausing call")); } diff --git a/daemon/commands/call-pause.h b/daemon/commands/call-pause.h index 0a52a0fb1..7fbb6177d 100644 --- a/daemon/commands/call-pause.h +++ b/daemon/commands/call-pause.h @@ -17,17 +17,16 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef CALLPAUSE_H -#define CALLPAUSE_H +#ifndef LINPHONE_DAEMON_COMMAND_CALL_PAUSE_H +#define LINPHONE_DAEMON_COMMAND_CALL_PAUSE_H #include "daemon.h" -class CallPause : public DaemonCommand +class CallPauseCommand : public DaemonCommand { public: - CallPause(); - - virtual void exec(Daemon *app, const char *args); + CallPauseCommand(); + virtual void exec(Daemon *app, const std::string& args); }; -#endif // CALLPAUSE_H +#endif // LINPHONE_DAEMON_COMMAND_CALL_PAUSE_H diff --git a/daemon/commands/call-resume.cc b/daemon/commands/call-resume.cc index 43ceda8fd..79acfb07d 100644 --- a/daemon/commands/call-resume.cc +++ b/daemon/commands/call-resume.cc @@ -19,7 +19,9 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "call-resume.h" -CallResume::CallResume(): +using namespace std; + +CallResumeCommand::CallResumeCommand(): DaemonCommand("call-resume", "call-resume ", "Pause a call (pause current if no id is specified).") { addExample(new DaemonCommandExample("call-resume 1", @@ -35,30 +37,31 @@ CallResume::CallResume(): "Reason: No current call available.")); } -void CallResume::exec(Daemon* app, const char* args) +void CallResumeCommand::exec(Daemon* app, const string& args) { LinphoneCore *lc = app->getCore(); int cid; LinphoneCall *call = NULL; bool current = false; - if (sscanf(args, "%i", &cid) == 1) { - call = app->findCall(cid); - if (call == NULL) { - app->sendResponse(Response("No call with such id.")); - return; - } - } else { + istringstream ist(args); + ist >> cid; + if (ist.fail()) { call = linphone_core_get_current_call(lc); current = true; if (call == NULL) { app->sendResponse(Response("No current call available.")); return; } + } else { + call = app->findCall(cid); + if (call == NULL) { + app->sendResponse(Response("No call with such id.")); + return; + } } - if( linphone_core_resume_call(lc, call) == 0 ) { - app->sendResponse(Response(current?"Current call was resumed": - "Call was resumed", Response::Ok)); + if (linphone_core_resume_call(lc, call) == 0) { + app->sendResponse(Response(current ? "Current call was resumed" : "Call was resumed", Response::Ok)); } else { app->sendResponse(Response("Error pausing call")); } diff --git a/daemon/commands/call-resume.h b/daemon/commands/call-resume.h index 13824d584..03ac2ae85 100644 --- a/daemon/commands/call-resume.h +++ b/daemon/commands/call-resume.h @@ -17,16 +17,16 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef CALLRESUME_H -#define CALLRESUME_H +#ifndef LINPHONE_DAEMON_COMMAND_CALL_RESUME_H +#define LINPHONE_DAEMON_COMMAND_CALL_RESUME_H #include "daemon.h" -class CallResume : public DaemonCommand +class CallResumeCommand : public DaemonCommand { public: - CallResume(); - virtual void exec(Daemon *app, const char *args); + CallResumeCommand(); + virtual void exec(Daemon *app, const std::string& args); }; -#endif // CALLRESUME_H +#endif // LINPHONE_DAEMON_COMMAND_CALL_RESUME_H diff --git a/daemon/commands/call-stats.cc b/daemon/commands/call-stats.cc index b239dfd75..bce38c188 100644 --- a/daemon/commands/call-stats.cc +++ b/daemon/commands/call-stats.cc @@ -52,26 +52,28 @@ CallStatsCommand::CallStatsCommand() : "Reason: No current call available.")); } -void CallStatsCommand::exec(Daemon *app, const char *args) { +void CallStatsCommand::exec(Daemon *app, const string& args) { LinphoneCore *lc = app->getCore(); int cid; LinphoneCall *call = NULL; - if (sscanf(args, "%i", &cid) == 1) { - call = app->findCall(cid); - if (call == NULL) { - app->sendResponse(Response("No call with such id.")); - return; - } - } else { + istringstream ist(args); + ist >> cid; + if (ist.fail()) { call = linphone_core_get_current_call(lc); if (call == NULL) { app->sendResponse(Response("No current call available.")); return; } + } else { + call = app->findCall(cid); + if (call == NULL) { + app->sendResponse(Response("No call with such id.")); + return; + } } ostringstream ostr; ostr << CallStatsResponse(app, call, linphone_call_get_audio_stats(call), false).getBody(); ostr << CallStatsResponse(app, call, linphone_call_get_video_stats(call), false).getBody(); - app->sendResponse(Response(ostr.str().c_str(), Response::Ok)); + app->sendResponse(Response(ostr.str(), Response::Ok)); } diff --git a/daemon/commands/call-stats.h b/daemon/commands/call-stats.h index 13b4370a3..465e38495 100644 --- a/daemon/commands/call-stats.h +++ b/daemon/commands/call-stats.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_CALL_STATS_H_ -#define COMMAND_CALL_STATS_H_ +#ifndef LINPHONE_DAEMON_COMMAND_CALL_STATS_H_ +#define LINPHONE_DAEMON_COMMAND_CALL_STATS_H_ -#include "../daemon.h" +#include "daemon.h" class CallStatsCommand: public DaemonCommand { public: CallStatsCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_CALL_STATS_H_ +#endif // LINPHONE_DAEMON_COMMAND_CALL_STATS_H_ diff --git a/daemon/commands/call-status.cc b/daemon/commands/call-status.cc index 675b160d8..7e8ac3589 100644 --- a/daemon/commands/call-status.cc +++ b/daemon/commands/call-status.cc @@ -36,22 +36,24 @@ CallStatusCommand::CallStatusCommand() : "Status: Error\n" "Reason: No current call available.")); } -void CallStatusCommand::exec(Daemon *app, const char *args) { +void CallStatusCommand::exec(Daemon *app, const string& args) { LinphoneCore *lc = app->getCore(); int cid; LinphoneCall *call = NULL; - if (sscanf(args, "%i", &cid) == 1) { - call = app->findCall(cid); - if (call == NULL) { - app->sendResponse(Response("No call with such id.")); - return; - } - } else { + istringstream ist(args); + ist >> cid; + if (ist.fail()) { call = linphone_core_get_current_call(lc); if (call == NULL) { app->sendResponse(Response("No current call available.")); return; } + } else { + call = app->findCall(cid); + if (call == NULL) { + app->sendResponse(Response("No call with such id.")); + return; + } } LinphoneCallState call_state = LinphoneCallIdle; @@ -82,5 +84,5 @@ void CallStatusCommand::exec(Daemon *app, const char *args) { default: break; } - app->sendResponse(Response(ostr.str().c_str(), Response::Ok)); + app->sendResponse(Response(ostr.str(), Response::Ok)); } diff --git a/daemon/commands/call-status.h b/daemon/commands/call-status.h index b97551a93..df5989998 100644 --- a/daemon/commands/call-status.h +++ b/daemon/commands/call-status.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_CALL_STATUS_H_ -#define COMMAND_CALL_STATUS_H_ +#ifndef LINPHONE_DAEMON_COMMAND_CALL_STATUS_H_ +#define LINPHONE_DAEMON_COMMAND_CALL_STATUS_H_ -#include "../daemon.h" +#include "daemon.h" class CallStatusCommand: public DaemonCommand { public: CallStatusCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_CALL_STATUS_H_ +#endif // LINPHONE_DAEMON_COMMAND_CALL_STATUS_H_ diff --git a/daemon/commands/call-transfer.cc b/daemon/commands/call-transfer.cc index 17558f00d..c422c843d 100644 --- a/daemon/commands/call-transfer.cc +++ b/daemon/commands/call-transfer.cc @@ -19,9 +19,11 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "call-transfer.h" -CallTransfer::CallTransfer() : +using namespace std; + +CallTransferCommand::CallTransferCommand() : DaemonCommand("call-transfer", - "call-transfer ", + "call-transfer ", "Transfer a call that you aswered to another party") { addExample(new DaemonCommandExample("call-transfer 1 sip:john", @@ -32,33 +34,73 @@ CallTransfer::CallTransfer() : addExample(new DaemonCommandExample("call-transfer 2 sip:john", "Status: Error\n" "Reason: No call with such id.")); + + addExample(new DaemonCommandExample("call-transfer 1 2", + "Status: Ok\n\n" + "Call ID: 1\n" + "Transfer to: 2")); } -void CallTransfer::exec(Daemon* app, const char* args) +void CallTransferCommand::exec(Daemon* app, const string& args) { LinphoneCore *lc = app->getCore(); - int cid; - LinphoneCall *call = NULL; - char sipurl[512]; - memset(sipurl, 0x00, 512); + LinphoneCall *call_to_transfer = NULL; + LinphoneCall *call_to_transfer_to = NULL; + istringstream ist(args); - if (sscanf(args, "%i %511s", &cid, sipurl) == 2) { - call = app->findCall(cid); - if (call == NULL) { - app->sendResponse(Response("No call with such id.")); - return; - } - } else { - app->sendResponse(Response("Invalid command format.")); + if (ist.peek() == EOF) { + app->sendResponse(Response("Missing call_to_transfer_id parameter.", Response::Error)); return; } - if( linphone_core_transfer_call(lc, call, sipurl) == 0 ) { - std::ostringstream ostr; - ostr << "Call ID: " << cid << "\n"; - ostr << "Transfer to: " << sipurl << "\n"; - app->sendResponse(Response(ostr.str(), Response::Ok)); - } else { - app->sendResponse(Response("Error pausing call")); + int call_to_transfer_id; + int call_to_transfer_to_id; + string sip_uri_to_transfer_to; + ist >> call_to_transfer_id; + if (ist.fail()) { + app->sendResponse(Response("Invalid command format (wrong call_to_transfer_id parameter).")); + return; } + if (ist.peek() == EOF) { + app->sendResponse(Response("Missing call_to_transfer_to_id or sip_uri_to_transfer_to parameter.", Response::Error)); + } + ist >> call_to_transfer_to_id; + if (ist.fail()) { + ist.clear(); + ist >> sip_uri_to_transfer_to; + if (ist.fail()) { + app->sendResponse(Response("Invalid command format (wrong call_to_transfer_to_id or sip_uri_to_transfer_to parameter.")); + return; + } + } + + call_to_transfer = app->findCall(call_to_transfer_id); + if (call_to_transfer == NULL) { + app->sendResponse(Response("No call with such id.")); + return; + } + if (sip_uri_to_transfer_to.empty()) { + call_to_transfer_to = app->findCall(call_to_transfer_to_id); + if (call_to_transfer_to == NULL) { + app->sendResponse(Response("No call with such id.")); + return; + } + if (linphone_core_transfer_call_to_another(lc, call_to_transfer, call_to_transfer_to) == 0) { + std::ostringstream ostr; + ostr << "Call ID: " << call_to_transfer_id << "\n"; + ostr << "Transfer to: " << call_to_transfer_to_id << "\n"; + app->sendResponse(Response(ostr.str(), Response::Ok)); + return; + } + } else { + if (linphone_core_transfer_call(lc, call_to_transfer, sip_uri_to_transfer_to.c_str()) == 0) { + std::ostringstream ostr; + ostr << "Call ID: " << call_to_transfer_id << "\n"; + ostr << "Transfer to: " << sip_uri_to_transfer_to << "\n"; + app->sendResponse(Response(ostr.str(), Response::Ok)); + return; + } + } + + app->sendResponse(Response("Error transferring call.")); } diff --git a/daemon/commands/call-transfer.h b/daemon/commands/call-transfer.h index 1ff37952c..c0c0d977b 100644 --- a/daemon/commands/call-transfer.h +++ b/daemon/commands/call-transfer.h @@ -17,16 +17,16 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef CALLTRANSFER_H -#define CALLTRANSFER_H +#ifndef LINPHONE_DAEMON_COMMAND_CALL_TRANSFER_H +#define LINPHONE_DAEMON_COMMAND_CALL_TRANSFER_H #include "daemon.h" -class CallTransfer : public DaemonCommand +class CallTransferCommand : public DaemonCommand { public: - CallTransfer(); - virtual void exec(Daemon *app, const char *args); + CallTransferCommand(); + virtual void exec(Daemon *app, const std::string& args); }; -#endif // CALLTRANSFER_H +#endif // LINPHONE_DAEMON_COMMAND_CALL_TRANSFER_H diff --git a/daemon/commands/call.cc b/daemon/commands/call.cc index f908b7f0b..740fa287f 100644 --- a/daemon/commands/call.cc +++ b/daemon/commands/call.cc @@ -35,30 +35,37 @@ CallCommand::CallCommand() : "Reason: Call creation failed.")); } -void CallCommand::exec(Daemon *app, const char *args) { +void CallCommand::exec(Daemon *app, const string& args) { + string address; + string early_media; LinphoneCall *call; Response resp; ostringstream ostr; - char address[256] = { 0 }, early_media[256] = { 0 }; - if (sscanf(args, "%s %s", address, early_media) == 2) { - char *opt; - LinphoneCallParams *cp; - opt = strstr(early_media,"--early-media"); - cp = linphone_core_create_call_params(app->getCore(), NULL); - if (opt) { + + istringstream ist(args); + ist >> address; + if (ist.fail()) { + app->sendResponse(Response("Missing address parameter.", Response::Error)); + return; + } + ist >> early_media; + if (!ist.fail()) { + LinphoneCallParams *cp = linphone_core_create_call_params(app->getCore(), NULL); + if (early_media.compare("--early-media") == 0) { linphone_call_params_enable_early_media_sending(cp, TRUE); ostr << "Early media: Ok\n"; } - call = linphone_core_invite_with_params(app->getCore(), address, cp); + call = linphone_core_invite_with_params(app->getCore(), address.c_str(), cp); } else { - call = linphone_core_invite(app->getCore(), args); + call = linphone_core_invite(app->getCore(), address.c_str()); } if (call == NULL) { app->sendResponse(Response("Call creation failed.")); - } else { - ostr << "Id: " << app->updateCallId(call) << "\n"; - resp.setBody(ostr.str().c_str()); - app->sendResponse(resp); + return; } + + ostr << "Id: " << app->updateCallId(call) << "\n"; + resp.setBody(ostr.str()); + app->sendResponse(resp); } diff --git a/daemon/commands/call.h b/daemon/commands/call.h index 5f0ea6b49..e2cf8700e 100644 --- a/daemon/commands/call.h +++ b/daemon/commands/call.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_CALL_H_ -#define COMMAND_CALL_H_ +#ifndef LINPHONE_DAEMON_COMMAND_CALL_H_ +#define LINPHONE_DAEMON_COMMAND_CALL_H_ -#include "../daemon.h" +#include "daemon.h" class CallCommand: public DaemonCommand { public: CallCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_CALL_H_ +#endif // LINPHONE_DAEMON_COMMAND_CALL_H_ diff --git a/daemon/commands/cn.cc b/daemon/commands/cn.cc index d2eabad30..affa3a671 100644 --- a/daemon/commands/cn.cc +++ b/daemon/commands/cn.cc @@ -35,7 +35,7 @@ CNResponse::CNResponse(LinphoneCore *core) : Response() { } else { ost << "disabled\n"; } - setBody(ost.str().c_str()); + setBody(ost.str()); } @@ -53,21 +53,22 @@ CNCommand::CNCommand() : "State: disabled")); } -void CNCommand::exec(Daemon *app, const char *args) { +void CNCommand::exec(Daemon *app, const string& args) { string status; istringstream ist(args); ist >> status; if (ist.fail()) { app->sendResponse(CNResponse(app->getCore())); - } else { - if (status.compare("enable") == 0) { - linphone_core_enable_generic_confort_noise(app->getCore(), TRUE); - } else if (status.compare("disable") == 0) { - linphone_core_enable_generic_confort_noise(app->getCore(), FALSE); - } else { - app->sendResponse(Response("Incorrect parameter.", Response::Error)); - return; - } - app->sendResponse(CNResponse(app->getCore())); + return; } + + if (status.compare("enable") == 0) { + linphone_core_enable_generic_confort_noise(app->getCore(), TRUE); + } else if (status.compare("disable") == 0) { + linphone_core_enable_generic_confort_noise(app->getCore(), FALSE); + } else { + app->sendResponse(Response("Incorrect parameter.", Response::Error)); + return; + } + app->sendResponse(CNResponse(app->getCore())); } diff --git a/daemon/commands/cn.h b/daemon/commands/cn.h index b8ca19b88..6e625bea8 100644 --- a/daemon/commands/cn.h +++ b/daemon/commands/cn.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_CN_H_ -#define COMMAND_CN_H_ +#ifndef LINPHONE_DAEMON_COMMAND_CN_H_ +#define LINPHONE_DAEMON_COMMAND_CN_H_ -#include "../daemon.h" +#include "daemon.h" class CNCommand: public DaemonCommand { public: CNCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_IPV6_H_ +#endif // LINPHONE_DAEMON_COMMAND_CN_H_ diff --git a/daemon/commands/conference.cc b/daemon/commands/conference.cc index c39c8515a..5b5da8741 100644 --- a/daemon/commands/conference.cc +++ b/daemon/commands/conference.cc @@ -19,7 +19,9 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "conference.h" -Conference::Conference() : +using namespace std; + +ConferenceCommand::ConferenceCommand() : DaemonCommand("conference", "conference ", "Create and manage an audio conference.\n" "Subcommands:\n" @@ -44,45 +46,45 @@ Conference::Conference() : "Reason: No call with such id.")); } -void Conference::exec(Daemon* app, const char* args) -{ +void ConferenceCommand::exec(Daemon* app, const string& args) { LinphoneCore* lc = app->getCore(); - long id; - char subcommand[32]={0}; - int n; - n=sscanf(args, "%31s %li", subcommand,&id); - if (n == 2){ - LinphoneCall *call=app->findCall(id); - if (call==NULL){ - app->sendResponse(Response("No call with such id.")); - return; - } - - if (strcmp(subcommand,"add")==0){ - n = linphone_core_add_to_conference(lc,call); - - }else if (strcmp(subcommand,"rm")==0){ - n = linphone_core_remove_from_conference(lc,call); - - }else if (strcmp(subcommand,"enter")==0){ - n = linphone_core_enter_conference(lc); - - }else if (strcmp(subcommand,"leave")==0){ - n = linphone_core_leave_conference(lc); - } else { - app->sendResponse("Invalid command format."); - } - - if ( n == 0 ){ - std::ostringstream ostr; - ostr << "Call ID: " << id << "\n"; - ostr << "Conference: " << subcommand << " OK" << "\n"; - app->sendResponse(Response(ostr.str(), Response::Ok)); - } else { - app->sendResponse("Conference: command failed"); - } - - } else { - app->sendResponse("Invalid command format."); + int id; + string subcommand; + int ret; + istringstream ist(args); + ist >> subcommand; + ist >> id; + if (ist.fail()) { + app->sendResponse(Response("Invalid command format.", Response::Error)); + return; } + + LinphoneCall *call=app->findCall(id); + if (call == NULL) { + app->sendResponse(Response("No call with such id.", Response::Error)); + return; + } + + if (subcommand.compare("add") == 0) { + ret = linphone_core_add_to_conference(lc, call); + } else if (subcommand.compare("rm") == 0) { + ret = linphone_core_remove_from_conference(lc, call); + } else if (subcommand.compare("enter") == 0) { + ret = linphone_core_enter_conference(lc); + } else if (subcommand.compare("leave") == 0) { + ret = linphone_core_leave_conference(lc); + } else { + app->sendResponse(Response("Invalid command format.", Response::Error)); + return; + } + + if (ret == 0) { + std::ostringstream ostr; + ostr << "Call ID: " << id << "\n"; + ostr << "Conference: " << subcommand << " OK" << "\n"; + app->sendResponse(Response(ostr.str(), Response::Ok)); + return; + } + + app->sendResponse(Response("Command failed", Response::Error)); } diff --git a/daemon/commands/conference.h b/daemon/commands/conference.h index e904e8792..c9d0719ee 100644 --- a/daemon/commands/conference.h +++ b/daemon/commands/conference.h @@ -17,16 +17,16 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMANDS_CONFERENCE_H -#define COMMANDS_CONFERENCE_H +#ifndef LINPHONE_DAEMON_COMMAND_CONFERENCE_H +#define LINPHONE_DAEMON_COMMAND_CONFERENCE_H #include "daemon.h" -class Conference : public DaemonCommand +class ConferenceCommand : public DaemonCommand { public: - Conference(); - virtual void exec(Daemon *app, const char *args); + ConferenceCommand(); + virtual void exec(Daemon *app, const std::string& args); }; -#endif // CONFERENCE_H +#endif // LINPHONE_DAEMON_COMMAND_CONFERENCE_H diff --git a/daemon/commands/config.cc b/daemon/commands/config.cc index 385823256..ca77b8845 100644 --- a/daemon/commands/config.cc +++ b/daemon/commands/config.cc @@ -28,8 +28,8 @@ public: ConfigResponse::ConfigResponse(const char *value) : Response() { ostringstream ost; - ost << "Value: "<<(value ? value : ""); - setBody(ost.str().c_str()); + ost << "Value: " << value ? value : ""; + setBody(ost.str()); } ConfigGetCommand::ConfigGetCommand() : @@ -40,16 +40,16 @@ ConfigGetCommand::ConfigGetCommand() : "Value: ")); } -void ConfigGetCommand::exec(Daemon *app, const char *args) { +void ConfigGetCommand::exec(Daemon *app, const string& args) { string section,key; istringstream ist(args); ist >> section >> key; if (ist.fail()) { app->sendResponse(Response("Missing section and/or key names.")); - } else { - const char *read_value=lp_config_get_string(linphone_core_get_config(app->getCore()),section.c_str(),key.c_str(),NULL); - app->sendResponse(ConfigResponse(read_value)); + return; } + const char *read_value=lp_config_get_string(linphone_core_get_config(app->getCore()),section.c_str(),key.c_str(),NULL); + app->sendResponse(ConfigResponse(read_value)); } @@ -64,16 +64,16 @@ ConfigSetCommand::ConfigSetCommand() : "Value: ")); } -void ConfigSetCommand::exec(Daemon *app, const char *args) { +void ConfigSetCommand::exec(Daemon *app, const string& args) { string section,key,value; istringstream ist(args); ist >> section >> key; if (ist.fail()) { app->sendResponse(Response("Missing section and/or key names.")); - } else { - ist>>value; - lp_config_set_string(linphone_core_get_config(app->getCore()), section.c_str(), key.c_str(), value.size()>0 ? value.c_str() : NULL); - app->sendResponse(ConfigResponse(value.c_str())); + return; } + ist>>value; + lp_config_set_string(linphone_core_get_config(app->getCore()), section.c_str(), key.c_str(), value.size()>0 ? value.c_str() : NULL); + app->sendResponse(ConfigResponse(value.c_str())); } diff --git a/daemon/commands/configcommand.h b/daemon/commands/configcommand.h index 5813f6735..6a138b900 100644 --- a/daemon/commands/configcommand.h +++ b/daemon/commands/configcommand.h @@ -17,21 +17,21 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_CONFIG_H_ -#define COMMAND_CONFIG_H_ +#ifndef LINPHONE_DAEMON_COMMAND_CONFIG_H_ +#define LINPHONE_DAEMON_COMMAND_CONFIG_H_ -#include "../daemon.h" +#include "daemon.h" class ConfigGetCommand: public DaemonCommand { public: ConfigGetCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; class ConfigSetCommand: public DaemonCommand { public: ConfigSetCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_IPV6_H_ +#endif // LINPHONE_DAEMON_COMMAND_CONFIG_H_ diff --git a/daemon/commands/contact.cc b/daemon/commands/contact.cc index b0b97f162..a4a13ae24 100644 --- a/daemon/commands/contact.cc +++ b/daemon/commands/contact.cc @@ -26,23 +26,26 @@ ContactCommand::ContactCommand() : addExample(new DaemonCommandExample("contact sip:root@unknown-host", "Status: Ok\n\n")); } -void ContactCommand::exec(Daemon *app, const char *args) { + +void ContactCommand::exec(Daemon *app, const string& args) { LinphoneCore *lc = app->getCore(); - int result; char *contact; - char username[256] = { 0 }; - char hostname[256] = { 0 }; - result = sscanf(args, "%255s %255s", username, hostname); - if (result == 1) { - linphone_core_set_primary_contact(lc,username); - app->sendResponse(Response("", Response::Ok)); + string username; + string hostname; + istringstream ist(args); + ist >> username; + if (ist.fail()) { + app->sendResponse(Response("Missing/Incorrect parameter(s).")); + return; } - else if (result > 1) { - contact=ortp_strdup_printf("sip:%s@%s",username,hostname); - linphone_core_set_primary_contact(lc,contact); - ms_free(contact); + ist >> hostname; + if (ist.fail()) { + linphone_core_set_primary_contact(lc, username.c_str()); app->sendResponse(Response("", Response::Ok)); } else { - app->sendResponse(Response("Missing/Incorrect parameter(s).")); + contact = ortp_strdup_printf("sip:%s@%s", username.c_str(), hostname.c_str()); + linphone_core_set_primary_contact(lc, contact); + ms_free(contact); + app->sendResponse(Response("", Response::Ok)); } } diff --git a/daemon/commands/contact.h b/daemon/commands/contact.h index 79a609bc8..057472b94 100644 --- a/daemon/commands/contact.h +++ b/daemon/commands/contact.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_CONTACT_H_ -#define COMMAND_CONTACT_H_ +#ifndef LINPHONE_DAEMON_COMMAND_CONTACT_H_ +#define LINPHONE_DAEMON_COMMAND_CONTACT_H_ -#include "../daemon.h" +#include "daemon.h" class ContactCommand: public DaemonCommand { public: ContactCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_CONTACT_H_ +#endif // LINPHONE_DAEMON_COMMAND_CONTACT_H_ diff --git a/daemon/commands/dtmf.cc b/daemon/commands/dtmf.cc index 7d464f4de..fac596818 100644 --- a/daemon/commands/dtmf.cc +++ b/daemon/commands/dtmf.cc @@ -31,24 +31,25 @@ DtmfCommand::DtmfCommand() : "Status: Ok")); } -void DtmfCommand::exec(Daemon *app, const char *args) { +void DtmfCommand::exec(Daemon *app, const string& args) { string digit_str; char digit; istringstream ist(args); ist >> digit_str; if (ist.fail()) { app->sendResponse(Response("Missing digit parameter.", Response::Error)); - } else { + return; + } + digit = digit_str.at(0); - if (isdigit(digit) || (digit == 'A') || (digit == 'B') || (digit == 'C') || (digit == 'D') || (digit == '*') || (digit == '#')) { - LinphoneCall *call = linphone_core_get_current_call(app->getCore()); - linphone_core_play_dtmf(app->getCore(), digit, 100); - if (call == NULL) { - linphone_call_send_dtmf(call, digit); - } - app->sendResponse(Response()); - } else { - app->sendResponse(Response("Incorrect digit parameter.", Response::Error)); + if (isdigit(digit) || (digit == 'A') || (digit == 'B') || (digit == 'C') || (digit == 'D') || (digit == '*') || (digit == '#')) { + LinphoneCall *call = linphone_core_get_current_call(app->getCore()); + linphone_core_play_dtmf(app->getCore(), digit, 100); + if (call == NULL) { + linphone_call_send_dtmf(call, digit); } + app->sendResponse(Response()); + } else { + app->sendResponse(Response("Incorrect digit parameter.", Response::Error)); } } diff --git a/daemon/commands/dtmf.h b/daemon/commands/dtmf.h index 1af629457..96d52298d 100644 --- a/daemon/commands/dtmf.h +++ b/daemon/commands/dtmf.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_DTMF_H_ -#define COMMAND_DTMF_H_ +#ifndef LINPHONE_DAEMON_COMMAND_DTMF_H_ +#define LINPHONE_DAEMON_COMMAND_DTMF_H_ -#include "../daemon.h" +#include "daemon.h" class DtmfCommand: public DaemonCommand { public: DtmfCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_DTMF_H_ +#endif // LINPHONE_DAEMON_COMMAND_DTMF_H_ diff --git a/daemon/commands/firewall-policy.cc b/daemon/commands/firewall-policy.cc index ae3a912b3..c5e7e3ba3 100644 --- a/daemon/commands/firewall-policy.cc +++ b/daemon/commands/firewall-policy.cc @@ -50,7 +50,7 @@ FirewallPolicyResponse::FirewallPolicyResponse(LinphoneCore *core) : Response() ost << "upnp\n"; break; } - setBody(ost.str().c_str()); + setBody(ost.str()); } FirewallPolicyCommand::FirewallPolicyCommand() : @@ -71,50 +71,53 @@ FirewallPolicyCommand::FirewallPolicyCommand() : "Type: none")); } -void FirewallPolicyCommand::exec(Daemon *app, const char *args) { +void FirewallPolicyCommand::exec(Daemon *app, const string& args) { string type; string address; istringstream ist(args); ist >> type; if (ist.eof() && (type.length() == 0)) { app->sendResponse(FirewallPolicyResponse(app->getCore())); - } else if (ist.fail()) { + return; + } + if (ist.fail()) { app->sendResponse(Response("Incorrect type parameter.", Response::Error)); + return; + } + + bool get_address; + LinphoneFirewallPolicy policy; + if (type.compare("none") == 0) { + policy = LinphonePolicyNoFirewall; + get_address = false; + } else if (type.compare("nat") == 0) { + policy = LinphonePolicyUseNatAddress; + get_address = true; + } else if (type.compare("stun") == 0) { + policy = LinphonePolicyUseStun; + get_address = true; + } else if (type.compare("ice") == 0) { + policy = LinphonePolicyUseIce; + get_address = true; + } else if (type.compare("upnp") == 0) { + policy = LinphonePolicyUseUpnp; + get_address = false; } else { - bool get_address; - LinphoneFirewallPolicy policy; - if (type.compare("none") == 0) { - policy = LinphonePolicyNoFirewall; - get_address = false; - } else if (type.compare("nat") == 0) { - policy = LinphonePolicyUseNatAddress; - get_address = true; - } else if (type.compare("stun") == 0) { - policy = LinphonePolicyUseStun; - get_address = true; - } else if (type.compare("ice") == 0) { - policy = LinphonePolicyUseIce; - get_address = true; - } else if (type.compare("upnp") == 0) { - policy = LinphonePolicyUseUpnp; - get_address = false; - } else { - app->sendResponse(Response("Incorrect type parameter.", Response::Error)); + app->sendResponse(Response("Incorrect type parameter.", Response::Error)); + return; + } + if (get_address) { + ist >> address; + if (ist.fail()) { + app->sendResponse(Response("Missing/Incorrect address parameter.", Response::Error)); return; } - if (get_address) { - ist >> address; - if (ist.fail()) { - app->sendResponse(Response("Missing/Incorrect address parameter.", Response::Error)); - return; - } - } - linphone_core_set_firewall_policy(app->getCore(), policy); - if (policy == LinphonePolicyUseNatAddress) { - linphone_core_set_nat_address(app->getCore(), address.c_str()); - } else if ((policy == LinphonePolicyUseStun) || (policy == LinphonePolicyUseIce)) { - linphone_core_set_stun_server(app->getCore(), address.c_str()); - } - app->sendResponse(FirewallPolicyResponse(app->getCore())); } + linphone_core_set_firewall_policy(app->getCore(), policy); + if (policy == LinphonePolicyUseNatAddress) { + linphone_core_set_nat_address(app->getCore(), address.c_str()); + } else if ((policy == LinphonePolicyUseStun) || (policy == LinphonePolicyUseIce)) { + linphone_core_set_stun_server(app->getCore(), address.c_str()); + } + app->sendResponse(FirewallPolicyResponse(app->getCore())); } diff --git a/daemon/commands/firewall-policy.h b/daemon/commands/firewall-policy.h index d90c78ecf..a19d1dfd1 100644 --- a/daemon/commands/firewall-policy.h +++ b/daemon/commands/firewall-policy.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_FIREWALL_POLICY_H_ -#define COMMAND_FIREWALL_POLICY_H_ +#ifndef LINPHONE_DAEMON_COMMAND_FIREWALL_POLICY_H_ +#define LINPHONE_DAEMON_COMMAND_FIREWALL_POLICY_H_ -#include "../daemon.h" +#include "daemon.h" class FirewallPolicyCommand: public DaemonCommand { public: FirewallPolicyCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_FIREWALL_POLICY_H_ +#endif // LINPHONE_DAEMON_COMMAND_FIREWALL_POLICY_H_ diff --git a/daemon/commands/help.cc b/daemon/commands/help.cc index 329a96359..7d031c570 100644 --- a/daemon/commands/help.cc +++ b/daemon/commands/help.cc @@ -25,21 +25,22 @@ HelpCommand::HelpCommand() : DaemonCommand("help", "help ", "Show help notice, if command is unspecified or inexistent show all commands.") { } -void HelpCommand::exec(Daemon *app, const char *args) { +void HelpCommand::exec(Daemon *app, const string& args) { ostringstream ost; list::const_iterator it; const list &l = app->getCommandList(); - if (args){ + bool found = false; + if (!args.empty()){ for (it = l.begin(); it != l.end(); ++it) { if ((*it)->matches(args)){ ost << (*it)->getHelp(); + found = true; break; } } - if (it==l.end()) args=NULL; } - if (args==NULL){ + if (!found){ for (it = l.begin(); it != l.end(); ++it) { ost << (*it)->getProto() << endl; } diff --git a/daemon/commands/help.h b/daemon/commands/help.h index b6e1f966d..6e18fd1b5 100644 --- a/daemon/commands/help.h +++ b/daemon/commands/help.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_HELP_H_ -#define COMMAND_HELP_H_ +#ifndef LINPHONE_DAEMON_COMMAND_HELP_H_ +#define LINPHONE_DAEMON_COMMAND_HELP_H_ -#include "../daemon.h" +#include "daemon.h" class HelpCommand: public DaemonCommand { public: HelpCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_HELP_H_ +#endif // LINPHONE_DAEMON_COMMAND_HELP_H_ diff --git a/daemon/commands/ipv6.cc b/daemon/commands/ipv6.cc index fc57cb531..cb5c80313 100644 --- a/daemon/commands/ipv6.cc +++ b/daemon/commands/ipv6.cc @@ -35,7 +35,7 @@ IPv6Response::IPv6Response(LinphoneCore *core) : Response() { } else { ost << "disabled\n"; } - setBody(ost.str().c_str()); + setBody(ost.str()); } IPv6Command::IPv6Command() : @@ -52,21 +52,22 @@ IPv6Command::IPv6Command() : "State: disabled")); } -void IPv6Command::exec(Daemon *app, const char *args) { +void IPv6Command::exec(Daemon *app, const string& args) { string status; istringstream ist(args); ist >> status; if (ist.fail()) { app->sendResponse(IPv6Response(app->getCore())); - } else { - if (status.compare("enable") == 0) { - linphone_core_enable_ipv6(app->getCore(), TRUE); - } else if (status.compare("disable") == 0) { - linphone_core_enable_ipv6(app->getCore(), FALSE); - } else { - app->sendResponse(Response("Incorrect parameter.", Response::Error)); - return; - } - app->sendResponse(IPv6Response(app->getCore())); + return; } + + if (status.compare("enable") == 0) { + linphone_core_enable_ipv6(app->getCore(), TRUE); + } else if (status.compare("disable") == 0) { + linphone_core_enable_ipv6(app->getCore(), FALSE); + } else { + app->sendResponse(Response("Incorrect parameter.", Response::Error)); + return; + } + app->sendResponse(IPv6Response(app->getCore())); } diff --git a/daemon/commands/ipv6.h b/daemon/commands/ipv6.h index 61247cfc3..31ef4899b 100644 --- a/daemon/commands/ipv6.h +++ b/daemon/commands/ipv6.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_IPV6_H_ -#define COMMAND_IPV6_H_ +#ifndef LINPHONE_DAEMON_COMMAND_IPV6_H_ +#define LINPHONE_DAEMON_COMMAND_IPV6_H_ -#include "../daemon.h" +#include "daemon.h" class IPv6Command: public DaemonCommand { public: IPv6Command(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_IPV6_H_ +#endif // LINPHONE_DAEMON_COMMAND_IPV6_H_ diff --git a/daemon/commands/jitterbuffer.cc b/daemon/commands/jitterbuffer.cc index be627a053..aa9690ab0 100644 --- a/daemon/commands/jitterbuffer.cc +++ b/daemon/commands/jitterbuffer.cc @@ -33,7 +33,7 @@ public: ostr<<"audio-jitter-buffer-size: "<>arg1; + istr >> arg1; if (istr.fail()){ - app->sendResponse(JitterBufferResponse(app->getCore(),true,true)); - }else{ - if (arg1!="audio" && arg1!="video"){ - app->sendResponse("Invalid argument."); + app->sendResponse(JitterBufferResponse(app->getCore(), true, true)); + return; + } + if (arg1 != "audio" && arg1 != "video") { + app->sendResponse(Response("Invalid argument.")); + return; + } + string arg2; + istr >> arg2; + if (istr.fail()) { + app->sendResponse(JitterBufferResponse(app->getCore(), arg1 == "audio", arg1 == "video")); + return; + } + if (arg2 == "size") { + int arg3; + istr >> arg3; + if (istr.fail()) { + app->sendResponse(Response("Bad command argument.")); return; } - string arg2; - istr>>arg2; - if (istr.fail()){ - app->sendResponse(JitterBufferResponse(app->getCore(),arg1=="audio",arg1=="video")); - }else{ - if (arg2=="size"){ - int arg3; - istr>>arg3; - if (!istr.fail()){ - if (arg1=="audio") - linphone_core_set_audio_jittcomp(app->getCore(),arg3); - else if (arg1=="video") - linphone_core_set_video_jittcomp(app->getCore(),arg3); - } - app->sendResponse(JitterBufferResponse(app->getCore(),arg1=="audio",arg1=="video")); - }else{ - app->sendResponse(Response("Bad command argument.")); - } - } + if (arg1 == "audio") + linphone_core_set_audio_jittcomp(app->getCore(), arg3); + else if (arg1=="video") + linphone_core_set_video_jittcomp(app->getCore(), arg3); } + app->sendResponse(JitterBufferResponse(app->getCore(), arg1 == "audio", arg1 == "video")); } JitterBufferResetCommand::JitterBufferResetCommand() : DaemonCommand("jitter-buffer-reset", @@ -96,53 +96,52 @@ JitterBufferResetCommand::JitterBufferResetCommand() : DaemonCommand("jitter-buf } -void JitterBufferResetCommand::exec(Daemon *app, const char *args){ +void JitterBufferResetCommand::exec(Daemon *app, const string& args) { istringstream istr(args); string arg1; - istr>>arg1; - if (istr.fail()){ + istr >> arg1; + if (istr.fail()) { app->sendResponse(Response("Missing arguments")); - }else{ - if (arg1!="call" && arg1!="stream"){ - app->sendResponse(Response("Invalid command syntax.")); - return; - } - int arg2; - istr>>arg2; - if (istr.fail()){ - app->sendResponse(Response("Missing call or stream id.")); - return; - }else{ - MSFilter *rtprecv=NULL; - if (arg1=="call"){ - LinphoneCall *call=app->findCall(arg2); - string streamtype; - if (call==NULL){ - app->sendResponse(Response("No such call id")); - return; - } - istr>>streamtype; - if (streamtype=="video"){ - rtprecv=call->videostream ? call->videostream->ms.rtprecv : NULL; - }else{ - rtprecv=call->audiostream ? call->audiostream->ms.rtprecv : NULL; - } - }else{ - AudioStream *stream=app->findAudioStream(arg2); - if (stream==NULL){ - app->sendResponse(Response("No such stream id")); - return; - } - rtprecv=stream->ms.rtprecv; - } - if (rtprecv==NULL){ - app->sendResponse(Response("No such active stream")); - return; - } - ms_filter_call_method_noarg(rtprecv,MS_RTP_RECV_RESET_JITTER_BUFFER); - app->sendResponse(Response()); - } + return; } + if (arg1 != "call" && arg1 != "stream") { + app->sendResponse(Response("Invalid command syntax.")); + return; + } + int arg2; + istr >> arg2; + if (istr.fail()) { + app->sendResponse(Response("Missing call or stream id.")); + return; + } + MSFilter *rtprecv = NULL; + if (arg1 == "call") { + LinphoneCall *call = app->findCall(arg2); + string streamtype; + if (call == NULL) { + app->sendResponse(Response("No such call id")); + return; + } + istr >> streamtype; + if (streamtype == "video") { + rtprecv = call->videostream ? call->videostream->ms.rtprecv : NULL; + } else { + rtprecv = call->audiostream ? call->audiostream->ms.rtprecv : NULL; + } + } else { + AudioStream *stream = app->findAudioStream(arg2); + if (stream == NULL) { + app->sendResponse(Response("No such stream id")); + return; + } + rtprecv = stream->ms.rtprecv; + } + if (rtprecv == NULL) { + app->sendResponse(Response("No such active stream")); + return; + } + ms_filter_call_method_noarg(rtprecv, MS_RTP_RECV_RESET_JITTER_BUFFER); + app->sendResponse(Response()); } diff --git a/daemon/commands/jitterbuffer.h b/daemon/commands/jitterbuffer.h index f63484b87..76855e0aa 100644 --- a/daemon/commands/jitterbuffer.h +++ b/daemon/commands/jitterbuffer.h @@ -17,23 +17,23 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_JITTER_SIZE_H_ -#define COMMAND_JITTER_SIZE_H_ +#ifndef LINPHONE_DAEMON_COMMAND_JITTER_BUFFER_H_ +#define LINPHONE_DAEMON_COMMAND_JITTER_BUFFER_H_ -#include "../daemon.h" +#include "daemon.h" class JitterBufferCommand : public DaemonCommand{ public: JitterBufferCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; class JitterBufferResetCommand : public DaemonCommand{ public: JitterBufferResetCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif +#endif // LINPHONE_DAEMON_COMMAND_JITTER_BUFFER_H diff --git a/daemon/commands/media-encryption.cc b/daemon/commands/media-encryption.cc index f055053ce..e5eb17f3b 100644 --- a/daemon/commands/media-encryption.cc +++ b/daemon/commands/media-encryption.cc @@ -44,7 +44,7 @@ MediaEncryptionResponse::MediaEncryptionResponse(LinphoneCore *core) : Response( ost << "DTLS\n"; break; } - setBody(ost.str().c_str()); + setBody(ost.str()); } MediaEncryptionCommand::MediaEncryptionCommand() : @@ -61,30 +61,32 @@ MediaEncryptionCommand::MediaEncryptionCommand() : "Encryption: srtp")); } -void MediaEncryptionCommand::exec(Daemon *app, const char *args) { +void MediaEncryptionCommand::exec(Daemon *app, const string& args) { string encryption_str; istringstream ist(args); ist >> encryption_str; if (ist.eof() && (encryption_str.length() == 0)) { app->sendResponse(MediaEncryptionResponse(app->getCore())); - } else if (ist.fail()) { + return; + } + if (ist.fail()) { app->sendResponse(Response("Incorrect parameter.", Response::Error)); + return; + } + LinphoneMediaEncryption encryption; + if (encryption_str.compare("none") == 0) { + encryption = LinphoneMediaEncryptionNone; + } else if (encryption_str.compare("srtp") == 0) { + encryption = LinphoneMediaEncryptionSRTP; + } else if (encryption_str.compare("zrtp") == 0) { + encryption = LinphoneMediaEncryptionZRTP; } else { - LinphoneMediaEncryption encryption; - if (encryption_str.compare("none") == 0) { - encryption = LinphoneMediaEncryptionNone; - } else if (encryption_str.compare("srtp") == 0) { - encryption = LinphoneMediaEncryptionSRTP; - } else if (encryption_str.compare("zrtp") == 0) { - encryption = LinphoneMediaEncryptionZRTP; - } else { - app->sendResponse(Response("Incorrect parameter.", Response::Error)); - return; - } - if (linphone_core_set_media_encryption(app->getCore(), encryption)==0){ - app->sendResponse(MediaEncryptionResponse(app->getCore())); - }else{ - app->sendResponse(Response("Unsupported media encryption", Response::Error)); - } + app->sendResponse(Response("Incorrect parameter.", Response::Error)); + return; + } + if (linphone_core_set_media_encryption(app->getCore(), encryption) == 0) { + app->sendResponse(MediaEncryptionResponse(app->getCore())); + }else{ + app->sendResponse(Response("Unsupported media encryption", Response::Error)); } } diff --git a/daemon/commands/media-encryption.h b/daemon/commands/media-encryption.h index a15163829..7a35d0c27 100644 --- a/daemon/commands/media-encryption.h +++ b/daemon/commands/media-encryption.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_MEDIA_ENCRYPTION_H_ -#define COMMAND_MEDIA_ENCRYPTION_H_ +#ifndef LINPHONE_DAEMON_COMMAND_MEDIA_ENCRYPTION_H_ +#define LINPHONE_DAEMON_COMMAND_MEDIA_ENCRYPTION_H_ -#include "../daemon.h" +#include "daemon.h" class MediaEncryptionCommand: public DaemonCommand { public: MediaEncryptionCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_MEDIA_ENCRYPTION_H_ +#endif // LINPHONE_DAEMON_COMMAND_MEDIA_ENCRYPTION_H_ diff --git a/daemon/commands/msfilter-add-fmtp.cc b/daemon/commands/msfilter-add-fmtp.cc index 961aee825..5137963be 100644 --- a/daemon/commands/msfilter-add-fmtp.cc +++ b/daemon/commands/msfilter-add-fmtp.cc @@ -35,34 +35,40 @@ MSFilterAddFmtpCommand::MSFilterAddFmtpCommand() : "Reason: No Audio Stream with such id.")); } -void MSFilterAddFmtpCommand::exec(Daemon *app, const char *args) { - char type[16]={0}, fmtp[512]={0}; +void MSFilterAddFmtpCommand::exec(Daemon *app, const string& args) { + string type; int id; + string fmtp; - if (sscanf(args, "%15s %d %511s", type, &id, fmtp) == 3) { - if(strcmp(type, "call") == 0) { - LinphoneCall *call = app->findCall(id); - if (call == NULL) { - app->sendResponse(Response("No Call with such id.")); - return; - } - if (call->audiostream==NULL || call->audiostream->ms.encoder==NULL){ - app->sendResponse(Response("This call doesn't have an active audio stream.")); - return; - } - ms_filter_call_method(call->audiostream->ms.encoder, MS_FILTER_ADD_FMTP, fmtp); - } else if(strcmp(type, "stream") == 0) { - AudioStream *stream = app->findAudioStream(id); - if (stream == NULL) { - app->sendResponse(Response("No Audio Stream with such id.")); - return; - } - ms_filter_call_method(stream->ms.encoder, MS_FILTER_ADD_FMTP, fmtp); - } else { - app->sendResponse(Response("Incorrect parameter(s).")); - } - app->sendResponse(Response()); - } else { + istringstream ist(args); + ist >> type; + ist >> id; + ist >> fmtp; + if (ist.fail()) { app->sendResponse(Response("Missing/Incorrect parameter(s).")); + return; } + if (type.compare("call") == 0) { + LinphoneCall *call = app->findCall(id); + if (call == NULL) { + app->sendResponse(Response("No Call with such id.")); + return; + } + if (call->audiostream == NULL || call->audiostream->ms.encoder == NULL) { + app->sendResponse(Response("This call doesn't have an active audio stream.")); + return; + } + ms_filter_call_method(call->audiostream->ms.encoder, MS_FILTER_ADD_FMTP, (void *)fmtp.c_str()); + } else if (type.compare("stream") == 0) { + AudioStream *stream = app->findAudioStream(id); + if (stream == NULL) { + app->sendResponse(Response("No Audio Stream with such id.")); + return; + } + ms_filter_call_method(stream->ms.encoder, MS_FILTER_ADD_FMTP, (void *)fmtp.c_str()); + } else { + app->sendResponse(Response("Incorrect parameter(s).")); + return; + } + app->sendResponse(Response()); } diff --git a/daemon/commands/msfilter-add-fmtp.h b/daemon/commands/msfilter-add-fmtp.h index 0e92f7e21..ecb2969ec 100644 --- a/daemon/commands/msfilter-add-fmtp.h +++ b/daemon/commands/msfilter-add-fmtp.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_MSFILTER_ADD_FMTP -#define COMMAND_MSFILTER_ADD_FMTP +#ifndef LINPHONE_DAEMON_COMMAND_MSFILTER_ADD_FMTP +#define LINPHONE_DAEMON_COMMAND_MSFILTER_ADD_FMTP -#include "../daemon.h" +#include "daemon.h" class MSFilterAddFmtpCommand : public DaemonCommand { public: MSFilterAddFmtpCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif /* COMMAND_MSFILTER_ADD_FMTP */ +#endif // LINPHONE_DAEMON_COMMAND_MSFILTER_ADD_FMTP diff --git a/daemon/commands/netsim.cc b/daemon/commands/netsim.cc index dcc277fbc..2d982416e 100644 --- a/daemon/commands/netsim.cc +++ b/daemon/commands/netsim.cc @@ -43,7 +43,7 @@ NetsimResponse::NetsimResponse(LinphoneCore *lc) : Response() { ost<<"jitter_burst_density: "<jitter_burst_density<jitter_strength<mode)<getCore(); OrtpNetworkSimulatorParams params=*linphone_core_get_network_simulator_params(lc); string subcommand; @@ -79,46 +79,45 @@ void NetsimCommand::exec(Daemon* app, const char* args){ return; } if (subcommand.compare("enable")==0){ - params.enabled=TRUE; + params.enabled = TRUE; }else if (subcommand.compare("disable")==0){ - params.enabled=FALSE; + params.enabled = FALSE; }else if (subcommand.compare("parameters")==0){ string parameters; - char value[128]={0}; + char value[128] = { 0 }; ist >> parameters; - if (fmtp_get_value(parameters.c_str(),"max_bandwidth",value, sizeof(value))){ - params.max_bandwidth=(float)atoi(value); + if (fmtp_get_value(parameters.c_str(), "max_bandwidth", value, sizeof(value))) { + params.max_bandwidth = (float)atoi(value); } - if (fmtp_get_value(parameters.c_str(),"max_buffer_size",value, sizeof(value))){ - params.max_buffer_size=atoi(value); + if (fmtp_get_value(parameters.c_str(), "max_buffer_size", value, sizeof(value))) { + params.max_buffer_size = atoi(value); } - if (fmtp_get_value(parameters.c_str(),"loss_rate",value, sizeof(value))){ - params.loss_rate=(float)atoi(value); + if (fmtp_get_value(parameters.c_str(), "loss_rate", value, sizeof(value))) { + params.loss_rate = (float)atoi(value); } - if (fmtp_get_value(parameters.c_str(),"latency",value, sizeof(value))){ - params.latency=atoi(value); + if (fmtp_get_value(parameters.c_str(), "latency", value, sizeof(value))) { + params.latency = atoi(value); } - if (fmtp_get_value(parameters.c_str(),"consecutive_loss_probability",value, sizeof(value))){ - params.consecutive_loss_probability=(float)atof(value); + if (fmtp_get_value(parameters.c_str(), "consecutive_loss_probability", value, sizeof(value))) { + params.consecutive_loss_probability = (float)atof(value); } - if (fmtp_get_value(parameters.c_str(),"jitter_burst_density",value, sizeof(value))){ - params.jitter_burst_density=(float)atof(value); + if (fmtp_get_value(parameters.c_str(), "jitter_burst_density", value, sizeof(value))) { + params.jitter_burst_density = (float)atof(value); } - if (fmtp_get_value(parameters.c_str(),"jitter_strength",value, sizeof(value))){ - params.jitter_strength=(float)atof(value); + if (fmtp_get_value(parameters.c_str(), "jitter_strength", value, sizeof(value))) { + params.jitter_strength = (float)atof(value); } - if (fmtp_get_value(parameters.c_str(),"mode",value, sizeof(value))){ - OrtpNetworkSimulatorMode mode=ortp_network_simulator_mode_from_string(value); - if (mode==OrtpNetworkSimulatorInvalid){ + if (fmtp_get_value(parameters.c_str(), "mode",value, sizeof(value))) { + OrtpNetworkSimulatorMode mode = ortp_network_simulator_mode_from_string(value); + if (mode == OrtpNetworkSimulatorInvalid) { app->sendResponse(Response("Invalid mode")); return; } - params.mode=mode; + params.mode = mode; } } - linphone_core_set_network_simulator_params(lc,¶ms); + linphone_core_set_network_simulator_params(lc, ¶ms); app->sendResponse(NetsimResponse(app->getCore())); - return; } diff --git a/daemon/commands/netsim.h b/daemon/commands/netsim.h index b883b93dd..e6b147c63 100644 --- a/daemon/commands/netsim.h +++ b/daemon/commands/netsim.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_NETSIM_H_ -#define COMMAND_NETSIM_H_ +#ifndef LINPHONE_DAEMON_COMMAND_NETSIM_H_ +#define LINPHONE_DAEMON_COMMAND_NETSIM_H_ -#include "../daemon.h" +#include "daemon.h" class NetsimCommand: public DaemonCommand { public: NetsimCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_NETSIM_H_ +#endif // LINPHONE_DAEMON_COMMAND_NETSIM_H_ diff --git a/daemon/commands/play-wav.cc b/daemon/commands/play-wav.cc index 18eae73e5..614682eff 100644 --- a/daemon/commands/play-wav.cc +++ b/daemon/commands/play-wav.cc @@ -33,7 +33,7 @@ void playWavFinished(LsdPlayer *p) { linphone_sound_daemon_release_player(lsd_player_get_daemon(p), p); } -void PlayWavCommand::exec(Daemon *app, const char *args) { +void PlayWavCommand::exec(Daemon *app, const string& args) { LinphoneSoundDaemon *lsd = app->getLSD(); if (!lsd) { app->sendResponse(Response("The linphone sound daemon (LSD) is not enabled.", Response::Error)); @@ -45,12 +45,14 @@ void PlayWavCommand::exec(Daemon *app, const char *args) { ist >> filename; if (ist.eof() && (filename.length() == 0)) { app->sendResponse(Response("Missing filename parameter.", Response::Error)); - } else if (ist.fail()) { - app->sendResponse(Response("Incorrect filename parameter.", Response::Error)); - } else { - LsdPlayer *p = linphone_sound_daemon_get_player(lsd); - lsd_player_set_callback(p, playWavFinished); - lsd_player_play(p, filename.c_str()); - app->sendResponse(Response()); + return; } + if (ist.fail()) { + app->sendResponse(Response("Incorrect filename parameter.", Response::Error)); + return; + } + LsdPlayer *p = linphone_sound_daemon_get_player(lsd); + lsd_player_set_callback(p, playWavFinished); + lsd_player_play(p, filename.c_str()); + app->sendResponse(Response()); } diff --git a/daemon/commands/play-wav.h b/daemon/commands/play-wav.h index 30e947033..19a245205 100644 --- a/daemon/commands/play-wav.h +++ b/daemon/commands/play-wav.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_PLAY_WAV_H_ -#define COMMAND_PLAY_WAV_H_ +#ifndef LINPHONE_DAEMON_COMMAND_PLAY_WAV_H_ +#define LINPHONE_DAEMON_COMMAND_PLAY_WAV_H_ -#include "../daemon.h" +#include "daemon.h" class PlayWavCommand: public DaemonCommand { public: PlayWavCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_PLAY_WAV_H_ +#endif // LINPHONE_DAEMON_COMMAND_PLAY_WAV_H_ diff --git a/daemon/commands/pop-event.cc b/daemon/commands/pop-event.cc index 2d2075497..0373f45c9 100644 --- a/daemon/commands/pop-event.cc +++ b/daemon/commands/pop-event.cc @@ -27,6 +27,6 @@ PopEventCommand::PopEventCommand() : "Status: Ok\n\n" "Size: 0")); } -void PopEventCommand::exec(Daemon *app, const char *args) { +void PopEventCommand::exec(Daemon *app, const string& args) { app->pullEvent(); } diff --git a/daemon/commands/pop-event.h b/daemon/commands/pop-event.h index 1a5fd581d..66a3a8489 100644 --- a/daemon/commands/pop-event.h +++ b/daemon/commands/pop-event.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_POP_EVENT_H_ -#define COMMAND_POP_EVENT_H_ +#ifndef LINPHONE_DAEMON_COMMAND_POP_EVENT_H_ +#define LINPHONE_DAEMON_COMMAND_POP_EVENT_H_ -#include "../daemon.h" +#include "daemon.h" class PopEventCommand: public DaemonCommand { public: PopEventCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_POP_EVENT_H_ +#endif // LINPHONE_DAEMON_COMMAND_POP_EVENT_H_ diff --git a/daemon/commands/port.cc b/daemon/commands/port.cc index 1452c6157..1d47bf094 100644 --- a/daemon/commands/port.cc +++ b/daemon/commands/port.cc @@ -62,7 +62,7 @@ PortResponse::PortResponse(LinphoneCore *core, PortResponse::PortType type) : Re outputVideoRTPPort(core, ost); break; } - setBody(ost.str().c_str()); + setBody(ost.str()); } void PortResponse::outputSIPPort(LinphoneCore *core, ostringstream &ost) { @@ -116,7 +116,7 @@ PortCommand::PortCommand() : "Video RTP: 9078")); } -void PortCommand::exec(Daemon *app, const char *args) { +void PortCommand::exec(Daemon *app, const string& args) { string type; int port; istringstream ist(args); @@ -124,61 +124,63 @@ void PortCommand::exec(Daemon *app, const char *args) { ist >> type; if (ist.eof() && (type.length() == 0)) { app->sendResponse(PortResponse(app->getCore(), PortResponse::AllPorts)); - } else if (ist.fail()) { + return; + } + if (ist.fail()) { app->sendResponse(Response("Incorrect type parameter.", Response::Error)); - } else { - ist >> port; - if (ist.fail()) { - if (type.compare("sip") == 0) { - app->sendResponse(PortResponse(app->getCore(), PortResponse::SIPPort)); - } else if (type.compare("audio") == 0) { - app->sendResponse(PortResponse(app->getCore(), PortResponse::AudioRTPPort)); - } else if (type.compare("video") == 0) { - app->sendResponse(PortResponse(app->getCore(), PortResponse::VideoRTPPort)); - } else { - app->sendResponse(Response("Incorrect type parameter.", Response::Error)); - } + return; + } + ist >> port; + if (ist.fail()) { + if (type.compare("sip") == 0) { + app->sendResponse(PortResponse(app->getCore(), PortResponse::SIPPort)); + } else if (type.compare("audio") == 0) { + app->sendResponse(PortResponse(app->getCore(), PortResponse::AudioRTPPort)); + } else if (type.compare("video") == 0) { + app->sendResponse(PortResponse(app->getCore(), PortResponse::VideoRTPPort)); } else { - if (type.compare("sip") == 0) { - Protocol protocol = UDPProtocol; - string protocol_str; - ist >> protocol_str; - if (!ist.fail()) { - if (protocol_str.compare("udp") == 0) { - protocol = UDPProtocol; - } else if (protocol_str.compare("tcp") == 0) { - protocol = TCPProtocol; - } else if (protocol_str.compare("tls") == 0) { - protocol = TLSProtocol; - } else { - app->sendResponse(Response("Incorrect protocol parameter.", Response::Error)); - return; - } - } - LCSipTransports transports; - memset(&transports, 0, sizeof(transports)); - switch (protocol) { - case UDPProtocol: - transports.udp_port = port; - break; - case TCPProtocol: - transports.tcp_port = port; - break; - case TLSProtocol: - transports.tls_port = port; - break; - } - linphone_core_set_sip_transports(app->getCore(), &transports); - app->sendResponse(PortResponse(app->getCore(), PortResponse::SIPPort)); - } else if (type.compare("audio") == 0) { - linphone_core_set_audio_port(app->getCore(), port); - app->sendResponse(PortResponse(app->getCore(), PortResponse::AudioRTPPort)); - } else if (type.compare("video") == 0) { - linphone_core_set_video_port(app->getCore(), port); - app->sendResponse(PortResponse(app->getCore(), PortResponse::VideoRTPPort)); + app->sendResponse(Response("Incorrect type parameter.", Response::Error)); + } + return; + } + if (type.compare("sip") == 0) { + Protocol protocol = UDPProtocol; + string protocol_str; + ist >> protocol_str; + if (!ist.fail()) { + if (protocol_str.compare("udp") == 0) { + protocol = UDPProtocol; + } else if (protocol_str.compare("tcp") == 0) { + protocol = TCPProtocol; + } else if (protocol_str.compare("tls") == 0) { + protocol = TLSProtocol; } else { - app->sendResponse(Response("Incorrect type parameter.", Response::Error)); + app->sendResponse(Response("Incorrect protocol parameter.", Response::Error)); + return; } } + LCSipTransports transports; + memset(&transports, 0, sizeof(transports)); + switch (protocol) { + case UDPProtocol: + transports.udp_port = port; + break; + case TCPProtocol: + transports.tcp_port = port; + break; + case TLSProtocol: + transports.tls_port = port; + break; + } + linphone_core_set_sip_transports(app->getCore(), &transports); + app->sendResponse(PortResponse(app->getCore(), PortResponse::SIPPort)); + } else if (type.compare("audio") == 0) { + linphone_core_set_audio_port(app->getCore(), port); + app->sendResponse(PortResponse(app->getCore(), PortResponse::AudioRTPPort)); + } else if (type.compare("video") == 0) { + linphone_core_set_video_port(app->getCore(), port); + app->sendResponse(PortResponse(app->getCore(), PortResponse::VideoRTPPort)); + } else { + app->sendResponse(Response("Incorrect type parameter.", Response::Error)); } } diff --git a/daemon/commands/port.h b/daemon/commands/port.h index 3618971dd..465a087e3 100644 --- a/daemon/commands/port.h +++ b/daemon/commands/port.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_PORT_H_ -#define COMMAND_PORT_H_ +#ifndef LINPHONE_DAEMON_COMMAND_PORT_H_ +#define LINPHONE_DAEMON_COMMAND_PORT_H_ -#include "../daemon.h" +#include "daemon.h" class PortCommand: public DaemonCommand { public: PortCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_PORT_H_ +#endif // LINPHONE_DAEMON_COMMAND_PORT_H_ diff --git a/daemon/commands/ptime.cc b/daemon/commands/ptime.cc index 234bb8e46..c1dda80a5 100644 --- a/daemon/commands/ptime.cc +++ b/daemon/commands/ptime.cc @@ -45,7 +45,7 @@ PtimeResponse::PtimeResponse(LinphoneCore *core, Direction dir) : Response() { ost << "Download: " << linphone_core_get_download_ptime(core) << "\n"; break; } - setBody(ost.str().c_str()); + setBody(ost.str()); } PtimeCommand::PtimeCommand() : @@ -65,34 +65,34 @@ PtimeCommand::PtimeCommand() : "Download: 30")); } -void PtimeCommand::exec(Daemon *app, const char *args) { +void PtimeCommand::exec(Daemon *app, const string& args) { string direction; int ms; istringstream ist(args); ist >> direction; if (ist.fail()) { app->sendResponse(PtimeResponse(app->getCore(), PtimeResponse::BothDirections)); - } else { - if (direction.compare("up") == 0) { - if (!ist.eof()) { - ist >> ms; - if (ist.fail()) { - app->sendResponse(Response("Incorrect ms parameter.", Response::Error)); - } - linphone_core_set_upload_ptime(app->getCore(), ms); + return; + } + if (direction.compare("up") == 0) { + if (!ist.eof()) { + ist >> ms; + if (ist.fail()) { + app->sendResponse(Response("Incorrect ms parameter.", Response::Error)); } - app->sendResponse(PtimeResponse(app->getCore(), PtimeResponse::Upload)); - } else if (direction.compare("down") == 0) { - if (!ist.eof()) { - ist >> ms; - if (ist.fail()) { - app->sendResponse(Response("Incorrect ms parameter.", Response::Error)); - } - linphone_core_set_download_ptime(app->getCore(), ms); - } - app->sendResponse(PtimeResponse(app->getCore(), PtimeResponse::Download)); - } else { - app->sendResponse(Response("Missing/Incorrect parameter(s).", Response::Error)); + linphone_core_set_upload_ptime(app->getCore(), ms); } + app->sendResponse(PtimeResponse(app->getCore(), PtimeResponse::Upload)); + } else if (direction.compare("down") == 0) { + if (!ist.eof()) { + ist >> ms; + if (ist.fail()) { + app->sendResponse(Response("Incorrect ms parameter.", Response::Error)); + } + linphone_core_set_download_ptime(app->getCore(), ms); + } + app->sendResponse(PtimeResponse(app->getCore(), PtimeResponse::Download)); + } else { + app->sendResponse(Response("Missing/Incorrect parameter(s).", Response::Error)); } } diff --git a/daemon/commands/ptime.h b/daemon/commands/ptime.h index 18c59825b..a54a17cd6 100644 --- a/daemon/commands/ptime.h +++ b/daemon/commands/ptime.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_PTIME_H_ -#define COMMAND_PTIME_H_ +#ifndef LINPHONE_DAEMON_COMMAND_PTIME_H_ +#define LINPHONE_DAEMON_COMMAND_PTIME_H_ -#include "../daemon.h" +#include "daemon.h" class PtimeCommand: public DaemonCommand { public: PtimeCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_PTIME_H_ +#endif // LINPHONE_DAEMON_COMMAND_PTIME_H_ diff --git a/daemon/commands/quit.cc b/daemon/commands/quit.cc index 8876e096d..cb2521fed 100644 --- a/daemon/commands/quit.cc +++ b/daemon/commands/quit.cc @@ -25,7 +25,7 @@ QuitCommand::QuitCommand() : DaemonCommand("quit", "quit", "Quit the application.") { } -void QuitCommand::exec(Daemon *app, const char *args) { +void QuitCommand::exec(Daemon *app, const string& args) { app->quit(); app->sendResponse(Response()); } diff --git a/daemon/commands/quit.h b/daemon/commands/quit.h index 78e323e1f..99bf5f49a 100644 --- a/daemon/commands/quit.h +++ b/daemon/commands/quit.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_QUIT_H_ -#define COMMAND_QUIT_H_ +#ifndef LINPHONE_DAEMON_COMMAND_QUIT_H_ +#define LINPHONE_DAEMON_COMMAND_QUIT_H_ -#include "../daemon.h" +#include "daemon.h" class QuitCommand: public DaemonCommand { public: QuitCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_QUIT_H_ +#endif // LINPHONE_DAEMON_COMMAND_QUIT_H_ diff --git a/daemon/commands/register-status.cc b/daemon/commands/register-status.cc index c50e49acb..e989083ba 100644 --- a/daemon/commands/register-status.cc +++ b/daemon/commands/register-status.cc @@ -43,7 +43,7 @@ void RegisterStatusResponse::append(int id, const LinphoneProxyConfig* cfg) { } ost << "Id: " << id << "\n"; ost << "State: " << linphone_registration_state_to_string(linphone_proxy_config_get_state(cfg)) << "\n"; - setBody(ost.str().c_str()); + setBody(ost.str()); } RegisterStatusCommand::RegisterStatusCommand() : @@ -63,7 +63,7 @@ RegisterStatusCommand::RegisterStatusCommand() : "Reason: No register with such id.")); } -void RegisterStatusCommand::exec(Daemon *app, const char *args) { +void RegisterStatusCommand::exec(Daemon *app, const string& args) { LinphoneProxyConfig *cfg = NULL; string param; int pid; diff --git a/daemon/commands/register-status.h b/daemon/commands/register-status.h index 9af479580..5e19cbe14 100644 --- a/daemon/commands/register-status.h +++ b/daemon/commands/register-status.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_REGISTER_STATUS_H_ -#define COMMAND_REGISTER_STATUS_H_ +#ifndef LINPHONE_DAEMON_COMMAND_REGISTER_STATUS_H_ +#define LINPHONE_DAEMON_COMMAND_REGISTER_STATUS_H_ -#include "../daemon.h" +#include "daemon.h" class RegisterStatusCommand: public DaemonCommand { public: RegisterStatusCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_REGISTER_STATUS_H_ +#endif // LINPHONE_DAEMON_COMMAND_REGISTER_STATUS_H_ diff --git a/daemon/commands/register.cc b/daemon/commands/register.cc index 14d4ff210..b67aa8c25 100644 --- a/daemon/commands/register.cc +++ b/daemon/commands/register.cc @@ -32,42 +32,54 @@ RegisterCommand::RegisterCommand() : "Status: Ok\n\n" "Id: 1")); } -void RegisterCommand::exec(Daemon *app, const char *args) { +void RegisterCommand::exec(Daemon *app, const string& args) { LinphoneCore *lc = app->getCore(); ostringstream ostr; - char proxy[256] = { 0 }, identity[128] = { 0 }, password[64] = { 0 }, userid[128] = { 0 }, realm[128] = { 0 }, parameter[256] = { 0 }; - if (sscanf(args, "%255s %127s %63s %127s %127s %255s", identity, proxy, password, userid, realm, parameter) >= 2) { - if (strcmp(password, "NULL") == 0) { - password[0] = 0; - } - if (strcmp(userid, "NULL") == 0) { - userid[0] = 0; - } - if (strcmp(realm, "NULL") == 0) { - realm[0] = 0; - } - if (strcmp(parameter, "NULL") == 0) { - parameter[0] = 0; - } - LinphoneProxyConfig *cfg = linphone_proxy_config_new(); - if (password[0] != '\0') { - LinphoneAddress *from = linphone_address_new(identity); - if (from != NULL) { - LinphoneAuthInfo *info = linphone_auth_info_new(linphone_address_get_username(from), - userid, password, NULL, realm, NULL); - linphone_core_add_auth_info(lc, info); /*add authentication info to LinphoneCore*/ - linphone_address_destroy(from); - linphone_auth_info_destroy(info); - } - } - linphone_proxy_config_set_identity(cfg, identity); - linphone_proxy_config_set_server_addr(cfg, proxy); - linphone_proxy_config_enable_register(cfg, TRUE); - linphone_proxy_config_set_contact_parameters(cfg, parameter); - ostr << "Id: " << app->updateProxyId(cfg) << "\n"; - linphone_core_add_proxy_config(lc, cfg); - app->sendResponse(Response(ostr.str().c_str(), Response::Ok)); - } else { + string identity; + string proxy; + string password; + string userid; + string realm; + string parameter; + istringstream ist(args); + const char *cidentity; + const char *cproxy; + const char *cpassword = NULL; + const char *cuserid = NULL; + const char *crealm = NULL; + const char *cparameter = NULL; + + ist >> identity; + ist >> proxy; + ist >> password; + ist >> userid; + ist >> realm; + ist >> parameter; + if (proxy.empty()) { app->sendResponse(Response("Missing/Incorrect parameter(s).")); + return; } + cidentity = identity.c_str(); + cproxy = proxy.c_str(); + if (!password.empty()) cpassword = password.c_str(); + if (!userid.empty()) cuserid = userid.c_str(); + if (!realm.empty()) crealm = realm.c_str(); + if (!parameter.empty()) cparameter = parameter.c_str(); + LinphoneProxyConfig *cfg = linphone_proxy_config_new(); + if (cpassword != NULL) { + LinphoneAddress *from = linphone_address_new(cidentity); + if (from != NULL) { + LinphoneAuthInfo *info = linphone_auth_info_new(linphone_address_get_username(from), cuserid, cpassword, NULL, crealm, NULL); + linphone_core_add_auth_info(lc, info); /* Add authentication info to LinphoneCore */ + linphone_address_destroy(from); + linphone_auth_info_destroy(info); + } + } + linphone_proxy_config_set_identity(cfg, cidentity); + linphone_proxy_config_set_server_addr(cfg, cproxy); + linphone_proxy_config_enable_register(cfg, TRUE); + linphone_proxy_config_set_contact_parameters(cfg, cparameter); + ostr << "Id: " << app->updateProxyId(cfg) << "\n"; + linphone_core_add_proxy_config(lc, cfg); + app->sendResponse(Response(ostr.str(), Response::Ok)); } diff --git a/daemon/commands/register.h b/daemon/commands/register.h index 73b990576..c29a17f2b 100644 --- a/daemon/commands/register.h +++ b/daemon/commands/register.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_REGISTER_H_ -#define COMMAND_REGISTER_H_ +#ifndef LINPHONE_DAEMON_COMMAND_REGISTER_H_ +#define LINPHONE_DAEMON_COMMAND_REGISTER_H_ -#include "../daemon.h" +#include "daemon.h" class RegisterCommand: public DaemonCommand { public: RegisterCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_REGISTER_H_ +#endif // LINPHONE_DAEMON_COMMAND_REGISTER_H_ diff --git a/daemon/commands/terminate.cc b/daemon/commands/terminate.cc index 20630ed56..c10acf492 100644 --- a/daemon/commands/terminate.cc +++ b/daemon/commands/terminate.cc @@ -34,21 +34,23 @@ TerminateCommand::TerminateCommand() : "Status: Error\n" "Reason: No active call.")); } -void TerminateCommand::exec(Daemon *app, const char *args) { +void TerminateCommand::exec(Daemon *app, const string& args) { LinphoneCall *call = NULL; int cid; const MSList *elem; - if (sscanf(args, "%i", &cid) == 1) { + istringstream ist(args); + ist >> cid; + if (ist.fail()) { + elem = linphone_core_get_calls(app->getCore()); + if (elem != NULL && elem->next == NULL) { + call = (LinphoneCall*)elem->data; + } + } else { call = app->findCall(cid); if (call == NULL) { app->sendResponse(Response("No call with such id.")); return; } - } else { - elem = linphone_core_get_calls(app->getCore()); - if (elem != NULL && elem->next == NULL) { - call = (LinphoneCall*) elem->data; - } } if (call == NULL) { app->sendResponse(Response("No active call.")); diff --git a/daemon/commands/terminate.h b/daemon/commands/terminate.h index 93096acd6..5733d3f21 100644 --- a/daemon/commands/terminate.h +++ b/daemon/commands/terminate.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_TERMINATE_H_ -#define COMMAND_TERMINATE_H_ +#ifndef LINPHONE_DAEMON_COMMAND_TERMINATE_H_ +#define LINPHONE_DAEMON_COMMAND_TERMINATE_H_ -#include "../daemon.h" +#include "daemon.h" class TerminateCommand: public DaemonCommand { public: TerminateCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_TERMINATE_H_ +#endif // LINPHONE_DAEMON_COMMAND_TERMINATE_H_ diff --git a/daemon/commands/unregister.cc b/daemon/commands/unregister.cc index 2b0852ece..1aa3daf73 100644 --- a/daemon/commands/unregister.cc +++ b/daemon/commands/unregister.cc @@ -32,7 +32,7 @@ UnregisterCommand::UnregisterCommand() : "Status: Ok")); } -void UnregisterCommand::exec(Daemon *app, const char *args) { +void UnregisterCommand::exec(Daemon *app, const string& args) { LinphoneProxyConfig *cfg = NULL; string param; int pid; diff --git a/daemon/commands/unregister.h b/daemon/commands/unregister.h index 2c83c9137..09dd5521c 100644 --- a/daemon/commands/unregister.h +++ b/daemon/commands/unregister.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_UNREGISTER_H_ -#define COMMAND_UNREGISTER_H_ +#ifndef LINPHONE_DAEMON_COMMAND_UNREGISTER_H_ +#define LINPHONE_DAEMON_COMMAND_UNREGISTER_H_ -#include "../daemon.h" +#include "daemon.h" class UnregisterCommand: public DaemonCommand { public: UnregisterCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_UNREGISTER_H_ +#endif // LINPHONE_DAEMON_COMMAND_UNREGISTER_H_ diff --git a/daemon/commands/version.cc b/daemon/commands/version.cc index f080a7dbd..922e8d977 100644 --- a/daemon/commands/version.cc +++ b/daemon/commands/version.cc @@ -29,7 +29,7 @@ public: VersionResponse::VersionResponse(LinphoneCore *core) : Response() { ostringstream ost; ost << "Version: " << linphone_core_get_version(); - setBody(ost.str().c_str()); + setBody(ost.str()); } VersionCommand::VersionCommand() : @@ -39,6 +39,6 @@ VersionCommand::VersionCommand() : "Version: 3.5.99.0_6c2f4b9312fd4717b2f8ae0a7d7c97b752768c7c")); } -void VersionCommand::exec(Daemon *app, const char *args) { +void VersionCommand::exec(Daemon *app, const string& args) { app->sendResponse(VersionResponse(app->getCore())); } diff --git a/daemon/commands/version.h b/daemon/commands/version.h index f9cc7fee8..18c897b8c 100644 --- a/daemon/commands/version.h +++ b/daemon/commands/version.h @@ -17,15 +17,15 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef COMMAND_VERSION_H_ -#define COMMAND_VERSION_H_ +#ifndef LINPHONE_DAEMON_COMMAND_VERSION_H_ +#define LINPHONE_DAEMON_COMMAND_VERSION_H_ -#include "../daemon.h" +#include "daemon.h" class VersionCommand: public DaemonCommand { public: VersionCommand(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif //COMMAND_VERSION_H_ +#endif // LINPHONE_DAEMON_COMMAND_VERSION_H_ diff --git a/daemon/commands/video.cc b/daemon/commands/video.cc index ffb2aa475..aa08bf7a7 100644 --- a/daemon/commands/video.cc +++ b/daemon/commands/video.cc @@ -19,6 +19,8 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "commands/video.h" +using namespace std; + Video::Video() : DaemonCommand("video", "video ", @@ -42,15 +44,15 @@ Video::Video() : "Reason: No call with such id.")); } -void Video::exec(Daemon* app, const char* args) +void Video::exec(Daemon* app, const string& args) { LinphoneCore *lc = app->getCore(); int cid; LinphoneCall *call = NULL; bool activate = false; - int argc = sscanf(args, "%i", &cid); - - if ( argc == 1) { // should take current call + istringstream ist(args); + ist >> cid; + if (ist.fail()) { call = linphone_core_get_current_call(lc); if (call == NULL) { app->sendResponse(Response("No current call available.")); @@ -64,12 +66,12 @@ void Video::exec(Daemon* app, const char* args) } } - if (linphone_call_get_state(call)==LinphoneCallStreamsRunning){ + if (linphone_call_get_state(call) == LinphoneCallStreamsRunning) { LinphoneCallParams *new_params = linphone_core_create_call_params(lc, call); activate = !linphone_call_params_video_enabled(new_params); - linphone_call_params_enable_video(new_params,activate); - linphone_core_update_call(lc,call,new_params); + linphone_call_params_enable_video(new_params, activate); + linphone_core_update_call(lc, call, new_params); linphone_call_params_destroy(new_params); } else { @@ -77,8 +79,7 @@ void Video::exec(Daemon* app, const char* args) return; } - app->sendResponse(Response(activate?"Camera activated.": - "Camera deactivated", Response::Ok)); + app->sendResponse(Response(activate ? "Camera activated." : "Camera deactivated", Response::Ok)); } @@ -105,41 +106,46 @@ VideoSource::VideoSource(): "Reason: No call with such id.")); } -void VideoSource::exec(Daemon* app, const char* args) +void VideoSource::exec(Daemon* app, const string& args) { LinphoneCore *lc = app->getCore(); LinphoneCall *call = NULL; + string subcommand; int cid; int argc = 0; bool activate = false; - char command[6]; - argc = sscanf(args, "%5s %i", command, &cid); - command[5] = 0; - - if ( argc == 1) { // should take current call + istringstream ist(args); + ist >> subcommand; + if (ist.fail()) { + app->sendResponse(Response("Missing parameter.", Response::Error)); + return; + } + ist >> cid; + if (ist.fail()) { call = linphone_core_get_current_call(lc); if (call == NULL) { app->sendResponse(Response("No current call available.")); return; } - } else if( argc == 2 ) { + } else { call = app->findCall(cid); if (call == NULL) { app->sendResponse(Response("No call with such id.")); return; } - } else { - app->sendResponse(Response("Invalid command")); - return; } - activate = (strcmp(command,"cam") == 0); - + if (subcommand.compare("cam") == 0) { + activate = true; + } else if (subcommand.compare("dummy") == 0) { + activate = false; + } else { + app->sendResponse(Response("Invalid source.", Response::Error)); + return; + } linphone_call_enable_camera(call,activate); - - app->sendResponse(Response(activate?"Dummy source selected.": - "Webcam source selected.", Response::Ok)); + app->sendResponse(Response(activate ? "Dummy source selected." : "Webcam source selected.", Response::Ok)); } @@ -157,11 +163,10 @@ AutoVideo::AutoVideo(): "Auto video OFF")); } -void AutoVideo::exec(Daemon* app, const char* args) +void AutoVideo::exec(Daemon* app, const std::string& args) { - bool enable = (strcmp(args,"on") == 0); + bool enable = (args.compare("on") == 0); app->setAutoVideo(enable); - app->sendResponse(Response(enable?"Auto video ON": - "Auto video OFF", Response::Ok)); + app->sendResponse(Response(enable?"Auto video ON": "Auto video OFF", Response::Ok)); } diff --git a/daemon/commands/video.h b/daemon/commands/video.h index 3fe9b07e9..b45688817 100644 --- a/daemon/commands/video.h +++ b/daemon/commands/video.h @@ -17,8 +17,8 @@ along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef CALLCAMERA_H -#define CALLCAMERA_H +#ifndef LINPHONE_DAEMON_COMMAND_VIDEO_H +#define LINPHONE_DAEMON_COMMAND_VIDEO_H #include "daemon.h" @@ -26,7 +26,7 @@ class Video : public DaemonCommand { public: Video(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; @@ -34,14 +34,14 @@ class VideoSource : public DaemonCommand { public: VideoSource(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; class AutoVideo : public DaemonCommand { public: AutoVideo(); - virtual void exec(Daemon *app, const char *args); + virtual void exec(Daemon *app, const std::string& args); }; -#endif // CALLCAMERA_H +#endif // LINPHONE_DAEMON_COMMAND_VIDEO_H diff --git a/daemon/daemon.cc b/daemon/daemon.cc index cb4cfa358..c1ed1ef60 100644 --- a/daemon/daemon.cc +++ b/daemon/daemon.cc @@ -287,10 +287,10 @@ PayloadTypeParser::PayloadTypeParser(LinphoneCore *core, const string &mime_type } } -DaemonCommandExample::DaemonCommandExample(const char *command, const char *output) +DaemonCommandExample::DaemonCommandExample(const string& command, const string& output) : mCommand(command), mOutput(output) {} -DaemonCommand::DaemonCommand(const char *name, const char *proto, const char *description) : +DaemonCommand::DaemonCommand(const string& name, const string& proto, const string& description) : mName(name), mProto(proto), mDescription(description) { } @@ -313,8 +313,8 @@ const string DaemonCommand::getHelp() const { return ost.str(); } -bool DaemonCommand::matches(const char *name) const { - return strcmp(name, mName.c_str()) == 0; +bool DaemonCommand::matches(const string& name) const { + return mName.compare(name) == 0; } Daemon::Daemon(const char *config_path, const char *factory_config_path, const char *log_file, const char *pipe_name, bool display_video, bool capture_video) : @@ -475,14 +475,14 @@ void Daemon::initCommands() { mCommands.push_back(new AnswerCommand()); mCommands.push_back(new CallStatusCommand()); mCommands.push_back(new CallStatsCommand()); - mCommands.push_back(new CallPause()); - mCommands.push_back(new CallMute()); - mCommands.push_back(new CallResume()); - mCommands.push_back(new CallTransfer()); + mCommands.push_back(new CallPauseCommand()); + mCommands.push_back(new CallMuteCommand()); + mCommands.push_back(new CallResumeCommand()); + mCommands.push_back(new CallTransferCommand()); mCommands.push_back(new Video()); mCommands.push_back(new VideoSource()); mCommands.push_back(new AutoVideo()); - mCommands.push_back(new Conference()); + mCommands.push_back(new ConferenceCommand()); mCommands.push_back(new AudioCodecGetCommand()); mCommands.push_back(new AudioCodecEnableCommand()); mCommands.push_back(new AudioCodecDisableCommand()); @@ -591,10 +591,14 @@ void Daemon::iterate() { } } -void Daemon::execCommand(const char *cl) { - char args[sLineSize] = { 0 }; - char name[sLineSize] = { 0 }; - sscanf(cl, "%511s %511[^\n]", name, args); //Read the rest of line in args +void Daemon::execCommand(const string &command) { + istringstream ist(command); + string name; + ist >> name; + stringbuf argsbuf; + ist.get(argsbuf); + string args = argsbuf.str(); + if (!args.empty() && (args[0] == ' ')) args.erase(0, 1); list::iterator it = find_if(mCommands.begin(), mCommands.end(), bind2nd(mem_fun(&DaemonCommand::matches), name)); if (it != mCommands.end()) { ms_mutex_lock(&mMutex); @@ -606,27 +610,26 @@ void Daemon::execCommand(const char *cl) { } void Daemon::sendResponse(const Response &resp) { - char buf[4096] = { 0 }; - int size; - size = resp.toBuf(buf, sizeof(buf)); + string buf = resp.toBuf(); if (mChildFd != (ortp_pipe_t)-1) { - if (ortp_pipe_write(mChildFd, (uint8_t *)buf, size) == -1) { + if (ortp_pipe_write(mChildFd, (uint8_t *)buf.c_str(), buf.size()) == -1) { ms_error("Fail to write to pipe: %s", strerror(errno)); } } else { - fprintf(stdout, "%s", buf); - fflush(stdout); + cout << buf << flush; } } -char *Daemon::readPipe(char *buffer, int buflen) { +string Daemon::readPipe() { + char buffer[32768]; + memset(buffer, '\0', sizeof(buffer)); #ifdef _WIN32 if (mChildFd == (ortp_pipe_t)-1) { mChildFd = ortp_server_pipe_accept_client(mServerFd); ms_message("Client accepted"); } if (mChildFd != (ortp_pipe_t)-1) { - int ret = ortp_pipe_read(mChildFd, (uint8_t *)buffer, buflen); + int ret = ortp_pipe_read(mChildFd, (uint8_t *)buffer, sizeof(buffer)); if (ret == -1) { ms_error("Fail to read from pipe: %s", strerror(errno)); mChildFd = (ortp_pipe_t)-1; @@ -634,9 +637,9 @@ char *Daemon::readPipe(char *buffer, int buflen) { if (ret == 0) { ms_message("Client disconnected"); mChildFd = (ortp_pipe_t)-1; - return NULL; + return ""; } - buffer[ret] = 0; + buffer[ret] = '\0'; return buffer; } } @@ -671,7 +674,7 @@ char *Daemon::readPipe(char *buffer, int buflen) { } if (mChildFd != (ortp_pipe_t)-1 && (pfd[1].revents & POLLIN)) { int ret; - if ((ret = ortp_pipe_read(mChildFd, (uint8_t *)buffer, buflen)) == -1) { + if ((ret = ortp_pipe_read(mChildFd, (uint8_t *)buffer, sizeof(buffer))) == -1) { ms_error("Fail to read from pipe: %s", strerror(errno)); } else { if (ret == 0) { @@ -680,7 +683,7 @@ char *Daemon::readPipe(char *buffer, int buflen) { mChildFd = (ortp_pipe_t)-1; return NULL; } - buffer[ret] = 0; + buffer[ret] = '\0; return buffer; } } @@ -763,74 +766,77 @@ void Daemon::dumpCommandsHelpHtml(){ static void printHelp() { - fprintf(stdout, "daemon-linphone []\n" + cout << "daemon-linphone []" << endl << #if defined(LICENCE_GPL) || defined(LICENCE_COMMERCIAL) - "Licence: " + "Licence: " #ifdef LICENCE_GPL - "GPL" + "GPL" #endif #ifdef LICENCE_COMMERCIAL - "Commercial" + "Commercial" #endif - "\n" + << endl << #endif - "where options are :\n" - "\t--help\t\t\tPrint this notice.\n" - "\t--dump-commands-help\tDump the help of every available commands.\n" - "\t--dump-commands-html-help\tDump the help of every available commands.\n" - "\t--pipe \tCreate an unix server socket to receive commands.\n" - "\t--log \t\tSupply a file where the log will be saved.\n" - "\t--factory-config \tSupply a readonly linphonerc style config file to start with.\n" - "\t--config \t\tSupply a linphonerc style config file to start with.\n" - "\t--disable-stats-events\t\tDo not automatically raise RTP statistics events.\n" - "\t--enable-lsd\t\tUse the linphone sound daemon.\n" - "\t-C\t\t\tenable video capture.\n" - "\t-D\t\t\tenable video display.\n"); + "where options are :" << endl << + "\t--help Print this notice." << endl << + "\t--dump-commands-help Dump the help of every available commands." << endl << + "\t--dump-commands-html-help Dump the help of every available commands." << endl << + "\t--pipe Create an unix server socket to receive commands." << endl << + "\t--log Supply a file where the log will be saved." << endl << + "\t--factory-config Supply a readonly linphonerc style config file to start with." << endl << + "\t--config Supply a linphonerc style config file to start with." << endl << + "\t--disable-stats-events Do not automatically raise RTP statistics events." << endl << + "\t--enable-lsd Use the linphone sound daemon." << endl << + "\t-C Enable video capture." << endl << + "\t-D Enable video display." << endl; } void Daemon::startThread() { ms_thread_create(&this->mThread, NULL, Daemon::iterateThread, this); } -char *Daemon::readLine(const char *prompt, bool *eof) { +#ifdef max +#undef max +#endif + +string Daemon::readLine(const string& prompt, bool *eof) { *eof=false; #ifdef HAVE_READLINE - return readline(prompt); + return readline(prompt.c_str()); #else if (cin.eof()) { *eof=true; - return NULL; + return ""; } cout << prompt; - char *buff = (char *) malloc(sLineSize); - cin.getline(buff, sLineSize); - return buff; + stringbuf outbuf; + cin.get(outbuf); + cin.clear(); + cin.ignore(std::numeric_limits::max(), '\n'); + return outbuf.str(); #endif } int Daemon::run() { - char line[sLineSize] = "daemon-linphone>"; - char *ret; + const string prompt("daemon-linphone>"); mRunning = true; startThread(); while (mRunning) { + string line; bool eof=false; if (mServerFd == (ortp_pipe_t)-1) { - ret = readLine(line,&eof); - if (ret && ret[0] != '\0') { + line = readLine(prompt, &eof); + if (!line.empty()) { #ifdef HAVE_READLINE - add_history(ret); + add_history(line.c_str()); #endif } } else { - ret = readPipe(line, sLineSize); + line = readPipe(); } - if (ret && ret[0] != '\0') { - execCommand(ret); - } - if (mServerFd == (ortp_pipe_t)-1 && ret != NULL) { - free(ret); + if (!line.empty()) { + execCommand(line); } if (eof && mRunning) { mRunning = false; // ctrl+d diff --git a/daemon/daemon.h b/daemon/daemon.h index 8c33cfc06..a768b0f77 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -58,7 +58,7 @@ class Daemon; class DaemonCommandExample { public: - DaemonCommandExample(const char *command, const char *output); + DaemonCommandExample(const std::string& command, const std::string& output); ~DaemonCommandExample() {} const std::string &getCommand() const { return mCommand; @@ -74,8 +74,8 @@ private: class DaemonCommand { public: virtual ~DaemonCommand() {} - virtual void exec(Daemon *app, const char *args)=0; - bool matches(const char *name) const; + virtual void exec(Daemon *app, const std::string& args)=0; + bool matches(const std::string& name) const; const std::string getHelp() const; const std::string &getProto() const { return mProto; @@ -88,7 +88,7 @@ public: } void addExample(const DaemonCommandExample *example); protected: - DaemonCommand(const char *name, const char *proto, const char *description); + DaemonCommand(const std::string& name, const std::string& proto, const std::string& description); const std::string mName; const std::string mProto; const std::string mDescription; @@ -105,14 +105,6 @@ public: Response() : mStatus(Ok) { } - Response(const char *msg, Status status = Error) : - mStatus(status) { - if (status == Ok) { - mBody = msg; - } else { - mReason = msg; - } - } Response(const std::string& msg, Status status = Error): mStatus(status) { if( status == Ok) { @@ -125,25 +117,26 @@ public: void setStatus(Status st) { mStatus = st; } - void setReason(const char *reason) { + void setReason(const std::string& reason) { mReason = reason; } - void setBody(const char *body) { + void setBody(const std::string& body) { mBody = body; } const std::string &getBody() const { return mBody; } - virtual int toBuf(char *dst, int dstlen) const { - int i = 0; - i += snprintf(dst + i, dstlen - i, "Status: %s\n", mStatus == Ok ? "Ok" : "Error"); - if (mReason.size() > 0) { - i += snprintf(dst + i, dstlen - i, "Reason: %s\n", mReason.c_str()); + virtual std::string toBuf() const { + std::ostringstream buf; + std::string status = (mStatus == Ok) ? "Ok" : "Error"; + buf << "Status: " << status << "\n"; + if (!mReason.empty()) { + buf << "Reason: " << mReason << "\n"; } - if (mBody.size() > 0) { - i += snprintf(dst + i, dstlen - i, "\n%s\n", mBody.c_str()); + if (!mBody.empty()) { + buf << "\n" << mBody << "\n"; } - return i; + return buf.str(); } private: Status mStatus; @@ -250,16 +243,15 @@ private: void callStateChanged(LinphoneCall *call, LinphoneCallState state, const char *msg); void callStatsUpdated(LinphoneCall *call, const LinphoneCallStats *stats); void dtmfReceived(LinphoneCall *call, int dtmf); - void execCommand(const char *cl); - char *readLine(const char *, bool*); - char *readPipe(char *buffer, int buflen); + void execCommand(const std::string &command); + std::string readLine(const std::string&, bool*); + std::string readPipe(); void iterate(); void iterateStreamStats(); void startThread(); void stopThread(); void initCommands(); void uninitCommands(); - void iterateStreamStats(LinphoneCore *lc); LinphoneCore *mLc; LinphoneSoundDaemon *mLSD; std::list mCommands; @@ -276,7 +268,6 @@ private: int mAudioStreamIds; ms_thread_t mThread; ms_mutex_t mMutex; - static const int sLineSize = 512; std::map mAudioStreams; };