/* * This file is part of the Dialogic Woomera Server project. * * * Copyright (C) 2009 Dialogic Corporation * All Rights Reserved * */ /*! * \file appwoomera.cxx * \brief Woomera HMP server. * \author John Tarlton * \author Antony Martin * \version 0.1 */ /*----------------------------- Dependencies -------------------------------*/ #include "logger.h" #include "getoption.h" #include "dialogicmanager.h" #include #include #include /*--------------------------------------------------------------------------*/ DialogicManager* dm; //FIXME make singleton! /* * */ void dialogicEventCallback( woomera_server_attr* attr ) { sr_waitevt(0); METAEVENT metaevent; if (gc_GetMetaEvent(&metaevent) != GC_SUCCESS) { /* serious problem - should never fail */ LOGDEBUG("gc_GetMetaEvent() failed"); } else { dm->dispatchEvent(metaevent); } } /* * ISDN protocol callback for Woomera messages. */ woomera_server_response* protocol_message_handler( woomera_callctlr_command* msg, void* prot_user_data ) { switch ( msg->e ) { case WOOMERA_CALLCTL_COMMAND_MAKE_CALL: { woomera_callctlr_command_make_call* callParms = &msg->m.make_call; woomera_server_response* response = woomera_server_response_new(msg->connection_id); // get number to dial std::string remote_number; if ( woomera_mime_includes(msg->common_mime, woomera_key_remote_url) != 0 ) { remote_number = woomera_mime_get_string(msg->common_mime, woomera_key_remote_url); } else { remote_number = callParms->called_number; } //FIXME CLI name and number + media dm->makeCall(msg->call_id, "1234", "local", remote_number); response->response = 200; strcpy(response->args, "Call started"); return response; } break; case WOOMERA_CALLCTL_COMMAND_HANGUP_CALL: { // declare response woomera_server_response* response = woomera_server_response_new(msg->connection_id); if ( !dm->hangup(msg->call_id) ) { response->response = 404; strcpy(response->args, "Call not found"); } else { response->response = 200; strcpy(response->args, "Call cleared"); } return response; } break; case WOOMERA_CALLCTL_COMMAND_ANSWER_CALL: { woomera_server_response * response = woomera_server_response_new(msg->connection_id); if ( !dm->answer(msg->call_id) ) { response->response = 404; strcpy(response->args, "Call not found"); } else { response->response = 200; strcpy(response->args, "Call answered"); } return response; } break; default: break; } return 0; } /* * ISDN protocol callback for Woomera media */ int protocol_media_handler( void* user_data, void* call_user_data, const char* call_id, unsigned session, unsigned int cmd, void* parm, int parmlen ) { switch ( cmd ) { case WOOMERA_MEDIA_CTL_READ_START: return 1; case WOOMERA_MEDIA_CTL_READ_STOP: return 1; case WOOMERA_MEDIA_CTL_READ: return 0; case WOOMERA_MEDIA_CTL_WRITE_START: return 1; case WOOMERA_MEDIA_CTL_WRITE_STOP: return 1; case WOOMERA_MEDIA_CTL_WRITE: return 0; } return 0; } /* * Protocol definition. */ static woomera_protocol_def isdn_protocol = { WOOMERA_PROTOCOL_READ_PUSH | WOOMERA_PROTOCOL_WRITE_PUSH, protocol_message_handler, protocol_media_handler }; /*! * */ void appwoomera_run(const GetOptions& opts) { LOGDEBUG("appwoomera_run()"); /* Command line options */ std::string opt_woomera_port = opts.getValue("woomera-port"); if ( opt_woomera_port.empty() ) { opt_woomera_port = "42420"; } /* initialise woomera subsystem */ woomera_init(); woomera_server* server = woomera_server_new(); woomera_callctlr* callctlr = woomera_callctlr_new(woomera_server_send_event, server); woomera_callctlr_add_protocol(callctlr, &isdn_protocol, "isdn", 0); /* create the woomera server */ woomera_server_attr * attr = woomera_server_attr_new(); attr->server = server; attr->callctlr = callctlr; attr->port = atoi(opt_woomera_port.c_str()); attr->timeout = 1000; attr->broadcast_port = 0; attr->community[0] = '\0'; attr->callback = &dialogicEventCallback; attr->user_data = 0; /* initialise dialogic */ int nfds = sr_getfdcnt(); int* fdarray = (int *) malloc(sizeof(int) * nfds); sr_getfdinfo(fdarray); for ( int i = 0; i < nfds; i++ ) { woomera_server_set_event(server, fdarray[i], 0); } dm = new DialogicManager; dm->setCallCtlr(callctlr); // XXXXX dm->init(); woomera_server_run(attr); /* exit */ woomera_server_delete(server); } /* vim:ts=4:set nu: * EOF */