bool 
StatusReporterInterface::ApplyNecessaryStatusRollupRules(	ManagedObject	*pObject,
															const Container &children, 
															const Container &parents ){

	ManagedObject					*pParent, *pChild;
	U32								index;
	int								newState, oldState;
	bool							canChangeFlag = true;


	// first check parents
	newState		= SSAPI_OBJECT_STATE_UNKNOWN;
	for( index = 0; index < parents.Count(); index++ ){
		if ( pObject->GetParent( index ) == NULL )
			pObject= pObject;
		pParent = pObject->GetParent( index );
		pParent->BuildYourValueSet();
		pParent->GetInt( SSAPI_OBJECT_FID_STATE, &oldState );
		pParent->Clear();
		if( (oldState == SSAPI_OBJECT_STATE_DEAD) || (oldState == CTS_SSAPI_OBJECT_STATE_NAME_UNKNOWN) ){
			if( newState != m_state ){
				m_state			= newState;
				m_stateString	= CTS_SSAPI_OBJECT_STATE_NAME_UNKNOWN;
				m_isRolledUp	= true;
				return true;
			}
			else
				canChangeFlag = false;
		}
	}

	// second, check children
	newState		= SSAPI_OBJECT_STATE_WARNING;
	for( index = 0; index < children.Count(); index++ ) {
		pChild = pObject->GetChild( index );
		pChild->BuildYourValueSet();
		pChild->GetInt( SSAPI_OBJECT_FID_STATE, &oldState );
		pChild->Clear();
		if( oldState != SSAPI_OBJECT_STATE_GOOD ){
			if( (m_state != newState) && (m_state == SSAPI_OBJECT_STATE_GOOD) ){
				m_state			= newState;
				m_stateString	= CTS_SSAPI_OBJECT_STATE_NAME_WARNING;	
				m_isRolledUp	= true;
				return true;
			}
			else
				canChangeFlag	= false;
		}
	}
	
	if( canChangeFlag && m_isRolledUp ){
		m_isRolledUp = false;
		m_state		 = SSAPI_OBJECT_STATE_GOOD;
		m_stateString= CTS_SSAPI_OBJECT_STATE_NAME_GOOD;
		return true;
	}

	return false;
}