void Provider::UpdatePropertyServiceTable() { AutoPtr<IProviderService> s; String serviceName; String algorithm; Boolean isEmpty; if (mChangedProperties == NULL || (mChangedProperties->IsEmpty(&isEmpty), isEmpty)) { return; } AutoPtr<ISet> entrySet; mChangedProperties->GetEntrySet((ISet**)&entrySet); AutoPtr<IIterator> it; entrySet->GetIterator((IIterator**)&it); Boolean hasNext; while (it->HasNext(&hasNext), hasNext) { AutoPtr<IMapEntry> entry; it->GetNext((IInterface**)&entry); AutoPtr<IInterface> _key; AutoPtr<IInterface> _value; entry->GetKey((IInterface**)&_key); entry->GetValue((IInterface**)&_value); if (_key == NULL || _value == NULL || (IString::Probe(_key) == NULL) || (IString::Probe(_value) == NULL)) { continue; } String key, value; ICharSequence::Probe(_key)->ToString(&key); ICharSequence::Probe(_value)->ToString(&value); if (key.StartWith("Provider")) { // Provider service type is reserved continue; } Int32 i; if (key.StartWith("Alg.Alias.")) { // Alg.Alias.<crypto_service>.<aliasName>=<standardName> String aliasName; String service_alias = key.Substring(10); i = service_alias.IndexOf('.'); serviceName = service_alias.Substring(0, i); aliasName = service_alias.Substring(i + 1); algorithm = value; String propertyServiceTableKey = Key(serviceName, algorithm); AutoPtr<IInterface> o; if (mPropertyServiceTable == NULL) { CLinkedHashMap::New(128, (ILinkedHashMap**)&mPropertyServiceTable); } else { AutoPtr<ICharSequence> keyObj; CString::New(propertyServiceTableKey, (ICharSequence**)&keyObj); mPropertyServiceTable->Get(keyObj, (IInterface**)&o); } if (o != NULL) { s = IProviderService::Probe(o); s->AddAlias(aliasName); if (mPropertyAliasTable == NULL) { CLinkedHashMap::New(256, (ILinkedHashMap**)&mPropertyAliasTable); } AutoPtr<ICharSequence> keyObj; CString::New(Key(serviceName, aliasName), (ICharSequence**)&keyObj); mPropertyAliasTable->Put(keyObj, s); } else { AutoPtr<ICharSequence> keyObj; CString::New(serviceName + "." + algorithm, (ICharSequence**)&keyObj); AutoPtr<IInterface> valueObj; mChangedProperties->Get(keyObj, (IInterface**)&valueObj); String className; ICharSequence::Probe(valueObj)->ToString(&className); if (!className.IsNull()) { AutoPtr<IList> l; CArrayList::New((IList**)&l); AutoPtr<ICharSequence> aliasNameObj; CString::New(aliasName, (ICharSequence**)&aliasNameObj); l->Add(aliasNameObj); AutoPtr<IMap> attributes; CHashMap::New((IMap**)&attributes); s = NULL; CProviderService::New(this, serviceName, algorithm, className, l, attributes, (IProviderService**)&s); keyObj = NULL; CString::New(propertyServiceTableKey, (ICharSequence**)&keyObj); mPropertyServiceTable->Put(keyObj, s); if (mPropertyAliasTable == NULL) { CLinkedHashMap::New(256, (ILinkedHashMap**)&mPropertyAliasTable); } keyObj = NULL; CString::New(Key(serviceName, aliasName), (ICharSequence**)&keyObj); mPropertyAliasTable->Put(keyObj, s); } } continue; } Int32 j = key.IndexOf('.'); if (j == -1) { // unknown format continue; } i = key.IndexOf(' '); if (i == -1) { // <crypto_service>.<algorithm_or_type>=<className> serviceName = key.Substring(0, j); algorithm = key.Substring(j + 1); String propertyServiceTableKey = Key(serviceName, algorithm); AutoPtr<IInterface> o; if (mPropertyServiceTable != NULL) { AutoPtr<ICharSequence> keyObj; CString::New(propertyServiceTableKey, (ICharSequence**)&keyObj); mPropertyServiceTable->Get(keyObj, (IInterface**)&o); } if (o != NULL) { s = IProviderService::Probe(o); s->SetClassName(value); } else { AutoPtr<ICollections> collections; CCollections::AcquireSingleton((ICollections**)&collections); AutoPtr<IList> emptyList; collections->GetEmptyList((IList**)&emptyList); AutoPtr<IMap> emptyMap; collections->GetEmptyMap((IMap**)&emptyMap); s = NULL; CProviderService::New(this, serviceName, algorithm, value, emptyList, emptyMap, (IProviderService**)&s); if (mPropertyServiceTable == NULL) { CLinkedHashMap::New(128, (ILinkedHashMap**)&mPropertyServiceTable); } AutoPtr<ICharSequence> keyObj; CString::New(propertyServiceTableKey, (ICharSequence**)&keyObj); mPropertyServiceTable->Put(keyObj, s); } } else { // <crypto_service>.<algorithm_or_type> <attribute_name>=<attrValue> serviceName = key.Substring(0, j); algorithm = key.Substring(j + 1, i); String attribute = key.Substring(i + 1); String propertyServiceTableKey = Key(serviceName, algorithm); AutoPtr<IInterface> o; if (mPropertyServiceTable != NULL) { AutoPtr<ICharSequence> keyObj; CString::New(propertyServiceTableKey, (ICharSequence**)&keyObj); mPropertyServiceTable->Get(keyObj, (IInterface**)&o); } if (o != NULL) { s = IProviderService::Probe(o); s->PutAttribute(attribute, value); } else { AutoPtr<ICharSequence> keyObj; CString::New(serviceName + "." + algorithm, (ICharSequence**)&keyObj); AutoPtr<IInterface> valueObj; mChangedProperties->Get(keyObj, (IInterface**)&valueObj); String className; ICharSequence::Probe(valueObj)->ToString(&className); if (!className.IsNull()) { AutoPtr<IMap> m; CHashMap::New((IMap**)&m); AutoPtr<ICharSequence> keyObj, valueObj; CString::New(attribute, (ICharSequence**)&keyObj); CString::New(value, (ICharSequence**)&valueObj); m->Put(keyObj, valueObj); AutoPtr<IList> l; CArrayList::New((IList**)&l); s = NULL; CProviderService::New(this, serviceName, algorithm, className, l, m, (IProviderService**)&s); if (mPropertyServiceTable == NULL) { CLinkedHashMap::New(128, (ILinkedHashMap**)&mPropertyServiceTable); } keyObj = NULL; CString::New(propertyServiceTableKey, (ICharSequence**)&keyObj); mPropertyServiceTable->Put(keyObj, s); } } } } ServicesChanged(); mChangedProperties = NULL; }