diff -r 000000000000 -r b16258d2340f applayerprotocols/httptransportfw/Test/T_HttpIntegration/HttpSessionCmds.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httptransportfw/Test/T_HttpIntegration/HttpSessionCmds.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,479 @@ +// Copyright (c) 2002-2009 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: +// $Header$ +// This module implements the collection of HTTP Framework related integration +// test commands and tools +// by: mjdavey, symbian@mjdss.com, August 2002 +// for: Typhoon (7.0s) & JetStream (8.0) +// Include Files +// +// + + +#include "CHTTPFamily.h" +#include "HttpSessionCmds.h" +#include "HttpFrmwrk.h" +#include "CWspEventDispatcher.h" + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Command: CONNECT command. +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// +// Form: +// CONNECT +// Example: +// CONNECT HTTP framework1 +// +// The connection made is assigned the name e.g. 'framework1' +// and is referenced by subsequent tagname replacement. +// the connection session is then associated with this tagname and can be +// used until the corresponding DISCONNECT is encountered. +// The 'Engine' has an arbitrary collection object that is used to maintain these +// links + +CCmdConnect *CCmdConnect::NewL(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase) + { + CCmdConnect *self = NewLC( aCommandId, aKeyphrase, aHelpPhrase); + CleanupStack::Pop(); + return self; + } + +//----------------------------------------------------------------------------- + +CCmdConnect *CCmdConnect::NewLC( TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase) + { + CCmdConnect *self = new (ELeave) CCmdConnect(); + CleanupStack::PushL(self); + self->ConstructL(aCommandId, aKeyphrase, aHelpPhrase); + return self; + } + +//----------------------------------------------------------------------------- + +void CCmdConnect::ConstructL(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase) + { + CCmdBase::ConstructL(aCommandId, aKeyphrase, aHelpPhrase); + + // create the Active Object interface + iEventDispatcher = CWspEventDispatcher::NewL(*this); + + WaitForNextEvent (THTTPSessionEvent::EDisconnected); + + } + +//----------------------------------------------------------------------------- + +CCmdConnect::~CCmdConnect(void) + { + iEventDispatcher->CancelWait(); + + delete iEventDispatcher; + // void WaitForNextEvent(TInt); + } + +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- + +void CCmdConnect::DisconnectL(const TDesC& aLabel) + { + CAnyObject *obj = (CAnyObject *)Machine()->Domains()->Name(aLabel); + CFrmwrkSession *frmwk = (CFrmwrkSession *) obj->Ptr(); + TPtrC myName = frmwk->Name() ; + + + Log(_L("CCmdConnect::DisconnectL, Session %S"), &myName); + frmwk->DisconnectL(); + } + +void CCmdConnect::DisconnectL(const TInt &aIndex) + { + CAnyObject *obj = (CAnyObject *)Machine()->Domains()->At(aIndex); + CFrmwrkSession *frmwk = (CFrmwrkSession *) obj->Ptr(); + TPtrC myName = frmwk->Name() ; + + + Log(_L("CCmdConnect::DisconnectL, Session %S"), &myName); + frmwk->DisconnectL(); + } + +void CCmdConnect::Delete(const TDesC& aLabel) + { + CAnyObject *obj = (CAnyObject *)Machine()->Domains()->Name(aLabel); + CFrmwrkSession *frmwk = (CFrmwrkSession *) obj->Ptr(); + TPtrC myName = frmwk->Name() ; + + Log(_L("CCmdConnect::Delete, Session %S"), &myName); + frmwk->Close(); + delete frmwk; + } + +TInt CCmdConnect::ProcessL( const TDesC& aCommand ) +{ + // Complete the test machine - will then get the next cmd + Machine()->CompleteRequest(); + + TPtrC framework; + TPtrC conname; + + TInt error; + if (( error = ParseCmdArgs( aCommand, framework, conname )) != KErrNone) + return error; + + if (conname.Size() != 0) + { + // Check if the connection already is defined. + // If it is return error, if not create a session and ptr! + CAnyObject *cnx = (CAnyObject *)Machine()->Domains()->Name(conname); + + if (cnx != NULL) // already exists + return Error(KErrAlreadyExists, THA_KErrCnxionExists, &conname); + else + { + CFrmwrkSession *cithc = CFrmwrkSession::NewLC(conname, framework, Machine()); + cithc->iEventDispatcher = iEventDispatcher ; + + TRAPD(error, cithc->OpenL()); + if (error == KErrNone) + { + cithc->SetPropertiesL(); + + TRAP(error, cithc->ConnectL()); + + if (error == KErrNone) + { + // now create reference to name in domains + // note: the value is 1 for HTTP and 0 for WSP + Machine()->Domains()->AddL(conname, 0, THA_KHTTP_Connect, (TAny *) cithc); + WriteDateStamp(); + Log(_L("Connection '%S' has been opened!"), &conname); + } + else + Error(error, KTxtErrConnectFailed); + } + + CleanupStack::Pop(); // cithc + } + } + else + { + (void) ShowSessions () ; + } + + return error; +} + +TInt CCmdConnect::ParseCmdArgs( const TDesC& aCommand, TPtrC& aFramework, TPtrC& aConName ) + { + aFramework.Set(NULL, 0); + aConName.Set(NULL, 0); + TInt error = KErrNone; + + // get the command into a local string + TPtrC param; + TRAP(error, param.Set(ParamsL(aCommand))); + if (error != KErrNone) + return Error(error, TFR_KFmtErrBadCmd, &Keyphrase()); + + // check its' valid + TLex parse(param); + if (!parse.Eos() && !parse.Peek().IsSpace()) + return Error(error, TFR_KFmtErrBadCmd, &Keyphrase()); + + // remove any spaces and see if its got params + parse.SkipSpace(); + if ( parse.Eos() ) // no params + return error; + + // Get framework name, must not exceed 16 characters. + // should be http or wsp (currently) + + TRAP(error, aFramework.Set(TfrLex::GetL(parse))); + if ( error != KErrNone) + return Error(KErrArgument, TFR_KFmtErrBadCmd, &aFramework); + + // check is valid length + aFramework.Set(TfrLex::Peel(aFramework)); + if ( aFramework.Length() > 16 ) + return Error(KErrArgument, THA_KErrParameterLong, &aFramework); + + // check aFramework type valid (HTTP or WSP) + // Param shall be HTTP (True) or WSP (False) + aFramework.Set( TfrLex::TrimAndPeel(aFramework) ); + TBool value = (aFramework.CompareF(THA_KTxtFrameworkHTTP) == 0); + + if ( !value && (aFramework.CompareF(THA_KTxtFrameworkWSP) != 0)) + return Error(KErrArgument, THA_KErrFrameworkErr, &aFramework); + + // Get connection/session name value. + + TRAP(error,aConName.Set(TfrLex::GetL(parse))); + if ( error != KErrNone) + return Error(KErrArgument, TFR_KFmtErrBadCmd, &aConName); + + // There shall not be anything more. + TPtrC remainder = TfrLex::Trim(parse.Remainder()); + if ( remainder.Length() > 0 ) + return Error(KErrArgument, TFR_KFmtErrBadCmd, &remainder); + + if (aConName.Length() <= 0) + return Error(KErrArgument, THA_KErrInvalidConnect, &Keyphrase()); + + aConName.Set(TfrLex::Peel(aConName)); + return (KErrNone); + } + +void CCmdConnect::ShowSessions () + { + + CObjCatalogue *cnxns = Machine()->Domains(); + TInt iCnxns = 0; + if (cnxns->Count() == 0) + Log(_L("\tNo connections have been defined")); + else + { + Log(_L("\t Name Framework")); + for (TInt i = 0; i < cnxns->Count(); ++i) + { + CAnyObject *obj = (CAnyObject *)cnxns->At(i); + if (obj->Tag() == THA_KHTTP_Connect) + { + TPtrC label = obj->Name(); + TPtrC frmwrk = ((TBool) ((CFrmwrkSession *) obj->Ptr())->UseWSPProtocol()) ? _L("WSP") : _L("HTTP"); + ++iCnxns; + Log(_L("\t%d %S - %S"), iCnxns, &label, &frmwrk); + } + } + } + } + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Command: DISCONNECT command. +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// +// Form: +// DISCONNECT +// Example: +// DISCONNECT framework1 +// + +CCmdDisconnect *CCmdDisconnect::NewL(TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase) + { + CCmdDisconnect *self = NewLC( aCommandId, aKeyphrase, aHelpPhrase); + CleanupStack::Pop(); + return self; + } + +//----------------------------------------------------------------------------- + +CCmdDisconnect *CCmdDisconnect::NewLC( TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase) + { + CCmdDisconnect *self = new (ELeave) CCmdDisconnect(); + CleanupStack::PushL(self); + self->ConstructL(aCommandId, aKeyphrase, aHelpPhrase); + return self; + } + +//----------------------------------------------------------------------------- + +void CCmdDisconnect::ConstructL( TInt aCommandId, const TDesC& aKeyphrase, const TDesC& aHelpPhrase) + { + CCmdBase::ConstructL(aCommandId, aKeyphrase, aHelpPhrase); + } + +//----------------------------------------------------------------------------- + +CCmdDisconnect::~CCmdDisconnect(void) + { + } + +TInt CCmdDisconnect::ParseCmdArgs( const TDesC& aCommand, TPtrC& aConName ) + { + aConName.Set(NULL, 0); + + // get the command into a local string + TPtrC param; + TRAPD(error, param.Set(ParamsL(aCommand))); + if (error != KErrNone) + return Error(error, TFR_KFmtErrBadCmd, &Keyphrase()); + + // check its' valid + TLex parse(param); + if (!parse.Eos() && !parse.Peek().IsSpace()) + return Error(error, TFR_KFmtErrBadCmd, &Keyphrase()); + + // remove any spaces and see if its got params + parse.SkipSpace(); + if (parse.Eos() ) + // If no params return error + return Error(error, TFR_KFmtErrBadCmd, &Keyphrase()); + + // Get connection/session name value. + TRAP(error,aConName.Set(TfrLex::GetL(parse))); + if (error != KErrNone) + return Error(KErrArgument, TFR_KFmtErrBadCmd, &Keyphrase()); + + // There shall not be anything more. + TPtrC remainder = TfrLex::Trim(parse.Remainder()); + if (remainder.Length() > 0) + return Error(KErrArgument, TFR_KFmtErrBadCmd, &Keyphrase()); + + if (aConName.Length() <= 0) + return Error(KErrArgument, THA_KErrInvalidConnect, &aConName); + + aConName.Set(TfrLex::Peel(aConName)); + return (KErrNone); + } + +TInt CCmdDisconnect::ProcessL(const TDesC& aCommand) + { + // Complete the test machine - will then get the next cmd + Machine()->CompleteRequest(); + + TInt error; + TPtrC conname; + if (( error = ParseCmdArgs( aCommand, conname )) != KErrNone) + return error; + + // Check if the connection already is defined. + // If it is return error, if not create a session and ptr! + CAnyObject *obj = (CAnyObject *) Machine()->Domains()->Name(conname); + + // at this point we can find the session that the disconnect refers to + // in the Session, save disconnects eventhandler. + + if (obj != NULL) // connection (name) exists + { + // get reference to list in CmdConnect from Family and retrieve the reference to the session + CCmdConnect *iConnect = (CCmdConnect *)Family()->Command(THA_KHTTP_Connect); + + iConnect->DisconnectL(conname); + + TBool frmwrk = ((CFrmwrkSession *) obj->Ptr())->UseWSPProtocol() ; + + if (!frmwrk) // HTTP Session so complete request + { + // check that there are no existing transactions (live) for this session + // and that the session is not already closed (i.e. in error) + + //XXXXXXX + + iConnect->Delete(conname); + Machine()->Domains()->Delete(conname); + + // what about the iSessionIndex - this is going to be problematic since we need to track the + // index into the session when it changes... + WriteDateStamp(); + Log(_L("\tConnection '%S' has been disconnected!"), &conname); + } + else + { + Log(_L("Issued DisconnectL")); + } + } + else + return Error(KErrNotFound, THA_KErrConnectionErr, &conname); + + if ( error != KErrNone ) + Log(TFR_KFmtErrFailed, &Keyphrase(), error); + + return error; +} + +void CCmdConnect::WaitForNextEvent(TInt aEventType) + { + // Wait for the next event + iEventRequired = aEventType; + + iEventDispatcher->WaitForWspEvent(); + } + + +void CCmdConnect::HandleWspEvent(TRequestStatus aStatus) +{ + TBool fail = EFalse; + + if (aStatus == THTTPSessionEvent::EConnect) + { + Log(_L("CFrmwrkSession::HandleWspEvent, event EConnect")); + } + else if (aStatus == THTTPSessionEvent::EConnectedOK) + { + Log(_L("CFrmwrkSession::HandleWspEvent, event EConnectedOK")); + } + else if (aStatus == THTTPSessionEvent::EConnectedWithReducedCapabilities) + { + Log(_L("CFrmwrkSession::HandleWspEvent, event EConnectedWithReducedCapabilities")); + } + else if (aStatus == THTTPSessionEvent::EDisconnected) + { + Log(_L("CFrmwrkSession::HandleWspEvent, event EDisconnected")); + fail = ETrue; + } + else if (aStatus == THTTPSessionEvent::EAuthenticatedOK) + { + Log(_L("CFrmwrkSession::HandleWspEvent, event EAuthenticatedOK")); + } + else if (aStatus == THTTPSessionEvent::EAuthenticationFailure) + { + Log(_L("CFrmwrkSession::HandleWspEvent, event EAuthenticationFailure")); + } + else if (aStatus == THTTPSessionEvent::EConnectionTimedOut) + { + Log(_L("CFrmwrkSession::HandleWspEvent, event EConnectionTimedOut")); + fail = ETrue; + } + else + { + Log(_L("CFrmwrkSession::HandleWspEvent, Unrecognised event [%d]"), aStatus.Int()); + fail = ETrue; + } + + if (fail) + { + CObjCatalogue *sessions = Machine()->Domains(); + + for (TInt i = 0; i < sessions->Count(); ++i) + { + CAnyObject *obj = (CAnyObject *)sessions->At(i); + if (obj->Tag() == THA_KHTTP_Connect) + { + CFrmwrkSession *frmwk = (CFrmwrkSession *) obj->Ptr(); + + if (frmwk->UseWSPProtocol() && (frmwk->iState == CFrmwrkSession::EWSPDisconnected)) + { + TBuf16<256> myNameBuf; + + myNameBuf.Copy(frmwk->Name()); + + Log(_L("CCmdConnect::HandleWspEvent() : Delete %S\r\n"), &myNameBuf); + Delete(myNameBuf); + Machine()->Domains()->Delete(myNameBuf); + + } + } + } + } + + WaitForNextEvent (THTTPSessionEvent::EDisconnected); +} + +//----------------------------------------------------------------------------- +// End of File +//----------------------------------------------------------------------------- +