/mojomail/imap/src/data/ImapAccountAdapter.cpp

https://bitbucket.org/kasimling/app-services · C++ · 270 lines · 182 code · 50 blank · 38 comment · 18 complexity · 6dd0775ae6e7272757568c9604011618 MD5 · raw file

  1. // @@@LICENSE
  2. //
  3. // Copyright (c) 2010-2012 Hewlett-Packard Development Company, L.P.
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. //
  17. // LICENSE@@@
  18. #include "data/ImapAccountAdapter.h"
  19. #include "data/DatabaseAdapter.h"
  20. #include "data/EmailAccountAdapter.h"
  21. #include "ImapCoreDefs.h"
  22. #include "ImapConfig.h"
  23. using namespace std;
  24. const char* const ImapAccountAdapter::KIND = "_kind";
  25. const char* const ImapAccountAdapter::SYNCKEY = "syncKey";
  26. const char* const ImapAccountAdapter::ID = "_id";
  27. const char* const ImapAccountAdapter::TEMPLATEID = "templateId";
  28. const char* const ImapAccountAdapter::ACCOUNT_ID = "accountId";
  29. const char* const ImapAccountAdapter::REV = "_rev";
  30. const char* const ImapAccountAdapter::CONFIG_REV = "ImapConfigRev";
  31. const char* const ImapAccountAdapter::SCHEMA = "com.palm.imap.account:1";
  32. const char* const ImapAccountAdapter::USERNAME = "username";
  33. const char* const ImapAccountAdapter::EMAIL = "email";
  34. const char* const ImapAccountAdapter::HOSTNAME = "server";
  35. const char* const ImapAccountAdapter::PORT = "port";
  36. const char* const ImapAccountAdapter::ENCRYPTION = "encryption";
  37. const char* const ImapAccountAdapter::CONFIG = "config";
  38. const char* const ImapAccountAdapter::NO_SSL = "none";
  39. const char* const ImapAccountAdapter::REQUIRE_SSL = "ssl";
  40. const char* const ImapAccountAdapter::TLS = "tls";
  41. const char* const ImapAccountAdapter::TLS_IF_AVAILABLE = "tlsIfAvailable";
  42. // IMAP-specific
  43. const char* const ImapAccountAdapter::ROOT_FOLDER = "rootFolder";
  44. // Compatibility options
  45. const char* const ImapAccountAdapter::ENABLE_COMPRESS = "enableCompress";
  46. const char* const ImapAccountAdapter::ENABLE_EXPUNGE = "enableExpunge";
  47. const int ImapAccountAdapter::DEFAULT_SYNC_FREQUENCY_MINS = -1; // push
  48. const int ImapAccountAdapter::DEFAULT_SYNC_WINDOW_DAYS = 7; // one week
  49. /**
  50. * Parse two database objects into an ImapAccount
  51. *
  52. * @param in com.palm.mail.account database object
  53. * @param transportIn com.palm.imap.account database object
  54. * @param out ImapAccount
  55. */
  56. void ImapAccountAdapter::GetImapAccount(const MojObject& in, const MojObject& transportIn, ImapAccount& out)
  57. {
  58. MojObject id;
  59. MojErr err = in.getRequired(ID, id);
  60. ErrorToException(err);
  61. out.SetId(id);
  62. // Template from account object
  63. MojString templateId;
  64. bool hasTemplateId = false;
  65. err = in.get(TEMPLATEID, templateId, hasTemplateId); // make required later
  66. ErrorToException(err);
  67. if(hasTemplateId)
  68. {
  69. out.SetTemplateId(templateId.data());
  70. }
  71. boost::shared_ptr<ImapLoginSettings> loginSettings(new ImapLoginSettings());
  72. // Username from account object (this is always the email address)
  73. MojString username;
  74. in.getRequired(USERNAME, username);
  75. ErrorToException(err);
  76. loginSettings->SetUsername(username.data());
  77. // Read server settings
  78. ParseLoginConfig(transportIn, *loginSettings);
  79. // Store updated server settings on account
  80. out.SetLoginSettings(loginSettings);
  81. int syncFrequencyMin;
  82. err = transportIn.getRequired(EmailAccountAdapter::SYNC_FREQUENCY_MINS, syncFrequencyMin);
  83. ErrorToException(err);
  84. out.SetSyncFrequencyMins(syncFrequencyMin);
  85. int syncWindowDays;
  86. err = transportIn.getRequired(EmailAccountAdapter::SYNC_WINDOW_DAYS, syncWindowDays);
  87. ErrorToException(err);
  88. out.SetSyncWindowDays(syncWindowDays);
  89. MojInt64 rev;
  90. err = transportIn.getRequired(REV, rev);
  91. ErrorToException(err);
  92. out.SetRevision(rev);
  93. // Retrieve the optional error status
  94. MojObject errorObj;
  95. if(transportIn.get(EmailAccountAdapter::ERROR, errorObj))
  96. {
  97. EmailAccount::AccountError accountError;
  98. EmailAccountAdapter::ParseErrorInfo(errorObj, accountError);
  99. out.SetError(accountError);
  100. }
  101. // Compatibility/workaround options
  102. bool enableCompress = DatabaseAdapter::GetOptionalBool(transportIn, ENABLE_COMPRESS, ImapConfig::GetConfig().GetEnableCompress());
  103. bool enableExpunge = DatabaseAdapter::GetOptionalBool(transportIn, ENABLE_EXPUNGE, true);
  104. out.SetEnableCompression(enableCompress);
  105. out.SetEnableExpunge(enableExpunge);
  106. // Read special folders
  107. EmailAccountAdapter::ParseSpecialFolders(transportIn, out);
  108. // Read retry status
  109. EmailAccountAdapter::ParseAccountRetryStatus(transportIn, out);
  110. // Root folder prefix
  111. bool hasRootFolder = false;
  112. MojString rootFolder;
  113. err = transportIn.get(ROOT_FOLDER, rootFolder, hasRootFolder);
  114. ErrorToException(err);
  115. if(hasRootFolder) {
  116. out.SetNamespaceRoot( string(rootFolder.data()) );
  117. }
  118. }
  119. ImapLoginSettings::EncryptionType ImapAccountAdapter::GetEncryptionType(const MojString& encryptionStr)
  120. {
  121. if (encryptionStr == NO_SSL)
  122. return ImapLoginSettings::Encrypt_None;
  123. else if(encryptionStr == REQUIRE_SSL)
  124. return ImapLoginSettings::Encrypt_SSL;
  125. else if(encryptionStr == TLS)
  126. return ImapLoginSettings::Encrypt_TLS;
  127. else if(encryptionStr == TLS_IF_AVAILABLE)
  128. return ImapLoginSettings::Encrypt_TLSIfAvailable;
  129. else {
  130. throw MailException("unknown/invalid ssl encryption type", __FILE__, __LINE__);
  131. }
  132. }
  133. // Copy fields from createAccount payload into com.palm.imap.account object
  134. void ImapAccountAdapter::GetImapAccountFromPayload(const MojObject& accountObj, const MojObject& payload, MojObject& imapAccount)
  135. {
  136. MojErr err = imapAccount.putString(ImapAccountAdapter::KIND, ImapAccountAdapter::SCHEMA);
  137. ErrorToException(err);
  138. MojObject accountId;
  139. err = payload.getRequired(ImapAccountAdapter::ACCOUNT_ID, accountId);
  140. ErrorToException(err);
  141. err = imapAccount.put(ImapAccountAdapter::ACCOUNT_ID, accountId);
  142. ErrorToException(err);
  143. MojObject config;
  144. err = payload.getRequired(ImapAccountAdapter::CONFIG, config);
  145. ErrorToException(err);
  146. MojString username;
  147. bool hasUsername = false;
  148. err = config.get(ImapAccountAdapter::USERNAME, username, hasUsername);
  149. ErrorToException(err);
  150. if(!hasUsername)
  151. {
  152. err = accountObj.getRequired(ImapAccountAdapter::USERNAME, username);
  153. ErrorToException(err);
  154. }
  155. err = imapAccount.put(ImapAccountAdapter::USERNAME, username);
  156. ErrorToException(err);
  157. MojString hostname;
  158. err = config.getRequired(ImapAccountAdapter::HOSTNAME, hostname);
  159. ErrorToException(err);
  160. err = imapAccount.put(ImapAccountAdapter::HOSTNAME, hostname);
  161. ErrorToException(err);
  162. int port;
  163. err = config.getRequired(ImapAccountAdapter::PORT, port);
  164. ErrorToException(err);
  165. err = imapAccount.put(ImapAccountAdapter::PORT, port);
  166. ErrorToException(err);
  167. MojString encryption;
  168. err = config.getRequired(ImapAccountAdapter::ENCRYPTION, encryption);
  169. ErrorToException(err);
  170. err = imapAccount.put(ImapAccountAdapter::ENCRYPTION, encryption);
  171. ErrorToException(err);
  172. /* Optional config parameters; fill in with defaults if not provided */
  173. bool hasSyncFrequency = false;
  174. int syncFrequencyMins = 0;
  175. config.get(EmailAccountAdapter::SYNC_FREQUENCY_MINS, syncFrequencyMins, hasSyncFrequency);
  176. ErrorToException(err);
  177. err = imapAccount.putInt(EmailAccountAdapter::SYNC_FREQUENCY_MINS,
  178. hasSyncFrequency ? syncFrequencyMins : DEFAULT_SYNC_FREQUENCY_MINS);
  179. ErrorToException(err);
  180. bool hasSyncWindow = false;
  181. int syncWindow = 0;
  182. err = config.get(EmailAccountAdapter::SYNC_WINDOW_DAYS, syncWindow, hasSyncWindow);
  183. ErrorToException(err);
  184. err = imapAccount.putInt(EmailAccountAdapter::SYNC_WINDOW_DAYS,
  185. hasSyncWindow ? syncWindow : DEFAULT_SYNC_WINDOW_DAYS);
  186. ErrorToException(err);
  187. }
  188. MojObject ImapAccountAdapter::GetFolderId(const MojObject& obj, const char* prop)
  189. {
  190. MojObject folderId(MojObject::Undefined);
  191. if(obj.contains(prop)) {
  192. MojErr err = obj.getRequired(prop, folderId);
  193. ErrorToException(err);
  194. }
  195. return folderId;
  196. }
  197. void ImapAccountAdapter::ParseLoginConfig(const MojObject& config, ImapLoginSettings& login)
  198. {
  199. MojErr err;
  200. // Optional username; overrides account username if available
  201. bool hasServerUsername = false;
  202. MojString serverUsername;
  203. err = config.get(ImapAccountAdapter::USERNAME, serverUsername, hasServerUsername);
  204. ErrorToException(err);
  205. if(hasServerUsername) {
  206. login.SetUsername(serverUsername.data());
  207. }
  208. MojString hostname;
  209. err = config.getRequired(ImapAccountAdapter::HOSTNAME, hostname);
  210. ErrorToException(err);
  211. login.SetHostname(hostname.data());
  212. int port;
  213. err = config.getRequired(ImapAccountAdapter::PORT, port);
  214. ErrorToException(err);
  215. login.SetPort(port);
  216. MojString encryptionStr;
  217. err = config.getRequired(ImapAccountAdapter::ENCRYPTION, encryptionStr);
  218. ErrorToException(err);
  219. login.SetEncryption(GetEncryptionType(encryptionStr));
  220. }