summaryrefslogtreecommitdiff
path: root/noncore/unsupported/mail2/libmail/imapbase.cpp
blob: 9a2ba476f3cd07e74184ec3911498c7ce7aa2730 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <qsocket.h>
#include <qtimer.h>

#include "imapbase.h"

IMAPBase::IMAPBase(const Account &account)
	: QObject(), _account(account)
{
	_connected = false;
	_writingAllowed = false;
	_socket = new QSocket(this);

	connect(_socket, SIGNAL(readyRead()), SLOT(slotDataAvailiable()));
	connect(_socket, SIGNAL(hostFound()), SLOT(slotHostFound()));
	connect(_socket, SIGNAL(connected()), SLOT(slotConnected()));
	connect(_socket, SIGNAL(connectionClosed()), SLOT(slotDisconnected()));
	connect(_socket, SIGNAL(error(int)), SLOT(slotError(int)));

	QTimer *commandTimer = new QTimer(this);
	commandTimer->start(200);
	connect(commandTimer, SIGNAL(timeout()), SLOT(writeCommands()));
}

void IMAPBase::sendCommand(const QString &command)
{
	if (!_connected) makeConnect();
	_commandQueue.append(command);
}

void IMAPBase::disconnect()
{
	_connected = false;
	delete _socket;
	emit disconnected();
}

void IMAPBase::makeConnect()
{
	emit lookingUpHost();
	if (_socket == NULL) _socket = new QSocket(this);

	Q_UINT16 port = _account.imapPort().toUInt();
	_socket->connectToHost(_account.imapServer(), port);
}

void IMAPBase::writeCommands()
{
	if (!_connected) return;
	if (_commandQueue.isEmpty()) return;
	if (!_writingAllowed) return;

	QStringList::Iterator it;
	for (it = _commandQueue.begin(); it != _commandQueue.end(); it++) {
		if (!(*it).isEmpty() && _writingAllowed) {
#ifndef QT_NO_DEBUG
			qDebug("IMAP > " + (*it).stripWhiteSpace());
#endif
			_socket->writeBlock((*it).latin1(), (*it).length());
			_writingAllowed = false;
			_commandQueue.remove(it);
			break;
		}
	}
}

void IMAPBase::slotError(int err)
{
	if (err == QSocket::ErrConnectionRefused) {
		emit error(IMAPErrConnectionRefused);
	} else if (err == QSocket::ErrHostNotFound) {
		emit error(IMAPErrHostNotFound);
	} else if (err == QSocket::ErrSocketRead) {
		emit error(IMAPErrSocketRead);
	} else {
		emit error(IMAPErrUnknownError);
	}
}

void IMAPBase::slotHostFound()
{
	emit hostFound();
}

void IMAPBase::slotConnected()
{
	_connected = true;
	emit connected();
}

void IMAPBase::slotDisconnected()
{
	_connected = false;
	emit disconnected();
}

void IMAPBase::slotDataAvailiable()
{
	while (_socket->canReadLine()) {
		_data += _socket->readLine();
		if (_socket->atEnd()) {
#ifndef QT_NO_DEBUG
			qDebug("IMAP < " + _data.stripWhiteSpace());
#endif
			emit dataReceived(_data);
			_writingAllowed = true;
			_data = QString(0);
		}
	}
}