summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattV <qt-info@nokia.com>2009-08-13 15:00:14 +1000
committerMattV <qt-info@nokia.com>2009-08-13 15:00:14 +1000
commitc1836938da7339a8ba4562a2f671082c5bdf2ccb (patch)
tree43990cff362ef7d90576b1c32c2873f63cc33fed
parenta94f56f04caf86d7952071e08c0cea57883ccf44 (diff)
Do not abort on initialization failure.qmf-1.0
Allow the client application to discover that the initialization failed and act accordingly. After initialization failure, all mail store operations fail and the lastError() is always QMailStore::StorageInaccessible.
-rw-r--r--src/libraries/qtopiamail/qmailstore.cpp8
-rw-r--r--src/libraries/qtopiamail/qmailstore.h7
-rw-r--r--src/libraries/qtopiamail/qmailstore_p.cpp7
-rw-r--r--src/libraries/qtopiamail/qmailstoreimplementation_p.cpp210
-rw-r--r--src/libraries/qtopiamail/qmailstoreimplementation_p.h93
5 files changed, 315 insertions, 10 deletions
diff --git a/src/libraries/qtopiamail/qmailstore.cpp b/src/libraries/qtopiamail/qmailstore.cpp
index dea45005..4b7126b4 100644
--- a/src/libraries/qtopiamail/qmailstore.cpp
+++ b/src/libraries/qtopiamail/qmailstore.cpp
@@ -152,6 +152,7 @@
\value ContentInaccessible The operation failed because the content data cannot be accessed by the mail store.
\value NotYetImplemented The operation failed because the mail store does not yet implement the operation.
\value FrameworkFault The operation failed because the mail store encountered an error in performing the operation.
+ \value StorageInaccessible The operation failed because the mail storage mechanism cannot be accessed by the mail store.
*/
/*!
@@ -1078,7 +1079,12 @@ QMailStore* QMailStore::instance()
static bool init = false;
if (!init) {
init = true;
- QMailStoreInstance()->d->initialize();
+ QMailStore *store(QMailStoreInstance());
+ store->d->initialize();
+ if (initializationState() == QMailStore::InitializationFailed) {
+ delete store->d;
+ store->d = new QMailStoreNullImplementation(store);
+ }
}
return QMailStoreInstance();
}
diff --git a/src/libraries/qtopiamail/qmailstore.h b/src/libraries/qtopiamail/qmailstore.h
index 9da69d38..17c533ab 100644
--- a/src/libraries/qtopiamail/qmailstore.h
+++ b/src/libraries/qtopiamail/qmailstore.h
@@ -56,7 +56,7 @@
#include "qmailglobal.h"
class QMailStore;
-class QMailStorePrivate;
+class QMailStoreImplementation;
#ifdef QMAILSTOREINSTANCE_DEFINED_HERE
static QMailStore* QMailStoreInstance();
@@ -101,7 +101,8 @@ public:
ConstraintFailure,
ContentInaccessible,
NotYetImplemented,
- FrameworkFault
+ FrameworkFault,
+ StorageInaccessible
};
public:
@@ -231,7 +232,7 @@ private:
void emitRetrievalInProgress(const QMailAccountIdList &ids);
void emitTransmissionInProgress(const QMailAccountIdList &ids);
- QMailStorePrivate* d;
+ QMailStoreImplementation* d;
};
Q_DECLARE_USER_METATYPE_ENUM(QMailStore::MessageRemovalOption)
diff --git a/src/libraries/qtopiamail/qmailstore_p.cpp b/src/libraries/qtopiamail/qmailstore_p.cpp
index 75a0dc6e..788f55c6 100644
--- a/src/libraries/qtopiamail/qmailstore_p.cpp
+++ b/src/libraries/qtopiamail/qmailstore_p.cpp
@@ -1992,8 +1992,6 @@ int QMailStorePrivate::pathIdentifier(const QString &filePath)
int QMailStorePrivate::databaseIdentifier(int n) const
{
int result = static_cast<int>(::ftok(database.databaseName().toAscii(), n));
- if (result == -1)
- qFatal("Could not create database semaphore. Database could not be found.");
return result;
}
@@ -2008,7 +2006,8 @@ QMailStorePrivate::QMailStorePrivate(QMailStore* parent)
accountCache(accountCacheSize),
inTransaction(false),
lastQueryError(0),
- mutex(0)
+ mutex(0),
+ readLock(0)
{
ProcessMutex creationMutex(pathIdentifier(QDir::rootPath()));
MutexGuard guard(creationMutex);
@@ -2052,7 +2051,7 @@ bool QMailStorePrivate::initStore()
return false;
}
- if (database.isOpenError()) {
+ if (!database.isOpen()) {
qMailLog(Messaging) << "Unable to open database in initStore!";
return false;
}
diff --git a/src/libraries/qtopiamail/qmailstoreimplementation_p.cpp b/src/libraries/qtopiamail/qmailstoreimplementation_p.cpp
index 72157f02..e9ecd53e 100644
--- a/src/libraries/qtopiamail/qmailstoreimplementation_p.cpp
+++ b/src/libraries/qtopiamail/qmailstoreimplementation_p.cpp
@@ -152,6 +152,10 @@ QMailStoreImplementationBase::QMailStoreImplementationBase(QMailStore* parent)
SLOT(aboutToQuit()));
}
+QMailStoreImplementationBase::~QMailStoreImplementationBase()
+{
+}
+
void QMailStoreImplementationBase::initialize()
{
initState = (initStore() ? QMailStore::Initialized : QMailStore::InitializationFailed);
@@ -169,6 +173,11 @@ QMailStore::ErrorCode QMailStoreImplementationBase::lastError() const
void QMailStoreImplementationBase::setLastError(QMailStore::ErrorCode code) const
{
+ if (initState == QMailStore::InitializationFailed) {
+ // Enforce the error code to be this if we can't init:
+ code = QMailStore::StorageInaccessible;
+ }
+
if (errorCode != code) {
errorCode = code;
@@ -700,3 +709,204 @@ QMailStoreImplementation::QMailStoreImplementation(QMailStore* parent)
{
}
+
+QMailStoreNullImplementation::QMailStoreNullImplementation(QMailStore* parent)
+ : QMailStoreImplementation(parent)
+{
+ setLastError(QMailStore::StorageInaccessible);
+}
+
+void QMailStoreNullImplementation::clearContent()
+{
+}
+
+bool QMailStoreNullImplementation::addAccount(QMailAccount *, QMailAccountConfiguration *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::addFolder(QMailFolder *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::addMessages(const QList<QMailMessage *> &, QMailMessageIdList *, QMailMessageIdList *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::addMessages(const QList<QMailMessageMetaData *> &, QMailMessageIdList *, QMailMessageIdList *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::removeAccounts(const QMailAccountKey &, QMailAccountIdList *, QMailFolderIdList *, QMailMessageIdList *, QMailMessageIdList *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::removeFolders(const QMailFolderKey &, QMailStore::MessageRemovalOption, QMailFolderIdList *, QMailMessageIdList *, QMailMessageIdList *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::removeMessages(const QMailMessageKey &, QMailStore::MessageRemovalOption, QMailMessageIdList *, QMailMessageIdList *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::updateAccount(QMailAccount *, QMailAccountConfiguration *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::updateAccountConfiguration(QMailAccountConfiguration *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::updateFolder(QMailFolder *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::updateMessages(const QList<QPair<QMailMessageMetaData *, QMailMessage *> > &, QMailMessageIdList *, QMailMessageIdList *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::updateMessagesMetaData(const QMailMessageKey &, const QMailMessageKey::Properties &, const QMailMessageMetaData &, QMailMessageIdList *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::updateMessagesMetaData(const QMailMessageKey &, quint64, bool, QMailMessageIdList *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::restoreToPreviousFolder(const QMailMessageKey &, QMailMessageIdList *, QMailFolderIdList *, QMailAccountIdList *)
+{
+ return false;
+}
+
+bool QMailStoreNullImplementation::purgeMessageRemovalRecords(const QMailAccountId &, const QStringList &)
+{
+ return false;
+}
+
+int QMailStoreNullImplementation::countAccounts(const QMailAccountKey &) const
+{
+ return 0;
+}
+
+int QMailStoreNullImplementation::countFolders(const QMailFolderKey &) const
+{
+ return 0;
+}
+
+int QMailStoreNullImplementation::countMessages(const QMailMessageKey &) const
+{
+ return 0;
+}
+
+int QMailStoreNullImplementation::sizeOfMessages(const QMailMessageKey &) const
+{
+ return 0;
+}
+
+QMailAccountIdList QMailStoreNullImplementation::queryAccounts(const QMailAccountKey &, const QMailAccountSortKey &) const
+{
+ return QMailAccountIdList();
+}
+
+QMailFolderIdList QMailStoreNullImplementation::queryFolders(const QMailFolderKey &, const QMailFolderSortKey &) const
+{
+ return QMailFolderIdList();
+}
+
+QMailMessageIdList QMailStoreNullImplementation::queryMessages(const QMailMessageKey &, const QMailMessageSortKey &) const
+{
+ return QMailMessageIdList();
+}
+
+QMailAccount QMailStoreNullImplementation::account(const QMailAccountId &) const
+{
+ return QMailAccount();
+}
+
+QMailAccountConfiguration QMailStoreNullImplementation::accountConfiguration(const QMailAccountId &) const
+{
+ return QMailAccountConfiguration();
+}
+
+QMailFolder QMailStoreNullImplementation::folder(const QMailFolderId &) const
+{
+ return QMailFolder();
+}
+
+QMailMessage QMailStoreNullImplementation::message(const QMailMessageId &) const
+{
+ return QMailMessage();
+}
+
+QMailMessage QMailStoreNullImplementation::message(const QString &, const QMailAccountId &) const
+{
+ return QMailMessage();
+}
+
+QMailMessageMetaData QMailStoreNullImplementation::messageMetaData(const QMailMessageId &) const
+{
+ return QMailMessageMetaData();
+}
+
+QMailMessageMetaData QMailStoreNullImplementation::messageMetaData(const QString &, const QMailAccountId &) const
+{
+ return QMailMessageMetaData();
+}
+
+QMailMessageMetaDataList QMailStoreNullImplementation::messagesMetaData(const QMailMessageKey &, const QMailMessageKey::Properties &, QMailStore::ReturnOption) const
+{
+ return QMailMessageMetaDataList();
+}
+
+QMailMessageRemovalRecordList QMailStoreNullImplementation::messageRemovalRecords(const QMailAccountId &, const QMailFolderId &) const
+{
+ return QMailMessageRemovalRecordList();
+}
+
+bool QMailStoreNullImplementation::registerAccountStatusFlag(const QString &)
+{
+ return false;
+}
+
+quint64 QMailStoreNullImplementation::accountStatusMask(const QString &) const
+{
+ return 0;
+}
+
+bool QMailStoreNullImplementation::registerFolderStatusFlag(const QString &)
+{
+ return false;
+}
+
+quint64 QMailStoreNullImplementation::folderStatusMask(const QString &) const
+{
+ return 0;
+}
+
+bool QMailStoreNullImplementation::registerMessageStatusFlag(const QString &)
+{
+ return false;
+}
+
+quint64 QMailStoreNullImplementation::messageStatusMask(const QString &) const
+{
+ return 0;
+}
+
+bool QMailStoreNullImplementation::initStore()
+{
+ return false;
+}
+
diff --git a/src/libraries/qtopiamail/qmailstoreimplementation_p.h b/src/libraries/qtopiamail/qmailstoreimplementation_p.h
index 96b5702c..e0c1ebc5 100644
--- a/src/libraries/qtopiamail/qmailstoreimplementation_p.h
+++ b/src/libraries/qtopiamail/qmailstoreimplementation_p.h
@@ -67,6 +67,7 @@ class QMailStoreImplementationBase : public QObject
public:
QMailStoreImplementationBase(QMailStore* parent);
+ virtual ~QMailStoreImplementationBase();
void initialize();
static QMailStore::InitializationState initializationState();
@@ -199,10 +200,10 @@ public:
QMailMessageIdList *addedMessageIds, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds) = 0;
virtual bool removeAccounts(const QMailAccountKey &key,
- QMailAccountIdList *deletedAccounts, QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessages, QMailFolderIdList *modeifiedFolderIds, QMailAccountIdList *modifiedAccountIds) = 0;
+ QMailAccountIdList *deletedAccounts, QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessages, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds) = 0;
virtual bool removeFolders(const QMailFolderKey &key, QMailStore::MessageRemovalOption option,
- QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessages, QMailFolderIdList *modeifiedFolderIds, QMailAccountIdList *modifiedAccountIds) = 0;
+ QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessages, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds) = 0;
virtual bool removeMessages(const QMailMessageKey &key, QMailStore::MessageRemovalOption option,
QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessages, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds) = 0;
@@ -264,5 +265,93 @@ public:
virtual quint64 messageStatusMask(const QString &name) const = 0;
};
+class QMailStoreNullImplementation : public QMailStoreImplementation
+{
+public:
+ QMailStoreNullImplementation(QMailStore* parent);
+
+ virtual void clearContent();
+
+ virtual bool addAccount(QMailAccount *account, QMailAccountConfiguration *config,
+ QMailAccountIdList *addedAccountIds);
+
+ virtual bool addFolder(QMailFolder *f,
+ QMailFolderIdList *addedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool addMessages(const QList<QMailMessage *> &m,
+ QMailMessageIdList *addedMessageIds, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool addMessages(const QList<QMailMessageMetaData *> &m,
+ QMailMessageIdList *addedMessageIds, QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool removeAccounts(const QMailAccountKey &key,
+ QMailAccountIdList *deletedAccounts, QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessages, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool removeFolders(const QMailFolderKey &key, QMailStore::MessageRemovalOption option,
+ QMailFolderIdList *deletedFolders, QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessages, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool removeMessages(const QMailMessageKey &key, QMailStore::MessageRemovalOption option,
+ QMailMessageIdList *deletedMessages, QMailMessageIdList *updatedMessages, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool updateAccount(QMailAccount *account, QMailAccountConfiguration* config,
+ QMailAccountIdList *updatedAccountIds);
+
+ virtual bool updateAccountConfiguration(QMailAccountConfiguration* config,
+ QMailAccountIdList *updatedAccountIds);
+
+ virtual bool updateFolder(QMailFolder* f,
+ QMailFolderIdList *updatedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool updateMessages(const QList<QPair<QMailMessageMetaData *, QMailMessage *> > &m,
+ QMailMessageIdList *updatedMessageIds, QMailMessageIdList *modifiedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool updateMessagesMetaData(const QMailMessageKey &key, const QMailMessageKey::Properties &properties, const QMailMessageMetaData &data,
+ QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool updateMessagesMetaData(const QMailMessageKey &key, quint64 messageStatus, bool set,
+ QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool restoreToPreviousFolder(const QMailMessageKey &key,
+ QMailMessageIdList *updatedMessageIds, QMailFolderIdList *modifiedFolderIds, QMailAccountIdList *modifiedAccountIds);
+
+ virtual bool purgeMessageRemovalRecords(const QMailAccountId &accountId, const QStringList &serverUids);
+
+ virtual int countAccounts(const QMailAccountKey &key) const;
+ virtual int countFolders(const QMailFolderKey &key) const;
+ virtual int countMessages(const QMailMessageKey &key) const;
+
+ virtual int sizeOfMessages(const QMailMessageKey &key) const;
+
+ virtual QMailAccountIdList queryAccounts(const QMailAccountKey &key, const QMailAccountSortKey &sortKey) const;
+ virtual QMailFolderIdList queryFolders(const QMailFolderKey &key, const QMailFolderSortKey &sortKey) const;
+ virtual QMailMessageIdList queryMessages(const QMailMessageKey &key, const QMailMessageSortKey &sortKey) const;
+
+ virtual QMailAccount account(const QMailAccountId &id) const;
+ virtual QMailAccountConfiguration accountConfiguration(const QMailAccountId &id) const;
+
+ virtual QMailFolder folder(const QMailFolderId &id) const;
+
+ virtual QMailMessage message(const QMailMessageId &id) const;
+ virtual QMailMessage message(const QString &uid, const QMailAccountId &accountId) const;
+
+ virtual QMailMessageMetaData messageMetaData(const QMailMessageId &id) const;
+ virtual QMailMessageMetaData messageMetaData(const QString &uid, const QMailAccountId &accountId) const;
+ virtual QMailMessageMetaDataList messagesMetaData(const QMailMessageKey &key, const QMailMessageKey::Properties &properties, QMailStore::ReturnOption option) const;
+
+ virtual QMailMessageRemovalRecordList messageRemovalRecords(const QMailAccountId &parentAccountId, const QMailFolderId &parentFolderId) const;
+
+ virtual bool registerAccountStatusFlag(const QString &name);
+ virtual quint64 accountStatusMask(const QString &name) const;
+
+ virtual bool registerFolderStatusFlag(const QString &name);
+ virtual quint64 folderStatusMask(const QString &name) const;
+
+ virtual bool registerMessageStatusFlag(const QString &name);
+ virtual quint64 messageStatusMask(const QString &name) const;
+
+private:
+ virtual bool initStore();
+};
+
#endif