diff -r 000000000000 -r 33413c0669b9 vpnengine/dmadengine/src/dmadcallback.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/dmadengine/src/dmadcallback.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,216 @@ +/* +* Copyright (c) 2002-2006 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: Call back implementation +* +*/ + + +#include + +#include "dmadcallbackc.h" +#include "dmadutil.h" +#include "vpnlogger.h" + +#if defined(_DEBUG) +_LIT(KDmAdLogFolder,"vpn"); +_LIT(KDmAdLogFile,"dmadengine.log"); +#endif + + +DMAD_EXPORT_C CDmAdCallBack* CDmAdCallBack::NewL(MSmlDmCallback* aCallBack, const TDesC8& aSomeOwnUri) + { + + //Is first method called from the dmadengine + //This why the logging is initiated here. + INITIALIZE_DEBUG_LOG_L(KDmAdLogFolder, KDmAdLogFile); + DEBUG_LOG1(_L8("LOGGING INITIALIZED for %S"), &aSomeOwnUri); + + CDmAdCallBack* self = NewLC(aCallBack, aSomeOwnUri); + CleanupStack::Pop(); // self + return self; + } + +DMAD_EXPORT_C CDmAdCallBack* CDmAdCallBack::NewLC(MSmlDmCallback* aCallBack, const TDesC8& aSomeOwnUri) + { + CDmAdCallBack* self = new (ELeave) CDmAdCallBack(aCallBack); + CleanupStack::PushL(self); + self->ConstructL(aSomeOwnUri); + return self; + } + +void CDmAdCallBack::ConstructL(const TDesC8& aSomeOwnUri) + { + TRACE("CDmAdCallBack::ConstructL"); + iSomeOwnUri = aSomeOwnUri.AllocL(); + } + +CDmAdCallBack::CDmAdCallBack(MSmlDmCallback* aCallBack) : iCallBack(aCallBack) + { + } + +DMAD_EXPORT_C CDmAdCallBack::~CDmAdCallBack() + { + + DEBUG_LOG1(_L8("FINALIZING LOGGING %S"), iSomeOwnUri); + FINALIZE_DEBUG_LOG; + + delete iSomeOwnUri; + } + +DMAD_EXPORT_C void CDmAdCallBack::SetResultsL(TInt aResultsRef, CBufBase& aObject, const TDesC8& aType) + { + TRACE("CDmAdCallBack::SetResultsL"); + + DEBUG_LOG1(_L("rref = %d"), aResultsRef); + DEBUG_LOG1(_L("lth = %d"), aObject.Ptr(0).Length()); + + DEBUG_LOG_HEX(aObject.Ptr(0)); + + iCallBack->SetResultsL(aResultsRef, aObject, aType); + } + +DMAD_EXPORT_C void CDmAdCallBack::SetStatusL(TInt aStatusRef, TInt aError) + { + TRACE("CDmAdCallBack::SetStatusL"); + + DEBUG_LOG1(_L("rref = %d"), aStatusRef); + DEBUG_LOG1(_L("status = %d"), aError); + + iCallBack->SetStatusL(aStatusRef, TDmAdUtil::MapStatusCode(aError)); + } + +DMAD_EXPORT_C void CDmAdCallBack::SetMappingL(const TDesC8& aUri, const TDesC8& aLuid) + { + TRACE("CDmAdCallBack::SetMappingL"); + + DEBUG_LOG1(_L8("aUri %S"), &aUri); + DEBUG_LOG(_L8("aLuid:")); + DEBUG_LOG_HEX(aLuid); + + iCallBack->SetMappingL(aUri, aLuid); + } + +DMAD_EXPORT_C void CDmAdCallBack::FetchLinkL(const TDesC8& aUri, CBufBase& aData, MSmlDmAdapter::TError& aStatus) + { + TRACE("CDmAdCallBack::FetchLinkL"); + + aData.Reset(); + iCallBack->FetchLinkL(aUri, aData, aStatus); + + DEBUG_LOG1(_L("FetchLinkL status %d"), aStatus); + DEBUG_LOG1(_L("Data Length %d"), aData.Ptr(0).Length()); + DEBUG_LOG1(_L8("aUri = %S"), &aUri); + DEBUG_LOG_HEX(aData.Ptr(0)); + + //Some adapters are a bit sloppy and returns a malformed URI, which + //ends with / character. This causes problems in our code. + //So if the last character is /, we strip it off. + + TUint dataSize = aData.Size(); + if (dataSize > 0) + { + TUint lastPosition = dataSize - 1; + TUint8 lastCharacter; + aData.Read(lastPosition, &lastCharacter, 1); + + if (lastCharacter == '/') + { + DEBUG_LOG(_L("WARNING: last character is /. Stripping it off...")); + aData.ResizeL(lastPosition); + } + + } +} + +DMAD_EXPORT_C HBufC8* CDmAdCallBack::GetLuidAllocL(const TDesC8& aUri) + { + TRACE("CDmAdCallBack::GetLuidAllocL"); + + HBufC8* luid = iCallBack->GetLuidAllocL(aUri); + + DEBUG_LOG1(_L8("aUri %S"), &aUri); + DEBUG_LOG(_L("luid:")); + DEBUG_LOG_HEX(*luid); + +#if 1 // restore adapter index (fixes agent) + + HBufC8* tempLuid = iCallBack->GetLuidAllocL(*iSomeOwnUri); + DEBUG_LOG1(_L8("iCallBack->GetLuidAllocL(%S) called"), iSomeOwnUri); + delete tempLuid; +#endif + + return luid; + } + +DMAD_EXPORT_C HBufC8* CDmAdCallBack::FindChildUriL(const TDesC8& aParentUri, const TDesC8& aChildLuid) + { + TRACE("CDmAdCallBack::FindChildUriL"); + + DEBUG_LOG1(_L8("aParentUri = %S"), &aParentUri); + DEBUG_LOG(_L8("aChildLuid:")); + DEBUG_LOG_HEX(aChildLuid); + + CBufBase* childUriList = CBufFlat::NewL(16); + CleanupStack::PushL(childUriList); + MSmlDmAdapter::TError status; + FetchLinkL(aParentUri, *childUriList, status); + if (status == MSmlDmAdapter::ENotFound) + { + DEBUG_LOG(_L("Node not found")); + CleanupStack::PopAndDestroy(); // childUriList + return 0; + } + else if (status != MSmlDmAdapter::EOk) + { + DEBUG_LOG1(_L("Operation failed with %d"), status); + User::Leave(KErrGeneral); + } + + CArrayFix* uriSegList; + TDmAdUtil::ParseUriLC(childUriList->Ptr(0), uriSegList); + + TBool found = EFalse; + HBufC8* uri = 0; + for (TInt i=0; iCount(); ++i) + { + uri = TDmAdUtil::BuildUriLC(aParentUri, uriSegList->At(i)); + HBufC8* luid = GetLuidAllocL(*uri); + if (luid->Compare(aChildLuid) == 0) + { + found = ETrue; + delete luid; + break; + } + CleanupStack::PopAndDestroy(); // uri + delete luid; + } + + if (found) + { + CleanupStack::Pop(); // uri + } + + CleanupStack::PopAndDestroy(2); //uriSegList, childUriList + + if (found) + { + DEBUG_LOG1(_L8("Found uri %S"), uri); + return uri; + } + else + { + DEBUG_LOG(_L("Uri not found")); + return 0; + } + }