vpnengine/dmadengine/src/dmadcallback.cpp
changeset 0 33413c0669b9
--- /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 <utf.h>
+
+#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<TPtrC8>* uriSegList;
+    TDmAdUtil::ParseUriLC(childUriList->Ptr(0), uriSegList);
+
+    TBool found = EFalse;
+    HBufC8* uri = 0;
+    for (TInt i=0; i<uriSegList->Count(); ++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;
+        }
+    }