diff options
author | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2013-04-28 20:49:09 -0700 |
---|---|---|
committer | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2013-04-28 20:49:09 -0700 |
commit | 6d1f8952d667509f705c4853799f65dc42420c85 (patch) | |
tree | 6834ec37123dec3adf28fd5f3d5e68fceff3cc58 | |
parent | d9da8ea6e22361a35c0bf94237c8c16d5021a3b4 (diff) |
fixes for providers
-rw-r--r-- | src/core/basetypes/MCIterator.h | 48 | ||||
-rw-r--r-- | src/core/provider/MCMailProvider.cc | 16 | ||||
-rw-r--r-- | src/core/provider/MCMailProvidersManager.cc | 21 | ||||
-rw-r--r-- | src/core/provider/MCNetService.cc | 28 |
4 files changed, 62 insertions, 51 deletions
diff --git a/src/core/basetypes/MCIterator.h b/src/core/basetypes/MCIterator.h index 00ff38db..964a2cce 100644 --- a/src/core/basetypes/MCIterator.h +++ b/src/core/basetypes/MCIterator.h @@ -28,22 +28,22 @@ for (unsigned int __index = 0; NULL != (__variable = mailcore::ArrayIteratorNext #define mc_foreachdictionaryKey(keyType, __key, __dictionary) \ keyType * __key; \ -DictionaryIterator __key##__iterator = DictionaryIteratorInit(__dictionary, true, false); \ -while (DictionaryIteratorRun(&__key##__iterator)) \ -while (DictionaryIteratorNext(&__key##__iterator, &__key, NULL)) +HashMapIterator __key##__iterator = HashMapIteratorInit(__dictionary, true, false); \ +while (HashMapIteratorRun(&__key##__iterator)) \ +while (HashMapIteratorNext(&__key##__iterator, &__key, NULL)) #define mc_foreachdictionaryValue(valueType, __value, __dictionary) \ valueType * __value; \ -DictionaryIterator __value##__iterator = DictionaryIteratorInit(__dictionary, false, true); \ -while (DictionaryIteratorRun(&__value##__iterator)) \ -while (DictionaryIteratorNext(&__value##__iterator, NULL, &__value)) +HashMapIterator __value##__iterator = HashMapIteratorInit(__dictionary, false, true); \ +while (HashMapIteratorRun(&__value##__iterator)) \ +while (HashMapIteratorNext(&__value##__iterator, NULL, (Object **) &__value)) -#define mc_foreachdictionaryKeyAndValue(__key, __value, __dictionary) \ +#define mc_foreachdictionaryKeyAndValue(keyType, __key, valueType, __value, __dictionary) \ keyType * __key; \ valueType * __value; \ -DictionaryIterator __key##__value##__iterator = DictionaryIteratorInit(__dictionary, true, true); \ -while (DictionaryIteratorRun(&__key##__value##__iterator)) \ -while (DictionaryIteratorNext(&__key##__value##__iterator, &__key, &__value)) +HashMapIterator __key##__value##__iterator = HashMapIteratorInit(__dictionary, true, true); \ +while (HashMapIteratorRun(&__key##__value##__iterator)) \ +while (HashMapIteratorNext(&__key##__value##__iterator, (Object **) &__key, (Object **) &__value)) namespace mailcore { @@ -55,7 +55,7 @@ namespace mailcore { static inline ArrayIterator ArrayIteratorInit(Array * array) { - ArrayIterator iterator = { 0, array->count(), array }; + ArrayIterator iterator = { 0, array != NULL ? array->count() : 0, array }; return iterator; } @@ -79,14 +79,18 @@ namespace mailcore { Array * values; }; - static inline HashMapIterator FastDictionaryIteratorInit(HashMap * hashmap, bool useKeys, bool useValues) + static inline HashMapIterator HashMapIteratorInit(HashMap * hashmap, bool useKeys, bool useValues) { AutoreleasePool * pool = new AutoreleasePool(); - Array * keys = useKeys ? hashmap->allKeys() : NULL; - Array * values = useValues ? hashmap->allValues() : NULL; - keys->retain(); - values->retain(); - HashMapIterator iterator = { false, 0, hashmap->count(), keys, values }; + Array * keys = useKeys ? (hashmap != NULL ? hashmap->allKeys() : NULL) : NULL; + Array * values = useValues ? (hashmap != NULL ? hashmap->allValues() : NULL) : NULL; + if (keys != NULL) { + keys->retain(); + } + if (values != NULL) { + values->retain(); + } + HashMapIterator iterator = { false, 0, hashmap != NULL ? hashmap->count() : 0, keys, values }; pool->release(); return iterator; @@ -109,18 +113,18 @@ namespace mailcore { } - static inline bool DictionaryIteratorRun(HashMapIterator * iterator) + static inline bool HashMapIteratorRun(HashMapIterator * iterator) { - if (iterator->cleanup) { + if (!iterator->cleanup) { iterator->cleanup = true; return true; } else { - iterator->keys->release(); - iterator->values->release(); + MC_SAFE_RELEASE(iterator->keys); + MC_SAFE_RELEASE(iterator->values); return false; } } - + }; #endif diff --git a/src/core/provider/MCMailProvider.cc b/src/core/provider/MCMailProvider.cc index e9f64872..40d4abf7 100644 --- a/src/core/provider/MCMailProvider.cc +++ b/src/core/provider/MCMailProvider.cc @@ -32,9 +32,15 @@ void MailProvider::initWihInfo(HashMap * info) Array * popInfos; HashMap * serverInfo; Array * mxs; - - mDomainMatch = (Array *) info->objectForKey(MCSTR("domain-match"))->retain(); - mMailboxPaths = (HashMap *) info->objectForKey(MCSTR("mailboxes"))->retain(); + + mDomainMatch = NULL; + if (info->objectForKey(MCSTR("domain-match")) != NULL) { + mDomainMatch = (Array *) info->objectForKey(MCSTR("domain-match"))->retain(); + } + mMailboxPaths = NULL; + if (info->objectForKey(MCSTR("mailboxes")) != NULL) { + mMailboxPaths = (HashMap *) info->objectForKey(MCSTR("mailboxes"))->retain(); + } mxs = (Array *) info->objectForKey(MCSTR("mx")); mc_foreacharray(String, mx, mxs) { mMxSet->addObject(mx->lowercaseString()); @@ -189,14 +195,14 @@ String * MailProvider::importantFolderPath() bool MailProvider::isMainFolder(String * folderPath, String * prefix) { - mc_foreachdictionaryValue(Object, path, mMailboxPaths) { + mc_foreachdictionaryValue(String, path, mMailboxPaths) { String * fullPath; if (prefix != NULL) { fullPath = prefix->stringByAppendingString((String *) path); } else { - fullPath = (String *) path; + fullPath = path; } if (fullPath->isEqual(folderPath)) diff --git a/src/core/provider/MCMailProvidersManager.cc b/src/core/provider/MCMailProvidersManager.cc index 0b45f4da..af4a85e6 100644 --- a/src/core/provider/MCMailProvidersManager.cc +++ b/src/core/provider/MCMailProvidersManager.cc @@ -19,10 +19,7 @@ void MailProvidersManager::init() MailProvider * MailProvidersManager::providerForEmail(String * email) { - mc_foreachdictionaryValue(Object, identifier, mProviders) { - MailProvider * provider; - - provider = (MailProvider *) mProviders->objectForKey(identifier); + mc_foreachdictionaryValue(MailProvider, provider, mProviders) { if (provider->matchEmail(email)) return provider; } @@ -32,10 +29,7 @@ MailProvider * MailProvidersManager::providerForEmail(String * email) MailProvider * MailProvidersManager::providerForMX(String * hostname) { - mc_foreachdictionaryValue(Object, identifier, mProviders) { - MailProvider * provider; - - provider = (MailProvider *) mProviders->objectForKey(identifier); + mc_foreachdictionaryValue(MailProvider, provider, mProviders) { if (provider->matchMX(hostname)) return provider; } @@ -50,12 +44,11 @@ MailProvider * MailProvidersManager::providerForIdentifier(String * identifier) void MailProvidersManager::registerProviders(HashMap * providers) { - mc_foreachdictionaryValue(Object, identifier, providers) { - MailProvider * provider; - - provider = new MailProvider((HashMap *) providers->objectForKey(identifier)); - provider->setIdentifier((String *) identifier); - mProviders->setObjectForKey(provider, identifier); + mc_foreachdictionaryKeyAndValue(String, identifier, HashMap, providerInfo, providers) { + MailProvider * provider = new MailProvider(providerInfo); + provider->setIdentifier(identifier); + MCLog("register %s", MCUTF8DESC(identifier)); + mProviders->setObjectForKey(identifier, provider); provider->release(); } } diff --git a/src/core/provider/MCNetService.cc b/src/core/provider/MCNetService.cc index 0ffcbaef..aef092e1 100644 --- a/src/core/provider/MCNetService.cc +++ b/src/core/provider/MCNetService.cc @@ -17,13 +17,19 @@ void NetService::init() { NetService::NetService(HashMap * info) { init(); - bool ssl; - bool starttls; + bool ssl = false; + bool starttls = false; this->setHostname((String *) info->objectForKey(MCSTR("hostname"))); - this->setPort(((Value *) info->objectForKey(MCSTR("port")))->intValue()); - ssl = ((Value *) info->objectForKey(MCSTR("ssl")))->boolValue(); - starttls = ((Value *) info->objectForKey(MCSTR("starttls")))->boolValue(); + if (info->objectForKey(MCSTR("port")) != NULL) { + this->setPort(((Value *) info->objectForKey(MCSTR("port")))->intValue()); + } + if (info->objectForKey(MCSTR("ssl")) != NULL) { + ssl = ((Value *) info->objectForKey(MCSTR("ssl")))->boolValue(); + } + if (info->objectForKey(MCSTR("starttls")) != NULL) { + starttls = ((Value *) info->objectForKey(MCSTR("starttls")))->boolValue(); + } if (ssl) { mConnectionType = ConnectionTypeTLS; } @@ -84,17 +90,19 @@ HashMap * NetService::info() { result = new HashMap(); if (mHostname != NULL) { - result->setObjectForKey(mHostname, MCSTR("hostname")); + result->setObjectForKey(MCSTR("hostname"), mHostname); } if (mPort != 0) { - result->setObjectForKey(Value::valueWithIntValue(mPort), MCSTR("port")); + result->setObjectForKey(MCSTR("port"), Value::valueWithIntValue(mPort)); } - switch (mConnectionType & ConnectionTypeMask) { + switch (mConnectionType) { case ConnectionTypeTLS: - result->setObjectForKey(Value::valueWithBoolValue(true), MCSTR("ssl")); + result->setObjectForKey(MCSTR("ssl"), Value::valueWithBoolValue(true)); break; case ConnectionTypeStartTLS: - result->setObjectForKey(Value::valueWithBoolValue(true), MCSTR("starttls")); + result->setObjectForKey(MCSTR("starttls"), Value::valueWithBoolValue(true)); + break; + default: break; } |