⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 property.c

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 C
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions://// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================////%//////////////////////////////////////////////////////////////////////////////*!  \file property.c  \brief Native property implementation.  This module implements a native property, which is not public to any  provider programmer. It is used to implement various other data types  natively, such as instances, object-paths and args.  It provides means to maintain linked lists of named properties including  functionality to add, remove, clone and release them.  \author Frank Scheffler*/#include <stdio.h>#include <string.h>#include "mm.h"#include "native.h"//! Storage container for commonly needed data within native CMPI data types./*!  This structure is used to build linked lists of data containers as needed  for various native data types.*/struct native_property {	char * name;		        //!< Property identifier.	CMPIType type;		        //!< Associated CMPIType.	CMPIValueState state; 	        //!< Current value state.	CMPIValue value;	        //!< Current value.	struct native_property * next;	//!< Pointer to next property.};/****************************************************************************/static CMPIData __convert2CMPIData ( struct native_property * prop,				     CMPIString ** propname ){	CMPIData result;	if ( prop != NULL ) {		result.type  = prop->type;		result.state = prop->state;		result.value = prop->value;		if ( propname ) {			*propname  = native_new_CMPIString ( prop->name,							     NULL );		}	} else {		result.state = CMPI_nullValue;	}	return result;}/** * returns non-zero if already existant */static int __addProperty ( struct native_property ** prop,			   int mm_add,			   const char * name,			   CONST CMPIType type,			   CMPIValueState state,			   CONST CMPIValue * value ){	CMPIValue v;	if ( *prop == NULL ) {		struct native_property * tmp = *prop =			(struct native_property *)			tool_mm_alloc ( mm_add,					sizeof ( struct native_property ) );		tmp->name = strdup ( name );		if ( mm_add == TOOL_MM_ADD ) tool_mm_add ( tmp->name );		tmp->type  = type;		tmp->state = value ? state : CMPI_nullValue;		if ( type == CMPI_chars ) {			tmp->type = CMPI_string;			v.string = native_new_CMPIString ( (char *) value,							   NULL );			value = &v;		}		if ( type != CMPI_null ) {			if ( mm_add == TOOL_MM_ADD ) {				tmp->value = *value;			} else {				CMPIStatus rc;				tmp->value = native_clone_CMPIValue ( type,								      value,								      &rc );				// what if clone() fails???			}		} else tmp->state = CMPI_nullValue;		return 0;	}	return ( strcmp ( (*prop)->name, name ) == 0 ||		 __addProperty ( &( (*prop)->next ),				 mm_add,				 name,				 type,				 state,				 value ) );}/** * returns -1 if non-existant */static int __setProperty ( struct native_property * prop,			   int mm_add,			   const char * name,			   CMPIType type,			   CONST CMPIValue * value ){	CMPIValue v;	if ( prop == NULL ) {		return -1;	}	if ( strcmp ( prop->name, name ) == 0 ) {		CMPIStatus rc;		if ( ! ( prop->state & CMPI_nullValue ) )			native_release_CMPIValue ( prop->type, &prop->value );		if ( type == CMPI_chars ) {			type = CMPI_string;			v.string = native_new_CMPIString ( (char *) value,							   NULL );			value = &v;		}		prop->type  = type;		if ( type != CMPI_null ) {			prop->value =				( mm_add == TOOL_MM_ADD )?				*value:				native_clone_CMPIValue ( type, value, &rc );			// what if clone() fails ???		} else prop->state = CMPI_nullValue;		return 0;	}	return __setProperty ( prop->next, mm_add, name, type, value);}static struct native_property * __getProperty ( struct native_property * prop,						const char * name ){	if ( ! prop || ! name ) {		return NULL;	}	return ( strcmp ( prop->name, name ) == 0 )?		prop: __getProperty ( prop->next, name );}static CMPIData __getDataProperty ( struct native_property * prop,				    const char * name,				    CMPIStatus * rc ){	struct native_property * p = __getProperty ( prop, name );	if ( rc ) CMSetStatus ( rc,				( p )?				CMPI_RC_OK:				CMPI_RC_ERR_NO_SUCH_PROPERTY );	return __convert2CMPIData ( p, NULL );}static struct native_property * __getPropertyAt( struct native_property * prop, unsigned int pos ){	if ( ! prop ) {		return NULL;	}	return ( pos == 0 )?		prop: __getPropertyAt ( prop->next, --pos );}static CMPIData __getDataPropertyAt ( struct native_property * prop,				      unsigned int pos,				      CMPIString ** propname,				      CMPIStatus * rc ){	struct native_property * p = __getPropertyAt ( prop, pos );	if ( rc ) CMSetStatus ( rc,				( p )?				CMPI_RC_OK:				CMPI_RC_ERR_NO_SUCH_PROPERTY );	return __convert2CMPIData ( p, propname );}static CMPICount __getPropertyCount ( struct native_property * prop,				      CMPIStatus * rc ){	CMPICount c = 0;	if ( rc ) CMSetStatus ( rc, CMPI_RC_OK );	while ( prop != NULL ) {		c++;		prop = prop->next;	}	return c;}static void __release ( struct native_property * prop ){	for ( ; prop; prop = prop->next ) {		tool_mm_add ( prop );		tool_mm_add ( prop->name );		native_release_CMPIValue ( prop->type, &prop->value );	}}static struct native_property * __clone ( struct native_property * prop,					  CMPIStatus * rc ){	struct native_property * result;	CMPIStatus tmp;	if ( prop == NULL ) {		if ( rc ) CMSetStatus ( rc, CMPI_RC_OK );		return NULL;	}	result =		(struct native_property * )		tool_mm_alloc ( TOOL_MM_NO_ADD,				sizeof ( struct native_property ) );	result->name  = strdup ( prop->name );	result->type  = prop->type;	result->state = prop->state;	result->value = native_clone_CMPIValue ( prop->type,						 &prop->value,						 &tmp );	if ( tmp.rc != CMPI_RC_OK ) {		result->state = CMPI_nullValue;	}	result->next  = __clone ( prop->next, rc );	return result;}/** * Global function table to access native_property helper functions. */struct native_propertyFT propertyFT = {	__addProperty,	__setProperty,	__getDataProperty,	__getDataPropertyAt,	__getPropertyCount,	__release,	__clone};/****************************************************************************//*** Local Variables:  ***//*** mode: C           ***//*** c-basic-offset: 8 ***//*** End:              ***/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -