| 
									
										
										
										
											2008-08-05 16:56:11 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Asterisk -- An open source telephony toolkit. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2007 - 2008, Digium, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * See http://www.asterisk.org for more information about
 | 
					
						
							|  |  |  |  * the Asterisk project. Please do not directly contact | 
					
						
							|  |  |  |  * any of the maintainers of this project for assistance; | 
					
						
							|  |  |  |  * the project provides a web site, mailing lists and IRC | 
					
						
							|  |  |  |  * channels for your use. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software, distributed under the terms of | 
					
						
							|  |  |  |  * the GNU General Public License Version 2. See the LICENSE file | 
					
						
							|  |  |  |  * at the top of the source tree. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*! \file
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * \brief Asterisk datastore objects | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "asterisk.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "asterisk/_private.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "asterisk/datastore.h"
 | 
					
						
							|  |  |  | #include "asterisk/utils.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-05 10:34:19 +00:00
										 |  |  | struct ast_datastore *__ast_datastore_alloc(const struct ast_datastore_info *info, const char *uid, | 
					
						
							|  |  |  | 					    const char *file, int line, const char *function) | 
					
						
							| 
									
										
										
										
											2008-08-05 16:56:11 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	struct ast_datastore *datastore = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Make sure we at least have type so we can identify this */ | 
					
						
							|  |  |  | 	if (!info) { | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-05 10:34:19 +00:00
										 |  |  | #if defined(__AST_DEBUG_MALLOC)
 | 
					
						
							|  |  |  | 	if (!(datastore = __ast_calloc(1, sizeof(*datastore), file, line, function))) { | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 	if (!(datastore = ast_calloc(1, sizeof(*datastore)))) { | 
					
						
							| 
									
										
										
										
											2008-08-05 16:56:11 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-05-05 10:34:19 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-08-05 16:56:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	datastore->info = info; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-01 22:16:23 +00:00
										 |  |  | 	if (!ast_strlen_zero(uid) && !(datastore->uid = ast_strdup(uid))) { | 
					
						
							|  |  |  | 		ast_free(datastore); | 
					
						
							|  |  |  | 		datastore = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-08-05 16:56:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return datastore; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int ast_datastore_free(struct ast_datastore *datastore) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int res = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Using the destroy function (if present) destroy the data */ | 
					
						
							|  |  |  | 	if (datastore->info->destroy != NULL && datastore->data != NULL) { | 
					
						
							|  |  |  | 		datastore->info->destroy(datastore->data); | 
					
						
							|  |  |  | 		datastore->data = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Free allocated UID memory */ | 
					
						
							|  |  |  | 	if (datastore->uid != NULL) { | 
					
						
							|  |  |  | 		ast_free((void *) datastore->uid); | 
					
						
							|  |  |  | 		datastore->uid = NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Finally free memory used by ourselves */ | 
					
						
							|  |  |  | 	ast_free(datastore); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return res; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-05-05 10:34:19 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* DO NOT PUT ADDITIONAL FUNCTIONS BELOW THIS BOUNDARY
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ONLY FUNCTIONS FOR PROVIDING BACKWARDS ABI COMPATIBILITY BELONG HERE | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Provide binary compatibility for modules that call ast_datastore_alloc() directly;
 | 
					
						
							|  |  |  |  * newly compiled modules will call __ast_datastore_alloc() via the macros in datastore.h | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #undef ast_datastore_alloc
 | 
					
						
							|  |  |  | struct ast_datastore *ast_datastore_alloc(const struct ast_datastore_info *info, const char *uid); | 
					
						
							|  |  |  | struct ast_datastore *ast_datastore_alloc(const struct ast_datastore_info *info, const char *uid) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return __ast_datastore_alloc(info, uid, __FILE__, __LINE__, __FUNCTION__); | 
					
						
							|  |  |  | } |