messagingappbase/obexmtms/obexmtm/obexutil/source/obexpasswordexternaliser.cpp
changeset 31 ebfee66fde93
child 47 5b14749788d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/obexmtms/obexmtm/obexutil/source/obexpasswordexternaliser.cpp	Fri Jun 04 10:25:39 2010 +0100
@@ -0,0 +1,279 @@
+// Copyright (c) 2001-2009 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:
+// $Workfile: obexpasswordexternaliser.cpp $
+// $Author: Stevep $
+// $Revision: 13 $
+// $Date: 26/03/02 11:34 $
+// 
+//
+
+//class include
+#include "obexpasswordexternaliser.h"
+//system includes
+#include <msvstore.h>   //CMsvStore, RMsvWriteStream, RMsvReadStream
+#include <msvids.h>
+#include <msvuids.h>
+
+//user includes
+#include "obexinternalutils.h"
+
+const TUid KObexPasswordStreamUid = {0x1000AAC6};
+
+
+void ObexPasswordExternaliser::SetPasswordFromServiceEntryL(CMsvEntry& aServiceEntry, const TDesC& aPassword)
+/**
+* Static setter function to set the ObexPassword associated with the given entry. If the length of the password is
+* zero, then the password is cleared. Calling this function causes the entry to be changed, too, which allows the watcher
+* to detect the change to the password.
+*
+* @param aServiceEntry The service entry to set the password into
+* @param aPassword the password to set
+* @leave KErrXXX system-wide error codes
+*/
+	{
+ 	CMsvStore* serviceEntryStore = aServiceEntry.EditStoreL();
+	CleanupStack::PushL(serviceEntryStore);
+
+	if (!aPassword.Length())
+		{
+		//No password, so remove the password stream
+		serviceEntryStore->Remove(KObexPasswordStreamUid);
+		}
+	else
+		{
+		//Get the stream
+		RMsvWriteStream passwordWriteStream;
+		passwordWriteStream.AssignL(*serviceEntryStore, KObexPasswordStreamUid);
+
+		//Externalise the password 
+		HBufC* passwordBuf = aPassword.AllocLC();
+		ObexInternalUtils::ExternalizeL(passwordBuf, passwordWriteStream);
+		CleanupStack::PopAndDestroy();		//passwordBuf
+		passwordBuf = 0;
+
+		//Commit the stream
+		passwordWriteStream.CommitL();
+		passwordWriteStream.Close();
+		}
+
+	//"Change" the entry, so that the watcher will pick up the change if it's installed
+	aServiceEntry.ChangeL(aServiceEntry.Entry());
+
+	//Commit the store
+	serviceEntryStore->CommitL();
+
+	//Cleanup
+	CleanupStack::PopAndDestroy();		//serviceEntryStore
+	}
+
+
+EXPORT_C void ObexPasswordExternaliser::SetPasswordL(CMsvEntry& aEntry, const TDesC& aPassword)
+/**
+* Static setter function to set the ObexPassword associated with the given entry. If the length of the password is
+* zero, then the password is cleared
+*
+* @param aEntry CMsvEntry whose owning service entry's password is to be set
+* @param aPassword the password to set
+* @leave KErrXXX system-wide error codes
+*/
+	{
+	TMsvId originalEntry = aEntry.EntryId();
+	TMsvId serviceEntry = aEntry.Entry().iServiceId;
+
+	//Switch to the service entry
+	aEntry.SetEntryL(serviceEntry);
+
+	SetPasswordFromServiceEntryL(aEntry, aPassword);
+
+	//Switch back
+	aEntry.SetEntryL(originalEntry);
+	}
+
+
+EXPORT_C void ObexPasswordExternaliser::SetPasswordL(CMsvSession& aSession, const TUid& aMtmUid, const TDesC& aPassword)
+/**
+* Static setter function to set the ObexPassword associated with the given entry. If the length of the password is
+* zero, then the password is cleared
+*
+* @param aEntry aSessionObserver A session observer
+* @param aMtmUid Uid of the MTM whose password is to be set
+* @param aPassword the password to set
+* @leave KErrXXX system-wide error codes
+*/
+	{
+	CMsvEntry* serviceEntry = GetServiceEntryLC(aSession, aMtmUid);
+
+	SetPasswordFromServiceEntryL(*serviceEntry, aPassword);
+
+	CleanupStack::PopAndDestroy();		//serviceEntry
+	}
+
+
+HBufC* ObexPasswordExternaliser::GetPasswordFromServiceEntryLC(CMsvEntry& aServiceEntry)
+/**
+* Static getter function to get the ObexPassword from the given service entry. If the password stream doesn't exist,
+* a zero-length HBufC is returned. Ownership of the returned descriptor is passed to the caller, and is pushed onto the
+* cleanup stack.
+*
+* @param aServiceEntry CMsvEntry set to the service entry containing the password
+* @return HBufC containing the password (zero length if not set of cannot be read). Ownership is passed to the caller, and left on the cleanup stack
+* @leave KErrXXX system-wide error codes
+*/
+	{
+	HBufC* returnDescriptor = 0;
+
+	CMsvStore* serviceEntryStore = 0;
+	TRAPD(editStoreErr, serviceEntryStore = aServiceEntry.ReadStoreL());
+	if (editStoreErr != KErrNone)
+		{
+		//Couldn't read the store--probably doesn't exist
+		returnDescriptor = HBufC::NewLC(0);
+		return returnDescriptor;
+		}
+	CleanupStack::PushL(serviceEntryStore);
+
+	//Get the stream
+	RMsvReadStream passwordReadStream;
+	TRAPD(assignErr, passwordReadStream.OpenL(*serviceEntryStore, KObexPasswordStreamUid));
+	if (assignErr == KErrNone)
+		{
+		//Stream opened OK
+		passwordReadStream.PushL();
+		ObexInternalUtils::InternalizeL(returnDescriptor, passwordReadStream);
+		CleanupStack::PopAndDestroy(2);		//passwordReadStream, serviceEntryStore
+		}
+	else
+		{
+		//Couldn't read from stream--probably doesn't exist
+		CleanupStack::PopAndDestroy();		//serviceEntryStore
+		returnDescriptor = HBufC::NewL(0);
+		}
+
+	CleanupStack::PushL(returnDescriptor);
+	return returnDescriptor;
+	}
+
+
+EXPORT_C HBufC* ObexPasswordExternaliser::GetPasswordLC(CMsvEntry& aEntry)
+/**
+ * Static getter function to get the ObexPassword associated with the given entry. If the password stream doesn't exist,
+ * a zero-length HBufC is returned. Ownership of the returned descriptor is passed to the caller, and is pushed onto the
+ * cleanup stack.
+ *
+ * @param aEntry CMsvEntry whose owning service entry's password is to be set
+ * @return HBufC containing the password (zero length if not set). Ownership is passed to the caller, and left on the cleanup stack
+ * @leave KErrXXX system-wide error codes
+ */
+	{
+	TMsvId originalEntry = aEntry.EntryId();
+	TMsvId serviceEntry = aEntry.Entry().iServiceId;
+
+	//Switch to the service entry, and get the store
+	aEntry.SetEntryL(serviceEntry);
+
+	HBufC* returnDescriptor = GetPasswordFromServiceEntryLC(aEntry);
+
+	//Switch back
+	aEntry.SetEntryL(originalEntry);
+
+	return returnDescriptor;
+	}
+
+
+EXPORT_C HBufC* ObexPasswordExternaliser::GetPasswordLC(CMsvSession& aSession, const TUid& aMtmUid)
+/**
+ * Static getter function to get the ObexPassword associated with the given MTM UID. The zeroth service entry is assumed.
+ * If the password stream doesn't exist,a zero-length HBufC is returned. Ownership of the returned descriptor is passed
+ * to the caller, and is pushed onto the cleanup stack.
+ *
+ * @param aSessionObserver a session observer
+ * @param aMtmUid UID of the MTM whose password is to be set
+ * @return HBufC containing the password (zero length if not set). Ownership is passed to the caller, and left on the cleanup stack
+ * @leave KErrXXX system-wide error codes
+ */
+	{
+	CMsvEntry* serviceEntry = GetServiceEntryLC(aSession, aMtmUid);
+
+	HBufC* returnDescriptor = GetPasswordFromServiceEntryLC(*serviceEntry);
+
+	CleanupStack::Pop();			//returnDescriptor
+	CleanupStack::PopAndDestroy();	//serviceEntry
+	CleanupStack::PushL(returnDescriptor);
+
+	return returnDescriptor;
+	}
+
+
+EXPORT_C void ObexPasswordExternaliser::ResetPasswordL(CMsvEntry& aEntry)
+/**
+* Resets the password associated with the given entry. Does nothing if there is no password.
+*
+* @param aEntry CMsvEntry whose owning service entry's password is to be reset
+* @leave KErrXXX system-wide error codes
+*/	
+	{
+	ObexPasswordExternaliser::SetPasswordL(aEntry, KNullDesC);
+	}
+
+
+EXPORT_C void ObexPasswordExternaliser::ResetPasswordL(CMsvSession& aSession, const TUid& aMtmUid)
+/**
+* Resets the password associated with the given entry. Does nothing if there is no password.
+*
+* @param aEntry aSessionObserver A session observer
+* @param aMtmUid Uid of the MTM whose password is to be set
+* @leave KErrXXX system-wide error codes
+*/	
+	{
+	ObexPasswordExternaliser::SetPasswordL(aSession, aMtmUid, KNullDesC);
+	}
+
+
+CMsvEntry* ObexPasswordExternaliser::GetServiceEntryLC(CMsvSession& aSession, const TUid& aMtmUid)
+/**
+* Returns a CMsvEntry pointing to the zeroth service entry associated with aMtmUid. Ownership of the returned CMsvEntry
+* is passed to the caller, and it is left on the cleanup stack.
+*
+* @param aSession a session
+* @param aSessionObserver A session observer
+* @param aMtmUid Uid of the MTM whose service entry is to be found
+* @return A newly created CMsvEntry
+*/
+	{
+	//Create the entry
+	TMsvSelectionOrdering order;
+	order.SetShowInvisibleEntries(ETrue);
+	CMsvEntry* returnEntry = CMsvEntry::NewL(aSession, KMsvRootIndexEntryId, order);
+	CleanupStack::PushL(returnEntry);
+
+	//Find the service entry
+	CMsvEntrySelection* serviceEntrySelection = returnEntry->ChildrenWithTypeL(KUidMsvServiceEntry);
+	CleanupStack::PushL(serviceEntrySelection);
+
+	TInt current;
+	for	(current = 0; current < serviceEntrySelection->Count(); current++)
+		{
+		returnEntry->SetEntryL(serviceEntrySelection->At(current));
+		if (returnEntry->Entry().iMtm == aMtmUid) break;
+		}
+
+	if (current == serviceEntrySelection->Count())
+		{
+		//No entry found--leave
+		User::Leave(KErrNotFound);
+		}
+	CleanupStack::PopAndDestroy(serviceEntrySelection);	
+
+	return returnEntry;
+	}