Index: funcs/func_language.c =================================================================== RCS file: /usr/cvsroot/asterisk/funcs/func_language.c,v retrieving revision 1.4 diff -u -r1.4 func_language.c --- funcs/func_language.c 24 Oct 2005 20:12:06 -0000 1.4 +++ funcs/func_language.c 4 Nov 2005 17:03:50 -0000 @@ -33,6 +33,7 @@ #include "asterisk/logger.h" #include "asterisk/utils.h" #include "asterisk/app.h" +#include "asterisk/causes.h" static char *builtin_function_language_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) { @@ -47,6 +48,118 @@ ast_copy_string(chan->language, value, sizeof(chan->language)); } +static char *builtin_function_hangupcause_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) +{ + snprintf(buf, len, "%d", chan->hangupcause); + return buf; +} + +static void builtin_function_hangupcause_write(struct ast_channel *chan, char *cmd, char *data, const char *value) +{ + int tmp; + if (value) { + if (sscanf(value, "%d", &tmp) == 1) { + chan->hangupcause = tmp; + + /* Common cause codes */ + } else if (! strcasecmp(value, "USER_BUSY") || ! strcasecmp(value, "BUSY")) { + chan->hangupcause = AST_CAUSE_USER_BUSY; + } else if ((! strcasecmp(value, "NORMAL_CIRCUIT_CONGESTION")) || (! strcasecmp(value, "CONGESTION"))) { + chan->hangupcause = AST_CAUSE_NORMAL_CIRCUIT_CONGESTION; + } else if ((! strcasecmp(value, "NETWORK_OUT_OF_ORDER")) || (! strcasecmp(value, "FAILURE"))) { + chan->hangupcause = AST_CAUSE_NETWORK_OUT_OF_ORDER; + } else if ((! strcasecmp(value, "NO_ANSWER")) || (! strcasecmp(value, "NOANSWER"))) { + chan->hangupcause = AST_CAUSE_NO_ANSWER; + } else if ((! strcasecmp(value, "NORMAL_CLEARING")) || (! strcasecmp(value, "NORMAL"))) { + chan->hangupcause = AST_CAUSE_NORMAL_CLEARING; + } else if ((! strcasecmp(value, "NO_ROUTE_DESTINATION")) || (! strcasecmp(value, "UNREGISTERED"))) { + chan->hangupcause = AST_CAUSE_NO_ROUTE_DESTINATION; + } else if (! strcasecmp(value, "NOTDEFINED")) { + chan->hangupcause = 0; + } else if ((! strcasecmp(value, "CHAN_NOT_IMPLEMENTED")) || (! strcasecmp(value, "NOSUCHDRIVER"))) { + chan->hangupcause = AST_CAUSE_CHAN_NOT_IMPLEMENTED; + + /* Uncommon cause codes */ + } else if (! strcasecmp(value, "UNALLOCATED")) { + chan->hangupcause = AST_CAUSE_UNALLOCATED; + } else if (! strcasecmp(value, "NO_ROUTE_TRANSIT_NET")) { + chan->hangupcause = AST_CAUSE_NO_ROUTE_TRANSIT_NET; + } else if (! strcasecmp(value, "CHANNEL_UNACCEPTABLE")) { + chan->hangupcause = AST_CAUSE_CHANNEL_UNACCEPTABLE; + } else if (! strcasecmp(value, "CALL_AWARDED_DELIVERED")) { + chan->hangupcause = AST_CAUSE_CALL_AWARDED_DELIVERED; + } else if (! strcasecmp(value, "NO_USER_RESPONSE")) { + chan->hangupcause = AST_CAUSE_NO_USER_RESPONSE; + } else if (! strcasecmp(value, "CALL_REJECTED")) { + chan->hangupcause = AST_CAUSE_CALL_REJECTED; + } else if (! strcasecmp(value, "NUMBER_CHANGED")) { + chan->hangupcause = AST_CAUSE_NUMBER_CHANGED; + } else if (! strcasecmp(value, "DESTINATION_OUT_OF_ORDER")) { + chan->hangupcause = AST_CAUSE_DESTINATION_OUT_OF_ORDER; + } else if (! strcasecmp(value, "INVALID_NUMBER_FORMAT")) { + chan->hangupcause = AST_CAUSE_INVALID_NUMBER_FORMAT; + } else if (! strcasecmp(value, "FACILITY_REJECTED")) { + chan->hangupcause = AST_CAUSE_FACILITY_REJECTED; + } else if (! strcasecmp(value, "RESPONSE_TO_STATUS_ENQUIRY")) { + chan->hangupcause = AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY; + } else if (! strcasecmp(value, "NORMAL_UNSPECIFIED")) { + chan->hangupcause = AST_CAUSE_NORMAL_UNSPECIFIED; + } else if (! strcasecmp(value, "NORMAL_TEMPORARY_FAILURE")) { + chan->hangupcause = AST_CAUSE_NORMAL_TEMPORARY_FAILURE; + } else if (! strcasecmp(value, "SWITCH_CONGESTION")) { + chan->hangupcause = AST_CAUSE_SWITCH_CONGESTION; + } else if (! strcasecmp(value, "ACCESS_INFO_DISCARDED")) { + chan->hangupcause = AST_CAUSE_ACCESS_INFO_DISCARDED; + } else if (! strcasecmp(value, "REQUESTED_CHAN_UNAVAIL")) { + chan->hangupcause = AST_CAUSE_REQUESTED_CHAN_UNAVAIL; + } else if (! strcasecmp(value, "PRE_EMPTED")) { + chan->hangupcause = AST_CAUSE_PRE_EMPTED; + } else if (! strcasecmp(value, "FACILITY_NOT_SUBSCRIBED")) { + chan->hangupcause = AST_CAUSE_FACILITY_NOT_SUBSCRIBED; + } else if (! strcasecmp(value, "OUTGOING_CALL_BARRED")) { + chan->hangupcause = AST_CAUSE_OUTGOING_CALL_BARRED; + } else if (! strcasecmp(value, "INCOMING_CALL_BARRED")) { + chan->hangupcause = AST_CAUSE_INCOMING_CALL_BARRED; + } else if (! strcasecmp(value, "BEARERCAPABILITY_NOTAUTH")) { + chan->hangupcause = AST_CAUSE_BEARERCAPABILITY_NOTAUTH; + } else if (! strcasecmp(value, "BEARERCAPABILITY_NOTAVAIL")) { + chan->hangupcause = AST_CAUSE_BEARERCAPABILITY_NOTAVAIL; + } else if (! strcasecmp(value, "BEARERCAPABILITY_NOTIMPL")) { + chan->hangupcause = AST_CAUSE_BEARERCAPABILITY_NOTIMPL; + } else if (! strcasecmp(value, "FACILITY_NOT_IMPLEMENTED")) { + chan->hangupcause = AST_CAUSE_FACILITY_NOT_IMPLEMENTED; + } else if (! strcasecmp(value, "INVALID_CALL_REFERENCE")) { + chan->hangupcause = AST_CAUSE_INVALID_CALL_REFERENCE; + } else if (! strcasecmp(value, "INCOMPATIBLE_DESTINATION")) { + chan->hangupcause = AST_CAUSE_INCOMPATIBLE_DESTINATION; + } else if (! strcasecmp(value, "INVALID_MSG_UNSPECIFIED")) { + chan->hangupcause = AST_CAUSE_INVALID_MSG_UNSPECIFIED; + } else if (! strcasecmp(value, "MANDATORY_IE_MISSING")) { + chan->hangupcause = AST_CAUSE_MANDATORY_IE_MISSING; + } else if (! strcasecmp(value, "MESSAGE_TYPE_NONEXIST")) { + chan->hangupcause = AST_CAUSE_MESSAGE_TYPE_NONEXIST; + } else if (! strcasecmp(value, "WRONG_MESSAGE")) { + chan->hangupcause = AST_CAUSE_WRONG_MESSAGE; + } else if (! strcasecmp(value, "IE_NONEXIST")) { + chan->hangupcause = AST_CAUSE_IE_NONEXIST; + } else if (! strcasecmp(value, "INVALID_IE_CONTENTS")) { + chan->hangupcause = AST_CAUSE_INVALID_IE_CONTENTS; + } else if (! strcasecmp(value, "WRONG_CALL_STATE")) { + chan->hangupcause = AST_CAUSE_WRONG_CALL_STATE; + } else if (! strcasecmp(value, "RECOVERY_ON_TIMER_EXPIRE")) { + chan->hangupcause = AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE; + } else if (! strcasecmp(value, "MANDATORY_IE_LENGTH_ERROR")) { + chan->hangupcause = AST_CAUSE_MANDATORY_IE_LENGTH_ERROR; + } else if (! strcasecmp(value, "PROTOCOL_ERROR")) { + chan->hangupcause = AST_CAUSE_PROTOCOL_ERROR; + } else if (! strcasecmp(value, "INTERWORKING")) { + chan->hangupcause = AST_CAUSE_INTERWORKING; + } else { + ast_log(LOG_WARNING, "Unknown cause code: '%s'\n", value); + } + } +} + #ifndef BUILTIN_FUNC static #endif @@ -66,6 +179,21 @@ .write = builtin_function_language_write, }; +#ifndef BUILTIN_FUNC +static +#endif +struct ast_custom_function hangupcause_function = { + .name = "HANGUPCAUSE", + .synopsis = "Gets or sets the channel's hangupcause.", + .syntax = "HANGUPCAUSE()", + .desc = "Allows a custom hangup causecode to be sent to the remote end at call\n" + "termination. A causecode is always specified at termination, whether the\n" + "call succeeded or failed. After setting this value, you should call the Hangup\n" + "application to terminate the call.\n", + .read = builtin_function_hangupcause_read, + .write = builtin_function_hangupcause_write, +}; + /* Local Variables: mode: C