syncmlfw/dm/settings/src/DMProfileContentHandler.cpp
changeset 0 b497e44ab2fc
child 24 13d7c31c74e0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/dm/settings/src/DMProfileContentHandler.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,670 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  XML file handler for DM-settings
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <f32file.h>
+#include <commdb.h>
+#include <nsmldebug.h>
+#include <featmgr.h>
+#include "DMprofileContentHandler.h"
+#include "nsmldmsettings.h"
+
+
+#define DES_AS_8_BIT(str) (TPtrC8((TText8*)((str).Ptr()), (str).Size()))
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+CDMProfileContentHandler::CDMProfileContentHandler()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CDMProfileContentHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDMProfileContentHandler::ConstructL(CNSmlDMSettings* aSettings)
+    {
+	iSettings = aSettings;
+	iProfileArray = new (ELeave) CArrayPtrFlat<CNSmlDMResourceProfile> (3);	
+	// init feature manager
+	FeatureManager::InitializeLibL();
+    }
+
+// -----------------------------------------------------------------------------
+// CDMProfileContentHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDMProfileContentHandler* CDMProfileContentHandler::NewL(CNSmlDMSettings* aSettings )
+    {
+		CDMProfileContentHandler* self = new( ELeave ) CDMProfileContentHandler;
+    
+		CleanupStack::PushL( self );
+		self->ConstructL(aSettings);
+		CleanupStack::Pop();
+
+		return self;
+    }
+
+    
+// Destructor
+CDMProfileContentHandler::~CDMProfileContentHandler()
+    {	
+	if(iProfileArray)
+		{
+		iProfileArray->ResetAndDestroy();
+		delete iProfileArray;			
+		}
+	// uninitialize feature manager
+	FeatureManager::UnInitializeLib();
+    }
+
+// ----------------------------------------------------------
+// void CDMProfileContentHandler::RemoveDuplicateEntry()
+// Remove all the duplicate entries and the entries do not have
+// the values for the mandatory fields.
+// ----------------------------------------------------------
+void CDMProfileContentHandler::RemoveDuplicateEntry()
+{
+	_DBG_FILE("CDMProfileContentHandler::RemoveDuplicateEntry(): begin");
+	TInt count = iProfileArray->Count();
+	for(TInt i = 0; i < count; i++)
+	{
+		if(!(iProfileArray->At(i)->iServerId &&
+		    iProfileArray->At(i)->iUserName &&
+		    iProfileArray->At(i)->iServerURL ))
+		{
+				iProfileArray->Delete(i);
+				iProfileArray->Compress();				
+				i--;
+				count--;
+		}
+	}
+	
+	for ( TInt i = 0; i < count; i++ )
+	{
+		for(TInt j = i+1; j <count; j++)
+		{
+			if((iProfileArray->At(i)->iServerId->Des().Compare(iProfileArray->At(j)->iServerId->Des()) == 0) &&
+			(iProfileArray->At(i)->iServerId->Length() == iProfileArray->At(j)->iServerId->Length()))
+			{		
+				iProfileArray->Delete(j);
+				iProfileArray->Compress();
+				j--;
+				count--;
+			}
+		}
+	}
+	_DBG_FILE("CDMProfileContentHandler::RemoveDuplicateEntry(): end");
+}
+
+// ----------------------------------------------------------
+// void CDMProfileContentHandler::RemoveRSCEntryL()
+// ----------------------------------------------------------
+void CDMProfileContentHandler::RemoveRSCEntryL()
+{
+	_DBG_FILE("CDMProfileContentHandler::RemoveRSCEntryL(): begin");
+	TInt count = iProfileArray->Count();
+	for ( TInt i = 0; i < count; i++ )
+	{
+		if((iSettings->ServerIdFoundL(iProfileArray->At(i)->iServerId->Des())) ||
+		((! FeatureManager::FeatureSupported ( KFeatureIdSyncMlDmObex )) &&( iProfileArray->At(i)->iTransportId == KNSmlDmBluetoothType)))
+		{
+			iProfileArray->Delete(i);
+			iProfileArray->Compress();
+			i--;
+			count--;			
+		}				
+	}
+	_DBG_FILE("CDMProfileContentHandler::RemoveRSCEntryL(): end");
+}
+
+// ----------------------------------------------------------
+// void CDMProfileContentHandler::GetAccessPointIdL()
+// ----------------------------------------------------------
+TBool CDMProfileContentHandler::GetAccessPointIdL(TInt count,TInt &iapId)
+{
+	_DBG_FILE("CDMProfileContentHandler::GetAccessPointIdL(): begin");
+
+	CCommsDatabase *database = CCommsDatabase::NewL();
+    TUint32 id;
+    TBool ret = EFalse; 
+    CleanupStack::PushL(database);
+    CCommsDbTableView*  checkView;
+    checkView = database->OpenViewMatchingTextLC(TPtrC(IAP),TPtrC(COMMDB_NAME), iProfileArray->At(count)->iAccessPoint->Des());
+    TInt error = checkView->GotoFirstRecord();
+    if (error == KErrNone)
+    {     
+     //Get the IAP ID 
+     checkView->ReadUintL(TPtrC(COMMDB_ID), id);
+     iapId = id; 
+     ret = ETrue;     
+    }
+         
+    CleanupStack::PopAndDestroy(2);
+    _DBG_FILE("CDMProfileContentHandler::GetAccessPointIdL(): end");
+
+    return ret;
+            
+}
+// ----------------------------------------------------------
+// void CDMProfileContentHandler::SaveProfilesL()
+// save the profiles into db.
+// First it will remove the duplicate entry from iProfileArray itself and also remove
+// the entries present in the RSC if any.
+// ----------------------------------------------------------
+void CDMProfileContentHandler::SaveProfilesL()
+{
+	_DBG_FILE("CDMProfileContentHandler::SaveProfilesL(): begin");
+	RemoveDuplicateEntry();
+	RemoveRSCEntryL();
+	TInt iapId = 0;
+	
+	for ( TInt i = 0; i < iProfileArray->Count(); i++ )
+	{
+		if(iProfileArray->At(i)->iAccessPoint)
+		{
+			if(GetAccessPointIdL(i, iapId))
+			{
+				iProfileArray->At(i)->iIapId = iapId;
+			}
+			else
+			{
+			iapId = KErrGeneral;
+			TLex id(iProfileArray->At(i)->iAccessPoint->Des());
+			id.Val(iapId);
+			if( iapId == KErrGeneral || iapId == KErrNotFound )
+			    {
+			    iProfileArray->At(i)->iIapId = iapId;
+			    }
+			}
+		}
+		if(! iProfileArray->At(i)->iProfileDisplayName)
+		{
+			TBuf<KNSmlDmProfileNameMaxLength> defaultProfile;
+			defaultProfile.Format( KNSmlDMDefaultProfile );
+			iProfileArray->At(i)->iProfileDisplayName = defaultProfile.AllocL();
+		}	
+		CNSmlDMProfile* profile = iSettings->CreateProfileL();
+		CleanupStack::PushL( profile );
+		iProfileArray->At(i)->SaveProfileL( profile );
+		profile->SaveL();
+		CleanupStack::PopAndDestroy(); // profile
+							
+	}
+	_DBG_FILE("CDMProfileContentHandler::SaveProfilesL(): end");
+}
+// -----------------------------------------------------------------------------
+//  CDMProfileContentHandler::IsChar
+//	Returns true value for other than numerical character.
+// -----------------------------------------------------------------------------
+TBool CDMProfileContentHandler::IsChar( const TUint8 aChar )
+{
+	TBool ret(ETrue);
+	switch(aChar)
+	{
+		case '0':
+		case '1':
+		case '2':
+		case '3':
+		case '4':
+		case '5':
+		case '6':
+		case '7':
+		case '8':
+		case '9':
+		{
+			ret = EFalse;
+			break;
+		}
+		default: ret = ETrue;		
+	}
+	return ret;    
+}
+
+TInt CDMProfileContentHandler::StartDocument()
+   {	
+		TInt error = KNSmlDmSettingsSuccess;
+		iFile.Close();
+		iSession.Close();
+		error = iSession.Connect();
+		error =iFile.Replace(iSession, iFilename, EFileWrite);
+		
+		return error;
+   }
+
+TInt CDMProfileContentHandler::EndDocument()
+{
+		iFile.Close();
+		iSession.Close();
+		return KNSmlDmSettingsSuccess;
+}
+
+// ----------------------------------------------------------
+// void CDMProfileContentHandler::AddProfileL()
+// Appends a new profile to the array.
+// ----------------------------------------------------------
+void CDMProfileContentHandler::AddProfileL( )
+{
+	_DBG_FILE("CDMProfileContentHandler::AddProfileL(): begin");
+	CNSmlDMResourceProfile* profile = CNSmlDMResourceProfile::NewLC();
+	iProfileArray->AppendL( profile );
+	CleanupStack::Pop();
+	_DBG_FILE("CDMProfileContentHandler::AddProfileL(): end");		
+}
+
+TInt CDMProfileContentHandler::StartElement(TDesC& /* aURI */, TDesC& /* aLocalName */, TDesC& aName, MXMLAttributes * /* aAttributeList*/)
+{	
+
+		if (! aName.Compare(KNSmlDMXmlFactorySettings()))
+		{
+			TRAPD(leavecode, AddProfileL());
+			if(leavecode != KErrNone )
+			{
+				return KNSmlDmSettingsFail;
+			}						
+			iDMAccountInProgress = ETrue;
+			iCounter++;
+		}
+		
+		if (!iDMAccountInProgress)
+			return KNSmlDmSettingsSuccess;
+		
+		if (! aName.Compare(KNSmlDMXmlProfileName()))
+		{
+			iState = EProfileName;			
+		}	
+		
+		else if (! aName.Compare(KNSmlDMXmlServerId()))
+		{
+			iState = EServerID;			
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileServerPassword()))
+		{
+			iState = EServerPassword;
+		}
+
+		else if (! aName.Compare(KNSmlDMXmlProfileUsername()))
+		{
+			iState = EUserName;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileClientPassword()))
+		{
+			iState = EClientPwd;
+		}
+
+		else if (! aName.Compare(KNSmlDMXmlProfileServerUrl()))
+		{
+			iState = EServerURL;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileTransportId()))
+		{
+			iState = ETransportID;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileAP()))
+		{
+			iState = EAccessPoint;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileServerAlertedAction()))
+		{
+			iState = EServerAlertedAction;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileAuthentication()))
+		{
+			iState = EAuthentication;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileDeleteAllowed()))
+		{
+			iState = EDeleteAllowed;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileView()))
+		{
+			iState = EProfileView;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileNetworkAuthentication()))
+		{
+			iState = ENetworkAuthentication;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileHttpAuthUsername()))
+		{
+			iState = EHTTPUserName;
+		}
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileHttpAuthPassword()))
+		{
+			iState = EHTTPPwd;
+		}				
+		
+		else if (! aName.Compare(KNSmlDMXmlProfileLock()))
+		{
+			iState = EProfileLock;
+		}
+
+		return KNSmlDmSettingsSuccess;
+}
+
+TInt CDMProfileContentHandler::EndElement(TDesC& /* aURI */, TDesC& /* aLocalName */, TDesC& aName)
+{
+		if (!iDMAccountInProgress)
+			return KNSmlDmSettingsSuccess;
+		
+		if (! aName.Compare(KNSmlDMXmlFactorySettings()))
+		{
+	    	iDMAccountInProgress = EFalse;
+		}
+		
+		if (iState != EStateHandled)
+		{				
+			iState = EStateHandled;   //Assume that empty feild. No need to set.
+		}		
+
+		return KNSmlDmSettingsSuccess;
+}
+TInt CDMProfileContentHandler::StartCDATA()
+{
+	// do nothing
+	return KNSmlDmSettingsSuccess;
+}
+TInt CDMProfileContentHandler::EndCDATA()
+{
+	// do nothing
+	return KNSmlDmSettingsSuccess;
+}
+
+// ----------------------------------------------------------
+// void CDMProfileContentHandler::AddProfileElementL()
+// Assigns profile element value.
+// ----------------------------------------------------------
+void CDMProfileContentHandler::AddProfileElementL(TDesC& aBuf)
+{
+	_DBG_FILE("CDMProfileContentHandler::AddProfileElementL(): begin");
+	if(iState == EProfileName)
+	{
+		if(aBuf.Length() > KNSmlDmProfileNameMaxLength)
+		{
+			TPtrC buf = aBuf.Left(KNSmlDmProfileNameMaxLength);
+			iProfileArray->At(iCounter-1)->iProfileDisplayName = buf.AllocL();
+		}
+		else		
+			iProfileArray->At(iCounter-1)->iProfileDisplayName = aBuf.AllocL();		
+		iState = EStateHandled;		
+	}
+	
+	else if(iState == EServerID)
+	{
+		iProfileArray->At(iCounter-1)->iServerId = aBuf.AllocL();		
+		iState = EStateHandled;		
+	}
+	
+	else if(iState == EServerPassword)
+	{		
+		iProfileArray->At(iCounter-1)->iPassWord = aBuf.AllocL();
+		iState = EStateHandled;		
+	}
+	
+	else if(iState == EUserName)
+	{		
+		iProfileArray->At(iCounter-1)->iUserName = aBuf.AllocL();
+		iState = EStateHandled;		
+	}
+	
+	else if(iState == EClientPwd)
+	{		
+		iProfileArray->At(iCounter-1)->iClientPassword = aBuf.AllocL();
+		iState = EStateHandled;		
+	}
+	
+	else if(iState == EServerURL)
+	{		
+		TInt len = aBuf.Length();
+		TInt locate(0);
+		if( aBuf.Find( KNSmlDMSettingsHTTP )==0 )//http:
+		{
+			locate = KNSmlDMSettingsHTTP().Length();
+		}
+		else if( aBuf.Find( KNSmlDMSettingsHTTPS )==0 )//https:
+		{
+			locate = KNSmlDMSettingsHTTPS().Length();
+		}
+		
+		TPtrC buf =aBuf.Right(len-locate);
+		TInt locateColon = buf.Locate(KNSmlDMColon); // ':'
+		if(locateColon > 0)
+		{
+			TInt bufLen = buf.Length();	
+			TPtrC buf1 = buf.Right(bufLen - locateColon);
+			TInt digit(0);
+			for( TInt i = locate + locateColon + 1; i < len; i++ )
+			{			
+				if (IsChar(aBuf[i]))
+				{
+					if(aBuf[i]!= KNSmlDMUriSeparator )
+					{
+						TPtrC strBuf = aBuf.Right(len - locate - locateColon);
+						TInt locateSlash = strBuf.Locate(KNSmlDMUriSeparator);
+						if(locateSlash > 0)
+						{
+							TPtrC ptrBuf1 = aBuf.Left(len-locateColon-1);
+							TBuf<KNSmlDmFileNameLength> buffer;
+							buffer.Append(ptrBuf1);
+							TPtrC ptrBuf2 = aBuf.Right(len-locate-locateColon-locateSlash);
+							buffer.Append(ptrBuf2);
+							iProfileArray->At(iCounter-1)->iServerURL = buffer.AllocL();
+							break;
+						}
+						else
+						{
+							TPtrC ptrBuf = aBuf.Left(locate + locateColon);
+							iProfileArray->At(iCounter-1)->iServerURL = ptrBuf.AllocL();
+							break;
+						}
+					}
+					else
+					{
+						iProfileArray->At(iCounter-1)->iServerURL = aBuf.AllocL();
+						break;
+					}
+				}
+				if(digit>= KNSmlDmMaxPortLength) // the max length of the port number
+				{
+					TPtrC ptrBuf1 = aBuf.Left(locate + locateColon);
+					TBuf<KNSmlDmFileNameLength> buffer;
+					buffer.Append(ptrBuf1);
+					TPtrC ptrBuf2 = aBuf.Right(len-i);
+					TInt locateSlash = ptrBuf2.Locate(KNSmlDMUriSeparator);
+					if(locateSlash > 0)
+					{
+						TPtrC ptrBuf3 = aBuf.Right(len-i-locateSlash);
+						buffer.Append(ptrBuf3);							
+					}						
+					iProfileArray->At(iCounter-1)->iServerURL = buffer.AllocL();	
+					break;
+				}
+				else if(i == (len-1))					
+					iProfileArray->At(iCounter-1)->iServerURL = aBuf.AllocL();					
+		
+				digit++;			
+			}		
+		}
+		else
+		{
+			iProfileArray->At(iCounter-1)->iServerURL = aBuf.AllocL();
+		}
+		iState = EStateHandled;		
+	}
+	else
+	{
+	AddRemainingElementsL(aBuf);	//To decrease cyclomatic complexity
+	}	
+	_DBG_FILE("CDMProfileContentHandler::AddProfileElementL(): end");
+}
+
+TInt CDMProfileContentHandler::Charecters(TDesC& aBuf, TInt /* aStart */, TInt /* aLength */)
+{	
+
+	if (!iDMAccountInProgress)
+		return KNSmlDmSettingsSuccess;
+	
+	TRAPD(leavecode, AddProfileElementL(aBuf));
+	if(leavecode != KErrNone )
+	{
+		return KNSmlDmSettingsFail;
+	}		
+	return KNSmlDmSettingsSuccess;
+}
+
+TInt CDMProfileContentHandler::Comment(TDesC& /* aComment */)
+{
+	// do nothing
+	return KNSmlDmSettingsSuccess;
+}
+
+TInt CDMProfileContentHandler::ProcessingInstructions(TDesC& /* aTarget */, TDesC& /* aData */)
+{
+	// do nothing
+	return KNSmlDmSettingsSuccess;
+}
+TInt CDMProfileContentHandler::IgnoreWhiteSpace(TDesC& /* aString */)
+{
+	// do nothing
+	return KNSmlDmSettingsSuccess;
+}
+TInt CDMProfileContentHandler::StartEntity(TDesC& /* aName */)
+{
+	// do nothing
+	return KNSmlDmSettingsSuccess;
+}
+TInt CDMProfileContentHandler::EndEntity(TDesC& /* aName */)
+{
+	// do nothing
+	return KNSmlDmSettingsSuccess;
+}
+TInt CDMProfileContentHandler::SkippedEntity(TDesC& /* aName */)
+{
+	// do nothing
+	return KNSmlDmSettingsSuccess;
+}
+TInt CDMProfileContentHandler::Error(TInt /* aErrorCode */, TInt /* aSeverity */)
+{
+	return KNSmlDmSettingsSuccess;
+}
+
+// ----------------------------------------------------------
+// void CDMProfileContentHandler::AddRemainingElementsL()
+// Assigns remaining profile element value other than in 
+// AddProfileElementL method
+// ----------------------------------------------------------
+void CDMProfileContentHandler::AddRemainingElementsL(TDesC& aBuf)
+	{
+	_DBG_FILE("CDMProfileContentHandler::AddRemainingElementsL(): end");
+	if(iState == ETransportID)
+		{	
+		TInt val(0);
+		if(! aBuf.Compare(KNSmlDMInternetTypeString()))
+			val = KNSmlDmInternetType;
+		else if (! aBuf.Compare(KNSmlDMBluetoothTypeString()))
+			val = KNSmlDmBluetoothType;		
+		iProfileArray->At(iCounter-1)->iTransportId = val;
+		iState = EStateHandled;		
+		}
+
+	else if(iState == EAccessPoint)
+		{		
+		iProfileArray->At(iCounter-1)->iAccessPoint = aBuf.AllocL();
+		iState = EStateHandled;		
+		}
+
+	else if(iState == EServerAlertedAction)
+		{		
+		TLex var(aBuf);
+		TInt val;
+		var.Val(val);
+		iProfileArray->At(iCounter-1)->iServerAlertAction = val;
+		iState = EStateHandled;		
+		}
+
+	else if(iState == EAuthentication)
+		{		
+		TLex var(aBuf);
+		TInt val;
+		var.Val(val);
+		iProfileArray->At(iCounter-1)->iAuthenticationRequired = val;
+		iState = EStateHandled;		
+		}
+
+	else if(iState == EDeleteAllowed)
+		{		
+		TLex var(aBuf);
+		TInt val;
+		var.Val(val);
+		iProfileArray->At(iCounter-1)->iDeleteAllowed = val;
+		iState = EStateHandled;		
+		}
+    else if(iState == EProfileLock)
+     	{		
+		TLex var(aBuf);
+		TInt val;
+		var.Val(val);
+		iProfileArray->At(iCounter-1)->iProfileLock = val;
+		iState = EStateHandled;		
+	    }
+	else if(iState == EProfileView)
+		{		
+		TLex var(aBuf);
+		TInt val;
+		var.Val(val);
+		iProfileArray->At(iCounter-1)->iProfileHidden = val;
+		iState = EStateHandled;		
+		}
+
+	else if(iState == ENetworkAuthentication)
+		{		
+		TLex var(aBuf);
+		TInt val;
+		var.Val(val);
+		iProfileArray->At(iCounter-1)->iHttpAuthUsed = val;
+		iState = EStateHandled;		
+		}
+
+	else if(iState == EHTTPUserName)
+		{		
+		iProfileArray->At(iCounter-1)->iHttpAuthUsername = aBuf.AllocL();
+		iState = EStateHandled;		
+		}
+
+	else if(iState == EHTTPPwd)
+		{		
+		iProfileArray->At(iCounter-1)->iHttpAuthPassword = aBuf.AllocL();
+		iState = EStateHandled;		
+		}
+	_DBG_FILE("CDMProfileContentHandler::AddRemainingElementsL(): end");
+	}
+//  End of File