Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117888485
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
11 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/migrationutility/sourceaccount.cpp b/migrationutility/sourceaccount.cpp
index 1769406..bd984d7 100644
--- a/migrationutility/sourceaccount.cpp
+++ b/migrationutility/sourceaccount.cpp
@@ -1,331 +1,331 @@
/*
* Copyright (C) 2012 Christian Mollekopf <mollekopf@kolabsys.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "sourceaccount.h"
#include "uiproxy.h"
#include <jobs/fetchmessagesjob.h>
#include <jobs/probekolabserverjob.h>
#include <kimap/session.h>
#include <kimap/listjob.h>
#include <kimap/logoutjob.h>
#include <kimap/capabilitiesjob.h>
#include <kimap/namespacejob.h>
#include <errorhandler.h>
#include <kolabobject.h>
#include <kabc/vcardconverter.h>
#include <kcalcore/memorycalendar.h>
#include <kcalcore/icalformat.h>
SourceAccount::SourceAccount(QObject* parent)
: QObject(parent)
{
}
QStringList SourceAccount::lookupFolderList()
{
return QStringList();
}
QList<Object> SourceAccount::getObjects(const QString& /* folder */)
{
return QList<Object>();
}
void SourceAccount::logout()
{
}
QPair<Kolab::FolderType, QString> SourceAccount::translateFolder(const QString& folder)
{
return QPair<Kolab::FolderType, QString>(Kolab::MailType, folder);
}
TestAccount::TestAccount(QObject* parent)
: SourceAccount(parent)
{
mFolderList << QLatin1String("folder1");
mFolderList << QLatin1String("folder2");
mFolderList << QLatin1String("folder3");
}
QStringList TestAccount::lookupFolderList()
{
return mFolderList;
}
QList<Object> TestAccount::getObjects(const QString& folder)
{
Debug() << folder;
Q_ASSERT(mFolderList.removeAll(folder) == 1);
return QList<Object>();
}
//--------------------------------------------------------------
KolabSourceAccount::KolabSourceAccount(KIMAP::Session *session, QObject* parent)
: SourceAccount(parent),
mSession(session)
{
}
void KolabSourceAccount::init()
{
Q_ASSERT(mSession);
ProbeKolabServerJob *probeJob = new ProbeKolabServerJob(mSession, this);
probeJob->exec();
mKolabFolders = probeJob->kolabFolders();
mPersonalNamespaces = probeJob->personalNamespace();
}
Kolab::FolderType KolabSourceAccount::getFolderType(const QString &folder)
{
if (mKolabFolders.values().contains(folder)) {
return Kolab::folderTypeFromString(mKolabFolders.key(folder).toStdString());
}
return Kolab::MailType;
}
QPair<Kolab::FolderType, QString> KolabSourceAccount::translateFolder(const QString& folder)
{
return QPair<Kolab::FolderType, QString>(getFolderType(folder), folder);
}
QStringList KolabSourceAccount::lookupFolderList()
{
// Debug() << "lookupFolderList" << mHost << mPort << mUsername << mPw;
init();
mMailboxes.clear();
KIMAP::ListJob *listJob = new KIMAP::ListJob(mSession);
listJob->setOption(KIMAP::ListJob::IncludeUnsubscribed);
listJob->setQueriedNamespaces(mPersonalNamespaces);
QObject::connect( listJob, SIGNAL(mailBoxesReceived(QList<KIMAP::MailBoxDescriptor>,QList<QList<QByteArray> >)),
this, SLOT(mailBoxesReceived(QList<KIMAP::MailBoxDescriptor>,QList<QList<QByteArray> >)));
listJob->exec();
Debug() << "found " << mMailboxes.size();
QStringList mailboxes;
foreach (const KIMAP::MailBoxDescriptor &descriptor, mMailboxes) {
mailboxes.append(descriptor.name);
}
return mailboxes;
}
void KolabSourceAccount::mailBoxesReceived(const QList<KIMAP::MailBoxDescriptor> &descriptors, const QList< QList< QByteArray > > &/* flags */)
{
mMailboxes.append(descriptors);
//TODO store folder type from metadata
// for (int i = 0; i < descriptors.size(); i++) {
// Debug() << descriptors.at(i).name;
// foreach (const QByteArray &arr, flags.at(i)) {
// Debug() << arr;
// }
// }
}
QVariant upgradeMessage(KMime::Message::Ptr msg)
{
//TODO deduplicate with upgradetool, check for errors during reading.
Kolab::KolabObjectReader reader;
switch (reader.parseMimeMessage(msg)) {
case Kolab::EventObject:
case Kolab::TodoObject:
case Kolab::JournalObject:
return QVariant::fromValue(reader.getIncidence());
case Kolab::ContactObject:
return QVariant::fromValue(reader.getContact());
case Kolab::DistlistObject:
return QVariant::fromValue(reader.getDistlist());
case Kolab::NoteObject: {
Note note;
note.msg = reader.getNote();
return QVariant::fromValue(note);
}
case Kolab::DictionaryConfigurationObject: {
Dictionary dictionary;
dictionary.dict = reader.getDictionary(dictionary.lang);
return QVariant::fromValue(dictionary);
}
case Kolab::InvalidObject:
default:
//TODO handle configuration objects
Error() << "failed to read mime file";
}
return QVariant();
}
QList<Object> KolabSourceAccount::getObjects(const QString& folder)
{
bool isKolabType = false;
if (mKolabFolders.values().contains(folder)) {
isKolabType = true;
}
// Debug() << folder;
FetchMessagesJob *fetchJob = new FetchMessagesJob(folder, mSession, this);
fetchJob->exec();
Debug() << fetchJob->getMessages().size();
QList<Object> messages;
foreach (const KMime::Message::Ptr &msg, fetchJob->getMessages()) {
Object obj;
if (isKolabType) {
obj.object = upgradeMessage(msg);
} else {
obj.object = QVariant::fromValue(msg);
}
obj.flags = fetchJob->getFlags(msg);
if (!obj.object.isValid()) {
Error() << "got empty message";
continue;
}
messages.append(obj);
}
return messages;
}
void KolabSourceAccount::logout()
{
KIMAP::LogoutJob *logoutJob = new KIMAP::LogoutJob(mSession);
logoutJob->exec();
mSession->close();
mSession->deleteLater();
mSession = 0;
Debug() << "logout done";
}
//--------------------------------------------------------
ExchangeIMAPSourceAccount::ExchangeIMAPSourceAccount(KIMAP::Session* session, QObject* parent)
: KolabSourceAccount(session, parent)
{
}
QPair<Kolab::ObjectType, KMime::Content*> ExchangeIMAPSourceAccount::getObjectType(const KMime::Message::Ptr &msg)
{
const QByteArray calendarType("text/calendar");
const QByteArray vcardType("text/vcard");
Q_FOREACH(KMime::Content *c, msg->contents()) {
Debug() << c->contentType()->mimeType();
if (c->contentType()->mimeType() == calendarType) {
KCalCore::ICalFormat format;
KCalCore::MemoryCalendar::Ptr calendar(new KCalCore::MemoryCalendar(KDateTime::Spec::UTC()));
format.fromRawString(calendar, c->decodedContent());
if (!calendar->events().isEmpty()) {
return QPair<Kolab::ObjectType, KMime::Content*>(Kolab::EventObject, c);
} else if (!calendar->todos().isEmpty()) {
return QPair<Kolab::ObjectType, KMime::Content*>(Kolab::TodoObject, c);
} else if (!calendar->journals().isEmpty()) {
return QPair<Kolab::ObjectType, KMime::Content*>(Kolab::JournalObject, c);
}
}
if (c->contentType()->mimeType() == vcardType) {
return QPair<Kolab::ObjectType, KMime::Content*>(Kolab::ContactObject, c);
}
}
return QPair<Kolab::ObjectType, KMime::Content*>(Kolab::InvalidObject, 0);
}
Kolab::FolderType ExchangeIMAPSourceAccount::getFolderType(const QString &folder)
{
FetchMessagesJob *fetchJob = new FetchMessagesJob(folder, mSession, this);
fetchJob->exec();
Debug() << fetchJob->getMessages().size();
QList<Object> messages;
foreach (const KMime::Message::Ptr &msg, fetchJob->getMessages()) {
Kolab::ObjectType type = getObjectType(msg).first;
if (type == Kolab::EventObject) {
return Kolab::EventType;
}
if (type == Kolab::TodoObject) {
return Kolab::TaskType;
}
if (type == Kolab::JournalObject) {
return Kolab::JournalType;
}
if (type == Kolab::ContactObject) {
return Kolab::ContactType;
}
}
return Kolab::MailType;
}
QPair<Kolab::FolderType, QString> ExchangeIMAPSourceAccount::translateFolder(const QString& folder)
{
return QPair<Kolab::FolderType, QString>(getFolderType(folder), folder);
}
QList<Object> ExchangeIMAPSourceAccount::getObjects(const QString& folder)
{
Debug() << folder;
FetchMessagesJob *fetchJob = new FetchMessagesJob(folder, mSession, this);
fetchJob->exec();
Debug() << fetchJob->getMessages().size();
QList<Object> messages;
foreach (const KMime::Message::Ptr &msg, fetchJob->getMessages()) {
QPair<Kolab::ObjectType, KMime::Content*> type = getObjectType(msg);
Debug() << type.first;
- if (type.first == Kolab::MailType) {
+ if (type.first == Kolab::InvalidObject) {
Object obj;
obj.object = QVariant::fromValue(msg);
obj.flags = fetchJob->getFlags(msg);
messages.append(obj);
} else if (type.first == Kolab::EventObject || type.first == Kolab::TodoObject || type.first == Kolab::JournalObject) {
const QByteArray content = type.second->decodedContent();
Debug() << "Found event object: " << content;
KCalCore::ICalFormat format;
KCalCore::MemoryCalendar::Ptr calendar(new KCalCore::MemoryCalendar(KDateTime::Spec::UTC()));
format.fromRawString(calendar, content);
//We're simply assuming here that we never have different incidence types mixed in a folder
foreach (const KCalCore::Incidence::Ptr &inc, calendar->incidences()) {
Object obj;
obj.object = QVariant::fromValue(inc);
obj.flags = fetchJob->getFlags(msg);
if (!obj.object.isValid()) {
Error() << "got empty message";
continue;
}
messages.append(obj);
}
} else if (type.first == Kolab::ContactObject) {
const QByteArray content = type.second->decodedContent();
Debug() << "Found contact object: " << content;
KABC::VCardConverter format;
const KABC::Addressee addressee = format.parseVCard(content);
Object obj;
obj.object = QVariant::fromValue(addressee);
obj.flags = fetchJob->getFlags(msg);
if (!obj.object.isValid()) {
Error() << "got empty message";
continue;
}
messages.append(obj);
}
}
return messages;
}
\ No newline at end of file
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Apr 6, 3:21 AM (3 w, 3 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18832181
Default Alt Text
(11 KB)
Attached To
Mode
rU utils
Attached
Detach File
Event Timeline