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

📄 subscriptiontable.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                    //  requestor, subscription creator must also match module                    //  user context name, to add provider to the list of                    //  failed providers                    //                    if ((moduleContext != PG_PROVMODULE_USERCTXT_REQUESTOR) ||                        (!authenticationEnabled) || (creator == userName))                    {                        //                        //  Add the provider to the list                        //                        failedProviderList.append                            (tableValue.providers [j]);                    }                }  //  if provider module name matches            }  //  for each subscription provider            //            //  If there were any failed providers, add the subscription            //  entry to the list of affected subscriptions            //            if (failedProviderList.size () > 0)            {                ActiveSubscriptionsTableEntry subscription;                subscription.subscription = tableValue.subscription;                subscription.providers = failedProviderList;                providerModuleSubscriptions.append (subscription);            }        }        //        //  Look up and update hash table entry for each affected subscription        //        for (Uint32 k = 0; k < providerModuleSubscriptions.size (); k++)        {            //            //  Update the entry in the active subscriptions hash table            //            CIMObjectPath activeSubscriptionsKey =                _generateActiveSubscriptionsKey                    (providerModuleSubscriptions [k].subscription.getPath ());            ActiveSubscriptionsTableEntry tableValue;            if (_activeSubscriptionsTable.lookup (activeSubscriptionsKey,                tableValue))            {                Array <ProviderClassList> updatedProviderList;                    for (Uint32 l = 0; l < tableValue.providers.size (); l++)                {                    String providerModuleName;                    CIMValue nameValue =                        tableValue.providers [l].providerModule.getProperty                        (tableValue.providers [l].providerModule.findProperty                        (PEGASUS_PROPERTYNAME_NAME)).getValue ();                    nameValue.get (providerModuleName);                    if (providerModuleName != moduleName)                    {                        //                        //  Provider is not in the failed module                        //  Append provider to list of providers still serving                        //  the subscription                        //                        updatedProviderList.append (tableValue.providers [l]);                    }                }                _updateSubscriptionProviders (activeSubscriptionsKey,                    tableValue.subscription, updatedProviderList);            }        }    }    PEG_METHOD_EXIT ();    return providerModuleSubscriptions;}CIMObjectPath SubscriptionTable::_generateActiveSubscriptionsKey (    const CIMObjectPath & subscription) const{    //    //  Get filter and handler object paths from subscription Filter and Handler    //  reference property values    //    Array<CIMKeyBinding> subscriptionKB = subscription.getKeyBindings ();    CIMObjectPath filterPath;    CIMObjectPath handlerPath;    for (Uint32 i = 0; i < subscriptionKB.size (); i++)    {        if ((subscriptionKB [i].getName () == PEGASUS_PROPERTYNAME_FILTER) &&            (subscriptionKB [i].getType () == CIMKeyBinding::REFERENCE))        {            filterPath = subscriptionKB [i].getValue ();        }        if ((subscriptionKB [i].getName () == PEGASUS_PROPERTYNAME_HANDLER) &&            (subscriptionKB [i].getType () == CIMKeyBinding::REFERENCE))        {            handlerPath = subscriptionKB [i].getValue ();        }    }    //    //  Construct subscription object name for key    //    filterPath.setHost (String::EMPTY);    handlerPath.setHost (String::EMPTY);    Array <CIMKeyBinding> kb;    kb.append (CIMKeyBinding (PEGASUS_PROPERTYNAME_FILTER, CIMValue (filterPath)));    kb.append (CIMKeyBinding (PEGASUS_PROPERTYNAME_HANDLER, CIMValue (handlerPath)));    CIMObjectPath activeSubscriptionsKey ("", subscription.getNameSpace (),        subscription.getClassName (), kb);    return activeSubscriptionsKey;}Boolean SubscriptionTable::_lockedLookupActiveSubscriptionsEntry (    const CIMObjectPath & key,    ActiveSubscriptionsTableEntry & tableEntry) const{    ReadLock lock(_activeSubscriptionsTableLock);    return (_activeSubscriptionsTable.lookup (key, tableEntry));}void SubscriptionTable::_insertActiveSubscriptionsEntry (    const CIMInstance & subscription,    const Array <ProviderClassList> & providers){    PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,        "SubscriptionTable::_insertActiveSubscriptionsEntry");    CIMObjectPath activeSubscriptionsKey = _generateActiveSubscriptionsKey        (subscription.getPath ());    ActiveSubscriptionsTableEntry entry;    entry.subscription = subscription;    entry.providers = providers;    //    //  Insert returns true on success, false if duplicate key    //    Boolean succeeded = _activeSubscriptionsTable.insert        (activeSubscriptionsKey, entry);    PEGASUS_ASSERT (succeeded);#ifdef PEGASUS_INDICATION_HASHTRACE    String traceString;    traceString.append (activeSubscriptionsKey);    traceString.append (" Providers: ");    for (Uint32 i = 0; i < providers.size (); i++)    {        String providerName = providers [i].provider.getProperty            (providers [i].provider.findProperty            (PEGASUS_PROPERTYNAME_NAME)).getValue ().toString ();        traceString.append (providerName);        traceString.append ("  Classes: ");        for (Uint32 j = 0; j < providers[i].classList.size (); j++)        {             traceString.append (providers[i].classList[j].getString());             traceString.append ("  ");        }    }    PEG_TRACE_STRING (TRC_INDICATION_SERVICE_INTERNAL, Tracer::LEVEL3,        "INSERTED _activeSubscriptionsTable entry: " + traceString);#endif    PEG_METHOD_EXIT ();}void SubscriptionTable::_removeActiveSubscriptionsEntry (    const CIMObjectPath & key){    PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,        "SubscriptionTable::_removeActiveSubscriptionsEntry");    //    //  Remove returns true on success, false if not found    //    Boolean succeeded = _activeSubscriptionsTable.remove (key);    PEGASUS_ASSERT (succeeded);#ifdef PEGASUS_INDICATION_HASHTRACE    PEG_TRACE_STRING (TRC_INDICATION_SERVICE_INTERNAL,                      Tracer::LEVEL3,                      "REMOVED _activeSubscriptionsTable entry: " +                      key.toString ());#endif    PEG_METHOD_EXIT ();}String SubscriptionTable::_generateSubscriptionClassesKey (    const CIMName & indicationClassName,    const CIMNamespaceName & sourceNamespaceName) const{    String subscriptionClassesKey;    //    //  Append indication class name to key    //    subscriptionClassesKey.append (indicationClassName.getString ());    //    //  Append source namespace name to key    //    subscriptionClassesKey.append (sourceNamespaceName.getString ());    return subscriptionClassesKey;}Boolean SubscriptionTable::_lockedLookupSubscriptionClassesEntry (    const String & key,    SubscriptionClassesTableEntry & tableEntry) const{    ReadLock lock(_subscriptionClassesTableLock);    return (_subscriptionClassesTable.lookup (key, tableEntry));}void SubscriptionTable::_insertSubscriptionClassesEntry (    const CIMName & indicationClassName,    const CIMNamespaceName & sourceNamespaceName,    const Array <CIMInstance> & subscriptions){    PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,        "SubscriptionTable::_insertSubscriptionClassesEntry");    String subscriptionClassesKey = _generateSubscriptionClassesKey        (indicationClassName, sourceNamespaceName);    SubscriptionClassesTableEntry entry;    entry.indicationClassName = indicationClassName;    entry.sourceNamespaceName = sourceNamespaceName;    entry.subscriptions = subscriptions;    //    //  Insert returns true on success, false if duplicate key    //    Boolean succeeded = _subscriptionClassesTable.insert        (subscriptionClassesKey, entry);    PEGASUS_ASSERT (succeeded);#ifdef PEGASUS_INDICATION_HASHTRACE    String traceString;    traceString.append (subscriptionClassesKey);    traceString.append (" Subscriptions: ");    for (Uint32 i = 0; i < subscriptions.size (); i++)    {        traceString.append (subscriptions [i].getPath ().toString());        traceString.append ("  ");    }    PEG_TRACE_STRING (TRC_INDICATION_SERVICE_INTERNAL, Tracer::LEVEL3,        "INSERTED _subscriptionClassesTable entry: " + traceString);#endif    PEG_METHOD_EXIT ();}void SubscriptionTable::_removeSubscriptionClassesEntry (    const String & key){    PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,        "SubscriptionTable::_removeSubscriptionClassesEntry");    //    //  Remove returns true on success, false if not found    //    Boolean succeeded = _subscriptionClassesTable.remove (key);    PEGASUS_ASSERT (succeeded);#ifdef PEGASUS_INDICATION_HASHTRACE    PEG_TRACE_STRING (TRC_INDICATION_SERVICE_INTERNAL, Tracer::LEVEL3,        "REMOVED _subscriptionClassesTable entry: " + key);#endif    PEG_METHOD_EXIT ();}void SubscriptionTable::_updateSubscriptionProviders    (const CIMObjectPath & activeSubscriptionsKey,     const CIMInstance & subscription,     const Array <ProviderClassList> & updatedProviderList){    PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,        "SubscriptionTable::_updateSubscriptionProviders");    if (updatedProviderList.size () > 0)    {        //        //  At least one provider is still serving the        //  subscription        //  Update entry in Active Subscriptions table        //        _removeActiveSubscriptionsEntry (activeSubscriptionsKey);        _insertActiveSubscriptionsEntry (subscription, updatedProviderList);    }    else    {        //        //  The disabled or failed provider(s) was (were) the only provider(s)        //  serving the subscription        //  Implement the subscription's On Fatal Error Policy        //        Boolean removedOrDisabled =            _subscriptionRepository->reconcileFatalError (subscription);        _removeActiveSubscriptionsEntry (activeSubscriptionsKey);        if (!removedOrDisabled)        {            //            //  If subscription was not disabled or deleted            //  Update entry in Active Subscriptions table            //  Note that in this case the updatedProviderList is            //  empty - no providers are serving the subscription            //  currently            //            _insertActiveSubscriptionsEntry (subscription,                updatedProviderList);        }    }    PEG_METHOD_EXIT ();}void SubscriptionTable::insertSubscription (    const CIMInstance & subscription,    const Array <ProviderClassList> & providers,    const Array <CIMName> & indicationSubclassNames,    const CIMNamespaceName & sourceNamespaceName){    PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,        "SubscriptionTable::insertSubscription");    //    //  Insert entry into active subscriptions table    //    {        WriteLock lock(_activeSubscriptionsTableLock);        _insertActiveSubscriptionsEntry (subscription, providers);    }    //    //  Insert or update entries in subscription classes table    //    {        //

⌨️ 快捷键说明

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