Example #1
0
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;
}