phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewActivator.cpp
changeset 0 e686773b3f54
child 58 d4f567ce2e7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewActivator.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,375 @@
+/*
+* Copyright (c) 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: 
+*       View activator - activates a tab view upon client request
+*
+*/
+
+
+// INCLUDE FILES
+#include "CxSPViewActivator.h"
+#include <CxSPViewData.h>
+#include "CxSPViewInfo.h"
+
+
+// System includes
+#include <aknViewAppUi.h>
+
+// Unnamed namespace for local definitions
+namespace
+    {
+    const TInt KDesAddressParam = 2; // Des address is in param ix 2
+    _LIT( KPanicText, "xSPViewActivator" );
+    
+    enum TPanicCode
+        {
+        EBadDescriptorLength,
+        EBadDescriptor
+        };
+    } // namespace
+
+// ================= MEMBER FUNCTIONS =======================
+
+CxSPViewActivator* CxSPViewActivator::NewL(CxSPViewIdChanger* aViewIdChanger)
+    {
+    CxSPViewActivator* self = new(ELeave) CxSPViewActivator(aViewIdChanger);
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();    // self
+
+    return self;
+    }
+
+CxSPViewActivator::CxSPViewActivator(CxSPViewIdChanger* aViewIdChanger) : 
+                                                CServer2(EPriorityStandard)
+    {
+    iViewIdChanger = aViewIdChanger;
+    }
+
+void CxSPViewActivator::ConstructL()
+    {
+    StartL(KxSPServer);
+    }
+
+CxSPViewActivator::~CxSPViewActivator()
+    {
+    }
+
+CSession2* CxSPViewActivator::NewSessionL(const TVersion& aVersion, const RMessage2&) const
+    {
+    TBool supported = User::QueryVersionSupported(TVersion(KxSPViewServerMajor,
+                                                    KxSPViewServerMinor,
+                                                    KxSPViewServerBuild),
+                                                    aVersion);
+    if(!supported)
+        {
+        User::Leave(KErrNotSupported);
+        }
+
+    return new (ELeave) CxSPViewActivatorSession();
+    }
+
+void CxSPViewActivator::ActivateView1L(const RMessage2 &aMessage)
+    {
+    TUint32 ecomID = aMessage.Int0();
+    TUint32 viewID = aMessage.Int1();
+
+    TInt err = KErrNone;
+    TInt newViewId;
+    if(ecomID)
+        {
+        err = iViewIdChanger->GetNewView(ecomID, viewID, newViewId);
+        }
+    else
+        {
+        newViewId = viewID;
+        }
+
+    aMessage.Complete(err);
+
+    if(err == KErrNone)
+        {
+        // Activate the view
+        static_cast<CAknViewAppUi*>(CCoeEnv::Static()->AppUi())->ActivateLocalViewL(
+                                                                TUid::Uid((TInt)newViewId));
+        }
+
+    return;
+    }
+
+void CxSPViewActivator::ActivateView2L(const RMessage2 &aMessage)
+    {
+    TInt err = KErrNone;
+
+    TUint32 ecomID = aMessage.Int0();
+    TUint32 viewID = aMessage.Int1();
+    TInt desLen = aMessage.GetDesLength(KDesAddressParam);
+    if( desLen <= 0 )
+        {
+        aMessage.Panic( KPanicText, EBadDescriptorLength );
+        }
+    else
+        {
+        HBufC8* paramBuf = HBufC8::NewL(desLen);
+        CleanupStack::PushL(paramBuf);
+        TPtr8 ptr = paramBuf->Des();
+        aMessage.ReadL(KDesAddressParam, ptr);
+    
+        TInt newViewId;
+        if(ecomID)
+            {
+            err = iViewIdChanger->GetNewView(ecomID, viewID, newViewId);
+            }
+        else
+            {
+            newViewId = viewID;
+            }
+    
+        aMessage.Complete(err);
+    
+        if(err == KErrNone)
+            {
+            // Make view id
+            const TVwsViewId viewId(TUid::Uid(KUid), TUid::Uid(newViewId));
+            // Activate the view
+            static_cast<CAknViewAppUi*>(CCoeEnv::Static()->AppUi())->ActivateViewL(
+                                                        viewId, CPbk2ViewState::Uid(), *paramBuf);
+            }
+    
+        CleanupStack::PopAndDestroy();  // paramBuf;
+        }
+    }
+
+void CxSPViewActivator::ActivateView2AsyncL(const RMessage2 &aMessage)
+    {
+    TInt err = KErrNone;
+
+    TUint32 ecomID = aMessage.Int0();
+    TUint32 viewID = aMessage.Int1();
+    TInt desLen = aMessage.GetDesLength(KDesAddressParam);
+    if( desLen <= 0 )
+        {
+        aMessage.Panic( KPanicText, EBadDescriptorLength );
+        }
+    else
+        {
+        HBufC8* paramBuf = HBufC8::NewL(desLen);
+        CleanupStack::PushL(paramBuf);
+        TPtr8 ptr = paramBuf->Des();
+        aMessage.ReadL(KDesAddressParam, ptr);
+    
+        TInt newViewId;
+        if(ecomID)
+            {
+            err = iViewIdChanger->GetNewView(ecomID, viewID, newViewId);
+            }
+        else
+            {
+            newViewId = viewID;
+            }
+    
+        aMessage.Complete(err);
+    
+        if(err == KErrNone)
+            {
+            // Make view id
+            const TVwsViewId viewId(TUid::Uid(KUid), TUid::Uid(newViewId));
+            // Activate the view
+            static_cast<CAknViewAppUi*>(CCoeEnv::Static()->AppUi())->ActivateViewL(
+                                                        viewId, CPbk2ViewState::Uid(), *paramBuf);
+            }
+    
+        CleanupStack::PopAndDestroy();  // paramBuf;
+        }
+
+    }
+    
+void CxSPViewActivator::GetViewCountL(const RMessage2 &aMessage)
+    {
+    TInt tabsCount;
+    TInt dummy;
+    iViewIdChanger->GetViewCount( tabsCount, dummy );   
+    TPckgC<TInt> tabsCountDes( tabsCount );
+    TRAPD( err, aMessage.WriteL( 0, tabsCountDes ) );
+    if( err != KErrNone )
+        {
+        aMessage.Panic( KPanicText, EBadDescriptor );
+        User::Leave( err );
+        }
+    else
+        {
+        aMessage.Complete( KErrNone );
+        }
+    }
+        
+void CxSPViewActivator::GetViewDataPackLengthL(const RMessage2 &aMessage)
+    {
+    TInt index = aMessage.Int0();
+    TInt tabsCount;
+    TInt dummy;
+    iViewIdChanger->GetViewCount( tabsCount, dummy );
+    if( index < 0 )
+        {
+        aMessage.Complete( KErrUnderflow );
+        }
+    else if( index >= tabsCount )
+        {
+        aMessage.Complete( KErrOverflow );
+        }
+    else
+        {
+        RPointerArray<CxSPViewInfo> infoArray;
+        CleanupClosePushL( infoArray );
+        iViewIdChanger->GetTabViewInfoL( infoArray );
+        const CxSPViewInfo& info = *infoArray[index];
+        CxSPViewData* viewData = CxSPViewData::NewL();
+        CleanupStack::PushL( viewData );
+        viewData->SetEComId( info.Id() );
+        viewData->SetOriginalViewId( info.OldViewId() );
+        viewData->SetIconId( info.SortIconId() );
+        viewData->SetMaskId( info.SortMaskId() );
+        viewData->SetIconFileL( info.SortIconFile() );
+        viewData->SetViewNameL( info.Name() );
+        HBufC8* packed = viewData->PackL();
+        TInt length = packed->Length();
+        delete packed;                      
+        CleanupStack::PopAndDestroy(); // viewData
+        CleanupStack::PopAndDestroy(); // infoArray     
+        TPckgC<TInt> lengthDes( length );
+        TRAPD( err, aMessage.WriteL( 1, lengthDes ) );
+        if( err != KErrNone )
+            {
+            aMessage.Panic( KPanicText, EBadDescriptor );
+            User::Leave( err );
+            }
+        else
+            {
+            aMessage.Complete( KErrNone );
+            }
+        }   
+    }
+        
+void CxSPViewActivator::GetViewDataL(const RMessage2 &aMessage)
+    {
+    TInt index = aMessage.Int0();
+    TInt tabsCount;
+    TInt dummy;
+    iViewIdChanger->GetViewCount( tabsCount, dummy );
+    if( index < 0 )
+        {
+        aMessage.Complete( KErrUnderflow );
+        }
+    else if( index >= tabsCount )
+        {
+        aMessage.Complete( KErrOverflow );
+        }
+    else
+        {
+        RPointerArray<CxSPViewInfo> infoArray;
+        CleanupClosePushL( infoArray );
+        iViewIdChanger->GetTabViewInfoL( infoArray );
+        const CxSPViewInfo& info = *infoArray[index];
+        CxSPViewData* viewData = CxSPViewData::NewL();
+        CleanupStack::PushL( viewData );
+        viewData->SetEComId( info.Id() );
+        viewData->SetOriginalViewId( info.OldViewId() );
+        viewData->SetIconId( info.SortIconId() );
+        viewData->SetMaskId( info.SortMaskId() );
+        viewData->SetIconFileL( info.SortIconFile() );
+        viewData->SetViewNameL( info.Name() );
+        HBufC8* packed = viewData->PackL();
+        CleanupStack::PushL( packed );      
+        TRAPD( err, aMessage.WriteL( 1, *packed ) );
+        if( err != KErrNone )
+            {
+            aMessage.Panic( KPanicText, EBadDescriptor );
+            User::Leave( err );
+            }
+        else
+            {
+            aMessage.Complete( KErrNone );
+            }
+        CleanupStack::PopAndDestroy(); // packed                    
+        CleanupStack::PopAndDestroy(); // viewData
+        CleanupStack::PopAndDestroy(); // infoArray     
+        }   
+    }
+           
+void CxSPViewActivator::StartL(const TDesC &aName)
+    {
+    CServer2::StartL(aName);
+
+    RSemaphore semaphore;
+    if(semaphore.OpenGlobal(KxSPServer) == KErrNone)
+        {
+        semaphore.Signal();
+        semaphore.Close();
+        }
+    }
+
+void CxSPViewActivatorSession::ServiceL(const RMessage2 &aMessage)
+    {
+    // There are currently separate synchronous and asynchronous op codes for
+    // some of the services. The server side implementation is however
+    // synchronous and the opcodes are handled similarily whenever possible.
+    // For example EGetViewCount and EGetViewCountAsync are treated identically
+    // and the corresponding async cancel operation (ECancelGetViewCountAsync)
+    // does nothing and completes immediately.
+
+    switch(aMessage.Function())
+        {
+        case EActivateView1:
+            ((CxSPViewActivator*)Server())->ActivateView1L(aMessage);
+            break;
+        case EActivateView2:
+            ((CxSPViewActivator*)Server())->ActivateView2L(aMessage);
+            break;
+        case EActivateView2Async:
+            ((CxSPViewActivator*)Server())->ActivateView2AsyncL( aMessage );
+            break;            
+        case EGetViewCount: // FALLTHROUGH
+        case EGetViewCountAsync:
+            ((CxSPViewActivator*)Server())->GetViewCountL(aMessage);
+            break;
+        case ECancelGetViewCountAsync:
+            aMessage.Complete( KErrNone );
+            break;
+        case EGetViewDataPackLength:
+            ((CxSPViewActivator*)Server())->GetViewDataPackLengthL(aMessage);
+            break;
+        case EGetViewDataPackLengthAsync:
+            ((CxSPViewActivator*)Server())->GetViewDataPackLengthL( aMessage );
+            break;
+        case ECancelGetViewDataPackLengthAsync:
+            aMessage.Complete( KErrNone );               
+            break;                                                                            
+        case EGetViewData:
+            ((CxSPViewActivator*)Server())->GetViewDataL(aMessage);
+            break;
+        case EGetViewDataAsync:
+            ((CxSPViewActivator*)Server())->GetViewDataL( aMessage );
+            break;
+        case ECancelActivateView2Async:
+            aMessage.Complete( KErrNone );
+            break;
+        case ECancelGetViewDataAsync:
+            aMessage.Complete( KErrNone );
+            break;
+        default:
+            aMessage.Complete(KErrNotSupported);
+        }
+    }
+        
+// End of file.