• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdenetwork
  • Sitemap
  • Contact Us
 

kopete/protocols/messenger/libpapillon

logintask.cpp

Go to the documentation of this file.
00001 /*
00002    logintask.cpp - Windows Live Messenger Login Task
00003 
00004    Copyright (c) 2006 by Michaƫl Larouche <larouche@kde.org>
00005 
00006    *************************************************************************
00007    *                                                                       *
00008    * This library is free software; you can redistribute it and/or         *
00009    * modify it under the terms of the GNU Lesser General Public            *
00010    * License as published by the Free Software Foundation; either          *
00011    * version 2 of the License, or (at your option) any later version.      *
00012    *                                                                       *
00013    *************************************************************************
00014 */
00015 #include "Papillon/Tasks/LoginTask"
00016 
00017 // Qt includes
00018 #include <QtCore/QStringList>
00019 #include <QtCore/QLatin1String>
00020 #include <QtDebug>
00021 
00022 // Papillon includes
00023 #include "Papillon/NetworkMessage"
00024 #include "Papillon/Connection"
00025 #include "Papillon/Http/TweenerHandler"
00026 #include "Papillon/Client"
00027 #include "Papillon/UserContact"
00028 
00029 namespace Papillon 
00030 {
00031 
00032 class LoginTask::Private
00033 {
00034 public:
00035     Private()
00036      : currentState(LoginTask::StateVersion)
00037     {}
00038 
00039     LoginTask::LoginState currentState;
00040 
00041     // Keep track of the expected transaction ID.
00042     QString currentTransactionId;
00043 
00044     QString tweenerTicket;
00045 };
00046 
00047 LoginTask::LoginTask(Task *parent)
00048  : Task(parent), d(new Private)
00049 {
00050 }
00051 
00052 LoginTask::~LoginTask()
00053 {
00054     delete d;
00055 }
00056 
00057 LoginTask::LoginState LoginTask::loginState() const
00058 {
00059     return d->currentState;
00060 }
00061 
00062 bool LoginTask::take(NetworkMessage *networkMessage)
00063 {
00064     if( forMe(networkMessage) )
00065     {
00066         bool proceeded = false;
00067         switch(d->currentState)
00068         {
00069             case StateVersion:
00070             {
00071                 if( networkMessage->command() == QLatin1String("VER") )
00072                 {
00073                     d->currentState = StateCVR;
00074                     proceeded = true;
00075                     sendCvrCommand();
00076                 }
00077                 break;
00078             }
00079             case StateCVR:
00080             {
00081                 if( networkMessage->command() == QLatin1String("CVR") )
00082                 {
00083                     d->currentState = StateTweenerInvite;
00084                     proceeded = true;
00085                     sendTweenerInviteCommand();
00086                 }
00087                 break;
00088             }
00089             case StateTweenerInvite:
00090             {
00091                 if( networkMessage->command() == QLatin1String("USR") )
00092                 {
00093                     if( networkMessage->arguments()[0] == QLatin1String("TWN") && networkMessage->arguments()[1] == QLatin1String("S") )
00094                     {
00095                         d->currentState = StateTweenerConfirmed;
00096 
00097                         QString tweener = networkMessage->arguments()[2];
00098                         TweenerHandler *tweenerHandler = new TweenerHandler;
00099                         tweenerHandler->setLoginInformation(tweener, passportId(), password());
00100                         connect(tweenerHandler, SIGNAL(result( TweenerHandler* )), this, SLOT(ticketReceived( TweenerHandler* )));
00101                         tweenerHandler->start();
00102 
00103                         proceeded = true;
00104                     }
00105                 }
00106                 else if( networkMessage->command() == QLatin1String("XFR") )
00107                 {
00108                     QString newServer = networkMessage->arguments()[1].section(":", 0, 0);
00109                     QString tempPort = networkMessage->arguments()[1].section(":", 1, 1);
00110                     bool dummy;
00111                     int newPort = tempPort.toUInt(&dummy);
00112 
00113                     d->currentState = StateRedirection;
00114                     proceeded = true;
00115                     emit redirection(newServer, newPort);
00116                 }
00117                 break;
00118             }
00119             case StateTweenerConfirmed:
00120             {
00121                 if( networkMessage->command() == QLatin1String("USR") )
00122                 {
00123                     if( networkMessage->arguments()[0] == QLatin1String("OK") )
00124                     {
00125                         proceeded = true;
00126                         d->currentState = StateFinish;
00127                         // End the login task.
00128                         setSuccess();
00129                     }
00130                 }
00131                 break;
00132             }
00133             default:
00134                 return false;
00135         }
00136 
00137         return proceeded;
00138     }
00139 
00140     return false;
00141 }
00142 
00143 bool LoginTask::forMe(NetworkMessage *networkMessage) const
00144 {
00145     if( networkMessage->type() == NetworkMessage::TransactionMessage )
00146     {
00147         if( networkMessage->transactionId() == d->currentTransactionId )
00148             return true;
00149     }
00150 
00151     return false;
00152 }
00153 
00154 // TODO: Send VER, CVR, USR I at the same time
00155 void LoginTask::onGo()
00156 {
00157     qDebug() << Q_FUNC_INFO << "Begin login process...";
00158 
00159     sendVersionCommand();
00160 }
00161 
00162 void LoginTask::sendVersionCommand()
00163 {
00164     qDebug() << Q_FUNC_INFO << "Sending version command.";
00165     NetworkMessage *versionNetworkMessage = new NetworkMessage(NetworkMessage::TransactionMessage);
00166     versionNetworkMessage->setCommand( QLatin1String("VER") );
00167 
00168     d->currentTransactionId = QString::number( connection()->transactionId() );
00169     versionNetworkMessage->setTransactionId( d->currentTransactionId );
00170 
00171     versionNetworkMessage->setArguments( QString("MSNP13 CVR0") );
00172 
00173     send(versionNetworkMessage);
00174 }
00175 
00176 void LoginTask::sendCvrCommand()
00177 {
00178     qDebug() << Q_FUNC_INFO << "Sending CVR command.";
00179     NetworkMessage *cvrMessage = new NetworkMessage(NetworkMessage::TransactionMessage);
00180     cvrMessage->setCommand( QLatin1String("CVR") );
00181     
00182     d->currentTransactionId = QString::number( connection()->transactionId() );
00183     cvrMessage->setTransactionId( d->currentTransactionId );
00184 
00185     QString arguments = QString("0x0409 winnt 5.1 i386 MSG80BETA 8.0.0689 msmsgs %1").arg( passportId() );
00186     cvrMessage->setArguments(arguments);
00187 
00188     send(cvrMessage);
00189 }
00190 
00191 void LoginTask::sendTweenerInviteCommand()
00192 {
00193     qDebug() << Q_FUNC_INFO << "Sending Tweener Invite Command";
00194     NetworkMessage *twnMessage = new NetworkMessage(NetworkMessage::TransactionMessage);
00195     twnMessage->setCommand("USR");
00196 
00197     d->currentTransactionId = QString::number( connection()->transactionId() );
00198     twnMessage->setTransactionId( d->currentTransactionId );
00199 
00200     QString arguments = QString("TWN I %1").arg( passportId() );
00201     twnMessage->setArguments(arguments);
00202 
00203     send(twnMessage);
00204 }
00205 
00206 void LoginTask::sendTweenerConfirmation()
00207 {
00208     qDebug() << Q_FUNC_INFO << "Sending Tweener confirmation command.";
00209     NetworkMessage *twnMessage = new NetworkMessage(NetworkMessage::TransactionMessage);
00210     twnMessage->setCommand("USR");
00211 
00212     d->currentTransactionId = QString::number( connection()->transactionId() );
00213     twnMessage->setTransactionId( d->currentTransactionId );
00214 
00215     QString arguments = QString("TWN S %1").arg(d->tweenerTicket);
00216     twnMessage->setArguments(arguments);
00217 
00218     send(twnMessage);
00219 }
00220 
00221 void LoginTask::ticketReceived(TweenerHandler *tweenerHandler)
00222 {
00223     if( tweenerHandler->success() )
00224     {
00225         d->tweenerTicket = tweenerHandler->ticket();
00226         tweenerHandler->deleteLater();
00227 
00228         sendTweenerConfirmation();
00229     }
00230     else
00231     {
00232         d->currentState = LoginTask::StateBadPassword;
00233         setError();
00234     }
00235 }
00236 
00237 QString LoginTask::passportId() const
00238 {
00239     return connection()->client()->userContact()->passportId();
00240 }
00241 
00242 QString LoginTask::password() const
00243 {
00244     return connection()->client()->userContact()->password();
00245 }
00246 
00247 }
00248 
00249 #include "logintask.moc"

kopete/protocols/messenger/libpapillon

Skip menu "kopete/protocols/messenger/libpapillon"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdenetwork

Skip menu "kdenetwork"
  • kget
  • kopete
  •   kopete
  •   libkopete
  •       libpapillon
  • krfb
Generated for kdenetwork by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal