#include <QtCore>
{
Q_OBJECT
public:
enum State { Starting, SentUser, SentPass, SentList, ReadList, Stopping };
explicit PopLister
(QObject *p
= 0): state(Starting)
{
process
->setProcessChannelMode
(QProcess::MergedChannels);
connect(process, SIGNAL(readyRead()), SLOT(handleOutput()));
}
void start()
{
args << "s_client" << "-connect" << "server:995";
process->start("openssl", args);
state = Starting;
}
private slots:
void handleOutput() {
while (process->canReadLine()) {
if (line.startsWith("+OK")) {
switch (state) {
case Starting:
process->write("USER username\r\n");
state = SentUser;
break;
case SentUser:
process->write("PASS password\r\n");
state = SentPass;
break;
case SentPass:
listData.clear();
process->write("LIST\r\n");
state = SentList;
break;
case SentList:
state = ReadList;
break;
case ReadList: // suppress compiler warnings
case Stopping:
break;
}
}
else if(line.startsWith("-ERR")) {
qDebug() << line;
process->write("QUIT\r\n");
state = Stopping;
}
else if (state == ReadList) {
if (line == ".\r\n") {
qDebug() << listData;
process->write("QUIT\r\n");
state = Stopping;
}
else {
listData += line;
}
}
else if (state == Stopping) {
qDebug() << line;
}
}
}
private:
State state;
};
int main(int argc, char **argv)
{
PopLister lister;
lister.start();
return app.exec();
}
#include "main.moc"
#include <QtCore>
class PopLister: public QObject
{
Q_OBJECT
public:
enum State { Starting, SentUser, SentPass, SentList, ReadList, Stopping };
explicit PopLister(QObject *p = 0):
QObject(p),
process(new QProcess(this)),
state(Starting)
{
process->setProcessChannelMode(QProcess::MergedChannels);
connect(process, SIGNAL(readyRead()), SLOT(handleOutput()));
}
void start()
{
QStringList args;
args << "s_client" << "-connect" << "server:995";
process->start("openssl", args);
state = Starting;
}
private slots:
void handleOutput() {
while (process->canReadLine()) {
QByteArray line = process->readLine();
if (line.startsWith("+OK")) {
switch (state) {
case Starting:
process->write("USER username\r\n");
state = SentUser;
break;
case SentUser:
process->write("PASS password\r\n");
state = SentPass;
break;
case SentPass:
listData.clear();
process->write("LIST\r\n");
state = SentList;
break;
case SentList:
state = ReadList;
break;
case ReadList: // suppress compiler warnings
case Stopping:
break;
}
}
else if(line.startsWith("-ERR")) {
qDebug() << line;
process->write("QUIT\r\n");
state = Stopping;
}
else if (state == ReadList) {
if (line == ".\r\n") {
qDebug() << listData;
process->write("QUIT\r\n");
state = Stopping;
}
else {
listData += line;
}
}
else if (state == Stopping) {
qDebug() << line;
}
}
}
private:
QProcess *process;
State state;
QByteArray listData;
};
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
PopLister lister;
lister.start();
return app.exec();
}
#include "main.moc"
To copy to clipboard, switch view to plain text mode
Bookmarks