#include "Settings.h"
#include <Application.h>
#include <Autolock.h>
#include <Catalog.h>
#include <CharacterSet.h>
#include <CharacterSetRoster.h>
#include <Directory.h>
#include <Entry.h>
#include <File.h>
#include <FindDirectory.h>
#include <Font.h>
#include <Locale.h>
#include <MailSettings.h>
#include <Message.h>
#include <String.h>
#include <UTF8.h>
#include <mail_encoding.h>
#define B_TRANSLATION_CONTEXT "Settings"
using namespace BPrivate ;
Settings::Settings()
:
fMailWindowFrame(BRect(0, 0, 200, 400)),
fPrintSettings(NULL),
fAutoMarkRead(true),
fSignature(),
fReplyPreamble(),
fWrapMode(true),
fAttachAttributes(true),
fColoredQuotes(true),
fShowButtonBar(kShowToolBar),
fWarnAboutUnencodableCharacters(true),
fStartWithSpellCheckOn(false),
fShowSpamGUI(true),
fDefaultChain(0),
fUseAccountFrom(0),
fMailCharacterSet(B_MS_WINDOWS_CONVERSION),
fContentFont(be_fixed_font)
{
fSignature = B_TRANSLATE("None");
LoadSettings();
fContentFont.SetSpacing(B_BITMAP_SPACING);
_CheckForSpamFilterExistence();
}
Settings::~Settings()
{
}
void
Settings::SetPrintSettings(const BMessage* printSettings)
{
BAutolock lock(be_app);
if (printSettings == fPrintSettings)
return;
delete fPrintSettings;
if (printSettings)
fPrintSettings = new BMessage(*printSettings);
else
fPrintSettings = NULL;
}
bool
Settings::HasPrintSettings()
{
BAutolock lock(be_app);
return fPrintSettings != NULL;
}
BMessage
Settings::PrintSettings()
{
BAutolock lock(be_app);
return BMessage(*fPrintSettings);
}
void
Settings::ClearPrintSettings()
{
delete fPrintSettings;
fPrintSettings = NULL;
}
void
Settings::SetWindowFrame(BRect frame)
{
BAutolock lock(be_app);
fMailWindowFrame = frame;
}
BRect
Settings::WindowFrame()
{
BAutolock lock(be_app);
return fMailWindowFrame;
}
status_t
Settings::_GetSettingsPath(BPath &path)
{
status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path);
if (status != B_OK)
return status;
path.Append("Mail");
return create_directory(path.Path(), 0755);
}
status_t
Settings::SaveSettings()
{
BMailSettings chainSettings;
if (fDefaultChain != ~0UL) {
chainSettings.SetDefaultOutboundChainID(fDefaultChain);
chainSettings.Save();
}
BPath path;
status_t status = _GetSettingsPath(path);
if (status != B_OK)
return status;
path.Append("Mail Settings~");
BFile file;
status = file.SetTo(path.Path(),
B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
if (status != B_OK)
return status;
BMessage settings('BeMl');
settings.AddRect("MailWindowSize", fMailWindowFrame);
font_family fontFamily;
font_style fontStyle;
fContentFont.GetFamilyAndStyle(&fontFamily, &fontStyle);
settings.AddString("FontFamily", fontFamily);
settings.AddString("FontStyle", fontStyle);
settings.AddFloat("FontSize", fContentFont.Size());
settings.AddBool("WordWrapMode", fWrapMode);
settings.AddBool("AutoMarkRead", fAutoMarkRead);
settings.AddString("SignatureText", fSignature);
settings.AddInt32("CharacterSet", fMailCharacterSet);
settings.AddInt8("ShowButtonBar", fShowButtonBar);
settings.AddInt32("UseAccountFrom", fUseAccountFrom);
settings.AddBool("ColoredQuotes", fColoredQuotes);
settings.AddString("ReplyPreamble", fReplyPreamble);
settings.AddBool("AttachAttributes", fAttachAttributes);
settings.AddBool("WarnAboutUnencodableCharacters",
fWarnAboutUnencodableCharacters);
settings.AddBool("StartWithSpellCheck", fStartWithSpellCheckOn);
BEntry entry;
status = entry.SetTo(path.Path());
if (status != B_OK)
return status;
status = settings.Flatten(&file);
if (status == B_OK) {
status = entry.Rename("Mail Settings", true);
} else
entry.Remove();
return status;
}
status_t
Settings::LoadSettings()
{
BMailSettings chainSettings;
fDefaultChain = chainSettings.DefaultOutboundChainID();
BPath path;
status_t status = _GetSettingsPath(path);
if (status != B_OK)
return status;
path.Append("Mail Settings");
BFile file;
status = file.SetTo(path.Path(), B_READ_ONLY);
if (status != B_OK) {
_GetSettingsPath(path);
path.Append("BeMail Settings");
status = file.SetTo(path.Path(), B_READ_ONLY);
if (status != B_OK)
return status;
}
BMessage settings;
status = settings.Unflatten(&file);
if (status < B_OK || settings.what != 'BeMl')
return status;
BRect rect;
if (settings.FindRect("MailWindowSize", &rect) == B_OK)
fMailWindowFrame = rect;
int32 int32Value;
const char *fontFamily;
if (settings.FindString("FontFamily", &fontFamily) == B_OK) {
const char *fontStyle;
if (settings.FindString("FontStyle", &fontStyle) == B_OK) {
float size;
if (settings.FindFloat("FontSize", &size) == B_OK) {
if (size >= 7)
fContentFont.SetSize(size);
if (fontFamily[0] && fontStyle[0]) {
fContentFont.SetFamilyAndStyle(
fontFamily[0] ? fontFamily : NULL,
fontStyle[0] ? fontStyle : NULL);
}
}
}
}
fWrapMode = settings.GetBool("WordWrapMode", fWrapMode);
fAutoMarkRead = settings.GetBool("AutoMarkRead", fAutoMarkRead);
BString string;
if (settings.FindString("SignatureText", &string) == B_OK)
fSignature = string;
if (settings.FindInt32("CharacterSet", &int32Value) == B_OK)
fMailCharacterSet = int32Value;
if (fMailCharacterSet != B_MAIL_UTF8_CONVERSION
&& fMailCharacterSet != B_MAIL_US_ASCII_CONVERSION
&& BCharacterSetRoster::GetCharacterSetByConversionID(fMailCharacterSet)
== NULL) {
fMailCharacterSet = B_MS_WINDOWS_CONVERSION;
}
fShowButtonBar = settings.GetInt8("ShowButtonBar", fShowButtonBar);
if (settings.FindInt32("UseAccountFrom", &int32Value) == B_OK)
fUseAccountFrom = int32Value;
if (fUseAccountFrom < ACCOUNT_USE_DEFAULT
|| fUseAccountFrom > ACCOUNT_FROM_MAIL)
fUseAccountFrom = ACCOUNT_USE_DEFAULT;
fColoredQuotes = settings.GetBool("ColoredQuotes", fColoredQuotes);
if (settings.FindString("ReplyPreamble", &string) == B_OK)
fReplyPreamble = string;
fAttachAttributes = settings.GetBool("AttachAttributes", fAttachAttributes);
fWarnAboutUnencodableCharacters = settings.GetBool(
"WarnAboutUnencodableCharacters", fWarnAboutUnencodableCharacters);
fStartWithSpellCheckOn = settings.GetBool("StartWithSpellCheck",
fStartWithSpellCheckOn);
return B_OK;
}
bool
Settings::AutoMarkRead()
{
BAutolock lock(be_app);
return fAutoMarkRead;
}
BString
Settings::Signature()
{
BAutolock lock(be_app);
return BString(fSignature);
}
BString
Settings::ReplyPreamble()
{
BAutolock lock(be_app);
return BString(fReplyPreamble);
}
bool
Settings::WrapMode()
{
BAutolock lock(be_app);
return fWrapMode;
}
bool
Settings::AttachAttributes()
{
BAutolock lock(be_app);
return fAttachAttributes;
}
bool
Settings::ColoredQuotes()
{
BAutolock lock(be_app);
return fColoredQuotes;
}
uint8
Settings::ShowButtonBar()
{
BAutolock lock(be_app);
return fShowButtonBar;
}
bool
Settings::WarnAboutUnencodableCharacters()
{
BAutolock lock(be_app);
return fWarnAboutUnencodableCharacters;
}
bool
Settings::StartWithSpellCheckOn()
{
BAutolock lock(be_app);
return fStartWithSpellCheckOn;
}
void
Settings::SetDefaultChain(uint32 chain)
{
BAutolock lock(be_app);
fDefaultChain = chain;
}
uint32
Settings::DefaultChain()
{
BAutolock lock(be_app);
return fDefaultChain;
}
int32
Settings::UseAccountFrom()
{
BAutolock lock(be_app);
return fUseAccountFrom;
}
uint32
Settings::MailCharacterSet()
{
BAutolock lock(be_app);
return fMailCharacterSet;
}
BFont
Settings::ContentFont()
{
BAutolock lock(be_app);
return fContentFont;
}
void
Settings::_CheckForSpamFilterExistence()
{
int32 addonNameIndex;
const char* addonNamePntr;
BDirectory inChainDir;
BPath path;
BEntry settingsEntry;
BFile settingsFile;
BMessage settingsMessage;
fShowSpamGUI = false;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK)
return;
path.Append("Mail/chains/inbound");
if (inChainDir.SetTo(path.Path()) != B_OK)
return;
while (inChainDir.GetNextEntry (&settingsEntry, true) == B_OK) {
if (!settingsEntry.IsFile())
continue;
if (settingsFile.SetTo (&settingsEntry, B_READ_ONLY) != B_OK)
continue;
if (settingsMessage.Unflatten (&settingsFile) != B_OK)
continue;
for (addonNameIndex = 0;
B_OK == settingsMessage.FindString("filter_addons",
addonNameIndex, &addonNamePntr);
addonNameIndex++) {
if (strstr(addonNamePntr, "Spam Filter") != NULL) {
fShowSpamGUI = true;
return;
}
}
}
}