devsoundextensions/ciextnfactoryplugins/ciextnserverplugin/src/ciextnserverplugin.cpp
author hgs
Wed, 13 Oct 2010 12:45:32 +0100
changeset 2 5c1df44f2eed
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk42_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
* Copyright (c) 2002-2008 Nokia Corporation and/or its subsidiary(-ies). 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
* All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
* Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
* Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
* Description:   Class definition of plugin implementing devsound server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
*                side custom interface extension.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
// Include files
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
#include "ciextnserverplugin.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
#include "citraces.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
#include <ecom.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
#include <mmf/common/mmfcontrollerpluginresolver.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
#include <cimsghndlrintfc.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
#include <cimsghndlrintfc.hrh>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
#include <e32const.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
// Constructs and returns an application object.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
MDevSoundCIServerExtension* CCIExtnServerPlugin::NewL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
    DEB_TRACE0(_L("*CI* CCIExtnServerPlugin::NewL")); 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
    CCIExtnServerPlugin* self = new (ELeave)CCIExtnServerPlugin;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
    CleanupStack::PushL( self );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
    self->ConstructL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
    CleanupStack::Pop( self );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
    MDevSoundCIServerExtension* ptr = static_cast<MDevSoundCIServerExtension*>(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
    return ptr;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
// Destructor
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
CCIExtnServerPlugin::~CCIExtnServerPlugin()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
    DEB_TRACE0(_L("*CI* CCIExtnServerPlugin::~CCIExtnServerPlugin")); 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
// Called by framework when plugin is constructed
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
TInt CCIExtnServerPlugin::Setup( MCustomInterface& aInterface )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
    DEB_TRACE0(_L("*CI* CCIExtnServerPlugin::Setup"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
    TInt status(KErrNone);
2
5c1df44f2eed 2010wk42_01
hgs
parents: 0
diff changeset
    62
    iMCustomInterface = &aInterface;
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
    TRAP_IGNORE(InitializeMsgHndlrPluginsL());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
    return status;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
// Called by framework forwarding passing aMessage to handle
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
TInt CCIExtnServerPlugin::HandleMessageL(const RMmfIpcMessage& aMessage)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
    DEB_TRACE0(_L("*CI* CCIExtnServerPlugin::HandleMessageL"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
    TInt status(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
    // Forward request to each message handler plugin in the list,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
    TBool msgHandled(EFalse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
    for ( TInt index = 0; index < iMCIMsgHndlrIntfcList.Count(); index++ )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
        msgHandled = iMCIMsgHndlrIntfcList[index]->HandleMessage( aMessage );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
        // If the plugin handled aMessage, stop forwarding the request to
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
        // other plugins in the list and break out of loop.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
        if ( msgHandled == TBool(ETrue) )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
            status = KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
            break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
    return status;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
// Called by framework when plugin is to be deleted
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
void CCIExtnServerPlugin::Release()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
    DEB_TRACE0(_L("*CI* CCIExtnServerPlugin::Release"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
    for ( TInt index = 0; index < iMCIMsgHndlrIntfcList.Count(); index++ )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
        iMCIMsgHndlrIntfcList[index]->Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
    iMCIMsgHndlrIntfcList.Reset();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
    iMCIMsgHndlrIntfcList.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
    REComSession::DestroyedImplementation(iDestructorKey);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
    delete this;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
// Called by framework after plugin is created
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
void CCIExtnServerPlugin::PassDestructorKey( TUid aDestructorKey )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
    iDestructorKey = aDestructorKey;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
// Constructor
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
CCIExtnServerPlugin::CCIExtnServerPlugin()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
    // No impl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
// Second phase constructor.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
void CCIExtnServerPlugin::ConstructL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
    // No impl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
// Initializes factory plugins list.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
// ---------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
void CCIExtnServerPlugin::InitializeMsgHndlrPluginsL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
    // 1. Query the implementation ids of plugins implementing
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
    //    KUidCIMsgHndlrIntfcInterface
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
    // 2. Instantiate it and add it to the list of plugins
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
    DEB_TRACE0(_L("*CI* CCIExtnServerPlugin::InitializeMsgHndlrPluginsL"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
    iMCIMsgHndlrIntfcList.Reset();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
    RImplInfoPtrArray msgHndlrEComUids;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
    CleanupResetAndDestroyPushL(msgHndlrEComUids);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
    // List all the factory plugins
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
    TUid msgHndlrPluginInterfaceUid = {KUidCIMsgHndlrIntfcInterface};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
    TEComResolverParams resParams;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
    REComSession::ListImplementationsL( msgHndlrPluginInterfaceUid, resParams, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
                                        KRomOnlyResolverUid, msgHndlrEComUids );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
    // Instantiate and add it to the list of factories
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
    TUid destructorKey;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
    MCIMsgHndlrIntfc* msgHndlrPlugin(NULL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
    TInt status(KErrNone);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
    for ( TInt index = 0; index < msgHndlrEComUids.Count(); index++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
        TRAP( status ,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
                msgHndlrPlugin = static_cast<MCIMsgHndlrIntfc*>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
                                    (REComSession::CreateImplementationL(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
                                            msgHndlrEComUids[index]->ImplementationUid(),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
                                            destructorKey ) ) );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
        // If there was problem instantiating factory plugin, continue trying
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
        // next one.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
        if ( status != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
            DEB_TRACE1(_L("*CI* CCIExtnServerPlugin::InitializeMsgHndlrPluginsL creation status=%d"),status);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
            continue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
        // Initialize the factory plugin
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
        if ( msgHndlrPlugin->Initialize( *iMCustomInterface, destructorKey ) == KErrNone )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
            status = iMCIMsgHndlrIntfcList.Append(msgHndlrPlugin);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
            if ( status != KErrNone )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
                {// There was problem adding plugin to list, there was a system
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
                 // wide error. Stop trying and return error code.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
                msgHndlrPlugin->Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
                User::Leave( status );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
                }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
        else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
            {// There was problem initializing the factory plugin instance, close
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
             // it and continue instantiating the rest
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
            msgHndlrPlugin->Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
    CleanupStack::PopAndDestroy(&msgHndlrEComUids);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
    }