ximpfw/core/srcdatamodel/ximpfeaturepluginholder.cpp
author hgs
Wed, 03 Nov 2010 22:25:05 +0530
changeset 52 3d676fce9a4e
parent 51 61fad867f68e
permissions -rw-r--r--
201044_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  Presence Service Connection globals holder
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <e32base.h>
hgs
parents:
diff changeset
    20
#include "ximpfeaturepluginholder.h"
hgs
parents:
diff changeset
    21
#include "apidataobjfactoryaccessor.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
const TInt KPluginArrayGranularity = 3;
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// ============================ HELPER CLASS ===============================
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/**
hgs
parents:
diff changeset
    29
 * Nested structure to hold global accessor objects.
hgs
parents:
diff changeset
    30
 */
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// FIXME: probably better would be to encapsulate the struct to CBase object
hgs
parents:
diff changeset
    33
NONSHARABLE_STRUCT( SAccessorHolder )
hgs
parents:
diff changeset
    34
    {
hgs
parents:
diff changeset
    35
    /**
hgs
parents:
diff changeset
    36
     * Presence obj factory accessor
hgs
parents:
diff changeset
    37
     * Owned.
hgs
parents:
diff changeset
    38
     */
hgs
parents:
diff changeset
    39
    MApiDataObjFactoryAccessor* iPresenceAccessor;
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
    // array of accessor plugins 
hgs
parents:
diff changeset
    43
    CArrayFixFlat<MApiDataObjFactoryAccessor*>* iAccessorPlugins;
hgs
parents:
diff changeset
    44
    
hgs
parents:
diff changeset
    45
    /**
hgs
parents:
diff changeset
    46
     * TODO: Add here more accessors
hgs
parents:
diff changeset
    47
     */
hgs
parents:
diff changeset
    48
     
hgs
parents:
diff changeset
    49
    /**
hgs
parents:
diff changeset
    50
     * Reference counter
hgs
parents:
diff changeset
    51
     */
hgs
parents:
diff changeset
    52
    TInt iRefCount;
hgs
parents:
diff changeset
    53
    };
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
// ============================ MEMBER FUNCTIONS ===============================
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
//
hgs
parents:
diff changeset
    59
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
//
hgs
parents:
diff changeset
    61
EXPORT_C void FeaturePluginHolder::InitializeL( )
hgs
parents:
diff changeset
    62
    {
hgs
parents:
diff changeset
    63
    SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls();
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
    if( !singleton )
hgs
parents:
diff changeset
    66
        {
hgs
parents:
diff changeset
    67
        singleton = new ( ELeave ) SAccessorHolder;
hgs
parents:
diff changeset
    68
        Dll::SetTls( singleton );
hgs
parents:
diff changeset
    69
        
hgs
parents:
diff changeset
    70
        // Initialize the variables
hgs
parents:
diff changeset
    71
        singleton->iRefCount = 0;
hgs
parents:
diff changeset
    72
        singleton->iPresenceAccessor = NULL;
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
        TRAP_IGNORE( singleton->iPresenceAccessor = MApiDataObjFactoryAccessor::NewPresenceAccessorL( ) );
hgs
parents:
diff changeset
    75
        
hgs
parents:
diff changeset
    76
        //added to hold accessor plugins
hgs
parents:
diff changeset
    77
        singleton->iAccessorPlugins = new(ELeave)CArrayFixFlat<MApiDataObjFactoryAccessor*>(KPluginArrayGranularity);
hgs
parents:
diff changeset
    78
        
hgs
parents:
diff changeset
    79
        FeaturePluginHolder::LoadAccessorPluginsL() ;
hgs
parents:
diff changeset
    80
        }
hgs
parents:
diff changeset
    81
    else
hgs
parents:
diff changeset
    82
        {
hgs
parents:
diff changeset
    83
        // increase the reference counter
hgs
parents:
diff changeset
    84
        singleton->iRefCount++;
hgs
parents:
diff changeset
    85
        }
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    89
// 
hgs
parents:
diff changeset
    90
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    91
//
hgs
parents:
diff changeset
    92
EXPORT_C MApiDataObjFactoryAccessor* FeaturePluginHolder::PresenceObjFactoryAccessor()
hgs
parents:
diff changeset
    93
    {
hgs
parents:
diff changeset
    94
    SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls();
hgs
parents:
diff changeset
    95
    if( !singleton )
hgs
parents:
diff changeset
    96
        {
hgs
parents:
diff changeset
    97
        User::Panic( _L("cximpglobals"), KErrNotFound );
hgs
parents:
diff changeset
    98
        }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
    return singleton->iPresenceAccessor;
hgs
parents:
diff changeset
   101
    }
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   105
// FeaturePluginHolder::Release()
hgs
parents:
diff changeset
   106
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   107
//
hgs
parents:
diff changeset
   108
EXPORT_C void FeaturePluginHolder::Release( )
hgs
parents:
diff changeset
   109
    {
hgs
parents:
diff changeset
   110
    SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls();
hgs
parents:
diff changeset
   111
    if ( !singleton->iRefCount )
hgs
parents:
diff changeset
   112
        {
hgs
parents:
diff changeset
   113
        // No more users, clean the TLS up
hgs
parents:
diff changeset
   114
        delete singleton->iPresenceAccessor;
hgs
parents:
diff changeset
   115
        if ( singleton->iAccessorPlugins )
hgs
parents:
diff changeset
   116
	    	{
hgs
parents:
diff changeset
   117
	    	TInt idx = KErrNotFound;
hgs
parents:
diff changeset
   118
	    	while( singleton->iAccessorPlugins->Count() )
hgs
parents:
diff changeset
   119
	        	{
hgs
parents:
diff changeset
   120
		        idx = singleton->iAccessorPlugins->Count() - 1;
hgs
parents:
diff changeset
   121
		        // Delete object
hgs
parents:
diff changeset
   122
		        delete singleton->iAccessorPlugins->At( idx );
hgs
parents:
diff changeset
   123
		        // Delete element
hgs
parents:
diff changeset
   124
		        singleton->iAccessorPlugins->Delete( idx );
hgs
parents:
diff changeset
   125
	        	}
hgs
parents:
diff changeset
   126
	    	}	
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
        delete singleton->iAccessorPlugins;
hgs
parents:
diff changeset
   129
        REComSession::FinalClose();
hgs
parents:
diff changeset
   130
        
hgs
parents:
diff changeset
   131
        delete singleton;
hgs
parents:
diff changeset
   132
        Dll::SetTls(NULL);
hgs
parents:
diff changeset
   133
        }
hgs
parents:
diff changeset
   134
    else
hgs
parents:
diff changeset
   135
        {
hgs
parents:
diff changeset
   136
        singleton->iRefCount--;        
hgs
parents:
diff changeset
   137
        }
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
    
hgs
parents:
diff changeset
   140
void FeaturePluginHolder::LoadAccessorPluginsL()    
hgs
parents:
diff changeset
   141
{
hgs
parents:
diff changeset
   142
	SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls();
hgs
parents:
diff changeset
   143
	if(!singleton)	
hgs
parents:
diff changeset
   144
	{
hgs
parents:
diff changeset
   145
		User::Panic( _L("cximpglobals"), KErrNotFound );
hgs
parents:
diff changeset
   146
	}
hgs
parents:
diff changeset
   147
	else
hgs
parents:
diff changeset
   148
	{
hgs
parents:
diff changeset
   149
		RImplInfoPtrArray pluginArray;	
hgs
parents:
diff changeset
   150
		MApiDataObjFactoryAccessor::ListAllImplementationsL(pluginArray) ;		
hgs
parents:
diff changeset
   151
		if ( pluginArray.Count() )
hgs
parents:
diff changeset
   152
		{
hgs
parents:
diff changeset
   153
			for( TInt i = 0; i < pluginArray.Count(); i++ )
hgs
parents:
diff changeset
   154
			{
hgs
parents:
diff changeset
   155
				MApiDataObjFactoryAccessor* implementation = NULL ;
hgs
parents:
diff changeset
   156
				
hgs
parents:
diff changeset
   157
				CImplementationInformation* info = pluginArray[ i ];
hgs
parents:
diff changeset
   158
            
hgs
parents:
diff changeset
   159
            	TUid id = info->ImplementationUid();
hgs
parents:
diff changeset
   160
            	TRAPD(err, implementation = MApiDataObjFactoryAccessor::NewL(id) );
hgs
parents:
diff changeset
   161
            	CleanupStack::PushL(implementation);
hgs
parents:
diff changeset
   162
            	if(err == KErrNone)
hgs
parents:
diff changeset
   163
            	{
hgs
parents:
diff changeset
   164
            		singleton->iAccessorPlugins->AppendL( implementation );
hgs
parents:
diff changeset
   165
            	}
hgs
parents:
diff changeset
   166
            	CleanupStack::Pop(implementation);
hgs
parents:
diff changeset
   167
			}
hgs
parents:
diff changeset
   168
		}
hgs
parents:
diff changeset
   169
		pluginArray.ResetAndDestroy();
hgs
parents:
diff changeset
   170
	}
hgs
parents:
diff changeset
   171
}
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
EXPORT_C TInt FeaturePluginHolder::AccessorCount()
hgs
parents:
diff changeset
   174
{
hgs
parents:
diff changeset
   175
	SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls();
hgs
parents:
diff changeset
   176
	if(!singleton)	
hgs
parents:
diff changeset
   177
	{
hgs
parents:
diff changeset
   178
		User::Panic( _L("cximpglobals"), KErrNotFound );
hgs
parents:
diff changeset
   179
	}
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
	return singleton->iAccessorPlugins->Count() ;	
hgs
parents:
diff changeset
   182
	
hgs
parents:
diff changeset
   183
}
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
EXPORT_C MApiDataObjFactoryAccessor* FeaturePluginHolder::Accessor(TInt index) 
hgs
parents:
diff changeset
   186
{
hgs
parents:
diff changeset
   187
	SAccessorHolder* singleton = ( SAccessorHolder* ) Dll::Tls();
hgs
parents:
diff changeset
   188
	if(!singleton)	
hgs
parents:
diff changeset
   189
	{
hgs
parents:
diff changeset
   190
		User::Panic( _L("cximpglobals"), KErrNotFound );
hgs
parents:
diff changeset
   191
	}
hgs
parents:
diff changeset
   192
	
hgs
parents:
diff changeset
   193
	return singleton->iAccessorPlugins->At(index) ;
hgs
parents:
diff changeset
   194
}
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
// End of file
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198