diff --git a/tools/lpsendmsg.c b/tools/lpsendmsg.c new file mode 100644 index 000000000..a88407055 --- /dev/null +++ b/tools/lpsendmsg.c @@ -0,0 +1,197 @@ +/* +linphone +Copyright (C) 2016 Belledonne Communications SARL + (simon.morlat@linphone.org) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + + +#ifdef IN_LINPHONE +#include "linphonecore.h" +#else +#include "linphone/linphonecore.h" +#endif +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include + +static bool_t running = TRUE; +static const char *passwd = NULL; + +static void stop(int signum){ + running=FALSE; +} + +static void helper(const char *progname) { + printf("%s --from --to --route --passwd --text \n" + "\t\t\t--help\n" + "\t\t\t--from uri to send from\n" + "\t\t\t--to uri to send to\n" + "\t\t\t--route uri to send the message through\n" + "\t\t\t--passwd \n" + "\t\t\t--text \n" + "\t\t\t--verbose\n", progname); + exit(0); +} + +static void on_msg_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageState state){ + switch(state){ + case LinphoneChatMessageStateInProgress: + printf("Sending message...\n"); + break; + case LinphoneChatMessageStateNotDelivered: + fprintf(stderr, "Error sending message. Use --verbose to troubleshoot.\n"); + running = FALSE; + break; + case LinphoneChatMessageStateDelivered: + printf("Message transmitted succesfully.\n"); + running = FALSE; + break; + case LinphoneChatMessageStateFileTransferDone: + case LinphoneChatMessageStateFileTransferError: + case LinphoneChatMessageStateIdle: + break; + } +} + +static void auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain){ + running = FALSE; + if (passwd){ + fprintf(stderr, "Server rejected the supplied username or password\n"); + }else{ + fprintf(stderr, "Authentication requested by server. Please retry by supplying a password with --passwd.\n"); + } +} + +int main(int argc, char *argv[]){ + LinphoneCoreVTable vtable={0}; + LinphoneCore *lc; + int i; + LinphoneAddress *from = NULL; + LinphoneAddress *to = NULL; + LinphoneAddress *route = NULL; + LinphoneProxyConfig *cfg; + LinphoneChatMessage *msg; + LinphoneChatRoom *room; + LinphoneChatMessageCbs *cbs; + char * text = NULL; + char *tmp; + + signal(SIGINT,stop); + + for(i = 1; i < argc; ++i) { + if (strcmp(argv[i], "--verbose") == 0) { + linphone_core_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL); + } else if (strcmp(argv[i], "--from") == 0){ + i++; + if (i < argc){ + from = linphone_address_new(argv[i]); + if (!from) { + fprintf(stderr, "Incorrect from specified\n"); + return -1; + } + } + } else if (strcmp(argv[i], "--to") == 0){ + i++; + if (i < argc){ + to = linphone_address_new(argv[i]); + if (!to) { + fprintf(stderr, "Incorrect to specified\n"); + return -1; + } + } + }else if (strcmp(argv[i], "--route") == 0){ + i++; + if (i < argc){ + route = linphone_address_new(argv[i]); + if (!route) { + fprintf(stderr, "Incorrect route specified\n"); + return -1; + } + } + } else if (strcmp(argv[i], "--passwd") == 0){ + i++; + if (i < argc){ + passwd = argv[i]; + } + } else if (strcmp(argv[i], "--text") == 0){ + i++; + if (i < argc){ + text = argv[i]; + } + } else { + helper(argv[0]); + } + } + + if (!from) { + fprintf(stderr, "Please specify from.\n"); + helper(argv[0]); + return -1; + } + if (!to) { + fprintf(stderr, "Please specify to.\n"); + helper(argv[0]); + return -1; + } + if (!text){ + fprintf(stderr, "Please specify text to send.\n"); + helper(argv[0]); + return -1; + } + + vtable.auth_info_requested = auth_info_requested; + lc=linphone_core_new(&vtable,NULL, NULL, NULL); + + if (passwd){ + LinphoneAuthInfo *ai = linphone_core_create_auth_info(lc, linphone_address_get_username(from), NULL, passwd, NULL, NULL, NULL); + linphone_core_add_auth_info(lc, ai); + linphone_auth_info_destroy(ai); + } + + if (!route){ + route = linphone_address_clone(from); + linphone_address_set_username(route, NULL); + linphone_address_set_display_name(route, NULL); + } + + cfg = linphone_core_create_proxy_config(lc); + linphone_proxy_config_set_identity_address(cfg, from); + tmp = linphone_address_as_string(route); + linphone_proxy_config_set_server_addr(cfg, tmp); + ms_free(tmp); + linphone_proxy_config_enable_register(cfg, FALSE); + linphone_core_add_proxy_config(lc, cfg); + linphone_proxy_config_unref(cfg); + + room = linphone_core_get_chat_room(lc, to); + msg = linphone_chat_room_create_message(room, text); + cbs = linphone_chat_message_get_callbacks(msg); + linphone_chat_message_cbs_set_msg_state_changed(cbs, on_msg_state_changed); + linphone_chat_room_send_chat_message(room, msg); + /* main loop for receiving notifications and doing background linphonecore work: */ + while(running){ + linphone_core_iterate(lc); + ms_usleep(50000); + } + linphone_address_destroy(from); + linphone_address_destroy(to); + linphone_address_destroy(route); + linphone_core_destroy(lc); + return 0; +} +