webservices/wsoviplugin/src/wsoviregisterhandler.cpp
changeset 0 62f9d29f7211
child 1 272b002df977
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsoviplugin/src/wsoviregisterhandler.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,309 @@
+/*
+* Copyright (c) 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:        
+*
+*/
+
+
+
+
+
+
+
+
+#include "wsoviregisterhandler.h"
+#include "wsovioauthclient.h"
+#include "sendebug.h"
+#include "senlogger.h"
+
+
+class CWSOviHandlerContext;
+// Create instance of concrete ECOM interface implementation
+CWSOviRegisterHandler* CWSOviRegisterHandler::NewL(TAny* aHandlerCtx)
+    {
+    
+    MSenHandlerContext* handlerCtx =
+        reinterpret_cast<MSenHandlerContext*>(aHandlerCtx);
+    CWSOviRegisterHandler* self   = new (ELeave) CWSOviRegisterHandler(*handlerCtx);
+    CleanupStack::PushL (self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// Constructor
+CWSOviRegisterHandler::CWSOviRegisterHandler(MSenHandlerContext& aCtx):CSenSessionHandler(aCtx)
+    {
+    
+    }
+
+// Destructor
+CWSOviRegisterHandler::~CWSOviRegisterHandler()
+    {
+    }
+
+// Second phase construction.
+void CWSOviRegisterHandler::ConstructL()
+    {
+    }
+    
+TInt CWSOviRegisterHandler::InvokeL(MSenSessionContext& aCtx)
+    {
+    MSenServiceDescription& pServiceDescription = *(MSenServiceDescription*)aCtx.GetSenWSDescriptionL(WSOviContextKeys::KServiceDescription());
+    const TDesC8* action = aCtx.GetDesC8L(WSOviContextKeys::KRegisterAction());
+    TInt result(KErrNone);
+    if (*action == WSOviContextValues::KActionRegister())
+        {
+        result = RegisterServiceDescriptionL(pServiceDescription);
+        }
+    else if (*action == WSOviContextValues::KActionUnregister())
+        {
+        result = UnregisterServiceDescriptionL(pServiceDescription);
+        };
+    return result;  
+    }
+    
+SenHandler::THandlerDirection CWSOviRegisterHandler::Direction() const
+    {
+        return SenHandler::EBoth;
+    };
+SenHandler::THandlerPhase CWSOviRegisterHandler::Phase()
+    {
+        return SenHandler::EDiscovery;
+    };
+
+//---------------------------------------------------------------------------
+// Attempt to register the ServiceDescription to the ServiceManager 
+//---------------------------------------------------------------------------
+//
+TInt CWSOviRegisterHandler::RegisterServiceDescriptionL(MSenServiceDescription& aServiceDescription )
+    {
+    TInt retval(KErrNone);
+    CWSOviServiceSession* pSession = NULL;
+    TPtrC8 contract = aServiceDescription.Contract();
+    TPtrC8 endpoint = aServiceDescription.Endpoint();
+
+    if (contract == KNullDesC8) 
+        {
+        TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CWSOviRegisterHandler::RegisterServiceDescriptionL failed - KErrSenNoContract");
+        retval = KErrSenNoContract;
+        }
+    else if(endpoint == KNullDesC8)
+        {
+        TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CWSOviRegisterHandler::RegisterServiceDescriptionL failed - KErrSenNoEndpoint");
+        retval = KErrSenNoEndpoint;
+        }
+    else
+        {
+        if(contract == KWSOviAuthenticationServiceContract)
+            {
+            retval = RegisterAuthClientL(&aServiceDescription);
+            }
+        else if (aServiceDescription.DescriptionClassType() ==
+                        MSenServiceDescription::EOviServiceSession)
+            {
+            //  description already is a session so we just add to core-DAO
+            //  usecase:    when connection has been made, and service is registered 
+            TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSOviRegisterHandler::RegisterServiceDescriptionL - session is already so just adding")));
+                pSession = (CWSOviServiceSession*) &aServiceDescription;
+                retval = iHandlerContext.GetSenCoreServiceManager()->AddServiceDescriptionL(pSession);
+            }
+        else
+            {
+            TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSOviRegisterHandler::RegisterServiceDescriptionL - Creating session from description...")));
+            pSession = CWSOviServiceSession::NewLC(*(CSIF*)iHandlerContext.GetAnyL(HandlerContextKey::KSIF()));	//codescannerwarnings
+            //usecase:  when description has been read from db during bootup
+            //          session has to be initialized (set validity time for example)
+            retval = pSession->InitializeFromL(aServiceDescription);
+            if (retval == KErrNone)
+                {
+                retval = iHandlerContext.GetSenCoreServiceManager()->AddServiceDescriptionL(pSession);
+                CleanupStack::Pop(pSession);
+                }
+            else
+                {
+                CleanupStack::PopAndDestroy(pSession);
+                }
+            }
+        }
+    return retval;
+    }
+    
+    
+//---------------------------------------------------------------------------
+// Attempt to unregister the ServiceDescription from the ServiceManager 
+//---------------------------------------------------------------------------
+//
+TInt CWSOviRegisterHandler::UnregisterServiceDescriptionL(
+    MSenServiceDescription& aServiceDescription)
+    {
+    TInt retval(KErrNone);
+    CWSOviServiceSession *pSession = NULL;
+    TPtrC8 contract = aServiceDescription.Contract();
+
+    if(contract == KWSOviAuthenticationServiceContract)
+        {
+        retval = UnRegisterAuthClientL(&aServiceDescription);
+        }
+    else
+        {
+        if(aServiceDescription.DescriptionClassType() ==
+                MSenServiceDescription::EOviServiceSession)
+            {
+            pSession = (CWSOviServiceSession*) &aServiceDescription;
+            retval = iHandlerContext.GetSenCoreServiceManager()->RemoveServiceDescriptionL(*pSession);
+            }
+        else
+            {
+
+            pSession = CWSOviServiceSession::NewLC(*(CSIF*)iHandlerContext.GetAnyL(HandlerContextKey::KSIF()));	//codescannerwarnings
+            retval = pSession->InitializeFromL(aServiceDescription);
+            if (retval == KErrNone)
+                {
+                RWSDescriptionArray sessions;
+                retval = iHandlerContext.GetSenCoreServiceManager()->ServiceDescriptionsL(sessions,aServiceDescription);
+                if (!retval && sessions.Count())
+                    {
+                    RServiceConsumerArray consumers;
+                    ((CWSOviServiceSession*)sessions[0])->Consumers(consumers);
+                    TInt count = consumers.Count();
+                    consumers.Reset();
+                    consumers.Close();
+                    sessions.Reset();
+                    sessions.Close();
+                    if (count)
+                        {
+                        CleanupStack::PopAndDestroy(pSession);
+                        return KErrInUse;
+                        }
+                    }
+                retval = iHandlerContext.GetSenCoreServiceManager()->RemoveServiceDescriptionL(*pSession);
+                }
+            CleanupStack::PopAndDestroy(pSession);
+            }
+        }
+
+    return retval;
+    }    
+
+//---------------------------------------------------------------------------
+// Register specific description (Auth contract)
+//---------------------------------------------------------------------------
+//    
+TInt CWSOviRegisterHandler::RegisterAuthClientL(
+                                MSenServiceDescription *aServiceDescription)
+    {
+    TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CWSOviRegisterHandler::RegisterNAUTHClientL");
+    
+    TPtrC8 endpoint = aServiceDescription->Endpoint();
+    TInt retval = KErrNone;
+    CWSOviServiceSession* pSession = NULL;
+    CWSOviOAuthClient* pAuthClient = NULL;
+
+    if(aServiceDescription->DescriptionClassType() ==
+                MSenServiceDescription::EOviOAuthClient)
+        {
+        TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSOviRegisterHandler::RegisterNAUTHClient - This ServiceDescription is already an NAUTH Client")));
+        pAuthClient = (CWSOviOAuthClient*)aServiceDescription;
+        retval = iHandlerContext.GetSenCoreServiceManager()->AddServiceDescriptionL(pAuthClient);
+        }
+    else
+        {
+        // Create new auth client and initialize
+        // it from given description
+        pSession = CWSOviServiceSession::NewLC(*(CSIF*)iHandlerContext.GetAnyL(HandlerContextKey::KSIF()));
+        retval = pSession->InitializeFromL(*aServiceDescription);
+
+        if(retval != KErrNone)
+            {
+            TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("CWSOviRegisterHandler::RegisterNAUTHClientL failed %d"), retval));
+            CleanupStack::PopAndDestroy(pSession);
+            return retval;
+            }
+        TPtrC8 sessionEndpoint = pSession->Endpoint();
+            TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("CWSOviRegisterHandler::RegisterNAUTHClientL created NAUTH using endpoint:'%S'"), &sessionEndpoint));
+
+        pAuthClient = CWSOviOAuthClient::NewLC(*(CSIF*)iHandlerContext.GetAnyL(HandlerContextKey::KSIF()));	//codescannerwarnings
+        pAuthClient->SetAuthSessionL(pSession);    // pSession will be owned by Auth Client
+        CleanupStack::Pop(pAuthClient);
+        CleanupStack::Pop(pSession);
+        CleanupStack::PushL(pAuthClient);
+
+        retval = iHandlerContext.GetSenCoreServiceManager()->AddServiceDescriptionL(pAuthClient);
+        if(retval != KErrNone)
+            {
+            delete pAuthClient;
+            }
+        CleanupStack::Pop(pAuthClient); 
+        pAuthClient = NULL;
+        }
+    return retval;
+    }
+
+//---------------------------------------------------------------------------
+// Unregister specific description (Auth contract)
+//---------------------------------------------------------------------------
+//    
+
+TInt CWSOviRegisterHandler::UnRegisterAuthClientL(
+                                MSenServiceDescription *aServiceDescription)
+    {
+    TInt retval = KErrNone;
+
+    CWSOviServiceSession* pSession = NULL;
+    CWSOviOAuthClient* pAuthClient = NULL;
+
+    if(aServiceDescription->DescriptionClassType() ==
+                MSenServiceDescription::EOviOAuthClient)
+        {
+        TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CWSOviRegisterHandler::CWSOviRegisterHandler - This ServiceDescription is already an NAUTH Client")));
+        pAuthClient = (CWSOviOAuthClient*)aServiceDescription;
+        retval = iHandlerContext.GetSenCoreServiceManager()->RemoveServiceDescriptionL(*pAuthClient);
+        }
+    else
+        {
+        
+        pSession = CWSOviServiceSession::NewLC(*(CSIF*)iHandlerContext.GetAnyL(HandlerContextKey::KSIF()));
+        retval = pSession->InitializeFromL(*aServiceDescription);
+        if(retval != KErrNone)
+            {
+            CleanupStack::PopAndDestroy(pSession);
+            return retval;
+            }
+        pAuthClient = CWSOviOAuthClient::NewLC(*(CSIF*)iHandlerContext.GetAnyL(HandlerContextKey::KSIF));	
+        pAuthClient->SetAuthSessionL(pSession);    // pSession will be owned by Auth Client
+        CleanupStack::Pop(pAuthClient);
+        CleanupStack::Pop(pSession);
+        CleanupStack::PushL(pAuthClient);
+
+        retval = iHandlerContext.GetSenCoreServiceManager()->RemoveServiceDescriptionL(*pAuthClient);
+        CleanupStack::PopAndDestroy(pAuthClient);
+        }
+
+    return retval;
+    }    
+    
+//---------------------------------------------------------------------------
+// Logger using during DEBUG mode
+//---------------------------------------------------------------------------
+//    
+
+TInt CWSOviRegisterHandler::InitL(MSenHandlerContext& aCtx)
+    {
+    iHandlerContext = aCtx;
+    return KErrNone;
+    }
+    
+// END OF FILE
+