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; }