1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #include "msgCore.h"  // for pre-compiled headers
7 #include "nsMsgIdentity.h"
8 #include "nsIPrefService.h"
9 #include "nsString.h"
10 #include "nsMsgCompCID.h"
11 #include "nsMsgFolderFlags.h"
12 #include "nsIMsgFolder.h"
13 #include "nsIMsgIncomingServer.h"
14 #include "nsIMsgAccountManager.h"
15 #include "mozilla/mailnews/MimeHeaderParser.h"
16 #include "nsMsgBaseCID.h"
17 #include "prprf.h"
18 #include "nsISupportsPrimitives.h"
19 #include "nsMsgUtils.h"
20 #include "nsServiceManagerUtils.h"
21 #include "nsComponentManagerUtils.h"
22 
23 #define REL_FILE_PREF_SUFFIX "-rel"
24 
NS_IMPL_ISUPPORTS(nsMsgIdentity,nsIMsgIdentity)25 NS_IMPL_ISUPPORTS(nsMsgIdentity, nsIMsgIdentity)
26 
27 /*
28  * accessors for pulling values directly out of preferences
29  * instead of member variables, etc
30  */
31 
32 NS_IMETHODIMP
33 nsMsgIdentity::GetKey(nsACString& aKey) {
34   aKey = mKey;
35   return NS_OK;
36 }
37 
38 NS_IMETHODIMP
SetKey(const nsACString & identityKey)39 nsMsgIdentity::SetKey(const nsACString& identityKey) {
40   mKey = identityKey;
41   nsresult rv;
42   nsCOMPtr<nsIPrefService> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv));
43   if (NS_FAILED(rv)) return rv;
44 
45   nsAutoCString branchName;
46   branchName.AssignLiteral("mail.identity.");
47   branchName += mKey;
48   branchName.Append('.');
49   rv = prefs->GetBranch(branchName.get(), getter_AddRefs(mPrefBranch));
50   if (NS_FAILED(rv)) return rv;
51 
52   rv = prefs->GetBranch("mail.identity.default.",
53                         getter_AddRefs(mDefPrefBranch));
54   return rv;
55 }
56 
GetIdentityName(nsAString & idName)57 nsresult nsMsgIdentity::GetIdentityName(nsAString& idName) {
58   idName.AssignLiteral("");
59   // Try to use "fullname <email>" as the name.
60   nsresult rv = GetFullAddress(idName);
61   NS_ENSURE_SUCCESS(rv, rv);
62 
63   // If a non-empty label exists, append it.
64   nsString label;
65   rv = GetLabel(label);
66   if (NS_SUCCEEDED(rv) &&
67       !label.IsEmpty()) {  // TODO: this should be localizable
68     idName.AppendLiteral(" (");
69     idName.Append(label);
70     idName.Append(')');
71   }
72 
73   if (!idName.IsEmpty()) return NS_OK;
74 
75   // If we still found nothing to use, use our key.
76   return ToString(idName);
77 }
78 
GetFullAddress(nsAString & fullAddress)79 nsresult nsMsgIdentity::GetFullAddress(nsAString& fullAddress) {
80   nsAutoString fullName;
81   nsresult rv = GetFullName(fullName);
82   NS_ENSURE_SUCCESS(rv, rv);
83 
84   nsAutoCString email;
85   rv = GetEmail(email);
86   NS_ENSURE_SUCCESS(rv, rv);
87 
88   if (fullName.IsEmpty() && email.IsEmpty())
89     fullAddress.Truncate();
90   else
91     mozilla::mailnews::MakeMimeAddress(fullName, NS_ConvertASCIItoUTF16(email),
92                                        fullAddress);
93 
94   return NS_OK;
95 }
96 
97 NS_IMETHODIMP
ToString(nsAString & aResult)98 nsMsgIdentity::ToString(nsAString& aResult) {
99   aResult.AssignLiteral("[nsIMsgIdentity: ");
100   aResult.Append(NS_ConvertASCIItoUTF16(mKey));
101   aResult.Append(']');
102   return NS_OK;
103 }
104 
105 /* Identity attribute accessors */
106 
107 NS_IMETHODIMP
GetSignature(nsIFile ** sig)108 nsMsgIdentity::GetSignature(nsIFile** sig) {
109   bool gotRelPref;
110   nsresult rv =
111       NS_GetPersistentFile("sig_file" REL_FILE_PREF_SUFFIX, "sig_file", nullptr,
112                            gotRelPref, sig, mPrefBranch);
113   if (NS_SUCCEEDED(rv) && !gotRelPref) {
114     rv = NS_SetPersistentFile("sig_file" REL_FILE_PREF_SUFFIX, "sig_file", *sig,
115                               mPrefBranch);
116     NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to write signature file pref.");
117   }
118   return NS_OK;
119 }
120 
121 NS_IMETHODIMP
SetSignature(nsIFile * sig)122 nsMsgIdentity::SetSignature(nsIFile* sig) {
123   nsresult rv = NS_OK;
124   if (sig)
125     rv = NS_SetPersistentFile("sig_file" REL_FILE_PREF_SUFFIX, "sig_file", sig,
126                               mPrefBranch);
127   return rv;
128 }
129 
130 NS_IMETHODIMP
ClearAllValues()131 nsMsgIdentity::ClearAllValues() {
132   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
133 
134   nsTArray<nsCString> prefNames;
135   nsresult rv = mPrefBranch->GetChildList("", prefNames);
136   NS_ENSURE_SUCCESS(rv, rv);
137 
138   for (auto& prefName : prefNames) {
139     mPrefBranch->ClearUserPref(prefName.get());
140   }
141 
142   return NS_OK;
143 }
144 
145 NS_IMPL_IDPREF_STR(EscapedVCard, "escapedVCard")
146 NS_IMPL_IDPREF_STR(SmtpServerKey, "smtpServer")
147 NS_IMPL_IDPREF_WSTR(FullName, "fullName")
148 NS_IMPL_IDPREF_STR(Email, "useremail")
149 NS_IMPL_IDPREF_BOOL(CatchAll, "catchAll")
150 NS_IMPL_IDPREF_STR(CatchAllHint, "catchAllHint")
151 NS_IMPL_IDPREF_WSTR(Label, "label")
152 NS_IMPL_IDPREF_STR(ReplyTo, "reply_to")
153 NS_IMPL_IDPREF_WSTR(Organization, "organization")
154 NS_IMPL_IDPREF_BOOL(ComposeHtml, "compose_html")
155 NS_IMPL_IDPREF_BOOL(AttachVCard, "attach_vcard")
156 NS_IMPL_IDPREF_BOOL(AttachSignature, "attach_signature")
157 NS_IMPL_IDPREF_WSTR(HtmlSigText, "htmlSigText")
158 NS_IMPL_IDPREF_BOOL(HtmlSigFormat, "htmlSigFormat")
159 
160 NS_IMPL_IDPREF_BOOL(AutoQuote, "auto_quote")
161 NS_IMPL_IDPREF_INT(ReplyOnTop, "reply_on_top")
162 NS_IMPL_IDPREF_BOOL(SigBottom, "sig_bottom")
163 NS_IMPL_IDPREF_BOOL(SigOnForward, "sig_on_fwd")
164 NS_IMPL_IDPREF_BOOL(SigOnReply, "sig_on_reply")
165 
166 NS_IMPL_IDPREF_INT(SignatureDate, "sig_date")
167 
168 NS_IMPL_IDPREF_BOOL(DoFcc, "fcc")
169 
170 NS_IMPL_FOLDERPREF_STR(FccFolder, "fcc_folder", "Sent",
171                        nsMsgFolderFlags::SentMail)
172 NS_IMPL_IDPREF_STR(FccFolderPickerMode, "fcc_folder_picker_mode")
173 NS_IMPL_IDPREF_BOOL(FccReplyFollowsParent, "fcc_reply_follows_parent")
174 NS_IMPL_IDPREF_STR(DraftsFolderPickerMode, "drafts_folder_picker_mode")
175 NS_IMPL_IDPREF_STR(ArchivesFolderPickerMode, "archives_folder_picker_mode")
176 NS_IMPL_IDPREF_STR(TmplFolderPickerMode, "tmpl_folder_picker_mode")
177 
178 NS_IMPL_IDPREF_BOOL(BccSelf, "bcc_self")
179 NS_IMPL_IDPREF_BOOL(BccOthers, "bcc_other")
180 NS_IMPL_IDPREF_STR(BccList, "bcc_other_list")
181 
182 NS_IMPL_IDPREF_BOOL(SuppressSigSep, "suppress_signature_separator")
183 
184 NS_IMPL_IDPREF_BOOL(DoCc, "doCc")
185 NS_IMPL_IDPREF_STR(DoCcList, "doCcList")
186 
187 NS_IMETHODIMP
GetDoBcc(bool * aValue)188 nsMsgIdentity::GetDoBcc(bool* aValue) {
189   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
190 
191   nsresult rv = mPrefBranch->GetBoolPref("doBcc", aValue);
192   if (NS_SUCCEEDED(rv)) return rv;
193 
194   bool bccSelf = false;
195   GetBccSelf(&bccSelf);
196 
197   bool bccOthers = false;
198   GetBccOthers(&bccOthers);
199 
200   nsCString others;
201   GetBccList(others);
202 
203   *aValue = bccSelf || (bccOthers && !others.IsEmpty());
204 
205   return SetDoBcc(*aValue);
206 }
207 
208 NS_IMETHODIMP
SetDoBcc(bool aValue)209 nsMsgIdentity::SetDoBcc(bool aValue) {
210   return SetBoolAttribute("doBcc", aValue);
211 }
212 
213 NS_IMETHODIMP
GetDoBccList(nsACString & aValue)214 nsMsgIdentity::GetDoBccList(nsACString& aValue) {
215   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
216 
217   nsCString val;
218   nsresult rv = mPrefBranch->GetCharPref("doBccList", val);
219   aValue = val;
220   if (NS_SUCCEEDED(rv)) return rv;
221 
222   bool bccSelf = false;
223   rv = GetBccSelf(&bccSelf);
224   NS_ENSURE_SUCCESS(rv, rv);
225 
226   if (bccSelf) GetEmail(aValue);
227 
228   bool bccOthers = false;
229   rv = GetBccOthers(&bccOthers);
230   NS_ENSURE_SUCCESS(rv, rv);
231 
232   nsCString others;
233   rv = GetBccList(others);
234   NS_ENSURE_SUCCESS(rv, rv);
235 
236   if (bccOthers && !others.IsEmpty()) {
237     if (bccSelf) aValue.Append(',');
238     aValue.Append(others);
239   }
240 
241   return SetDoBccList(aValue);
242 }
243 
244 NS_IMETHODIMP
SetDoBccList(const nsACString & aValue)245 nsMsgIdentity::SetDoBccList(const nsACString& aValue) {
246   return SetCharAttribute("doBccList", aValue);
247 }
248 
249 NS_IMPL_FOLDERPREF_STR(DraftFolder, "draft_folder", "Drafts",
250                        nsMsgFolderFlags::Drafts)
251 NS_IMPL_FOLDERPREF_STR(ArchiveFolder, "archive_folder", "Archives",
252                        nsMsgFolderFlags::Archive)
253 NS_IMPL_FOLDERPREF_STR(StationeryFolder, "stationery_folder", "Templates",
254                        nsMsgFolderFlags::Templates)
255 
256 NS_IMPL_IDPREF_BOOL(ArchiveEnabled, "archive_enabled")
257 NS_IMPL_IDPREF_INT(ArchiveGranularity, "archive_granularity")
258 NS_IMPL_IDPREF_BOOL(ArchiveKeepFolderStructure, "archive_keep_folder_structure")
259 
260 NS_IMPL_IDPREF_BOOL(ShowSaveMsgDlg, "showSaveMsgDlg")
261 NS_IMPL_IDPREF_STR(DirectoryServer, "directoryServer")
262 NS_IMPL_IDPREF_BOOL(OverrideGlobalPref, "overrideGlobal_Pref")
263 NS_IMPL_IDPREF_BOOL(AutocompleteToMyDomain, "autocompleteToMyDomain")
264 
265 NS_IMPL_IDPREF_BOOL(Valid, "valid")
266 
getFolderPref(const char * prefname,nsCString & retval,const char * folderName,uint32_t folderflag)267 nsresult nsMsgIdentity::getFolderPref(const char* prefname, nsCString& retval,
268                                       const char* folderName,
269                                       uint32_t folderflag) {
270   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
271 
272   nsresult rv = mPrefBranch->GetCharPref(prefname, retval);
273   if (NS_SUCCEEDED(rv) && !retval.IsEmpty()) {
274     nsCOMPtr<nsIMsgFolder> folder;
275     rv = GetOrCreateFolder(retval, getter_AddRefs(folder));
276     NS_ENSURE_SUCCESS(rv, rv);
277     nsCOMPtr<nsIMsgIncomingServer> server;
278     // Make sure that folder hierarchy is built so that legitimate parent-child
279     // relationship is established.
280     folder->GetServer(getter_AddRefs(server));
281     if (server) {
282       nsCOMPtr<nsIMsgFolder> rootFolder;
283       nsCOMPtr<nsIMsgFolder> deferredToRootFolder;
284       server->GetRootFolder(getter_AddRefs(rootFolder));
285       server->GetRootMsgFolder(getter_AddRefs(deferredToRootFolder));
286       // check if we're using a deferred account - if not, use the uri;
287       // otherwise, fall through to code that will fix this pref.
288       if (rootFolder == deferredToRootFolder) {
289         nsCOMPtr<nsIMsgFolder> msgFolder;
290         rv = server->GetMsgFolderFromURI(folder, retval,
291                                          getter_AddRefs(msgFolder));
292         return NS_SUCCEEDED(rv) ? msgFolder->GetURI(retval) : rv;
293       }
294     }
295   }
296 
297   // if the server doesn't exist, fall back to the default pref.
298   rv = mDefPrefBranch->GetCharPref(prefname, retval);
299   if (NS_SUCCEEDED(rv) && !retval.IsEmpty())
300     return setFolderPref(prefname, retval, folderflag);
301 
302   // here I think we need to create a uri for the folder on the
303   // default server for this identity.
304   nsCOMPtr<nsIMsgAccountManager> accountManager =
305       do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv);
306   NS_ENSURE_SUCCESS(rv, rv);
307 
308   nsTArray<RefPtr<nsIMsgIncomingServer>> servers;
309   rv = accountManager->GetServersForIdentity(this, servers);
310   NS_ENSURE_SUCCESS(rv, rv);
311   if (servers.IsEmpty()) {
312     // if there are no servers for this identity, return generic failure.
313     return NS_ERROR_FAILURE;
314   }
315   nsCOMPtr<nsIMsgIncomingServer> server(servers[0]);
316   bool defaultToServer;
317   server->GetDefaultCopiesAndFoldersPrefsToServer(&defaultToServer);
318   // if we should default to special folders on the server,
319   // use the local folders server
320   if (!defaultToServer) {
321     rv = accountManager->GetLocalFoldersServer(getter_AddRefs(server));
322     NS_ENSURE_SUCCESS(rv, rv);
323   }
324   nsCOMPtr<nsIMsgFolder> rootFolder;
325   // this will get the deferred to server's root folder, if "server"
326   // is deferred, e.g., using the pop3 global inbox.
327   rv = server->GetRootMsgFolder(getter_AddRefs(rootFolder));
328   NS_ENSURE_SUCCESS(rv, rv);
329   if (rootFolder) {
330     rv = rootFolder->GetURI(retval);
331     NS_ENSURE_SUCCESS(rv, rv);
332     retval.Append('/');
333     retval.Append(folderName);
334     return setFolderPref(prefname, retval, folderflag);
335   }
336   return NS_ERROR_FAILURE;
337 }
338 
setFolderPref(const char * prefname,const nsACString & value,uint32_t folderflag)339 nsresult nsMsgIdentity::setFolderPref(const char* prefname,
340                                       const nsACString& value,
341                                       uint32_t folderflag) {
342   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
343 
344   nsCString oldpref;
345   nsresult rv;
346   nsCOMPtr<nsIMsgFolder> folder;
347 
348   if (folderflag == nsMsgFolderFlags::SentMail) {
349     // Clear the temporary return receipt filter so that the new filter
350     // rule can be recreated (by ConfigureTemporaryFilters()).
351     nsCOMPtr<nsIMsgAccountManager> accountManager =
352         do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv);
353     NS_ENSURE_SUCCESS(rv, rv);
354 
355     nsTArray<RefPtr<nsIMsgIncomingServer>> servers;
356     rv = accountManager->GetServersForIdentity(this, servers);
357     NS_ENSURE_SUCCESS(rv, rv);
358     if (!servers.IsEmpty()) {
359       servers[0]->ClearTemporaryReturnReceiptsFilter();
360       // okay to fail; no need to check for return code
361     }
362   }
363 
364   // get the old folder, and clear the special folder flag on it
365   rv = mPrefBranch->GetCharPref(prefname, oldpref);
366   if (NS_SUCCEEDED(rv) && !oldpref.IsEmpty()) {
367     rv = GetOrCreateFolder(oldpref, getter_AddRefs(folder));
368     if (NS_SUCCEEDED(rv)) {
369       rv = folder->ClearFlag(folderflag);
370     }
371   }
372 
373   // set the new folder, and set the special folder flags on it
374   rv = SetCharAttribute(prefname, value);
375   if (NS_SUCCEEDED(rv) && !value.IsEmpty()) {
376     rv = GetOrCreateFolder(value, getter_AddRefs(folder));
377     if (NS_SUCCEEDED(rv)) rv = folder->SetFlag(folderflag);
378   }
379   return rv;
380 }
381 
SetUnicharAttribute(const char * aName,const nsAString & val)382 NS_IMETHODIMP nsMsgIdentity::SetUnicharAttribute(const char* aName,
383                                                  const nsAString& val) {
384   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
385 
386   if (!val.IsEmpty())
387     return mPrefBranch->SetStringPref(aName, NS_ConvertUTF16toUTF8(val));
388 
389   mPrefBranch->ClearUserPref(aName);
390   return NS_OK;
391 }
392 
GetUnicharAttribute(const char * aName,nsAString & val)393 NS_IMETHODIMP nsMsgIdentity::GetUnicharAttribute(const char* aName,
394                                                  nsAString& val) {
395   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
396 
397   nsCString valueUtf8;
398   if (NS_FAILED(
399           mPrefBranch->GetStringPref(aName, EmptyCString(), 0, valueUtf8)))
400     mDefPrefBranch->GetStringPref(aName, EmptyCString(), 0, valueUtf8);
401   CopyUTF8toUTF16(valueUtf8, val);
402   return NS_OK;
403 }
404 
SetCharAttribute(const char * aName,const nsACString & val)405 NS_IMETHODIMP nsMsgIdentity::SetCharAttribute(const char* aName,
406                                               const nsACString& val) {
407   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
408 
409   if (!val.IsEmpty()) return mPrefBranch->SetCharPref(aName, val);
410 
411   mPrefBranch->ClearUserPref(aName);
412   return NS_OK;
413 }
414 
GetCharAttribute(const char * aName,nsACString & val)415 NS_IMETHODIMP nsMsgIdentity::GetCharAttribute(const char* aName,
416                                               nsACString& val) {
417   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
418 
419   nsCString tmpVal;
420   if (NS_FAILED(mPrefBranch->GetCharPref(aName, tmpVal)))
421     mDefPrefBranch->GetCharPref(aName, tmpVal);
422   val = tmpVal;
423   return NS_OK;
424 }
425 
SetBoolAttribute(const char * aName,bool val)426 NS_IMETHODIMP nsMsgIdentity::SetBoolAttribute(const char* aName, bool val) {
427   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
428 
429   return mPrefBranch->SetBoolPref(aName, val);
430 }
431 
GetBoolAttribute(const char * aName,bool * val)432 NS_IMETHODIMP nsMsgIdentity::GetBoolAttribute(const char* aName, bool* val) {
433   NS_ENSURE_ARG_POINTER(val);
434   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
435 
436   *val = false;
437 
438   if (NS_FAILED(mPrefBranch->GetBoolPref(aName, val)))
439     mDefPrefBranch->GetBoolPref(aName, val);
440 
441   return NS_OK;
442 }
443 
SetIntAttribute(const char * aName,int32_t val)444 NS_IMETHODIMP nsMsgIdentity::SetIntAttribute(const char* aName, int32_t val) {
445   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
446 
447   return mPrefBranch->SetIntPref(aName, val);
448 }
449 
GetIntAttribute(const char * aName,int32_t * val)450 NS_IMETHODIMP nsMsgIdentity::GetIntAttribute(const char* aName, int32_t* val) {
451   NS_ENSURE_ARG_POINTER(val);
452 
453   if (!mPrefBranch) return NS_ERROR_NOT_INITIALIZED;
454 
455   *val = 0;
456 
457   if (NS_FAILED(mPrefBranch->GetIntPref(aName, val)))
458     mDefPrefBranch->GetIntPref(aName, val);
459 
460   return NS_OK;
461 }
462 
463 #define COPY_IDENTITY_FILE_VALUE(SRC_ID, MACRO_GETTER, MACRO_SETTER) \
464   {                                                                  \
465     nsresult macro_rv;                                               \
466     nsCOMPtr<nsIFile> macro_spec;                                    \
467     macro_rv = SRC_ID->MACRO_GETTER(getter_AddRefs(macro_spec));     \
468     if (NS_SUCCEEDED(macro_rv)) this->MACRO_SETTER(macro_spec);      \
469   }
470 
471 #define COPY_IDENTITY_INT_VALUE(SRC_ID, MACRO_GETTER, MACRO_SETTER) \
472   {                                                                 \
473     nsresult macro_rv;                                              \
474     int32_t macro_oldInt;                                           \
475     macro_rv = SRC_ID->MACRO_GETTER(&macro_oldInt);                 \
476     if (NS_SUCCEEDED(macro_rv)) this->MACRO_SETTER(macro_oldInt);   \
477   }
478 
479 #define COPY_IDENTITY_BOOL_VALUE(SRC_ID, MACRO_GETTER, MACRO_SETTER) \
480   {                                                                  \
481     nsresult macro_rv;                                               \
482     bool macro_oldBool;                                              \
483     macro_rv = SRC_ID->MACRO_GETTER(&macro_oldBool);                 \
484     if (NS_SUCCEEDED(macro_rv)) this->MACRO_SETTER(macro_oldBool);   \
485   }
486 
487 #define COPY_IDENTITY_STR_VALUE(SRC_ID, MACRO_GETTER, MACRO_SETTER) \
488   {                                                                 \
489     nsCString macro_oldStr;                                         \
490     nsresult macro_rv;                                              \
491     macro_rv = SRC_ID->MACRO_GETTER(macro_oldStr);                  \
492     if (NS_SUCCEEDED(macro_rv)) {                                   \
493       this->MACRO_SETTER(macro_oldStr);                             \
494     }                                                               \
495   }
496 
497 #define COPY_IDENTITY_WSTR_VALUE(SRC_ID, MACRO_GETTER, MACRO_SETTER) \
498   {                                                                  \
499     nsString macro_oldStr;                                           \
500     nsresult macro_rv;                                               \
501     macro_rv = SRC_ID->MACRO_GETTER(macro_oldStr);                   \
502     if (NS_SUCCEEDED(macro_rv)) {                                    \
503       this->MACRO_SETTER(macro_oldStr);                              \
504     }                                                                \
505   }
506 
507 NS_IMETHODIMP
Copy(nsIMsgIdentity * identity)508 nsMsgIdentity::Copy(nsIMsgIdentity* identity) {
509   NS_ENSURE_ARG_POINTER(identity);
510 
511   COPY_IDENTITY_BOOL_VALUE(identity, GetComposeHtml, SetComposeHtml)
512   COPY_IDENTITY_STR_VALUE(identity, GetEmail, SetEmail)
513   COPY_IDENTITY_BOOL_VALUE(identity, GetCatchAll, SetCatchAll)
514   COPY_IDENTITY_WSTR_VALUE(identity, GetLabel, SetLabel)
515   COPY_IDENTITY_STR_VALUE(identity, GetReplyTo, SetReplyTo)
516   COPY_IDENTITY_WSTR_VALUE(identity, GetFullName, SetFullName)
517   COPY_IDENTITY_WSTR_VALUE(identity, GetOrganization, SetOrganization)
518   COPY_IDENTITY_STR_VALUE(identity, GetDraftFolder, SetDraftFolder)
519   COPY_IDENTITY_STR_VALUE(identity, GetArchiveFolder, SetArchiveFolder)
520   COPY_IDENTITY_STR_VALUE(identity, GetFccFolder, SetFccFolder)
521   COPY_IDENTITY_BOOL_VALUE(identity, GetFccReplyFollowsParent,
522                            SetFccReplyFollowsParent)
523   COPY_IDENTITY_STR_VALUE(identity, GetStationeryFolder, SetStationeryFolder)
524   COPY_IDENTITY_BOOL_VALUE(identity, GetArchiveEnabled, SetArchiveEnabled)
525   COPY_IDENTITY_INT_VALUE(identity, GetArchiveGranularity,
526                           SetArchiveGranularity)
527   COPY_IDENTITY_BOOL_VALUE(identity, GetArchiveKeepFolderStructure,
528                            SetArchiveKeepFolderStructure)
529   COPY_IDENTITY_BOOL_VALUE(identity, GetAttachSignature, SetAttachSignature)
530   COPY_IDENTITY_FILE_VALUE(identity, GetSignature, SetSignature)
531   COPY_IDENTITY_WSTR_VALUE(identity, GetHtmlSigText, SetHtmlSigText)
532   COPY_IDENTITY_BOOL_VALUE(identity, GetHtmlSigFormat, SetHtmlSigFormat)
533   COPY_IDENTITY_BOOL_VALUE(identity, GetAutoQuote, SetAutoQuote)
534   COPY_IDENTITY_INT_VALUE(identity, GetReplyOnTop, SetReplyOnTop)
535   COPY_IDENTITY_BOOL_VALUE(identity, GetSigBottom, SetSigBottom)
536   COPY_IDENTITY_BOOL_VALUE(identity, GetSigOnForward, SetSigOnForward)
537   COPY_IDENTITY_BOOL_VALUE(identity, GetSigOnReply, SetSigOnReply)
538   COPY_IDENTITY_INT_VALUE(identity, GetSignatureDate, SetSignatureDate)
539   COPY_IDENTITY_BOOL_VALUE(identity, GetAttachVCard, SetAttachVCard)
540   COPY_IDENTITY_STR_VALUE(identity, GetEscapedVCard, SetEscapedVCard)
541   COPY_IDENTITY_STR_VALUE(identity, GetSmtpServerKey, SetSmtpServerKey)
542   COPY_IDENTITY_BOOL_VALUE(identity, GetSuppressSigSep, SetSuppressSigSep)
543   return NS_OK;
544 }
545 
546 NS_IMETHODIMP
GetRequestReturnReceipt(bool * aVal)547 nsMsgIdentity::GetRequestReturnReceipt(bool* aVal) {
548   NS_ENSURE_ARG_POINTER(aVal);
549 
550   bool useCustomPrefs = false;
551   nsresult rv = GetBoolAttribute("use_custom_prefs", &useCustomPrefs);
552   NS_ENSURE_SUCCESS(rv, rv);
553   if (useCustomPrefs)
554     return GetBoolAttribute("request_return_receipt_on", aVal);
555 
556   nsCOMPtr<nsIPrefBranch> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv));
557   NS_ENSURE_SUCCESS(rv, rv);
558   return prefs->GetBoolPref("mail.receipt.request_return_receipt_on", aVal);
559 }
560 
561 NS_IMETHODIMP
GetReceiptHeaderType(int32_t * aType)562 nsMsgIdentity::GetReceiptHeaderType(int32_t* aType) {
563   NS_ENSURE_ARG_POINTER(aType);
564 
565   bool useCustomPrefs = false;
566   nsresult rv = GetBoolAttribute("use_custom_prefs", &useCustomPrefs);
567   NS_ENSURE_SUCCESS(rv, rv);
568   if (useCustomPrefs)
569     return GetIntAttribute("request_receipt_header_type", aType);
570 
571   nsCOMPtr<nsIPrefBranch> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv));
572   NS_ENSURE_SUCCESS(rv, rv);
573   return prefs->GetIntPref("mail.receipt.request_header_type", aType);
574 }
575 
576 NS_IMETHODIMP
GetRequestDSN(bool * aVal)577 nsMsgIdentity::GetRequestDSN(bool* aVal) {
578   NS_ENSURE_ARG_POINTER(aVal);
579 
580   bool useCustomPrefs = false;
581   nsresult rv = GetBoolAttribute("dsn_use_custom_prefs", &useCustomPrefs);
582   NS_ENSURE_SUCCESS(rv, rv);
583   if (useCustomPrefs) return GetBoolAttribute("dsn_always_request_on", aVal);
584 
585   nsCOMPtr<nsIPrefBranch> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv));
586   NS_ENSURE_SUCCESS(rv, rv);
587   return prefs->GetBoolPref("mail.dsn.always_request_on", aVal);
588 }
589