aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-04-28 20:49:09 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-04-28 20:49:09 -0700
commit6d1f8952d667509f705c4853799f65dc42420c85 (patch)
tree6834ec37123dec3adf28fd5f3d5e68fceff3cc58
parentd9da8ea6e22361a35c0bf94237c8c16d5021a3b4 (diff)
fixes for providers
-rw-r--r--src/core/basetypes/MCIterator.h48
-rw-r--r--src/core/provider/MCMailProvider.cc16
-rw-r--r--src/core/provider/MCMailProvidersManager.cc21
-rw-r--r--src/core/provider/MCNetService.cc28
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;
}