1/* 2Open Tracker License 3 4Terms and Conditions 5 6Copyright (c) 1991-2001, Be Incorporated. All rights reserved. 7 8Permission is hereby granted, free of charge, to any person obtaining a copy of 9this software and associated documentation files (the "Software"), to deal in 10the Software without restriction, including without limitation the rights to 11use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 12of the Software, and to permit persons to whom the Software is furnished to do 13so, subject to the following conditions: 14 15The above copyright notice and this permission notice applies to all licensees 16and shall be included in all copies or substantial portions of the Software. 17 18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY, 20FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN 23CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 25Except as contained in this notice, the name of Be Incorporated shall not be 26used in advertising or otherwise to promote the sale, use or other dealings in 27this Software without prior written authorization from Be Incorporated. 28 29BeMail(TM), Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or 30registered trademarks of Be Incorporated in the United States and other 31countries. Other brand product names are registered trademarks or trademarks 32of their respective holders. All rights reserved. 33*/ 34 35 36#include "Settings.h" 37 38#include <Application.h> 39#include <Autolock.h> 40#include <Catalog.h> 41#include <CharacterSet.h> 42#include <CharacterSetRoster.h> 43#include <Directory.h> 44#include <Entry.h> 45#include <File.h> 46#include <FindDirectory.h> 47#include <Font.h> 48#include <Locale.h> 49#include <MailSettings.h> 50#include <Message.h> 51#include <String.h> 52#include <UTF8.h> 53 54#include <mail_encoding.h> 55 56 57#define B_TRANSLATION_CONTEXT "Settings" 58 59 60using namespace BPrivate ; 61 62 63Settings::Settings() 64 : 65 fMailWindowFrame(BRect(0, 0, 200, 400)), 66 fPrintSettings(NULL), 67 fAutoMarkRead(true), 68 fSignature(), 69 fReplyPreamble(), 70 fWrapMode(true), 71 fAttachAttributes(true), 72 fColoredQuotes(true), 73 fShowButtonBar(kShowToolBar), 74 fWarnAboutUnencodableCharacters(true), 75 fStartWithSpellCheckOn(false), 76 fShowSpamGUI(true), 77 fDefaultChain(0), 78 fUseAccountFrom(0), 79 fMailCharacterSet(B_MS_WINDOWS_CONVERSION), 80 fContentFont(be_fixed_font) 81{ 82 fSignature = B_TRANSLATE("None"); 83 84 LoadSettings(); 85 86 fContentFont.SetSpacing(B_BITMAP_SPACING); 87 88 _CheckForSpamFilterExistence(); 89} 90 91 92Settings::~Settings() 93{ 94} 95 96 97void 98Settings::SetPrintSettings(const BMessage* printSettings) 99{ 100 BAutolock lock(be_app); 101 102 if (printSettings == fPrintSettings) 103 return; 104 105 delete fPrintSettings; 106 if (printSettings) 107 fPrintSettings = new BMessage(*printSettings); 108 else 109 fPrintSettings = NULL; 110} 111 112 113bool 114Settings::HasPrintSettings() 115{ 116 BAutolock lock(be_app); 117 return fPrintSettings != NULL; 118} 119 120 121BMessage 122Settings::PrintSettings() 123{ 124 BAutolock lock(be_app); 125 return BMessage(*fPrintSettings); 126} 127 128 129void 130Settings::ClearPrintSettings() 131{ 132 delete fPrintSettings; 133 fPrintSettings = NULL; 134} 135 136 137void 138Settings::SetWindowFrame(BRect frame) 139{ 140 BAutolock lock(be_app); 141 fMailWindowFrame = frame; 142} 143 144 145BRect 146Settings::WindowFrame() 147{ 148 BAutolock lock(be_app); 149 return fMailWindowFrame; 150} 151 152 153status_t 154Settings::_GetSettingsPath(BPath &path) 155{ 156 status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path); 157 if (status != B_OK) 158 return status; 159 160 path.Append("Mail"); 161 return create_directory(path.Path(), 0755); 162} 163 164 165status_t 166Settings::SaveSettings() 167{ 168 BMailSettings chainSettings; 169 170 if (fDefaultChain != ~0UL) { 171 chainSettings.SetDefaultOutboundChainID(fDefaultChain); 172 chainSettings.Save(); 173 } 174 175 BPath path; 176 status_t status = _GetSettingsPath(path); 177 if (status != B_OK) 178 return status; 179 180 path.Append("Mail Settings~"); 181 182 BFile file; 183 status = file.SetTo(path.Path(), 184 B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); 185 186 if (status != B_OK) 187 return status; 188 189 BMessage settings('BeMl'); 190 settings.AddRect("MailWindowSize", fMailWindowFrame); 191 192 font_family fontFamily; 193 font_style fontStyle; 194 fContentFont.GetFamilyAndStyle(&fontFamily, &fontStyle); 195 196 settings.AddString("FontFamily", fontFamily); 197 settings.AddString("FontStyle", fontStyle); 198 settings.AddFloat("FontSize", fContentFont.Size()); 199 200 settings.AddBool("WordWrapMode", fWrapMode); 201 settings.AddBool("AutoMarkRead", fAutoMarkRead); 202 settings.AddString("SignatureText", fSignature); 203 settings.AddInt32("CharacterSet", fMailCharacterSet); 204 settings.AddInt8("ShowButtonBar", fShowButtonBar); 205 settings.AddInt32("UseAccountFrom", fUseAccountFrom); 206 settings.AddBool("ColoredQuotes", fColoredQuotes); 207 settings.AddString("ReplyPreamble", fReplyPreamble); 208 settings.AddBool("AttachAttributes", fAttachAttributes); 209 settings.AddBool("WarnAboutUnencodableCharacters", 210 fWarnAboutUnencodableCharacters); 211 settings.AddBool("StartWithSpellCheck", fStartWithSpellCheckOn); 212 213 BEntry entry; 214 status = entry.SetTo(path.Path()); 215 if (status != B_OK) 216 return status; 217 218 status = settings.Flatten(&file); 219 if (status == B_OK) { 220 // replace original settings file 221 status = entry.Rename("Mail Settings", true); 222 } else 223 entry.Remove(); 224 225 return status; 226} 227 228 229status_t 230Settings::LoadSettings() 231{ 232 BMailSettings chainSettings; 233 fDefaultChain = chainSettings.DefaultOutboundChainID(); 234 235 BPath path; 236 status_t status = _GetSettingsPath(path); 237 if (status != B_OK) 238 return status; 239 240 path.Append("Mail Settings"); 241 242 BFile file; 243 status = file.SetTo(path.Path(), B_READ_ONLY); 244 if (status != B_OK) { 245 _GetSettingsPath(path); 246 path.Append("BeMail Settings"); 247 status = file.SetTo(path.Path(), B_READ_ONLY); 248 if (status != B_OK) 249 return status; 250 } 251 252 BMessage settings; 253 status = settings.Unflatten(&file); 254 if (status < B_OK || settings.what != 'BeMl') 255 return status; 256 257 BRect rect; 258 if (settings.FindRect("MailWindowSize", &rect) == B_OK) 259 fMailWindowFrame = rect; 260 261 int32 int32Value; 262 263 const char *fontFamily; 264 if (settings.FindString("FontFamily", &fontFamily) == B_OK) { 265 const char *fontStyle; 266 if (settings.FindString("FontStyle", &fontStyle) == B_OK) { 267 float size; 268 if (settings.FindFloat("FontSize", &size) == B_OK) { 269 if (size >= 7) 270 fContentFont.SetSize(size); 271 272 if (fontFamily[0] && fontStyle[0]) { 273 fContentFont.SetFamilyAndStyle( 274 fontFamily[0] ? fontFamily : NULL, 275 fontStyle[0] ? fontStyle : NULL); 276 } 277 } 278 } 279 } 280 281 fWrapMode = settings.GetBool("WordWrapMode", fWrapMode); 282 fAutoMarkRead = settings.GetBool("AutoMarkRead", fAutoMarkRead); 283 284 BString string; 285 if (settings.FindString("SignatureText", &string) == B_OK) 286 fSignature = string; 287 288 if (settings.FindInt32("CharacterSet", &int32Value) == B_OK) 289 fMailCharacterSet = int32Value; 290 if (fMailCharacterSet != B_MAIL_UTF8_CONVERSION 291 && fMailCharacterSet != B_MAIL_US_ASCII_CONVERSION 292 && BCharacterSetRoster::GetCharacterSetByConversionID(fMailCharacterSet) 293 == NULL) { 294 fMailCharacterSet = B_MS_WINDOWS_CONVERSION; 295 } 296 297 fShowButtonBar = settings.GetInt8("ShowButtonBar", fShowButtonBar); 298 299 if (settings.FindInt32("UseAccountFrom", &int32Value) == B_OK) 300 fUseAccountFrom = int32Value; 301 if (fUseAccountFrom < ACCOUNT_USE_DEFAULT 302 || fUseAccountFrom > ACCOUNT_FROM_MAIL) 303 fUseAccountFrom = ACCOUNT_USE_DEFAULT; 304 305 fColoredQuotes = settings.GetBool("ColoredQuotes", fColoredQuotes); 306 307 if (settings.FindString("ReplyPreamble", &string) == B_OK) 308 fReplyPreamble = string; 309 310 fAttachAttributes = settings.GetBool("AttachAttributes", fAttachAttributes); 311 fWarnAboutUnencodableCharacters = settings.GetBool( 312 "WarnAboutUnencodableCharacters", fWarnAboutUnencodableCharacters); 313 fStartWithSpellCheckOn = settings.GetBool("StartWithSpellCheck", 314 fStartWithSpellCheckOn); 315 316 return B_OK; 317} 318 319 320bool 321Settings::AutoMarkRead() 322{ 323 BAutolock lock(be_app); 324 return fAutoMarkRead; 325} 326 327 328BString 329Settings::Signature() 330{ 331 BAutolock lock(be_app); 332 return BString(fSignature); 333} 334 335 336BString 337Settings::ReplyPreamble() 338{ 339 BAutolock lock(be_app); 340 return BString(fReplyPreamble); 341} 342 343 344bool 345Settings::WrapMode() 346{ 347 BAutolock lock(be_app); 348 return fWrapMode; 349} 350 351 352bool 353Settings::AttachAttributes() 354{ 355 BAutolock lock(be_app); 356 return fAttachAttributes; 357} 358 359 360bool 361Settings::ColoredQuotes() 362{ 363 BAutolock lock(be_app); 364 return fColoredQuotes; 365} 366 367 368uint8 369Settings::ShowButtonBar() 370{ 371 BAutolock lock(be_app); 372 return fShowButtonBar; 373} 374 375 376bool 377Settings::WarnAboutUnencodableCharacters() 378{ 379 BAutolock lock(be_app); 380 return fWarnAboutUnencodableCharacters; 381} 382 383 384bool 385Settings::StartWithSpellCheckOn() 386{ 387 BAutolock lock(be_app); 388 return fStartWithSpellCheckOn; 389} 390 391 392void 393Settings::SetDefaultChain(uint32 chain) 394{ 395 BAutolock lock(be_app); 396 fDefaultChain = chain; 397} 398 399 400uint32 401Settings::DefaultChain() 402{ 403 BAutolock lock(be_app); 404 return fDefaultChain; 405} 406 407 408int32 409Settings::UseAccountFrom() 410{ 411 BAutolock lock(be_app); 412 return fUseAccountFrom; 413} 414 415 416uint32 417Settings::MailCharacterSet() 418{ 419 BAutolock lock(be_app); 420 return fMailCharacterSet; 421} 422 423 424BFont 425Settings::ContentFont() 426{ 427 BAutolock lock(be_app); 428 return fContentFont; 429} 430 431 432void 433Settings::_CheckForSpamFilterExistence() 434{ 435 int32 addonNameIndex; 436 const char* addonNamePntr; 437 BDirectory inChainDir; 438 BPath path; 439 BEntry settingsEntry; 440 BFile settingsFile; 441 BMessage settingsMessage; 442 443 fShowSpamGUI = false; 444 445 if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) 446 return; 447 path.Append("Mail/chains/inbound"); 448 if (inChainDir.SetTo(path.Path()) != B_OK) 449 return; 450 451 while (inChainDir.GetNextEntry (&settingsEntry, true) == B_OK) { 452 if (!settingsEntry.IsFile()) 453 continue; 454 if (settingsFile.SetTo (&settingsEntry, B_READ_ONLY) != B_OK) 455 continue; 456 if (settingsMessage.Unflatten (&settingsFile) != B_OK) 457 continue; 458 for (addonNameIndex = 0; 459 B_OK == settingsMessage.FindString("filter_addons", 460 addonNameIndex, &addonNamePntr); 461 addonNameIndex++) { 462 if (strstr(addonNamePntr, "Spam Filter") != NULL) { 463 fShowSpamGUI = true; 464 return; 465 } 466 } 467 } 468} 469 470