syncmlfw/common/sosserver/src/NSmlProfile.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/sosserver/src/NSmlProfile.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,465 @@
+/*
+* Copyright (c) 2002-2005 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:  Symbian OS Server source.
+*
+*/
+
+
+#include <ecom.h>
+#include <implementationinformation.h>
+
+#include "nsmlsosserver.h"
+
+// --------------------------------------------------------------------------
+// CNSmlProfile::CNSmlProfile( TSmlUsageType aUsageType )
+// --------------------------------------------------------------------------
+//
+CNSmlProfile::CNSmlProfile( TSmlUsageType aUsageType, CNSmlSOSSession& aSession ) 
+: iProfId(KNSmlNullId), iUsageType(aUsageType), iSession(aSession), iLocked(EFalse), 
+iDataPtr(NULL, 0, 0) 
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CNSmlProfile::~CNSmlProfile()
+// --------------------------------------------------------------------------
+//
+CNSmlProfile::~CNSmlProfile()
+    {
+    delete iBuffer;
+    }
+
+// --------------------------------------------------------------------------
+// TInt CNSmlProfile::ProfileId() const
+// --------------------------------------------------------------------------
+//
+TInt CNSmlProfile::ProfileId() const
+    {
+    return iProfId;
+    }
+
+// --------------------------------------------------------------------------
+// void CNSmlProfile::SetLocked()
+// --------------------------------------------------------------------------
+//
+void CNSmlProfile::SetLocked()
+    {
+    iLocked = ETrue;
+    }
+
+// --------------------------------------------------------------------------
+// TBool CNSmlProfile::IsLocked()
+// --------------------------------------------------------------------------
+//
+TBool CNSmlProfile::IsLocked()
+    {
+    return iLocked;
+    }
+
+// --------------------------------------------------------------------------
+// void CNSmlProfile::SetCreatorId( const TInt aCreatorId )
+// --------------------------------------------------------------------------
+//
+void CNSmlProfile::SetCreatorId( const TInt aCreatorId )
+    {
+    iCreatorId = aCreatorId;
+    }
+
+// --------------------------------------------------------------------------
+// TInt CNSmlProfile::FetchDataL( const TInt aId, TBool aAllowHidden )
+// --------------------------------------------------------------------------
+//
+TInt CNSmlProfile::FetchDataL( const TInt aId, TBool aAllowHidden )
+    {
+    iProfId = aId;
+    TInt ret(KErrNotFound);
+    // Get profile data and pack it into aData.
+    switch ( iUsageType )
+        {
+        case ESmlDataSync:
+            {
+            CNSmlDSProfile* prof = iSession.DSSettings().ProfileL( iProfId );
+
+            if ( prof )
+                {
+                CleanupStack::PushL(prof);
+                
+                // check that hidden profiles are allowed
+                if ( !aAllowHidden && prof->IntValue( EDSProfileHidden) )
+                	{
+                	ret = KErrAccessDenied;
+                	}
+                else
+                	{
+	                TInt namelen = prof->StrValue( EDSProfileDisplayName ).Size();
+	                TInt unlen = prof->StrValue( EDSProfileSyncServerUsername ).Size();
+	                TInt pwlen = prof->StrValue( EDSProfileSyncServerPassword ).Size();
+	                TInt sidlen = prof->StrValue( EDSProfileServerId ).Size();
+	                    
+	                CBufFlat* buffer = CBufFlat::NewL( KDefaultNSmlBufferGranularity );
+	                CleanupStack::PushL( buffer );
+	                RBufWriteStream stream( *buffer );  
+	                CleanupClosePushL(stream);
+	                
+	                stream.WriteInt32L( namelen );
+	                stream << prof->StrValue( EDSProfileDisplayName );
+
+	                stream.WriteInt32L( unlen );
+	                stream << prof->StrValue( EDSProfileSyncServerUsername );
+
+	                stream.WriteInt32L( pwlen );
+	                stream << prof->StrValue( EDSProfileSyncServerPassword );
+
+	                stream.WriteInt32L( sidlen );
+	                stream << prof->StrValue( EDSProfileServerId );
+
+	                stream.WriteInt8L( prof->IntValue( EDSProfileServerAlertedAction ) );   
+	                stream.WriteInt32L( prof->IntValue( EDSProfileCreatorId ) );   
+
+	                stream.WriteInt8L( prof->IntValue( EDSProfileDeleteAllowed ) );
+	                stream.WriteInt8L( prof->IntValue( EDSProfileProtocolVersion ) );
+
+	            	stream.CommitL();
+	                
+	                CleanupStack::PopAndDestroy(&stream);    
+	                
+	                delete iBuffer;
+	                iBuffer = buffer;
+	                CleanupStack::Pop( buffer );   
+	                ret = KErrNone;
+                	}
+                	
+	            CleanupStack::PopAndDestroy(prof); 
+                }
+            break;
+            }
+        case ESmlDevMan:
+            {
+            CNSmlDMProfile* prof = iSession.DMSettings().ProfileL( iProfId );
+            if ( prof )
+                {
+                CleanupStack::PushL(prof);
+
+                if ( !aAllowHidden && prof->IntValue( EDMProfileHidden) )
+                	{
+                	ret = KErrAccessDenied;
+                	}
+                else
+	                {
+                    TInt namelen = prof->StrValue( EDMProfileDisplayName ).Size();
+                    TInt sunlen = prof->StrValue( EDMProfileServerUsername ).Size();
+                    TInt spwlen = prof->StrValue( EDMProfileServerPassword ).Size(); 
+                    TInt sidlen = prof->StrValue( EDMProfileServerId ).Size();       
+                    TInt pwlen = prof->StrValue( EDMProfileClientPassword ).Size();
+                   
+                    CBufFlat* buffer = CBufFlat::NewL( KDefaultNSmlBufferGranularity );
+                    CleanupStack::PushL( buffer );
+                    RBufWriteStream stream( *buffer );  
+                    CleanupClosePushL(stream);
+                    
+                    stream.WriteInt32L( namelen );
+                    stream << prof->StrValue( EDMProfileDisplayName );
+
+                    stream.WriteInt32L( sunlen );
+                    stream << prof->StrValue( EDMProfileServerUsername );
+
+                    stream.WriteInt32L( spwlen );
+                    stream << prof->StrValue( EDMProfileServerPassword );
+
+                    stream.WriteInt32L( sidlen );
+                    stream << prof->StrValue( EDMProfileServerId );
+
+                    stream.WriteInt8L( prof->IntValue( EDMProfileServerAlertAction ) );
+                    stream.WriteInt32L( prof->IntValue( EDMProfileCreatorId ) );  
+                    stream.WriteInt8L( prof->IntValue( EDMProfileDeleteAllowed ) );
+                    stream.WriteInt8L( prof->IntValue( EDMProfileLock ) );
+                    stream.WriteInt32L( pwlen );
+                    stream << prof->StrValue( EDMProfileClientPassword );
+
+                	stream.CommitL();
+                    
+                    CleanupStack::PopAndDestroy(&stream); 
+                    
+                    delete iBuffer;
+                    iBuffer = buffer;
+                    CleanupStack::Pop( buffer );    
+                    
+                    ret = KErrNone;
+	                }
+                CleanupStack::PopAndDestroy(prof); 
+                }
+            break;
+            }
+        default:
+            break;
+        }
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// void CNSmlProfile::ConnectionListL( RArray<TInt>& aArray )
+// --------------------------------------------------------------------------
+//
+void CNSmlProfile::ConnectionListL( RArray<TInt>& aArray )
+    {
+    if ( iProfId < KMaxDataSyncID ) // DS profile
+        {
+        CNSmlDSProfile* prof = iSession.DSSettings().ProfileL( iProfId );
+        if ( prof )
+            {
+            // Currently there's only one connection per profile.
+            aArray.AppendL( prof->IntValue( EDSProfileTransportId ) );
+            delete prof;
+            prof = NULL;
+            }
+        }
+    else    // DM profile
+       {
+        CNSmlDMProfile* prof = iSession.DMSettings().ProfileL( iProfId );
+        if ( prof )
+            {
+            aArray.AppendL( prof->IntValue( EDMProfileTransportId ) );
+            delete prof;
+            prof = NULL;
+            }
+       }            
+    }
+
+// --------------------------------------------------------------------------
+// void CNSmlProfile::TaskListL( RArray<TInt>& aArray )
+// --------------------------------------------------------------------------
+//
+void CNSmlProfile::TaskListL( RArray<TInt>& aArray )
+    {
+    CNSmlDSProfile* prof = iSession.DSSettings().ProfileL( iProfId );
+    if ( prof )
+        {
+        CleanupStack::PushL(prof);
+
+        RImplInfoPtrArray implArray;
+        CleanupStack::PushL(PtrArrCleanupItemRArr( CImplementationInformation, &implArray ) );    
+        TUid ifUid = { KNSmlDSInterfaceUid };
+        REComSession::ListImplementationsL( ifUid, implArray );
+        for ( TInt i = 0 ; i < implArray.Count() ; i++ )
+            {    
+            CImplementationInformation* implInfo = implArray[i];
+            CNSmlDSContentType* ctype = prof->ContentType( implInfo->ImplementationUid().iUid );
+            if ( ctype )
+                {            
+                aArray.AppendL( ctype->IntValue( EDSAdapterTableId ) );
+                }
+            }
+        REComSession::FinalClose();
+        CleanupStack::PopAndDestroy(&implArray); 
+        CleanupStack::PopAndDestroy(prof);
+        }
+    }
+
+// --------------------------------------------------------------------------
+// TInt CNSmlProfile::DataSize()
+// --------------------------------------------------------------------------
+//
+TInt CNSmlProfile::DataSize()
+    {
+    return iBuffer->Size();
+    }
+
+// --------------------------------------------------------------------------
+// const TPtr8& CNSmlProfile::ReadData()
+// --------------------------------------------------------------------------
+//
+const TPtr8& CNSmlProfile::ReadData()
+    {
+     if ( iBuffer )
+        {
+        iDataPtr.Set(iBuffer->Ptr(0));    
+        }    
+    return iDataPtr;
+    }
+
+// --------------------------------------------------------------------------
+// TInt CNSmlProfile::UpdateDataL( TInt& aId , const TDesC8& aData, TBool& aIsHidden )
+// --------------------------------------------------------------------------
+//
+TInt CNSmlProfile::UpdateDataL( TInt& aId , const TDesC8& aData, TBool& aIsHidden )
+    {    
+    aIsHidden = EFalse;
+    TInt ret(KErrNone);
+    switch ( iUsageType )
+        {        
+        case ESmlDataSync:
+            {            
+            CNSmlDSProfile* prof;
+
+            if ( iProfId == KNSmlNullId )
+                {
+                prof = iSession.DSSettings().CreateProfileL();
+                }
+            else
+                {
+                prof = iSession.DSSettings().ProfileL( iProfId );
+                
+                if ( !prof )
+        			{
+        			User::Leave( KErrNotFound );
+        			}
+                }
+            User::LeaveIfNull(prof);
+
+            CleanupStack::PushL(prof);
+
+            aIsHidden = prof->IntValue( EDSProfileHidden );
+            
+            RDesReadStream stream;
+            stream.Open(aData);
+            CleanupClosePushL(stream);
+          
+            TInt maxlen(0);
+            TInt pc(0);
+         
+            maxlen = stream.ReadInt32L();
+            prof->SetStrValue( EDSProfileDisplayName, HBufC::NewLC(stream,maxlen)->Des() ); pc++;
+            maxlen = stream.ReadInt32L();
+            prof->SetStrValue( EDSProfileSyncServerUsername, HBufC::NewLC(stream,maxlen)->Des() ); pc++;
+            maxlen = stream.ReadInt32L();
+            prof->SetStrValue( EDSProfileSyncServerPassword, HBufC::NewLC(stream,maxlen)->Des() ); pc++;
+            maxlen = stream.ReadInt32L();
+            prof->SetStrValue( EDSProfileServerId, HBufC::NewLC(stream,maxlen)->Des() ); pc++;
+
+            prof->SetIntValue( EDSProfileServerAlertedAction, stream.ReadInt8L() );
+
+            prof->SetIntValue( EDSProfileCreatorId, stream.ReadInt32L() );
+
+            prof->SetIntValue( EDSProfileProtocolVersion, stream.ReadInt8L() );
+
+            CleanupStack::PopAndDestroy(pc);
+
+            ret = prof->SaveL();
+
+            // read id after SaveL() and return to client.
+            iProfId = prof->IntValue( EDSProfileId );
+
+            aId = iProfId;
+
+            CleanupStack::PopAndDestroy(&stream);
+            CleanupStack::PopAndDestroy(prof);
+
+            break;
+            }
+        case ESmlDevMan:
+            {
+            CNSmlDMProfile* prof;
+
+            if ( iProfId == KNSmlNullId )
+                {
+                prof = iSession.DMSettings().CreateProfileL();
+                }
+            else
+                {
+                prof = iSession.DMSettings().ProfileL( iProfId );
+                
+                if ( !prof )
+        			{
+        			User::Leave( KErrNotFound );
+        			}
+                }
+            User::LeaveIfNull(prof);
+
+            CleanupStack::PushL(prof);
+
+            RDesReadStream stream;
+            stream.Open(aData);
+            CleanupClosePushL(stream);
+           
+            TInt maxlen(0);
+            TInt pc(0);
+
+            maxlen = stream.ReadInt32L();
+            prof->SetStrValue( EDMProfileDisplayName, HBufC::NewLC(stream,maxlen)->Des() ); pc++;
+            maxlen = stream.ReadInt32L();
+            prof->SetStrValue( EDMProfileServerUsername, HBufC::NewLC(stream,maxlen)->Des() ); pc++;
+            maxlen = stream.ReadInt32L();
+            prof->SetStrValue( EDMProfileServerPassword, HBufC::NewLC(stream,maxlen)->Des() ); pc++;
+            maxlen = stream.ReadInt32L();
+            HBufC* serverId = HBufC::NewLC(stream,maxlen); pc++; 
+            prof->SetStrValue( EDMProfileServerId, *serverId);
+
+            prof->SetIntValue( EDMProfileServerAlertAction, stream.ReadInt8L() );
+
+            prof->SetIntValue(  EDMProfileCreatorId ,stream.ReadInt32L() );
+            
+            
+            prof->SetIntValue( EDMProfileLock, stream.ReadInt8L() );
+            
+            maxlen = stream.ReadInt32L();
+            prof->SetStrValue( EDMProfileClientPassword, HBufC::NewLC(stream,maxlen)->Des() ); pc++;
+
+            
+ 
+            if(iSession.DMSettings().ServerIdFoundL(*serverId,iProfId))
+                {
+                ret = KErrAlreadyExists;
+                }
+            else
+                {
+                ret = prof->SaveL();
+
+                // read id after SaveL() and return to client.
+                iProfId = prof->IntValue( EDMProfileId );
+
+                aId = iProfId;
+                }
+
+            CleanupStack::PopAndDestroy(pc);
+            
+            CleanupStack::PopAndDestroy(&stream);
+            CleanupStack::PopAndDestroy(prof);
+            break;
+            }
+        default:
+            ret = KErrNotFound;
+            break;
+        }    
+    return ret;
+    }
+    
+// --------------------------------------------------------------------------
+// TBool CNSmlProfile::DeleteTaskL( const TInt aId )
+// --------------------------------------------------------------------------
+//
+TBool CNSmlProfile::DeleteTaskL( const TInt aId )
+    {
+	TBool deleted = EFalse;
+    CNSmlDSProfile* prof = iSession.DSSettings().ProfileL( iProfId );
+    if ( prof )
+        {
+        CleanupStack::PushL(prof);
+        deleted = prof->DeleteContentTypeL( aId );
+        prof->SaveL();
+        CleanupStack::PopAndDestroy(prof); 
+        }
+    
+    return deleted;
+    }
+
+// --------------------------------------------------------------------------
+// TSmlUsageType CNSmlProfile::GetUsageType()
+// --------------------------------------------------------------------------
+//
+TSmlUsageType CNSmlProfile::GetUsageType()
+	{
+	return iUsageType;
+	}
+
+//  End of File