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(¯o_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(¯o_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