Index: channels/chan_sip.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v retrieving revision 1.868 diff -u -r1.868 chan_sip.c --- channels/chan_sip.c 27 Sep 2005 02:12:36 -0000 1.868 +++ channels/chan_sip.c 28 Sep 2005 07:08:33 -0000 @@ -12467,6 +12467,14 @@ "Skips to priority+101 if header does not exist\n" "Otherwise returns 0\n"; +static char *app_sipgetpeerdata = "SIPGetPeerData"; +static char *synopsis_sipgetpeerdata = "Get Peer data (Accountcode, UserAgent, Codecs, ...) about a specific peer"; + +static char *descrip_sipgetpeerdata = "" +" SIPGetPeerData(peer|variable)\n" +"Get Peer related data of type 'variable' which can be referenced\n" +"By the first feild of each pair in an 'sip show peer'\n"; + /*--- sip_dtmfmode: change the DTMFmode for a SIP call (application) ---*/ static int sip_dtmfmode(struct ast_channel *chan, void *data) { @@ -12601,6 +12609,118 @@ return 0; } +static int sip_getpeerdata(struct ast_channel *chan, void *data) +{ + struct sip_peer *peer; + int x=0; + char peerdata[1024] = ""; + char *peername = NULL; + char *request = NULL; + char *argcopy = NULL; + char *args[2]; + + if (!data) { + ast_log(LOG_WARNING, "This application requires atleast the peer name.\n"); + return 0; + } + + if (data) + argcopy = ast_strdupa((char *)data); + + if (ast_separate_app_args(argcopy, '|', args, sizeof(args) / sizeof(args[0])) < 1) { + ast_log(LOG_WARNING, "Cannot Parse Arguements.\n"); + return -1; + } + + peername = args[x++]; + request = args[x++]; + + if (!peername || !request) { + ast_log(LOG_WARNING, "Invalid Arguments.\n"); + return -1; + } + + ast_mutex_lock(&chan->lock); + + peer = find_peer(peername, NULL, 1); + + if (peer) { + if(strcasecmp(request, "Name") == 0) + strcat(peerdata, peer->name); + if(strcasecmp(request, "Secret") == 0) + strcat(peerdata, ast_strlen_zero(peer->secret)?"":""); + if(strcasecmp(request, "MD5Secret") == 0) + strcat(peerdata, ast_strlen_zero(peer->md5secret)?"":""); + // DO REALM AUTH + if(strcasecmp(request, "Context") == 0) + strcat(peerdata, peer->context); + if(strcasecmp(request, "SubscribeContext") == 0) + strcat(peerdata, ast_strlen_zero(peer->subscribecontext)?"":peer->subscribecontext); + if(strcasecmp(request, "Language") == 0) + strcat(peerdata, peer->language); + if(strcasecmp(request, "Accountcode") == 0) + strcat(peerdata, peer->accountcode); + if(strcasecmp(request, "AMAFlags") == 0) + strcat(peerdata, ast_cdr_flags2str(peer->amaflags)); + if(strcasecmp(request, "CallingPres") == 0) + strcat(peerdata, ast_describe_caller_presentation(peer->callingpres)); + if(strcasecmp(request, "FromUser") == 0 && !ast_strlen_zero(peer->fromuser)) + strcat(peerdata, peer->fromuser); + if(strcasecmp(request, "FromDomain") == 0 && !ast_strlen_zero(peer->fromdomain)) + strcat(peerdata, peer->fromdomain); + // DO CALLGROUP/PICKUPGROUP + if(strcasecmp(request, "Mailbox") == 0) + strcat(peerdata, peer->mailbox); + if(strcasecmp(request, "VMExten") == 0 || strcasecmp(request, "VM Extension")) + strcat(peerdata, peer->vmexten); + if(strcasecmp(request, "LastMsgsSent") == 0) + strcat(peerdata, peer->lastmsgssent); + if(strcasecmp(request, "CallLimit") == 0 || strcasecmp(request, "Call_Limit") || strcasecmp(request, "Call Limit")) + strcat(peerdata, peer->call_limit); + if(strcasecmp(request, "Dynamic") == 0) + strcat(peerdata, peer->(ast_test_flag(peer, SIP_DYNAMIC)?"Yes":"No")); + if(strcasecmp(request, "Callerid") == 0) + strcat(peerdata, ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "")); + if(strcasecmp(request, "Expire") == 0) + strcat(peerdata, peer->expire); + if(strcasecmp(request, "Insecure") == 0) + strcat(peerdata, insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE))); + if(strcasecmp(request, "Nat") == 0) + strcat(peerdata, nat2str(ast_test_flag(peer, SIP_NAT))); + if(strcasecmp(request, "ACL") == 0) + strcat(peerdata, (peer->ha?"Yes":"No")); + if(strcasecmp(request, "CanReinvite") == 0) + strcat(peerdata, (ast_test_flag(peer, SIP_CAN_REINVITE)?"Yes":"No")); + if(strcasecmp(request, "PromiscRedir") == 0) + strcat(peerdata, (ast_test_flag(peer, SIP_PROMISCREDIR)?"Yes":"No")); + if(strcasecmp(request, "UserReqPhone") == 0 || strcasecmp(request, "User=Phone")) + strcat(peerdata, (ast_test_flag(peer, SIP_USEREQPHONE)?"Yes":"No")); + if(strcasecmp(request, "DTMFmode") == 0) + strcat(peerdata, peer->dtmfmode2str(ast_test_flag(peer, SIP_DTMF))); + if(strcasecmp(request, "LastMsg") == 0) + strcat(peerdata, peer->lastmsg); + if(strcasecmp(request, "ToHost") == 0) + strcat(peerdata, peer->tohost); + //DO ADDR->IP/DEFADDR->IP + if(strcasecmp(request, "DefUsername") == 0 || strcasecmp(request, "Def. Username") == 0) + strcat(peerdata, peer->username); + //DO SIP Options + //DO Status + if(strcasecmp(request, "Useragent") == 0) + strcat(peerdata, peer->useragent); + if(strcasecmp(request, "fullcontact") == 0) + strcat(peerdata, peer->fullcontact); + //DO CHANVARS + } + + ASTOBJ_UNREF(peer,sip_destroy_peer); + + ast_mutex_unlock(&chan->lock); + + pbx_builtin_setvar_helper(chan, "SIPPEERDATA", peerdata); + return RESULT_SUCCESS; +} + /*--- sip_sipredirect: Transfer call before connect with a 302 redirect ---*/ /* Called by the transfer() dialplan application through the sip_transfer() */ /* pbx interface function if the call is in ringing state */ @@ -12831,6 +12951,7 @@ /* These will be removed soon */ ast_register_application(app_sipaddheader, sip_addheader, synopsis_sipaddheader, descrip_sipaddheader); ast_register_application(app_sipgetheader, sip_getheader, synopsis_sipgetheader, descrip_sipgetheader); + ast_register_application(app_sipgetpeerdata, sip_getpeerdata, synopsis_sipgetpeerdata, descrip_sipgetpeerdata); /* Register dialplan functions */ ast_custom_function_register(&sip_header_function);