ipcm_plat/bearer_settings_plugin_api/inc/cmpluginbaseeng.h
branchRCL_3
changeset 58 83ca720e2b9a
parent 57 05bc53fe583b
--- a/ipcm_plat/bearer_settings_plugin_api/inc/cmpluginbaseeng.h	Tue Aug 31 15:35:44 2010 +0300
+++ b/ipcm_plat/bearer_settings_plugin_api/inc/cmpluginbaseeng.h	Wed Sep 01 12:23:51 2010 +0100
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
+* 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"
@@ -11,8 +11,7 @@
 *
 * Contributors:
 *
-* Description:
-* IF implementation class for connection method plugins.
+* Description:  IF implementation class for connection method plugins.
 *
 */
 
@@ -24,28 +23,14 @@
 
 #include <e32std.h>
 #include <e32base.h>
-#include <ecom/ecom.h>
+#include <ecom/ecom.h>        // For REComSession
 #include <metadatabase.h>
 #include <commsdattypesv1_1.h>
-#include <cmmanagerdef.h>
 
-
-/**
- * Macro for getting element id from Iap Id.
- * @param iapRecId Record id of an Iap.
- */
 #define IAP_ELEMENT_ID( iapRecId )  (KCDTIdIAPRecord | \
                                      KCDMaskShowFieldType | \
                                      (iapRecId << 8))
 
-/**
- * Macros for getting/setting diffrerent type of values from/to the records(CommsDat)
- * @param record Pointer to the record which has the field requested/to be set.
- * @param fieldId Id of the field to get/set the value.
- * @param ***Val Value to be set.
- * @return Returns the requested value in get operation.
- */
-
 #define QUERY_HBUFC_FIELD( record, fieldId ) *STATIC_CAST(CommsDat::CMDBField<HBufC*>*, record->GetFieldByIdL( fieldId ))
 #define QUERY_UINT32_FIELD( record, fieldId ) *STATIC_CAST(CommsDat::CMDBField<TUint32>*, record->GetFieldByIdL( fieldId ))
 #define QUERY_INT_FIELD( record, fieldId ) *STATIC_CAST(CommsDat::CMDBField<TInt>*, record->GetFieldByIdL( fieldId ))
@@ -56,23 +41,11 @@
 
 // CONSTANTS
 const TInt32 KExtensionBaseLevel = 1;
-const TUint32 KMaxProxyServerNameLength = 1024;
+const TUint32 KDefAttrsArrayGranSize = 32;
+const TUint32 KMaxProxyServerNameLength = 1000;
 
 const TUint32 KDummyBearerType = 1;
 
-/**
- * Record indexes for generic iap records in the Client instance table.
- */
-const TInt KIapRecordIndex = 0;         // Mandatory record
-const TInt KServiceRecordIndex = 1;     // Mandatory record
-const TInt KNetworkRecordIndex = 2;     // Mandatory record
-const TInt KWAPAPRecordIndex = 3;       // Mandatory record
-const TInt KWAPBearerRecordIndex = 4;   // Mandatory record
-const TInt KMetaDataRecordIndex = 5;    // Mandatory record
-const TInt KLocationRecordIndex = 6;    // Optional record
-const TInt KProxyRecordIndex = 7;       // Mandatory record (flag in record tells if in use)
-
-
 // DATA TYPES
 typedef enum
     {
@@ -80,8 +53,8 @@
     ECmInt,
     ECmText,
     ECmText8
-    } TCMFieldTypes;
-
+    }TCMFieldTypes;
+    
 // Attributes that are related to bearer plugin creation
 enum TBearerCreationCommonAttributes
     {
@@ -90,851 +63,976 @@
                                                 * bearer creation related
                                                 * attributes
                                                 */
-
+    
     ECmExtensionLevel,          /**<
-                                * Return the extension level of the given
+                                * Return the extension level of the given 
                                 * bearer type. 1 means the level 1st.
                                 * (TUint32 - default: none - read only)
                                 */
-
+    
     ECmBearerCreationCommonAttributesEnd = 9999 /**<
                                                 * Marks the end of bearer
                                                 * creation related attributes
                                                 */
     };
 
+class CCmPluginBaseEng;
+class CCmPluginBase;
+
 /**
- * Flags for Iap metadata to indicate:
- * EMetaHighlight: If it's set it indicates that a connection method is
- *                 highlighted in Agent dialog. Only one connection
- *                 method can have this flag set.
- * EMetaHiddenAgent: If it's set it indicates that an connection method is
- *                   hidden connection method in Agent dialog.
- * EMetaHotSpot: If it's set it indicates that an connection method is
- *               HotSpot connection method.
- */
+* Validation function called before data is stored.
+* @param aThis 'this' pointer of the plugin instance
+* @param aAttribute attribute to be set
+* @param aValue value to be checked
+* @return ETrue if value is stored.
+*/
+typedef TBool (*TValidationFunctionL)( CCmPluginBaseEng* aThis,
+                                      TUint32 aAttribute,
+                                      const TAny* aValue );
+
+/**
+* Structure of conversion table between CM attributes and
+* CommsDat ids. The first element must indicate the 
+* range of the conversion table. iAttribId is the lowest Id, 
+* iCommsDatId is the highest one. The last element is a
+* terminator. e.g. Proxy table:
+* static const TCmAttribConvTable SProxyConvTbl[] = 
+*   {
+        { ECMProxyUsageEnabled, ECMProxyRangeMax, NULL }
+        { ECMProxyUseProxyServer, KCDTIdUseProxyServer, NULL },
+        { ECmProxyPortNumber, KCDTIdPortNumber, &CheckPortNumberValidityL },
+        ...
+        { 0, 0 }
+    }
+*/
+typedef struct
+    {
+    TInt    iAttribId;
+    TInt    iCommsDatId;
+    TValidationFunctionL iValidFuncL;
+    TInt    iTitleId;
+    TInt    iMaxLength;
+    TUint32 iAttribFlags;   // see TCmConvAttribFlags
+    TInt    iDefSettingResId;
+    TInt    iEditorResId;
+    TInt    iDefValueResId;
+    TAny*   iNotUsed1;
+    TAny*   iNotUsed2;
+    }TCmAttribConvTable;
+    
+enum TCmConvAttribFlags
+    {
+    EConvNoZeroLength   = 0x00000001,   // Zero length NOT acceptable
+    EConvCompulsory     = 0x00000002,
+    EConv8Bits          = 0x00000004,
+    EConvReadOnly       = 0x00000008,
+    EConvNumber         = 0x00000010,
+    EConvIPv4           = 0x00000020,
+    EConvIPv6           = 0x00000040,
+    EConvPassword       = 0x00000080,
+    };
+
+typedef struct
+    {
+    CommsDat::CCDRecordBase*      *iRecord;
+    TBool*              iEnabled;
+    const TCmAttribConvTable* iConvTable;
+    }TCmAttrConvArrayItem;
+
+typedef struct
+    {
+    TInt                iAttribId;
+    TInt                iCommonAttribId;
+    }TCmCommonAttrConvArrayItem;
+    
 enum TCmMetaDataFields
     {
     EMetaHighlight    = 0x00000001,
-    EMetaHiddenAgent  = 0x00000002,
-    EMetaHotSpot      = 0x00000004
+    EMetaHiddenAgent  = 0x00000002
     };
+    
+// FUNCTION PROTOTYPES
+
+/**
+* TValidationFunctionL functions.
+*/
+
+/**
+* Function should be called if client tries to set attribute that is read-only
+* @param aThis 'this' pointer of the plugin instance
+* @param aAttribute not used
+* @param aValue not used
+* @leave KErrNotSupported in every cases
+*/
+IMPORT_C TBool ReadOnlyAttributeL( CCmPluginBaseEng* aThis, 
+                                  TUint32 aAttribute, 
+                                  const TAny* aValue );
+
+/**
+* Function to check if the passed IPv4 address is valid.
+* @param aThis 'this' pointer of the plugin instance
+* @param aAttribute attribute client wants to set
+* @param aValue TDesC* IPv4 address buffer to be checked
+*/
+IMPORT_C TBool CheckIPv4ValidityL( CCmPluginBaseEng* aThis, 
+                                  TUint32 aAttribute, 
+                                  const TAny* aValue );
+
+/**
+* Function to check if the passed IPv6 address is valid.
+* @param aThis 'this' pointer of the plugin instance
+* @param aAttribute attribute client wants to set
+* @param aValue TDesC* IPv6 address buffer to be checked
+*/
+IMPORT_C TBool CheckIPv6ValidityL( CCmPluginBaseEng* aThis, 
+                                  TUint32 aAttribute, 
+                                  const TAny* aValue );
+
+/**
+* Function to check if the passed port number is valid.
+* @param aThis 'this' pointer of the plugin instance
+* @param aAttribute attribute client wants to set
+* @param aValue TUint32 the port number to be check
+*/
+IMPORT_C TBool CheckPortNumberValidityL( CCmPluginBaseEng* aThis, 
+                                        TUint32 aAttribute, 
+                                        const TAny* aValue );
+
+/**
+* Function to check if the passed record is valid.
+* @param aThis 'this' pointer of the plugin instance
+* @param aAttribute attribute client wants to set
+* @param aValue TUint32 the record id to be checked
+*/
+IMPORT_C TBool CheckRecordIdValidityL( CCmPluginBaseEng* aThis, 
+                                      TUint32 aAttribute, 
+                                      const TAny* aValue );
+
+/**
+* Function to check if the passed WAPWspOption is valid.
+* @param aThis 'this' pointer of the plugin instance
+* @param aAttribute attribute client wants to set
+* @param TUint32 the WPSOption to be checked
+*/
+IMPORT_C TBool CheckWAPWspOptionValidityL( CCmPluginBaseEng* aThis, 
+                                          TUint32 aAttribute, 
+                                          const TAny* aValue );
+
+/**
+* @param aThis 'this' pointer of the plugin instance
+* @param aAttribute attribute client wants to set
+* @param TUint32 the WPSOption to be checked
+*/
+IMPORT_C TBool SetProxyServerNameL( CCmPluginBaseEng* aThis, 
+                                   TUint32 aAttribute, 
+                                   const TAny* aValue );
+                          
+/**
+* Miscellaneous utility functions.
+*/
+
+/**
+* Check if the passed IP address is '0.0.0.0' or empty string
+* @param aIpAddress IP address to be checked
+*/
+IMPORT_C TBool IsUnspecifiedIPv4Address( const TDesC& aIpv4Address );
+
+/**
+* Check if the passed IP address is one of these:
+* - empty string    -   
+* - '0:0:0:0:0:0:0:0' 
+* - 'fec0:000:0000:ffff::1'
+* - 'fec0:000:0000:ffff::2'
+* @param aIpAddress IP address to be checked
+*/
+IMPORT_C CMManager::TIPv6Types ClassifyIPv6Address( const TDesC& aIpv6Address );
 
 // FORWARD DECLARATIONS
-class CCmPluginBaseEng;
+class CCmDestinationImpl;
+class CCmManagerImpl;
 class CCDIAPMetadataRecord;
-
+class CCmTransactionHandler;
+class CCmPluginBasePrivate;
+        
 // CLASS DECLARATION
-/**
- * Initialisation instance for plugin creation. Used in plugin
- * construction phase.
- */
 NONSHARABLE_CLASS(TCmPluginInitParam)
     {
     public:
-        /**
-         * Constructor.
-         * @param aSessionRef Reference for open Session handle to CommsDat.
-         */
-        IMPORT_C TCmPluginInitParam( CommsDat::CMDBSession& aSessionRef );
-
-    public:
-        /**
-         * Reference to CommsDat session handle.
-         */
-        CommsDat::CMDBSession& iSessionRef;
-
-        /**
-         * Reserved for future.
-         */
-        TAny* iNotused1;
-        TAny* iNotused2;
-    };
-
-// CLASS DECLARATION
-/**
- * This defines the data object used for moving data between
- * cmm server and plugins.
- */
-NONSHARABLE_CLASS( CCmClientPluginInstance ): public CBase
-    {
+    
+        TCmPluginInitParam( CCmManagerImpl& aCmMgr );
+        
     public:
-        /**
-         * Two-phase constructor. Returns pointer to the new
-         * CCmClientPluginInstance object.
-         */
-        IMPORT_C static CCmClientPluginInstance* NewL();
-
-        /**
-         * Two-phase constructor. Returns pointer to the new
-         * CCmClientPluginInstance object.
-         */
-        IMPORT_C static CCmClientPluginInstance* NewLC();
-
-        /**
-         * Destructor
-         */
-        IMPORT_C ~CCmClientPluginInstance();
-
-    private:
-        /**
-         * Default constructor.
-         */
-        CCmClientPluginInstance();
-
-        /**
-         * Second phase constructor.
-         */
-        void ConstructL();
-
-    public:
-        /**
-         * Pointer array for generic record pointers. Those are copies
-         * from CommsDat versions for the client usage.
-         */
-        RPointerArray<CommsDat::CCDRecordBase> iGenRecordArray;
-
-        /**
-         * Pointer array for bearer specific record pointers. Those are copies
-         * from CommsDat versions for the client usage. These are asked from
-         * the different plugins.
-         */
-        RPointerArray<CommsDat::CCDRecordBase> iBearerSpecRecordArray;
-
-        /** Naming way of the CM. e.g. ENamingUnique */
-        CMManager::TNamingMethod iNamingMethod;
-
-        /** Boolean to keep the information if location is enabled */
-        TBool iLocationEnabled;
-
-        /** Iap Record id of this Connection Method */
-        TUint32 iIapId;
+    
+        CCmManagerImpl&     iCmMgr;
+        TUint32             iParentDest;// Parent destination
+        TAny*               iNotused1;
+        TAny*               iNotused2;
     };
 
 /**
- *  CCmPluginBaseEng is base class for every connection method plugin.
- *  It handles all the generic iap informations e.g. record handling
- *  and attribute reaquests to generic records.
+ *  CCmPluginBaseEng is base class for every connection method plugin
  *
- *  @lib cmmpluginbase.lib
- *  @since S60 v5.2
+ *  @lib cmmanager.lib
+ *  @since S60 v3.2
  */
 class CCmPluginBaseEng : public CBase
     {
     public:
-       /**
-        * Destructor.
-        */
-       IMPORT_C virtual ~CCmPluginBaseEng();
-
+    
+        /** Destructor. */
+        IMPORT_C virtual ~CCmPluginBaseEng();
+        
         /**
-         * Create a new instance of the given bearer type plugin.
-         * Used from CMM server to avoid using slow ECom framework.
-         * @param aInitParam initialization data
-         * @return Returns CCmPluginBaseEng type pointer which represents pure
-         * bearer instance for the CMM server.
-         */
-        virtual CCmPluginBaseEng* CreateInstanceL(
-                TCmPluginInitParam& aInitParam ) const = 0;
+        * Create a new instance of the given bearer type plugin.
+        * Used from framework to avoid using slow ECom framework.
+        * @param aInitParam initialization data
+        */
+        virtual CCmPluginBaseEng* 
+                CreateInstanceL( TCmPluginInitParam& aInitParam ) const = 0;
+        
+    public: // Attribute handlers
+    
+        /**
+        * Gets the value for a TInt attribute.
+        * @param aAttribute Identifies the attribute to be retrived.
+        * @return contains the requested TInt attribute.
+        */
+        IMPORT_C virtual TUint32 
+                        GetIntAttributeL( const TUint32 aAttribute ) const;
 
         /**
-         * Following GetBearerInfoXXXL methods return the values of the
-         * requested attributes. These values are bearerspecific so they
-         * don't vary between CMs with same bearer type.
-         * @param aAttribute An attribute identifier.
-         * @return Returns the value requested. If not found leaves with
-         * KErrNotFound error code.
-         */
-        IMPORT_C virtual TUint32 GetBearerInfoIntL(
-                TUint32 aAttribute ) const = 0;
-
-        IMPORT_C virtual TBool GetBearerInfoBoolL(
-                TUint32 aAttribute ) const = 0;
-
-        IMPORT_C virtual HBufC* GetBearerInfoStringL(
-                TUint32 aAttribute ) const = 0;
-
-        IMPORT_C virtual HBufC8* GetBearerInfoString8L(
-                TUint32 aAttribute ) const = 0;
-
-        /**
-         * Checks if the plug-in can handle the Connection Method identified
-         * with parameter aIapId.
-         * @param aIapId IAPId of the AP to be checked
-         * @return ETrue if plug-in can handle the IAP, otherwise EFalse.
-         */
-        virtual TBool CanHandleIapIdL( TUint32 aIapId ) const = 0;
-
-        /**
-         * Checks if the plug-in can handle the given IAP record.
-         * @param aIapRecord IAP record to be checked
-         * @return ETrue if plug-in can handle the IAP, otherwise EFalse.
-         */
-        virtual TBool CanHandleIapIdL(
-                CommsDat::CCDIAPRecord* aIapRecord ) const = 0;
-
-    public: // Client interface
-        /**
-         * Loads all the records belonging to this Connection Method.
-         * @param aIapId Id of the IAP record. Identifies the CM
-         * related records to load.
-         */
-        IMPORT_C void LoadL( TUint32 aIapId );
-
-        /**
-         * Resets and loads all the records belonging to this Connection Method.
-         */
-        IMPORT_C void ReLoadL();
+        * Gets the value for a TBool attribute.
+        * @param aAttribute Identifies the attribute to be retrived.
+        * @return contains the requested TBool attribute.
+        */
+        IMPORT_C virtual TBool 
+                        GetBoolAttributeL( const TUint32 aAttribute ) const;
 
         /**
-         * Creates a new Connection Method in memory. Call UpdateL() to store
-         * it in CommsDat. No CommsDat transaction operation is needed for this.
-         * @param aCmId Predefined iapid to be used when saving to CommsDat.
-         *       0 means that CommsDat gives the id.
-         */
-        IMPORT_C void CreateNewL( TUint32 aCmId );
+        * Gets the value for a String16 attribute.
+        * @param aAttribute Identifies the attribute to be retrived.
+        * @return copy of the requested attribute. Ownership is passed.
+        */
+        IMPORT_C virtual HBufC* 
+                        GetStringAttributeL( const TUint32 aAttribute ) const;
+        
+        /**
+        * Gets the value for a String8 attribute.
+        * @param aAttribute Identifies the attribute to be retrived.
+        * @return copy of the requested attribute. Ownership is passed.
+        */
+        IMPORT_C virtual HBufC8* 
+                        GetString8AttributeL( const TUint32 aAttribute ) const;
 
         /**
-         * Creates a copy of an existing Connection Method.
-         * @param aClientPluginInstance The source data to create the copy from.
-         * @return CCmPluginBaseEng type pointer to an object which represents
-         * the new plugin to the CMM server.
-         */
-        IMPORT_C CCmPluginBaseEng* CreateCopyL(
-                CCmClientPluginInstance* aClientPluginInstance );
+        * Sets the value for a TInt attribute.
+        * @param aAttribute Identifies the attribute to be set.
+        * @param aValue The value to be set.
+        * @return None.
+        */
+        IMPORT_C virtual void SetIntAttributeL( 
+                             const TUint32 aAttribute, TUint32 aValue );
 
         /**
-         * Updates all records to commsdat. Data is copied from the client's copy
-         * to the original data.
-         * This method does not open/rollback/commit transaction to CommsDat.
-         * Caller must handle transactions.
-         */
-        IMPORT_C virtual void UpdateL(
-                CCmClientPluginInstance* aClientPluginInstance );
-
-        /*
-         * Deletes all the records of this CM from the database.
-         * All the preventing conditions must be checked before calling this.
-         * This method does not open/rollback/commit transaction to CommsDat.
-         * Caller must handle transactions.
-         */
-        IMPORT_C virtual void DeleteL();
-
-        /**
-         * Creates a copy of all plugin data( most of them are CommsDat data ) for a client.
-         * @param aClientPluginInstance An object where to copy the data.
-         */
-        IMPORT_C void GetPluginDataL( CCmClientPluginInstance* aClientPluginInstance );
+        * Sets the value for a TBool attribute.
+        * @param aAttribute Identifies the attribute to be set.
+        * @param aValue The value to be set.
+        * @return None.
+        */
+        IMPORT_C virtual void SetBoolAttributeL( 
+                             const TUint32 aAttribute, TBool aValue );
 
         /**
-         * Following GetXXXXAttributeL methods return the values of the
-         * requested attributes. Attributes are returned from the client's
-         * copy of the data. These values are CM specific.
-         * @param aAttribute An attribute identifier.
-         * @param aClientPluginInstance Client's copy of the data where
-         * to get the return value.
-         * @return Returns the value requested. If not found leaves with
-         * KErrNotFound error code.
-         */
-        IMPORT_C TUint32 GetIntAttributeL(
-                TUint32 aAttribute,
-                CCmClientPluginInstance* aClientPluginInstance );
+        * Sets the value for a String16 attribute.
+        * @param aAttribute Identifies the attribute to be set.
+        * @param aValue The value to be set.
+        * @return None.
+        */
+        IMPORT_C virtual void SetStringAttributeL( 
+                             const TUint32 aAttribute, const TDesC16& aValue );
 
-        IMPORT_C TBool GetBoolAttributeL(
-                TUint32 aAttribute,
-                CCmClientPluginInstance* aClientPluginInstance );
-
-        IMPORT_C HBufC* GetStringAttributeL(
-                TUint32 aAttribute,
-                CCmClientPluginInstance* aClientPluginInstance );
-
-        IMPORT_C HBufC8* GetString8AttributeL(
-                TUint32 aAttribute,
-                CCmClientPluginInstance* aClientPluginInstance );
+        /**
+        * Sets the value for a String8 attribute.
+        * @param aAttribute Identifies the attribute to be set.
+        * @param aValue The value to be set.
+        * @return None.
+        */
+        IMPORT_C virtual void SetString8AttributeL( 
+                             const TUint32 aAttribute, const TDesC8& aValue );
 
         /**
-         * Following SetXXXXAttributeL methods set the given values
-         * identified with attributes. Attributes are set to the
-         * client's copy of the data.
-         * @param aAttribute An attribute identifier.
-         * @param aValue Value to set.
-         * @param aClientPluginInstance Client's copy of the data where
-         * to set the given value.
-         */
-        IMPORT_C void SetIntAttributeL(
-                TUint32 aAttribute,
-                TUint32 aValue,
-                CCmClientPluginInstance* aClientPluginInstance );
-
-        IMPORT_C void SetBoolAttributeL(
-                TUint32 aAttribute,
-                TBool aValue,
-                CCmClientPluginInstance* aClientPluginInstance );
-
-        IMPORT_C void SetStringAttributeL(
-                TUint32 aAttribute,
-                const TDesC16& aValue,
-                CCmClientPluginInstance* aClientPluginInstance );
-
-        IMPORT_C void SetString8AttributeL(
-                TUint32 aAttribute,
-                const TDesC8& aValue,
-                CCmClientPluginInstance* aClientPluginInstance );
+        * Restore the original value of the attribute from commsdat field.
+        * Base implementation can be used only with attributes 
+        * stored directly in commsdat.
+        * @param aAttribute attribute to be restored
+        */
+        IMPORT_C virtual void RestoreAttributeL( const TUint32 aAttribute );
+        
+        /**
+        * Returns the CCmDestinationImpl* if this is an 
+        * embedded destination CM. Otherwise returns NULL.
+        * @return embedded destination object or NULL
+        */
+        IMPORT_C virtual CCmDestinationImpl* Destination() const;
+        
+        /**
+        * Update or if this is a new CM, creates CM in CommsDat. 
+        * - OpenTransactionLC()
+        * - PrepareToUpdateRecordsL()
+        * - UpdateChargeCardRecordL()
+        * - UpdateServiceRecordL()
+        * - UpdateIAPRecordL()
+        *   - UpdateLocationRecordL()
+        *   - BearerRecordIdLC()
+        *   - UpdateNetworkRecordL()
+        *   - UpdateWapRecordL()
+        *   - UpdateProxyRecordL()
+        *   - UpdateConnPrefSettingL()
+        * - UpdateAdditionalRecordsL()
+        * - CommitTransactionL()
+        * @return None.
+        */        
+        IMPORT_C virtual void UpdateL();     
+        
+        /*
+        * Delete from the database if this CM has no more reference
+        * from the DN_IAP table.
+        * - IsMultipleReferencedL()
+        * - OpenTransactionLC()
+        * - PrepareToDeleteL()
+        * - Delete records (in this order)
+        *   - IAP
+        *   - Proxy
+        *   - Service
+        *   - ChargeCard
+        *   - Network
+        *   - Location
+        *   - WapAP
+        *   - WapBearer
+        * - DeleteAdditionalRecordsL()
+        * - CommitTransactionL()
+        * @param aForced forced delete doesn't check referencies
+        * @param aOneRefsAllowed ETrue if one reference from a destination is 
+        *           acceptable to delete this connection method.
+        */    
+        IMPORT_C virtual TBool DeleteL( TBool aForced,
+                                        TBool aOneRefAllowed = ETrue );
 
         /**
-         * Requests CommsDat table ids to be observed for changes by the cmm
-         * server. This is only for generic iap related tables.
-         * @param aTableIdArray A reference to an array where iap related generic
-         * table ids are added.
-         */
-        IMPORT_C void GetGenericTableIdsToBeObservedL( RArray<TUint32>& aTableIdArray ) const;
-
-    public: // plugin interface
-        /**
-         * Creates a copy of all bearer specific CommsDat data for the client.
-         * Called as result of GetPluginDataL().
-         * @param aRecordArray An array where the copy the records. Only
-         * the bearer specific implementation knows the amount and order
-         * of these records in the array.
-         */
-        virtual void GetBearerSpecificRecordsL(
-                RPointerArray<CommsDat::CCDRecordBase>& aRecordArray ) = 0;
+        * Performs the basic loading of records related
+        * to this connection method:
+        * - OpenTransactionLC();
+        * - PrepareToLoadRecordsL()
+        * - LoadIAPRecordL();
+        *       - load IAP
+        *       - load WAP (AP & IP Bearer)
+        *       - load proxy
+        *       - load charge card
+        *       - load network
+        *       - load location
+        * - LoadServiceSettingL();
+        * - LoadAdditionalRecordsL();
+        */
+        IMPORT_C virtual void LoadL( TUint32 aIapId );
 
         /**
-         * Following GetBearerXXXXAttribute methods get only the
-         * fields in records in pointer arrays(parameters).
-         * @param aAttribute Identifier of the requested value.
-         * @param aGenRecordArray An array containing pointers to generic
-         * records of the Connection Method.
-         * @param aBearerSpecRecordArray An array containing pointers to bearer
-         * specific records of the Connection Method. aAttribute
-         * parameter should identify one field(integer, boolean string)
-         * in one of these records.
-         * @return Returns the requested value. In error case leaves with
-         * system-wide error code.
-         */
+        * Create a new connection method in memory.
+        * Call UpdateL() to store it in CommsDat.
+        * No transaction operation is performed.
+        * - Creates new WAP, IAP, Network records
+        * - CreateNewServiceRecordL()
+        * - CreateAdditionalRecordsL()
+        * - Loads default AP name from resource 
+        *       (R_CMMANAGERENG_DEFAULT_AP_NAME)
+        */
+        IMPORT_C virtual void CreateNewL();
+        
+        /**
+        * Create a copy of the connection method:
+        * - CreateInstanceL()
+        * - CreateNewL()
+        * - PrepareToCopyDataL()
+        * - Copies data:
+        *   - name
+        *   - bearer type
+        *   - records added to the convertion table
+        * - Calls CopyAdditionalDataL().
+        */
+        IMPORT_C virtual CCmPluginBaseEng* CreateCopyL() const;
+        
+        /*
+        * Returns true if the CM has more than one parent destination
+        */        
+        IMPORT_C virtual TInt NumOfConnMethodReferencesL();
 
-        virtual TUint32 GetBearerIntAttributeL(
-                TUint32 aAttribute,
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
-
-        virtual TBool GetBearerBoolAttributeL(
-                TUint32 aAttribute,
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
+    public:
+    
+        /**
+        * Returns a pointer to the cmmanager
+        * @return a pointer to the cmmanager
+        */
+        CCmManagerImpl& CmMgr() const { return iCmMgr; };
 
-        virtual HBufC* GetBearerStringAttributeL(
-                TUint32 aAttribute,
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
+        IMPORT_C CommsDat::CMDBSession& Session() const;
 
-        virtual HBufC8* GetBearerString8AttributeL(
-                TUint32 aAttribute,
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
+        /**
+        * Launches the settings dialog of the plugin
+        *
+        * @since S60 3.2
+        * @return soft key selection
+        */
+        virtual TInt RunSettingsL() = 0;
 
         /**
-         * Following SetBearerXXXXAttribute methods set only the
-         * fields in records in pointer arrays(parameters). They are not
-         * allowed to update the original records in plugins.
-         * @param aAttribute Identifier of the field to set.
-         * @param aValue The value to set.
-         * @param aGenRecordArray An array containing pointers to generic
-         * records of the Connection Method.
-         * @param aBearerSpecRecordArray An array containing pointers to bearer
-         * specific records of the Connection Method. aAttribute
-         * parameter should identify one field(integer, boolean string)
-         * in one of these records.
-         * @return None.
-         */
-
-        virtual void SetBearerIntAttributeL(
-                TUint32 aAttribute,
-                TUint32 aValue,
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
-
-        virtual void SetBearerBoolAttributeL(
-                TUint32 aAttribute,
-                TBool aValue,
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
-
-        virtual void SetBearerStringAttributeL(
-                TUint32 aAttribute,
-                const TDesC16& aValue,
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
-
-        virtual void SetBearerString8AttributeL(
-                TUint32 aAttribute,
-                const TDesC8& aValue,
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
-
+        * Called on a newly created connection method to initialize it properly
+        * with user interaction (e.g. APN setting for a packet data-, WEP-key
+        * setting for a WLAN connection method, etc.).
+        * Note: each plug-in should set its name (i.e. ECmName) in this
+        * function call.
+        *
+        * @since S60 3.2
+        * @param aManuallyConfigure let's the plugin know if a plugin should 
+        *                           be configured manually or automatically
+        * @return ETrue if initialization was successful and wasn't cancelled.
+        * EFalse, if initialization process was cancelled (i.e. user pressed
+        * Cancel button).
+        */
+        virtual TBool InitializeWithUiL( TBool aManuallyConfigure ) = 0;
+        
+        /**
+        * Checks if the plug-in can handle the given AP.
+        * @param aIapId IAPId of the AP to be checked
+        * @return ETrue if plug-in can handle the IAP
+        */
+        virtual TBool CanHandleIapIdL( TUint32 aIapId ) const = 0;
+        
         /**
-         * Inherited class can make some preraration before CCmPluginBaseEng
-         * would start loading bearer specific records.
-         */
-        virtual void PreparePluginToLoadRecordsL() = 0;
-
+        * Checks if the plug-in can handle the given AP.
+        * @param aIapRecord IAP record to be checked
+        * @return ETrue if plug-in can handle the IAP
+        */
+        virtual TBool CanHandleIapIdL( CommsDat::CCDIAPRecord* aIapRecord ) const = 0;
+        
         /**
-         * Gives the plugin a possibility to do some preparing operations
-         * if needed.
-         * @param aCopyInstance Client side data instance.
-         */
-        virtual void PrepareToCopyDataL( CCmPluginBaseEng* aCopyInstance ) = 0;
-
+        * Return the parent destination of this connection method.
+        * @return parent destination of this connection method
+        */
+        IMPORT_C CCmDestinationImpl* ParentDestination() const;
+        
         /**
-         * Inherited class can make some preraration before CCmPluginBaseEng
-         * would start to update all the records.
-         * @param aGenRecordArray Reference to generic records pointer array.
-         * @param aBearerSpecRecordArray Reference to bearer specific records
-         * pointer array.
-         */
-        virtual void PreparePluginToUpdateRecordsL(
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
-
+        * Calls FeatureManager::FeatureSupported directly.
+        * @param aFeature feature ID
+        * @return feature support status
+        * @since 3.2
+        */
+        IMPORT_C static TBool FeatureSupported( TInt aFeature );
+                
         /**
-         * Plugin can prepare to delete the Connection Method with this
-         * function. Called from DeleteL() before any record would be
-         * deleted. No records are deleted here.
-         */
-        virtual void PrepareToDeleteRecordsL(){};
+        * Function should be overriden by virtual bearer type plugins.
+        * Returns if the passed IAP id is linked to that connection method.
+        * @param aIapId IAP id to be checked
+        * @return ETrue if the passed IAP id is linked to that connection method.
+        */
+        virtual TBool IsLinkedToIap( TUint32 /*aIapId*/ ){ return EFalse; }
+        
+        /**
+        * Function should be overriden by virtual bearer type plugins.
+        * Returns if the passed SNAP id is linked to that connection method.
+        * @param aSnapId SNAP id to be checked
+        * @return ETrue if the passed SNAP id is linked to that connection method.
+        */
+        virtual TBool IsLinkedToSnap( TUint32 /*aSnapId*/ ){ return EFalse; }
 
         /**
-         * Loads the service record. Service record type is known and loaded by
-         * plugin(bearer specific) part of the implementation even if the record
-         * is saved to the generic side. Service record is linked to IAP record.
-         */
-        virtual void LoadServiceRecordL() = 0;
-
-        /**
-         * Creates the service records.
-         */
-        virtual void CreateServiceRecordL() = 0;
-
+        * Increments the reference counter. Used by the object pool.
+        */
+        void IncrementRefCounter();
         /**
-         * Update service record.
-         * @param aGenRecordArray Reference to generic records pointer array.
-         * @param aBearerSpecRecordArray Reference to bearer specific records
-         * pointer array.
-         */
-        virtual void UpdateServiceRecordL(
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
-
+        * Increments the reference counter. Used by the object pool.
+        */
+        void DecrementRefCounter();
         /**
-         * Copies the service record. Bearer specific part knows the type of it's
-         * service record.
-         * @return Returns the service record pointer.
-         */
-        virtual CommsDat::CCDRecordBase* CopyServiceRecordL() = 0;
+        * Returns the reference counter. Used by the object pool.
+        * @return TInt
+        */
+        TInt GetRefCounter();
 
         /**
-         * Returns the service record id of the Connection Method.
-         * @return Returns the id of the service record id of the Connection Method.
-         */
-        virtual TUint32 ServiceRecordId() const = 0;
+        * Appends uids of connection methods - which were also created during connection method
+        * creation - to the array given as parameter 
+        * @param aIapIds the array the additonal cm uids are appended to
+        */        
+        IMPORT_C virtual void GetAdditionalUids( RArray<TUint32>& aIapIds );
 
-        /**
-         * Returns the service record name of the Connection Method.
-         * @param aServiceName Name of the service record the CM's iap record
-         * points to.
-         */
-        virtual void ServiceRecordNameLC( HBufC* &aServiceName ) = 0;
-
-        /**
-         * Inherited class loads all the bearer specific records after
-         * loading generic records. Called from LoadL().
-         */
-        virtual void LoadBearerRecordsL() = 0;
-
+    protected: // Conversion table API
+    
+        IMPORT_C void AddConverstionTableL( 
+                            CommsDat::CCDRecordBase* *aRecord,
+                            TBool* aEnabled,
+                            const TCmAttribConvTable* aConvTable );
+                                            
+        IMPORT_C void AddCommonConversionTableL( 
+                                const TCmCommonAttrConvArrayItem* aConvTable );
+        
+        IMPORT_C void RemoveConversionTable( 
+                                        const TCmAttribConvTable* aConvTable );
+        
+        IMPORT_C void RemoveCommonConversionTable( 
+                                const TCmCommonAttrConvArrayItem* aConvTable );
+                                   
+    protected: // Resource handling
+    
         /**
-         * Creates bearer specific records.
-         */
-        virtual void CreateBearerRecordsL(){};
-
+        * Add file name to the resource file array.
+        * Open it and/or increment reference count.
+        * @param aName resource file name
+        */
+        IMPORT_C void AddResourceFileL( const TDesC& aName );
+        
         /**
-         * Update bearer specific records.
-         * @param aGenRecordArray Reference to generic records pointer array.
-         * @param aBearerSpecRecordArray Reference to bearer specific records
-         */
-        virtual void UpdateBearerRecordsL(
-                RPointerArray<CommsDat::CCDRecordBase>& aGenRecordArray,
-                RPointerArray<CommsDat::CCDRecordBase>& aBearerSpecRecordArray ) = 0;
-
-        /**
-         * Plugin(generic part) can delete bearer specific records
-         * with this function. Called from DeleteL().
-         */
-        virtual void DeleteBearerRecordsL() = 0;
+        * Remove file name from the resource file name array.
+        * Close the resource file and/or decrement the reference count.
+        * @param aName resource file name
+        */
+        IMPORT_C void RemoveResourceFile( const TDesC& aName );
 
         /**
-         * Resets the bearer specific records.
-         */
-        virtual void ResetBearerRecords() = 0;
-
+        * Read string from resource file. Resource file has to be
+        * opened prior this by calling AddResourceFileL().
+        */
+        IMPORT_C HBufC* AllocReadL( TInt aResourceId ) const;
+        
+            
+    protected:
+    
+        /** Constructor */
+        IMPORT_C CCmPluginBaseEng( TCmPluginInitParam *aInitParam );
+        
+        /** Second phase constructor */
+        IMPORT_C virtual void ConstructL();
+    
+        /** Open transaction */
+        void OpenTransactionLC();
+        
         /**
-         * Copies the bearer specific records to copy instance given as
-         * parameter.
-         * @param aCopyInstance Pointer to instance where to copy.
-         */
-        virtual void CopyBearerRecordsL( CCmPluginBaseEng* aCopyInstance ) = 0;
-
+        * Commit transaction.
+        * @param aError - error id
+        */
+        void CommitTransactionL( TInt aError );
+        
         /**
-         * Returns the bearer record id of the Connection Method.
-         * @param aRecordId Id of the bearer record this CM's iap record
-         * points to.
-         */
-        virtual void BearerRecordIdL( TUint32& aRecordId ) = 0;
-
+        * Rollback transaction.
+        */
+        void RollbackTransaction();
+        
+        /** Make a reset on this class. */
+        IMPORT_C void Reset();
+        
         /**
-         * Returns the bearer record name of the Connection Method.
-         * @param aBearerName Name of the bearer record this CM's iap record
-         * points to.
-         */
-        virtual void BearerRecordNameLC( HBufC* &aBearerName ) = 0;
+        * Plug-in implementation can make its on
+        * cleanup in this function. 
+        * Always called from LoadL() and 
+        * should be called from plugin's destructor.
+        */
+        virtual void AdditionalReset() = 0;
+        
+        /**
+        * Check if there's connection established with
+        * this connection method (IAP id).
+        */
+        IMPORT_C virtual TBool CheckIfAlreadyConnected() const;
+        
+    protected:  // virtual loader function
+        
+        /**
+        * Inherited class can make some preraration
+        * before CCmPluginBaseEng would start loading
+        * records from tables.
+        */
+        IMPORT_C virtual void PrepareToLoadRecordsL();
 
         /**
-         * Requests CommsDat table ids to be observed for changes by the cmm
-         * server. If a table used is not mentioned to be modified a bearer
-         * shouldn't return this. Bearers do not reset the array before adding
-         * ids.
-         * @param aTableIdArray A reference to an array where plugin must add
-         * the ids of the tables it want's to be observed.
-         */
-        IMPORT_C virtual void GetBearerTableIdsToBeObservedL(
-                RArray<TUint32>& aTableIdArray ) const = 0;
-
-    protected:
-        /**
-         * Constructor
-         */
-        IMPORT_C CCmPluginBaseEng( TCmPluginInitParam *aInitParam );
-
-        /**
-         * Second phase constructor
-         */
-        IMPORT_C virtual void ConstructL();
-
-        /**
-         * Checks if the ECmName attribute was set since the last update.
-         * If so, name is updated in passed record
-         * @param aSrcRecord record to be checked against
-         * @param aDestRecord record to be checked against aSrcRecord
-         */
-        IMPORT_C void CheckIfNameModifiedL(
-                CommsDat::CCDRecordBase* aSrcRecord,
-                CommsDat::CCDRecordBase* aDestRecord ) const;
-
-        /**
-         * Plugins can check DNS setting with this function.
-         * Suggested to be called from PrepareToUpdateRecordsL().
-         * It checked the DNS server addresses, moves secord into
-         * first if first is dynamic, and update DNSFromServer field
-         * according to address values.
-         * @param aIPv6 passed DNS server address are in IPv6 form
-         * @param aDNS1 first DNS server address
-         * @param aDNS1 secord DNS server address
-         * @param aDNSFromServer DNS address from server flag
-         */
-        IMPORT_C void CheckDNSServerAddressL(
-                TBool aIPv6,
-                CommsDat::CMDBField<TDesC>& aDNS1,
-                CommsDat::CMDBField<TDesC>& aDNS2,
-                CommsDat::CMDBField<TBool>& aDNSFromServer );
+        * Inherited class can load any additional
+        * records after CCmPluginBaseEng finished.
+        */
+        virtual void LoadAdditionalRecordsL(){};
 
         /**
-         * Copies the values and attributes of all fields from aSource-record
-         * into aDestination record.
-         * Does not copy the record element ID. Also, does not touch any field
-         * in aDestination-record that is NULL in aSource-record.
-         * @param aSource The record that is copied from.
-         * @param aDestination The record that is copied to.
-         */
-        IMPORT_C void CopyRecordFieldsL(
-                CommsDat::CMDBRecordBase& aSource,
-                CommsDat::CMDBRecordBase& aDestination );
+        * Load service record. Default implementation can
+        * create only factory supported record instances.
+        */
+        IMPORT_C virtual void LoadServiceSettingL();
 
-    private:
+    protected:  // virtual update functions
+    
         /**
-         * Handles all the Connection Method data copying to instance given as
-         * parameter. This is called from CreateCopyL().
-         * @ param aCopyInstance Pointer to plugin to copy the data.
-         */
-        void CopyDataL( CCmPluginBaseEng* aCopyInstance );
-
+        * Check if connection method data is valid, before
+        * it would be persisted to commsdat.
+        * If invalid data found, set its attribute id in
+        * iInvalidAttribute.
+        * Base class implementation must be called from
+        * overridden one.
+        */
+        IMPORT_C virtual void PrepareToUpdateRecordsL();
+        
         /**
-         * Handles all the Connection Method related record copying. Called from
-         * CopyDataL().
-         * @ param aCopyInstance Pointer to plugin to copy the data.
-         */
-        void CopyRecordsL( CCmPluginBaseEng* aCopyInstance );
+        * Inherited class can update its additional
+        * records here.
+        */
+        virtual void UpdateAdditionalRecordsL(){};
 
         /**
-         * Copies the record identified by aRecordIdentifier to copy instance.
-         * @param aRecordIdentifier Identifies the record which is copied copy.
-         * @param aCopyInstance Pointer to plugin to copy the data.
-         */
-        void CopyRecordDataL(
-                TUint32 aRecordIdentifier,
-                CCmPluginBaseEng* aCopyInstance );
-
-        /**
-         * Creates proxy record and sets the proxy settings enabled for this
-         * Connection Method.
-         */
-        void EnableProxyL( TBool aEnable );
-
-        /**
-         * Creates location record and sets the location enabled for this
-         * Connection Method.
-         */
-        void EnableLocationL( TBool aEnable );
+        * Update service record.
+        */
+        IMPORT_C virtual void UpdateServiceRecordL();
 
         /**
-         * Calls all the loading methods.
-         */
-        void DoLoadL( TUint32 aIapId );
-
-        /**
-         * Loads IAP record.
-         * @param aIapId Identifies the IAP record to load.
-         */
-        void LoadIAPRecordL( TUint32 aIapId );
-
-        /**
-         * Loads proxy record related to this IAP. This is called as a result
-         * of calling LoadL().
-         */
-        void LoadProxyRecordL();
-
-        /**
-         * Loads network record related to this IAP. This is called as a result
-         * of calling LoadL().
-         */
-        void LoadNetworkRecordL();
+        * Return the service table name and record id 
+        * of this connection in the service table.
+        * @param - aServiceName name of the service table
+        *           this connection method points to.
+        * @param - aRecordId record id in the service table.
+        */
+        virtual void ServiceRecordIdLC( HBufC* &aServiceName, 
+                                       TUint32& aRecordId ) = 0;
 
         /**
-         * Loads location record related to this IAP. This is called as a result
-         * of calling LoadL().
-         */
-        void LoadLocationRecordL();
-
-        /**
-         * Loads WAP AP and WAP IP records related to this IAP. This is called as a result
-         * of calling LoadL().
-         */
-        void LoadWapRecordL();
-
-        /**
-         * Loads iap metadata record related to this IAP. This is called as a result
-         * of calling LoadL().
-         */
-        void LoadMetadataRecordL();
+        * Return the bearer table name and record id 
+        * of this connection in the bearer table.
+        * @param - aBearerName name of the bearer table
+        *           this connection method points to.
+        * @param - aRecordId record id in the bearer table.
+        */
+        virtual void BearerRecordIdLC( HBufC* &aBearerName, 
+                                       TUint32& aRecordId ) = 0;
 
+    protected:  // virtual delete function
+    
         /**
-         * Following methods are called as a result of calling method UpdateL().
-         * Each method overwrites the original data in memory with the client copy
-         * of that data. Client data has all the possible changes set by client.
-         * After overwrite the data is written to CommsDat.
-         * @param aClientPluginInstance The client copy of the original data with the
-         * possible changes.
-         */
-        void UpdateIAPRecordL( CCmClientPluginInstance* aClientPluginInstance );
-        void UpdateProxyRecordL( CCmClientPluginInstance* aClientPluginInstance );
-        void UpdateConnPrefSettingL();
-        void UpdateNetworkRecordL( CCmClientPluginInstance* aClientPluginInstance );
-        void UpdateLocationRecordL( CCmClientPluginInstance* aClientPluginInstance );
-        void UpdateWapRecordL( CCmClientPluginInstance* aClientPluginInstance );
-        void UpdateMetadataRecordL( CCmClientPluginInstance* aClientPluginInstance );
-        void UpdateServiceRecordL( CCmClientPluginInstance* aClientPluginInstance );
+        * Plugin can prepare to delete the connection method
+        * with this function. Called from DeleteL() before
+        * any record would be deleted. Do NOT delete any
+        * record here.
+        */
+        virtual void PrepareToDeleteRecordsL(){};
+        
+        /**
+        * Plugin can delete additional, bearer specific record
+        * with this function. Called from DeleteL().
+        */
+        virtual void DeleteAdditionalRecordsL(){};
+
+    protected:  // virtual create function
+    
+        /**
+        * Plugin has to create and initialize its bearer specific object
+        * that points to the service record here. Pointer has to be stored in 
+        * iServiceRecord data member.
+        * Do NOT store service record in CommsDat yet.
+        */
+        virtual void CreateNewServiceRecordL() = 0;
+        
+        /**
+        * Plugin can create and initialize its bearer specific record(s) here.
+        * Do NOT store them in CommsDat yet.
+        */
+        virtual void CreateAdditionalRecordsL(){};
+        
+    protected:
 
         /**
-        * Creates new wap records.
+        * Called from CreateCopyL().
+        * Plugin can prepare for copying every records
+        * added to the conversion tables.
+        *
+        * @param aDestInst copy attributes into this plugin instance
+        */
+        virtual void PrepareToCopyDataL( CCmPluginBaseEng& /*aDestInst*/ ) const {};
+                
+        /**
+        * Copy data of the connection method that is not 
+        * added to the conversion table. (e.g. bearer specific
+        * flags)
+        *
+        * @param aDestInst copy attributes into this plugin instance
+        */    
+        virtual void CopyAdditionalDataL( CCmPluginBaseEng& /*aDestInst*/ ) const {};
+
+    private:
+    
+        void EnableProxyL( TBool aEnable );
+        void EnableChargeCardL( TBool aEnable );
+        void EnableLocationL( TBool aEnable );
+
+        // Loader functions
+        void DoLoadL( TUint32 aIapId );
+        void LoadIAPRecordL( TUint32 aIapId );
+        void LoadChargeCardSettingL( TUint32 aChargeCardId );
+        void LoadProxySettingL();
+        void LoadNetworkSettingL();
+        void LoadLocationSettingL();
+        void LoadWapRecordL();
+        void LoadSeamlessnessRecordL();
+        
+        // Updater functions
+        void UpdateIAPRecordL();
+        void UpdateProxyRecordL();
+        void UpdateChargeCardRecordL();
+        void UpdateConnPrefSettingL();
+        void UpdateNetworkRecordL();
+        void UpdateLocationRecordL();
+        void UpdateWapRecordL();
+        void UpdateSeamlessnessRecordL();
+        
+        /**
+        * No WAP record found in load process,
+        * but client wants to set start page.
         */
         void NewWapRecordL();
-
+        
         /**
-         * Searches the WAP records related to this iap. This is called as a
-         * result of LoadL().
-         * @return Returns pointer to WAP IP record. If it's not found NULL is
-         * returned.
-         */
+        * Create a new metadata record.
+        * @param aSetDef ETrue if setting default seamlessness valud is needed
+        * @return create metadata record point
+        */
+        CCDIAPMetadataRecord* NewSeamlessnessRecordL( TBool aSetDef );
+        
         CommsDat::CCDWAPIPBearerRecord* FindWAPRecordL();
+        CCDIAPMetadataRecord* FindSeamlessnessRecordL();
 
         /**
-        * Creates a new metadata record.
-        * @param aSetDef ETrue if setting default seamlessness value is needed
-        * @return Returns metadata record pointer.
-        */
-        CCDIAPMetadataRecord* NewMetadataRecordL( TBool aSetDef );
-
-        /**
-         * Searches the metadata record belonging to this iap. This is called as a
-         * result of LoadL().
-         * @return Returns pointer to WAP IP record. If it's not found NULL is
-         * returned.
-         */
-        CCDIAPMetadataRecord* FindMetadataRecordL(); //TODO, check comment, return value...
-
-        /**
-        * Set attribute flag on the given record.
-        * @param aRecord Record to be set.
-        * @param aAttribute Attribute to be set.
+        * Set attribute flag on the given record
+        * @param aRecord record to be set
+        * @param aAttribute e.g. ECDHidden
         * @param aSet ETrue to set, EFalse to clear
         */
-        void SetAttribute(
-                CommsDat::CCDRecordBase* aRecord,
-                TUint32 aAttribute,
-                TBool aSet );
-
+        void SetAttribute( CommsDat::CCDRecordBase* aRecord, 
+                           TUint32 aAttribute, 
+                           TBool aSet );
+                           
         /**
         * Copy the attributes of the source record to the destination.
         * @param aSrcRecord record of which attributes are copied
         * @param ADstRecord record of which attributes are set
         */
-        void CopyAttributes(
-                CommsDat::CCDRecordBase* aSrcRecord,
-                CommsDat::CCDRecordBase* aDstRecord );
-
-
-        /**
-        * Returns the default location record id.
-        * @return Returns the default location record id.
-        */
-        TUint32 GetLocationIdL() const;
-
-    private:
+        void CopyAttributes( CommsDat::CCDRecordBase* aSrcRecord, 
+                             CommsDat::CCDRecordBase* aDstRecord );
 
         /**
-         * Gives a possibility to make some prerarations before
-         * starting to load bearer specific records.
-         */
-        void PrepareToLoadRecordsL();
+        * Find field element associated with the passed attribute.
+        * @param aAttribute aatribute to find
+        * @aType type of the attribute (e.g. bool, int or string)
+        */               
+        TValidationFunctionL FindFieldL( TUint32 aAttribute,
+                                           TCMFieldTypes aType,
+                                           CommsDat::CMDBElement* &aElement ) const;
+
+        
+        /**
+        * Return Location id
+        * @return location id
+        */
+        TUint32 GetLocationIdL() const;
+        
+        /**
+        * Search for common attribute and convert it to plugin specific one.
+        * @param aAttribute common attribute id
+        * @return bearer specific attribute id
+        */
+        TUint32 CheckForCommonAttribute( const TUint32 aAttribute ) const;
+        
+        /**
+        * Returns the common attribute for the bearer specific attribute.
+        * Panics if there is no matching common attribute.
+        * @param aAttribute bearer specific attribute
+        * @return common attribute
+        */
+        TUint32 CommonAttribute( const TUint32 aAttribute ) const;
+        
+    public: // Util functions
+
+        IMPORT_C CommsDat::TMDBElementId IAPRecordElementId() const;
+        
+        IMPORT_C TBool IsProtected() const;
+        
+        TBool SetProxyServerNameL( const TDesC& aProxyServer );
 
         /**
-         * Gives a possibility to make some prerarations before
-         * starting to update bearer specific records.
-         */
-        void PrepareToUpdateRecordsL(
-                CCmClientPluginInstance* aClientPluginInstance );
-
-        /**
-         * Returns the element id of the iap record.
-         * @return Returns the element id of the iap record.
-         */
-        CommsDat::TMDBElementId IAPRecordElementId() const;
+        * Return the coversion table item of the attribute
+        * @param aAttribute attribute of which conversion item is requested
+        * @return conversion table item
+        */
+        IMPORT_C const TCmAttribConvTable* ConvTableItem( TUint32 aAttribute );
 
         /**
-         * Checks the protection attribute of the IAP.
-         * @return Returns ETrue if the IAP is protected. Otherwise returns
-         * EFalse.
-         */
-        TBool IsProtected() const;
+        * Function to set up DNS addresses and DNS address from server flag.
+        * Can be used with both IPv4 and IPv6 attribute. 
+        * Passed bearer specific attributes must be defined in common conversion 
+        * table.
+        * @param aSrv1Attr first DNS server address attribute
+        * @param aSrv1 DNS first DNS server address
+        * @param aSrv2Attr second DNS server address
+        * @param aSrv2 DNS second DNS server address attribute
+        * @param aAddrFromSrvAttr DNS address from server flag attribute
+        * @param aIPv6 ETrue if passed addresses are in IPv6 form
+        */
+        IMPORT_C void SetDNSServerAddressL( TUint32 aSrv1Attr,
+                                            const TDesC& aSrv1,
+                                            TUint32 aSrv2Attr,
+                                            const TDesC& aSrv2,
+                                            TUint32 aAddrFromSrvAttr,
+                                            TBool aIPv6  );
 
         /**
-         * Sets the name of the proxy server to proxy record. If name's
-         * length is 0, proxyport is set to 0 and proxyserver usage
-         * boolean is set to EFalse. If the name is longer than 0,
-         * boolean is set to ETrue.
-         * @param aProxyServer Address to be set.
-         * @param Record pointer where to set.
-         */
-        void SetProxyServerNameL(
-                const TDesC& aProxyServer,
-                CommsDat::CCDRecordBase* aProxyRecord );
+        * Plugins can check DNS setting with this function.
+        * Suggested to be called from PrepareToUpdateRecordsL().
+        * It checked the DNS server addresses, moves secord into
+        * first if first is dynamic, and update DNSFromServer field
+        * according to address values.
+        * @param aIPv6 passed DNS server address are in IPv6 form
+        * @param aDNS1 first DNS server address
+        * @param aDNS1 secord DNS server address
+        * @param aDNSFromServer DNS address from server flag
+        */                                            
+        IMPORT_C void CheckDNSServerAddressL( TBool aIPv6,
+                                              CommsDat::CMDBField<TDesC>& aDNS1,
+                                              CommsDat::CMDBField<TDesC>& aDNS2,
+                                              CommsDat::CMDBField<TBool>& aDNSFromServer );
 
+    protected:
+            
         /**
-         * Sets a name to IAP.
-         * @param aName Name to set.
-         * @param aClientPluginInstance Client copy of data where to set the
-         * name. UpdateL() updates the name to the CommsDat.
-         */
-        void SetNameL(
-                const TDesC& aName,
-                CommsDat::CCDRecordBase* aIapRecord,
-                const CMManager::TNamingMethod aNamingMethod );
+        * Checks if the ECmName attribute was set since the last update.
+        * If so, name is updated in passed record
+        * @param aRecord record to be checked against iIapRecord
+        */
+        IMPORT_C void CheckIfNameModifiedL( CommsDat::CCDRecordBase* aRecord ) const;
+        
+        /**
+        * Returns the global priority of the passed bearer type
+        * @param aServiceType bearer type of which priority is requested
+        * @return global bearer priority
+        */        
+        IMPORT_C TInt GlobalBearerPriority( const TDesC& aServiceType ) const;
+        
+        /**
+        * Returns the global UI priority of the passed bearer type
+        * @param aServiceType bearer type of which priority is requested
+        * @return global UI bearer priority
+        */
+        IMPORT_C TInt GlobalUiBearerPriority( const TDesC& aServiceType ) const;
 
-        /**
-         * Following methods are called as a result of SetNameL() to
-         * make a valid name of the given string.
-         */
-        HBufC* DoMakeValidNameL( const TDesC& aName, const TUint32& aIapId );
-        HBufC* EnsureMaxLengthLC( const TDesC& aName, TBool& aChanged );
+    private: // Util functions
+    
+        HBufC* DoMakeValidNameL( const TDesC& aName );
+        HBufC* EnsureMaxLengthLC( const TDesC& aName, 
+                                  TBool& aChanged );
+                                  
         TPtrC GetPrefix( const TDesC& aName );
         TInt GetPostfix( const TDesC& aName, const TDesC& aPrefix );
-        TBool IsValidNameL( const TDesC& aNameText, const TUint32& aIapId );
+
+        TBool IsValidNameL( const TDesC& aNameText );
         HBufC* EscapeTextLC( const TDesC& aLiteral );
-        void SetDefaultNameL( const TDesC& aName );
-
+        
+        void SetNameL( const TDesC& aName );
+        
+        TCmAttrConvArrayItem* ConversionTable( TUint32 aAttribute ) const;
+        CommsDat::CMDBElement& FieldByAttributeL( const TCmAttrConvArrayItem* aItem,
+                                        const TUint32 aAttribute,
+                                        TInt& aIndex ) const;
+        
         /**
-        * Check if the passed IP address is '0.0.0.0' or empty string
-        * @param aIpAddress IP address to be checked
+        * Writes the passed text into the passed attribute.
+        * @param aAttribute The attribute to write into
+        * @param aValue The value to write
         */
-        TBool IsUnspecifiedIPv4Address( const TDesC& aIpv4Address );
+        void GenericStringWriterL( const TUint32 aAttribute, 
+                                   const TDesC16& aValue );
+        
+        /**
+        * Returns the common attribute for the bearer specific attribute, if 
+        * it is mapped to any. Otherwise, it returns the original attribute.
+        * @param aAttribute bearer specific attribute
+        * @return common/original attribute
+        */
+        TUint32 MappedCommonAttribute( const TUint32 aAttribute ) const;        
+    public:
 
         /**
-        * Check if the passed IP address is one of these:
-        * - empty string    -
-        * - '0:0:0:0:0:0:0:0'
-        * - 'fec0:000:0000:ffff::1'
-        * - 'fec0:000:0000:ffff::2'
-        * @param aIpAddress IP address to be checked
+        * Indicates if the Id is valid or if this is a new object which sitll
+        * haven't been updated. 
+        * Used by the object pool.
+        * @return TBool
         */
-        CMManager::TIPv6Types ClassifyIPv6Address( const TDesC& aIpv6Address );
-
-    public: // Data
-
-        // Required attribute for the framework
-        // (An identifier used during destruction)
-        TUid    iDtor_ID_Key;
-        TUint32 iBearerType;
-
-    protected:
-        /**
-         * Reference to cmm's session handle. Initialised at the construction
-         * phase.
-         */
-        CommsDat::CMDBSession& iSession;
+        TBool IdIsValid();
 
         /**
-         * Generic record pointers.
+        * Sets iIdIsValid attribute
+        * Used by the object pool.
+        */
+        void SetIdValidity(TBool validity);
+        
+        /**
+        * Scans aDests for destinations that may be valid parents 
+        * for this plugin and removes those that may not. The function may be
+        * overriden by virtual bearer type plugins.
+        * @param aDests The array of destination IDs to be filtered.
+        */
+        virtual void FilterPossibleParentsL( RArray<TUint32>& /*aDests*/ ) {}
+        
+        /**
+         * Sets the predefined id for the plugin. This should only be
+         * used by cmmanager framework.
          */
-        CommsDat::CCDIAPRecord*             iIapRecord;
-        CommsDat::CCDProxiesRecord*         iProxyRecord;
-        CommsDat::CCDRecordBase*            iServiceRecord;
-        CommsDat::CCDNetworkRecord*         iNetworkRecord;
-        CommsDat::CCDLocationRecord*        iLocationRecord;
-        CommsDat::CCDWAPAccessPointRecord*  iWapAPRecord;
-        CommsDat::CCDWAPIPBearerRecord*     iWapIPBearerRecord;
-        CCDIAPMetadataRecord*               iMetaDataRecord;
+        IMPORT_C void SetPreDefinedId( const TUint32 aPreDefId );
+
+    public:
 
         /**
-         * IAP record id of the CM. 0 means that this is not stored to CommsDat
-         * yet. If in UpdateL phase iap record has an id but iIapId == 0 -->
-         * predefined iap id
-         */
-        TUint32 iCmId;
+        * Check if there is space to save record
+        * @return ETrue if space is available; otherwise leave with KLeaveWithoutAlert
+        */
+        IMPORT_C TBool CheckSpaceBelowCriticalLevelL() const;
 
-    private:
-        /**
-         * Naming method of the CM.
-         */
-        CMManager::TNamingMethod iNamingMethod;
+    public: // Data
+    
+        // Required attribute for the framework
+        // (An identifier used during destruction)
+        TUid iDtor_ID_Key;
+        
+    protected:
 
-        /**
-         * Table id of the iap metadata table.
-         */
-        CommsDat::TMDBElementId iMetadataTableId;
+        CCmManagerImpl&     iCmMgr;         //< Not owned    
+        TUint32             iParentDest;    // id of the parent destinaton
+        
+        // IAP id of the CM. 0 means that this is a newly
+        // created one.
+        TUint32         iIapId;
+        TUint32         iBearerType;        //< Should be set by plugin 
+                                            //< constructor
+        
+        CommsDat::CCDIAPRecord*           iIapRecord;         // created by base class
+        CommsDat::CCDProxiesRecord*       iProxyRecord;       // optional
+        CommsDat::CCDRecordBase*          iServiceRecord;     // created by plugin
+        CommsDat::CCDChargecardRecord*    iChargeCardRecord;  // optional
+        CommsDat::CCDNetworkRecord*       iNetworkRecord;     // created by base class
+        CommsDat::CCDLocationRecord*      iLocationRecord;    // optional
+        
+        TBool           iChargeCardEnabled;
+        TBool           iLocationEnabled;
 
-        /**
-         * Identifies if the location is enabled.
-         */
-        TBool iLocationEnabled;
+        TUint32         iInvalidAttribute;
+
+    private: // Data
+        
+        CCmPluginBasePrivate* iPriv;
+        //Reference counter for the object pool
+	    TInt                  iRefCounter;
+        //indicates if the Id is valid or not (for the object pool)
+        TBool                 iIdIsValid;
+        // Predefined connection method id(iap id)
+        TUint32               iPreDefIapId;
+	    friend class CCmPluginBase;
     };
-
+    
 #endif // CMPLUGINBASEENG_H