[asterisk-commits] russell: branch russell/res_monkeys r79173 - in /team/russell/res_monkeys: ./...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Aug 13 09:04:54 CDT 2007


Author: russell
Date: Mon Aug 13 09:04:53 2007
New Revision: 79173

URL: http://svn.digium.com/view/asterisk?view=rev&rev=79173
Log:
resolve conflict in this mission critical branch

Modified:
    team/russell/res_monkeys/   (props changed)
    team/russell/res_monkeys/channels/chan_skinny.c
    team/russell/res_monkeys/funcs/func_devstate.c
    team/russell/res_monkeys/include/asterisk/channel.h
    team/russell/res_monkeys/main/channel.c
    team/russell/res_monkeys/pbx/pbx_spool.c
    team/russell/res_monkeys/res/res_odbc.c

Propchange: team/russell/res_monkeys/
------------------------------------------------------------------------------
    automerge = *

Propchange: team/russell/res_monkeys/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Propchange: team/russell/res_monkeys/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Aug 13 09:04:53 2007
@@ -1,1 +1,1 @@
-/trunk:1-79078
+/trunk:1-79172

Modified: team/russell/res_monkeys/channels/chan_skinny.c
URL: http://svn.digium.com/view/asterisk/team/russell/res_monkeys/channels/chan_skinny.c?view=diff&rev=79173&r1=79172&r2=79173
==============================================================================
--- team/russell/res_monkeys/channels/chan_skinny.c (original)
+++ team/russell/res_monkeys/channels/chan_skinny.c Mon Aug 13 09:04:53 2007
@@ -552,25 +552,159 @@
 #define SOFTKEY_GPICKUP			0x12
 
 struct soft_key_template_definition soft_key_template_default[] = {
-	{ "Redial",	 	0x01 },
-	{ "NewCall",	 	0x02 },
-	{ "Hold",	 	0x03 },
-	{ "Trnsfer",	 	0x04 },
-	{ "CFwdAll",	 	0x05 },
-	{ "CFwdBusy",	 	0x06 },
-	{ "CFwdNoAnswer",	0x07 },
-	{ "<<",		 	0x08 },
-	{ "EndCall",	 	0x09 },
-	{ "Resume",		0x0A },
-	{ "Answer",		0x0B },
-	{ "Info",		0x0C },
-	{ "Confrn",		0x0D },
-	{ "Park",		0x0E },
-	{ "Join",		0x0F },
-	{ "MeetMe",		0x10 },
-	{ "PickUp",		0x11 },
-	{ "GPickUp",		0x12 },
-};
+	{ "\200\001", 		SOFTKEY_REDIAL },
+	{ "\200\002", 		SOFTKEY_NEWCALL },
+	{ "\200\003", 		SOFTKEY_HOLD },
+	{ "\200\004", 		SOFTKEY_TRNSFER },
+	{ "\200\005", 		SOFTKEY_CFWDALL },
+	{ "\200\006", 		SOFTKEY_CFWDBUSY },
+	{ "\200\007", 		SOFTKEY_CFWDNOANSWER },
+	{ "\200\010", 		SOFTKEY_BKSPC },
+	{ "\200\011", 		SOFTKEY_ENDCALL },
+	{ "\200\012", 		SOFTKEY_RESUME },
+	{ "\200\013", 		SOFTKEY_ANSWER },
+	{ "\200\014", 		SOFTKEY_INFO },
+	{ "\200\015", 		SOFTKEY_CONFRN },
+	{ "\200\016", 		SOFTKEY_PARK },
+	{ "\200\017", 		SOFTKEY_JOIN },
+	{ "\200\020", 		SOFTKEY_MEETME },
+	{ "\200\021", 		SOFTKEY_PICKUP },
+	{ "\200\022", 		SOFTKEY_GPICKUP },
+};
+
+/* Localized message "codes" (in octal)
+   Below is en_US (taken from a 7970)
+
+   \200\xxx
+       \000: ???
+       \001: Redial
+       \002: New Call
+       \003: Hold
+       \004: Transfer
+       \005: CFwdALL
+       \006: CFwdBusy
+       \007: CFwdNoAnswer
+       \010: <<
+       \011: EndCall
+       \012: Resume
+       \013: Answer
+       \014: Info
+       \015: Confrn
+       \016: Park
+       \017: Join
+       \020: MeetMe
+       \021: PickUp
+       \022: GPickUp
+       \023: Your current options
+       \024: Off Hook
+       \025: On Hook
+       \026: Ring out
+       \027: From
+       \030: Connected
+       \031: Busy
+       \032: Line In Use
+       \033: Call Waiting
+       \034: Call Transfer
+       \035: Call Park
+       \036: Call Proceed
+       \037: In Use Remote
+       \040: Enter number
+       \041: Call park At
+       \042: Primary Only
+       \043: Temp Fail
+       \044: You Have VoiceMail
+       \045: Forwarded to
+       \046: Can Not Complete Conference
+       \047: No Conference Bridge
+       \050: Can Not Hold Primary Control
+       \051: Invalid Conference Participant
+       \052: In Conference Already
+       \053: No Participant Info
+       \054: Exceed Maximum Parties
+       \055: Key Is Not Active
+       \056: Error No License
+       \057: Error DBConfig
+       \060: Error Database
+       \061: Error Pass Limit
+       \062: Error Unknown
+       \063: Error Mismatch
+       \064: Conference
+       \065: Park Number
+       \066: Private
+       \067: Not Enough Bandwidth
+       \070: Unknown Number
+       \071: RmLstC
+       \072: Voicemail
+       \073: ImmDiv
+       \074: Intrcpt
+       \075: SetWtch
+       \076: TrnsfVM
+       \077: DND
+       \100: DivAll
+       \101: CallBack
+       \102: Network congestion,rerouting
+       \103: Barge
+       \104: Failed to setup Barge
+       \105: Another Barge exists
+       \106: Incompatible device type
+       \107: No Park Number Available
+       \110: CallPark Reversion
+       \111: Service is not Active
+       \112: High Traffic Try Again Later
+       \113: QRT
+       \114: MCID
+       \115: DirTrfr
+       \116: Select
+       \117: ConfList
+       \120: iDivert
+       \121: cBarge
+       \122: Can Not Complete Transfer
+       \123: Can Not Join Calls
+       \124: Mcid Successful
+       \125: Number Not Configured
+       \126: Security Error
+       \127: Video Bandwidth Unavailable
+       \130: VidMode
+       \131: Max Call Duration Timeout
+       \132: Max Hold Duration Timeout
+       \133: OPickUp
+       \134: ???
+       \135: ???
+       \136: ???
+       \137: ???
+       \140: ???
+       \141: External Transfer Restricted
+       \142: ???
+       \143: ???
+       \144: ???
+       \145: Mac Address
+       \146: Host Name
+       \147: Domain Name
+       \150: IP Address
+       \151: Subnet Mask
+       \152: TFTP Server 1
+       \153: Default Router 1
+       \154: Default Router 2
+       \155: Default Router 3
+       \156: Default Router 4
+       \157: Default Router 5
+       \160: DNS Server 1
+       \161: DNS Server 2
+       \162: DNS Server 3
+       \163: DNS Server 4
+       \164: DNS Server 5
+       \165: Operational VLAN Id
+       \166: Admin. VLAN Id
+       \167: CallManager 1
+       \170: CallManager 2
+       \171: CallManager 3
+       \172: CallManager 4
+       \173: CallManager 5
+       \174: Information URL
+       \175: Directories URL
+       \176: Messages URL
+       \177: Services URL
+ */
 
 struct soft_key_definitions {
 	const uint8_t mode;

Modified: team/russell/res_monkeys/funcs/func_devstate.c
URL: http://svn.digium.com/view/asterisk/team/russell/res_monkeys/funcs/func_devstate.c?view=diff&rev=79173&r1=79172&r2=79173
==============================================================================
--- team/russell/res_monkeys/funcs/func_devstate.c (original)
+++ team/russell/res_monkeys/funcs/func_devstate.c Mon Aug 13 09:04:53 2007
@@ -41,14 +41,9 @@
 #include "asterisk/linkedlists.h"
 #include "asterisk/devicestate.h"
 #include "asterisk/cli.h"
+#include "asterisk/astdb.h"
 
-struct custom_device {
-	int state;
-	AST_RWLIST_ENTRY(custom_device) entry;
-	char name[1];
-};
-
-static AST_RWLIST_HEAD_STATIC(custom_devices, custom_device);
+static const char astdb_family[] = "CustomDevstate";
 
 static int devstate_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 {
@@ -59,8 +54,7 @@
 
 static int devstate_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
 {
-	struct custom_device *dev;
-	int len = strlen("Custom:");
+	size_t len = strlen("Custom:");
 
 	if (strncasecmp(data, "Custom:", len)) {
 		ast_log(LOG_WARNING, "The DEVSTATE function can only be used to set 'Custom:' device state!\n");
@@ -72,46 +66,25 @@
 		return -1;
 	}
 
-	AST_RWLIST_WRLOCK(&custom_devices);
-	AST_RWLIST_TRAVERSE(&custom_devices, dev, entry) {
-		if (!strcasecmp(dev->name, data))
-			break;
-	}
-	if (!dev) {
-		if (!(dev = ast_calloc(1, sizeof(*dev) + strlen(data) + 1))) {
-			AST_RWLIST_UNLOCK(&custom_devices);
-			return -1;
-		}
-		strcpy(dev->name, data);
-		AST_RWLIST_INSERT_HEAD(&custom_devices, dev, entry);
-	}
-	dev->state = ast_devstate_val(value);
-	ast_devstate_changed(dev->state, "Custom:%s", dev->name);
-	AST_RWLIST_UNLOCK(&custom_devices);
+	ast_db_put(astdb_family, data, value);
+
+	ast_devstate_changed(ast_devstate_val(value), "Custom:%s", data);
 
 	return 0;
 }
 
 static enum ast_device_state custom_devstate_callback(const char *data)
 {
-	struct custom_device *dev;
-	enum ast_device_state state = AST_DEVICE_UNKNOWN;
+	char buf[256] = "";
 
-	AST_RWLIST_RDLOCK(&custom_devices);
-	AST_RWLIST_TRAVERSE(&custom_devices, dev, entry) {
-		if (!strcasecmp(dev->name, data)) {
-			state = dev->state;	
-			break;
-		}
-	}
-	AST_RWLIST_UNLOCK(&custom_devices);
+	ast_db_get(astdb_family, data, buf, sizeof(buf));
 
-	return state;
+	return ast_devstate_val(buf);
 }
 
 static char *cli_funcdevstate_list(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
-	struct custom_device *dev;
+	struct ast_db_entry *db_entry, *db_tree;
 
 	switch (cmd) {
 	case CLI_INIT:
@@ -133,12 +106,18 @@
 	        "--- Custom Device States --------------------------------------------\n"
 	        "---------------------------------------------------------------------\n"
 	        "---\n");
-	AST_RWLIST_RDLOCK(&custom_devices);
-	AST_RWLIST_TRAVERSE(&custom_devices, dev, entry) {
+
+	db_entry = db_tree = ast_db_gettree(astdb_family, NULL);
+	for (; db_entry; db_entry = db_entry->next) {
+		const char *dev_name = strrchr(db_entry->key, '/') + 1;
+		if (dev_name <= (const char *) 1)
+			continue;
 		ast_cli(a->fd, "--- Name: 'Custom:%s'  State: '%s'\n"
-		               "---\n", dev->name, ast_devstate_str(dev->state));
+		               "---\n", dev_name, db_entry->data);
 	}
-	AST_RWLIST_UNLOCK(&custom_devices);
+	ast_db_freetree(db_tree);
+	db_tree = NULL;
+
 	ast_cli(a->fd,
 	        "---------------------------------------------------------------------\n"
 	        "---------------------------------------------------------------------\n"
@@ -178,17 +157,11 @@
 
 static int unload_module(void)
 {
-	struct custom_device *dev;
 	int res = 0;
 
 	res |= ast_custom_function_unregister(&devstate_function);
 	res |= ast_devstate_prov_del("Custom");
 	res |= ast_cli_unregister_multiple(cli_funcdevstate, ARRAY_LEN(cli_funcdevstate));
-
-	AST_RWLIST_WRLOCK(&custom_devices);
-	while ((dev = AST_RWLIST_REMOVE_HEAD(&custom_devices, entry)))
-		ast_free(dev);
-	AST_RWLIST_UNLOCK(&custom_devices);
 
 	return res;
 }
@@ -196,6 +169,20 @@
 static int load_module(void)
 {
 	int res = 0;
+	struct ast_db_entry *db_entry, *db_tree;
+
+	/* Populate the device state cache on the system with all of the currently
+	 * known custom device states. */
+	db_entry = db_tree = ast_db_gettree(astdb_family, NULL);
+	for (; db_entry; db_entry = db_entry->next) {
+		const char *dev_name = strrchr(db_entry->key, '/') + 1;
+		if (dev_name <= (const char *) 1)
+			continue;
+		ast_devstate_changed(ast_devstate_val(db_entry->data),
+			"Custom:%s\n", dev_name);
+	}
+	ast_db_freetree(db_tree);
+	db_tree = NULL;
 
 	res |= ast_custom_function_register(&devstate_function);
 	res |= ast_devstate_prov_add("Custom", custom_devstate_callback);

Modified: team/russell/res_monkeys/include/asterisk/channel.h
URL: http://svn.digium.com/view/asterisk/team/russell/res_monkeys/include/asterisk/channel.h?view=diff&rev=79173&r1=79172&r2=79173
==============================================================================
--- team/russell/res_monkeys/include/asterisk/channel.h (original)
+++ team/russell/res_monkeys/include/asterisk/channel.h Mon Aug 13 09:04:53 2007
@@ -1468,6 +1468,13 @@
 
 int ast_chan_thread_create(struct ast_channel *chan, void *(*start_func)(void *));
 
+/*!
+  \brief return an english explanation of the code returned thru __ast_request_and_dial's 'outstate' argument
+  \param reason  The integer argument, usually taken from AST_CONTROL_ macros
+  \return char pointer explaining the code
+ */
+char *ast_channel_reason2str(int reason);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif

Modified: team/russell/res_monkeys/main/channel.c
URL: http://svn.digium.com/view/asterisk/team/russell/res_monkeys/main/channel.c?view=diff&rev=79173&r1=79172&r2=79173
==============================================================================
--- team/russell/res_monkeys/main/channel.c (original)
+++ team/russell/res_monkeys/main/channel.c Mon Aug 13 09:04:53 2007
@@ -2919,6 +2919,29 @@
 			  &chan->writetrans, 1);
 }
 
+char *ast_channel_reason2str(int reason)
+{
+	switch (reason) /* the following appear to be the only ones actually returned by request_and_dial */
+	{
+	case 0:
+		return "Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)";
+	case AST_CONTROL_HANGUP:
+		return "Hangup";
+	case AST_CONTROL_RING:
+		return "Local Ring";
+	case AST_CONTROL_RINGING:
+		return "Remote end Ringing";
+	case AST_CONTROL_ANSWER:
+		return "Remote end has Answered";
+	case AST_CONTROL_BUSY:
+		return "Remote end is Busy";
+	case AST_CONTROL_CONGESTION:
+		return "Congestion (circuits busy)";
+	default:
+		return "Unknown Reason!!";
+	}
+}
+
 struct ast_channel *__ast_request_and_dial(const char *type, int format, void *data, int timeout, int *outstate, const char *cid_num, const char *cid_name, struct outgoing_helper *oh)
 {
 	int dummy_outstate;

Modified: team/russell/res_monkeys/pbx/pbx_spool.c
URL: http://svn.digium.com/view/asterisk/team/russell/res_monkeys/pbx/pbx_spool.c?view=diff&rev=79173&r1=79172&r2=79173
==============================================================================
--- team/russell/res_monkeys/pbx/pbx_spool.c (original)
+++ team/russell/res_monkeys/pbx/pbx_spool.c Mon Aug 13 09:04:53 2007
@@ -336,7 +336,7 @@
 		res = ast_pbx_outgoing_exten(o->tech, AST_FORMAT_SLINEAR, o->dest, o->waittime * 1000, o->context, o->exten, o->priority, &reason, 2 /* wait to finish */, o->cid_num, o->cid_name, o->vars, o->account, NULL);
 	}
 	if (res) {
-		ast_log(LOG_NOTICE, "Call failed to go through, reason %d\n", reason);
+		ast_log(LOG_NOTICE, "Call failed to go through, reason (%d) %s\n", reason, ast_channel_reason2str(reason));
 		if (o->retries >= o->maxretries + 1) {
 			/* Max retries exceeded */
 			ast_log(LOG_EVENT, "Queued call to %s/%s expired without completion after %d attempt%s\n", o->tech, o->dest, o->retries - 1, ((o->retries - 1) != 1) ? "s" : "");

Modified: team/russell/res_monkeys/res/res_odbc.c
URL: http://svn.digium.com/view/asterisk/team/russell/res_monkeys/res/res_odbc.c?view=diff&rev=79173&r1=79172&r2=79173
==============================================================================
--- team/russell/res_monkeys/res/res_odbc.c (original)
+++ team/russell/res_monkeys/res/res_odbc.c Mon Aug 13 09:04:53 2007
@@ -416,8 +416,16 @@
 			}
 			ast_mutex_init(&obj->lock);
 			obj->parent = class;
-			odbc_obj_connect(obj);
-			AST_LIST_INSERT_TAIL(&class->odbc_obj, obj, list);
+			if (odbc_obj_connect(obj) == ODBC_FAIL) {
+				ast_log(LOG_WARNING, "Failed to connect to %s\n", name);
+				ast_mutex_destroy(&obj->lock);
+				free(obj);
+				obj = NULL;
+				class->count--;
+			} else {
+				obj->used = 1;
+				AST_LIST_INSERT_TAIL(&class->odbc_obj, obj, list);
+			}
 		}
 	} else {
 		/* Non-pooled connection: multiple modules can use the same connection. */




More information about the asterisk-commits mailing list