diff -r 000000000000 -r e6b17d312c8b imservices/ossprotocoladaptation/src/cossprotocolloginrequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imservices/ossprotocoladaptation/src/cossprotocolloginrequest.cpp Thu Dec 17 08:54:49 2009 +0200 @@ -0,0 +1,420 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Login Request to the Network Server. +* +*/ + + +#include "cossprotocolloginrequest.h" +#include +#include "mossprotocolconnectionmanager.h" +#include "ossprotocolpluginlogger.h" +#include "cossprotocolconnection.h" +#include "cossprotocolconnectionmanager.h" +#include +#include "stringutils.h" +#include +#include "msgliterals.h" +#include "msg_enums.h" +#include "xmppparameters.h" +#include "waittimer.h" +#include + +#include + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// COSSProtocolLoginRequest::COSSProtocolLoginRequest() +// --------------------------------------------------------------------------- +// +COSSProtocolLoginRequest::COSSProtocolLoginRequest ( + MOSSProtocolConnectionManager& aConnMan, + TXIMPRequestId aRequestId ) : + CActive ( CActive::EPriorityStandard ), + iRequestId ( aRequestId ), + iConnMan ( aConnMan ) + { + LOGGER ( TXT ( "COSSProtocolLoginRequest::COSSProtocolLoginRequest Start" ) ); + CActiveScheduler::Add ( this ); + LOGGER ( TXT ( "COSSProtocolLoginRequest::COSSProtocolLoginRequest End" ) ); + } + +// COSSProtocolLoginRequest::ConstructL() +// --------------------------------------------------------------------------- +// +void COSSProtocolLoginRequest::ConstructL() + { + LOGGER ( TXT ( "COSSProtocolLoginRequest::COSSProtocolLoginRequest Start-End" ) ); + LOGGER ( TXT ( "COSSProtocolLoginRequest::COSSProtocolLoginRequest End" ) ); + } + + +// --------------------------------------------------------------------------- +// COSSProtocolLoginRequest::NewL() +// --------------------------------------------------------------------------- +// +COSSProtocolLoginRequest* COSSProtocolLoginRequest::NewL ( + MOSSProtocolConnectionManager& aConnMan, + TXIMPRequestId aRequestId ) + { + LOGGER ( TXT ( "COSSProtocolLoginRequest::NewL Start" ) ); + + COSSProtocolLoginRequest* self = + new ( ELeave ) COSSProtocolLoginRequest ( aConnMan, aRequestId ); + CleanupStack::PushL ( self ); + self->ConstructL(); + CleanupStack::Pop ( self ); + + LOGGER ( TXT ( "COSSProtocolLoginRequest::NewL End" ) ); + return self; + } + + +// --------------------------------------------------------------------------- +// COSSProtocolLoginRequest::NewLC() +// --------------------------------------------------------------------------- +// +COSSProtocolLoginRequest* COSSProtocolLoginRequest::NewLC ( + MOSSProtocolConnectionManager& aConnMan, + TXIMPRequestId aRequestId ) + { + LOGGER ( TXT ( "COSSProtocolLoginRequest::NewLC Start" ) ); + + COSSProtocolLoginRequest* self = + COSSProtocolLoginRequest::NewL ( aConnMan, aRequestId ); + CleanupStack::PushL ( self ); + + LOGGER ( TXT ( "COSSProtocolLoginRequest::NewLC End" ) ); + return self; + } + +// --------------------------------------------------------------------------- +// COSSProtocolLoginRequest::~COSSProtocolLoginRequest() +// --------------------------------------------------------------------------- +// +COSSProtocolLoginRequest::~COSSProtocolLoginRequest() + { + LOGGER ( TXT ( "::~COSSProtocolLoginRequest Start-End" ) ); + Cancel(); + if( iUserName ) + { + delete iUserName; + } + + LOGGER ( TXT ( "::~COSSProtocolLoginRequest End\n" ) ); + } + + +// --------------------------------------------------------------------------- +// COSSProtocolLoginRequest::DoCancel() +// --------------------------------------------------------------------------- +// +void COSSProtocolLoginRequest::DoCancel() + { + } + + +// --------------------------------------------------------------------------- +// COSSProtocolLoginRequest::RunL() +// --------------------------------------------------------------------------- +// +void COSSProtocolLoginRequest::RunL() + { + LOGGER ( TXT ( "COSSProtocolLoginRequest::RunL Start" ) ); + message_hdr_resp* msg_struct = NULL; + User::LeaveIfError ( iStatus.Int() ); + char* pResponse = NULL; + pResponse = iConnMan.DataHandler().ResponseL ( iSendId ); + + msg_struct = ( message_hdr_resp* )pResponse ; + if( !( msg_struct->response ) ) + { + switch( msg_struct->error_type ) + { + case ELOGIN_NETWORK_ERROR: + LOGGER ( TXT ( "COSSProtocolLoginRequest::RunL ELOGIN_NETWORK_ERROR" ) ); + case ELOGIN_NONE_SPECIFIED: + //XImpfw is not giving any error code for canceling accespoint so we are using KErrDisconnected + //once error code is provided by ximpfw we can remove + LOGGER ( TXT ( "COSSProtocolLoginRequest::RunL ELOGIN_NONE_SPECIFIED" ) ); + iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, KErrDisconnected ); + break; + case ELOGIN_AUTHENTICATION: //The username or password was invalid. + LOGGER ( TXT ( "COSSProtocolLoginRequest::RunL ELOGIN_AUTHENTICATION" ) ); + iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, KXIMPErrServiceAuthenticationFailed ); + break; + default: //for all other error codes like ssl related are mapped to general error ELOGIN_AUTHORIZATION + LOGGER ( TXT ( "COSSProtocolLoginRequest::RunL defualt" ) ); + iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, KXIMPErrServiceGeneralError ); + break; + } + } + else + { + iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, KErrNone ); + MPresenceBuddyInfo2* buddyPresInfo = MPresenceBuddyInfo2::NewLC(); + MPresenceCacheWriter2* presenceCacheWriter = MPresenceCacheWriter2::CreateWriterL(); + HBufC* userName = HBufC::NewLC( iUserName->Length() + iConnMan.ServiceName().Length() + KColon().Length() ); + TPtr namePtr( userName->Des() ); + namePtr.Zero(); + namePtr.Append(iConnMan.ServiceName()); // prepend service name + namePtr.Append(KColon); + namePtr.Append(iUserName->Des() ); + buddyPresInfo->SetIdentityL(namePtr); + LOGGER ( TXT ( "COSSProtocolLoginRequest::owndata:%S " ), userName ); + CleanupStack::PopAndDestroy();//userName + _LIT(KAvailable,"available");//since not getting the own status from downlayer.here + _LIT(KStatusTest,"Online");//is hardcoded once logged in is successfully + HBufC16 *message = KAvailable().AllocLC(); + buddyPresInfo->SetAvailabilityL( MPresenceBuddyInfo2::EAvailable,*message); + HBufC16 *statusmessage = KStatusTest().AllocLC(); + buddyPresInfo->SetStatusMessageL(*statusmessage); + + TInt cacheerror = presenceCacheWriter->WritePresenceL(buddyPresInfo); + User::LeaveIfError ( cacheerror); + CleanupStack::PopAndDestroy ( 3 ); //buddyPresInfo, message ,statusmessage + delete presenceCacheWriter ; + } + + + free( pResponse ); + delete this; + + LOGGER ( TXT ( "COSSProtocolLoginRequest::RunL End" ) ); + + } + + +// --------------------------------------------------------------------------- +// COSSProtocolLoginRequest::RunError() +// --------------------------------------------------------------------------- +// +TInt COSSProtocolLoginRequest::RunError ( TInt aError ) + { + LOGGER ( TXT ( "COSSProtocolLoginRequest::RunError Start" ) ); + + iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, aError ); + + delete this; + LOGGER ( TXT ( "COSSProtocolLoginRequest::RunError End" ) ); + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// COSSProtocolLoginRequest::IssueLoginRequestL() +// --------------------------------------------------------------------------- +// +void COSSProtocolLoginRequest::IssueLoginRequestL() + { + LOGGER ( TXT ( "COSSProtocolLoginRequest::IssueLoginRequestL Start" ) ); + + char *smsg = NULL; + char *tmpmsg = NULL; + message_hdr_req msgHdr = {0,}; + int userLen = 0; + int totalLen = 0; + int err = 0; + + smsg = ( char* ) User::AllocLC(MAX_MSG_SIZE); + + tmpmsg = ( char* ) User::AllocLC(MAX_MSG_SIZE); + + HBufC* buffer = HBufC::NewLC ( MAX_MSG_SIZE ); + TPtr bufferPtr ( buffer->Des() ); + bufferPtr.Zero(); + memset ( smsg, '\0', MAX_MSG_SIZE ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + + msgHdr.message_type = ELogin_Request; + iConnMan.DataHandler().IncreaseOpId(); + TInt Opid = iConnMan.DataHandler().GetOpId(); + msgHdr.request_id = Opid; + memcpy ( smsg, &msgHdr, sizeof ( message_hdr_req ) ); + totalLen += sizeof ( message_hdr_req ); + bufferPtr.Zero(); + + if ( iConnMan.UserName().Length() == 0 && iConnMan.Password().Length() == 0 ) //if username and pwd are not passed from client.read default settings + { + bufferPtr.Append ( iConnMan.XmppParams().UserName() ); + iUserName = bufferPtr.AllocL(); + LOGGER ( TXT ( "COSSProtocolLoginRequest::UserName:%S " ), & ( iConnMan.XmppParams().UserName() ) ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + if( -1 == err) + { + iConnMan.HandleToHost().HandleRequestCompleted ( iRequestId, err ); + } + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + bufferPtr.Zero(); + bufferPtr.Append ( iConnMan.XmppParams().Passwd() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + } + else + { + iUserName = iConnMan.UserName().AllocL(); + bufferPtr.Append ( iConnMan.UserName() ); + LOGGER ( TXT ( "COSSProtocolLoginRequest::UserName:%S " ), & ( iConnMan.UserName() ) ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + bufferPtr.Zero(); + bufferPtr.Append ( iConnMan.Password() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + } + + bufferPtr.Zero(); + + bufferPtr.Append ( iConnMan.XmppParams().ServerAddress() ); + LOGGER ( TXT ( "COSSProtocolLoginRequest::RunL:ServerAddress:%S " ), & ( iConnMan.XmppParams().ServerAddress() ) ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + //resource + bufferPtr.Zero(); + bufferPtr.Append ( GenResourceId(iConnMan.XmppParams().Resource()) ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + //ssl + bufferPtr.Zero(); + bufferPtr.AppendNum ( iConnMan.XmppParams().Ssl() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + //ServerPort + bufferPtr.Zero(); + bufferPtr.AppendNum ( iConnMan.XmppParams().ServerPort() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + //IapId + bufferPtr.Zero(); + bufferPtr.AppendNum ( iConnMan.XmppParams().IapId() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + //connmgr_bus + bufferPtr.Zero(); + bufferPtr.Append ( iConnMan.XmppParams().ConnMgrBus() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + //connmgr_path + bufferPtr.Zero(); + bufferPtr.Append ( iConnMan.XmppParams().ConnMgrPath() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + //protocol + bufferPtr.Zero(); + bufferPtr.Append ( iConnMan.XmppParams().Protocol() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + +#ifdef __WINSCW__ + //ProxyServer + bufferPtr.Zero(); + bufferPtr.Append ( iConnMan.XmppParams().ProxyServer() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; + + //ProxyPort + bufferPtr.Zero(); + bufferPtr.AppendNum ( iConnMan.XmppParams().ProxyPort() ); + memset ( tmpmsg, '\0', MAX_MSG_SIZE ); + err = tbufC16tochar ( bufferPtr, tmpmsg ); + userLen = strlen ( tmpmsg ) + 1; //for '\0' + memcpy ( smsg + totalLen, tmpmsg, userLen ); + totalLen += userLen; +#endif + + + iSendId = iConnMan.DataHandler().SendDataL ( iStatus, smsg, totalLen ); + + // signal the scheduler + SetActive(); + CleanupStack::PopAndDestroy (buffer); + CleanupStack::PopAndDestroy (tmpmsg); + CleanupStack::PopAndDestroy (smsg); + LOGGER ( TXT ( "COSSProtocolConnection::OpenSessionL() End" ) ); + } +// --------------------------------------------------------------------------- +// COSSProtocolLoginRequest::GenResourceId() +// --------------------------------------------------------------------------- +// +TPtrC COSSProtocolLoginRequest::GenResourceId( const TDesC& aResourceId ) + { + TBuf tempRId = aResourceId; + //initialise client id + iResourceId.SetLength(0); + + //generate Resourse here + iResourceId.Append(tempRId); + + TTime time; + time.HomeTime(); + TInt64 seed = time.Int64(); + + TInt i = Math::Rand( seed ); + + iResourceId.AppendFormat( _L("%d"), i); + + return iResourceId; + } + +// End of file