authorisation/userpromptservice/server/source/upsclient/rupsmanagement.cpp
changeset 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/authorisation/userpromptservice/server/source/upsclient/rupsmanagement.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,304 @@
+/*
+* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+* RUpsManagement implementation.	 See class and function definitions
+* for more detail.
+*
+*/
+
+
+/**
+ @file
+*/
+
+
+#include <ups/upsclient.h>
+#include <s32mem.h>
+
+#include "upscommon.h"
+#include <scs/nullstream.h>
+
+namespace UserPromptService
+	{
+EXPORT_C RUpsManagement::RUpsManagement()
+/**
+	This constructor provides a single point of definition from
+	which the superclass constructor is called.
+ */
+:	RScsClientBase(), iCreateViewFilterBuf(), iMatchLengthBuf()
+	{
+	iMatchLengthBuf() = 0;
+	}
+
+EXPORT_C TInt RUpsManagement::Connect()
+/**
+	Connect to the UPS server.
+
+	@return					Symbian OS error code where KErrNone indicates
+							success and any other value indicates failure.
+ */
+	{
+	TVersion v = UserPromptService::Version();
+	TUidType serverFullUid = UserPromptService::ServerImageFullUid();
+
+	TInt r = RScsClientBase::Connect(
+		UserPromptService::KUpsServerName, v, UserPromptService::KServerImageName, serverFullUid);
+	
+	return r;
+	}
+	
+EXPORT_C void RUpsManagement::Close()
+/**
+Cleanup and call RScsClientBase::Close
+*/
+	{
+	RScsClientBase::Close();
+	}
+
+EXPORT_C void RUpsManagement::DeleteDatabaseL()
+/**
+	Deletes all stored UPS decisions.
+
+	@capability WriteDeviceData 
+*/
+	{
+	User::LeaveIfError(CallSessionFunction(EDeleteDatabase));
+	}
+
+EXPORT_C void RUpsManagement::CreateView(const CDecisionFilter& aFilter, TRequestStatus &aStatus)
+/**
+	Creates a view for records which match the supplied CDecisionFilter.
+
+	If the CDecisionFilter is created using the constructor which specifies all fields (or all fields are set), then an exact match will be
+	searched for.
+	If the CDecisionFilter is created without parameters, then any fields which are not set will match any record.
+
+	Only one view can be active in a single RUpsManagement session at any one time.
+
+	Simultaneous database updates, either from this management session, another session or the main UPS 
+	operation may cause the query to be aborted with KErrAbort.
+
+	When you are finished with the view you should call CancelAndCloseView (otherwise you
+	will not be able to create a new view).
+
+	@param aFilter	Specifies the filter to be matched.
+	@capability ReadDeviceData 
+*/
+{
+	aStatus = KRequestPending;
+	TRAPD(err,
+		RNullWriteStream nullstream;
+		nullstream << aFilter;
+		nullstream.CommitL();
+		TInt bytesWritten = nullstream.BytesWritten();
+
+		iCreateViewFilterBuf.Close();
+		iCreateViewFilterBuf.CreateL(bytesWritten);
+
+		// Arg 0 - The CDecisionFilter
+		// Externalize to iCreateViewFilterBuf
+		RDesWriteStream desstream(iCreateViewFilterBuf);
+		CleanupClosePushL(desstream);
+		desstream << aFilter;
+		desstream.CommitL();
+		CleanupStack::PopAndDestroy(&desstream);
+
+		// Arg 1 - TUint32 length of first match returned by server
+		// Server writes into iMatchLengthBuf
+		CallSessionFunction(ECreateView, TIpcArgs(&iCreateViewFilterBuf, &iMatchLengthBuf), aStatus);
+		);
+	if(err != KErrNone)
+		{
+		TRequestStatus *rs = &aStatus;
+		User::RequestComplete(rs, err);
+		}
+}
+
+EXPORT_C CDecisionRecord *RUpsManagement::NextMatchL()
+/**
+	Returns the next matching record in the view created with CreateViewL.
+
+	Simultaneous database updates, either from this management session, another session or the main UPS 
+	operation may cause the query to be aborted with KErrAbort.
+
+	When you are finished with the view you should call CancelAndCloseView.
+
+	@return record ptr, or 0 if there are no more matching records. Leaves for other errors.
+
+	@capability ReadDeviceData 
+*/
+{
+	if(iMatchLengthBuf() == 0)
+		{
+		return 0; // No more matches
+		}
+
+	CDecisionRecord *record = CDecisionRecord::NewLC();
+
+	// Arg 0 - The CDecisionRecord buffer
+	RBuf8 buf;
+	CleanupClosePushL(buf);
+	buf.CreateL(iMatchLengthBuf());
+
+	// Arg 1 - TUint32 length of next match
+
+	User::LeaveIfError(CallSessionFunction(ENextMatch, TIpcArgs(&buf, &iMatchLengthBuf)));
+
+	RDesReadStream readStream(buf);
+	CleanupClosePushL(readStream);
+
+	readStream >> *record;
+
+	CleanupStack::PopAndDestroy(&readStream);
+	CleanupStack::PopAndDestroy(&buf);
+	CleanupStack::Pop(record);
+	return record;
+}
+
+EXPORT_C void RUpsManagement::CancelAndCloseView()
+	/**
+	Close down a view. This can also be used to cancel an outstanding CreateView request.
+
+	@capability ReadDeviceData 
+	*/
+{
+	CancelSessionFunction(ECreateView);
+	(void) CallSessionFunction(ECloseView);
+	iCreateViewFilterBuf.Close();
+	iMatchLengthBuf() = 0;
+}
+
+EXPORT_C void RUpsManagement::RemoveDecisionsL(const CDecisionFilter& aFilter)
+/**
+	Removes all records which match the supplied CDecisionFilter.
+
+	The filter can match/delete multiple records in one operation.
+	
+	@param aFilter	Specifies the records to be deleted.
+
+	@capability WriteDeviceData 
+*/
+	{
+	// Calculate the buffer length required to represent the filter object
+	RNullWriteStream nullstream;
+	nullstream << aFilter;
+	nullstream.CommitL();
+	TInt bytesWritten = nullstream.BytesWritten();
+
+	// Create buffer for filter
+	RBuf8 filterBuf;
+	CleanupClosePushL(filterBuf);
+	filterBuf.CreateL(bytesWritten);
+
+	// Arg 0 - The CDecisionFilter
+	// Externalize to iCreateViewFilterBuf
+	RDesWriteStream desstream(filterBuf);
+	CleanupClosePushL(desstream);
+	desstream << aFilter;
+	desstream.CommitL();
+	CleanupStack::PopAndDestroy(&desstream);
+
+	User::LeaveIfError(CallSessionFunction(ERemoveDecisions, TIpcArgs(&filterBuf)));
+
+	CleanupStack::PopAndDestroy(&filterBuf);
+	}
+
+EXPORT_C void RUpsManagement::UpdateDecision(TUint32 aRecordId, TBool aAllow, TRequestStatus &aStatus)
+/**
+	Updates the single record which matches the unique record ID.
+
+	This API ONLY updates the CDecisionRecord result field. The only legal values are ETrue (always) or EFalse (never)
+	
+	@param aRecordId	Specifies the single record to update.
+	@param aAllow		Allow or reject the request.
+	
+	@capability AllFiles 
+*/
+	{
+	TIpcArgs args(aRecordId, aAllow);
+	CallSessionFunction(EUpdateDecision, args, aStatus);
+	}
+
+EXPORT_C void RUpsManagement::CancelUpdateDecision()
+/**
+	Cancel an outstanding UpdateDecision request.
+	
+	Normally this will not be used because an UpdateDecision call will complete very quickly, but
+	internally the request is asynchronous and exposing the cancel API allows the cancel code path
+	to be tested.
+
+	@capability AllFiles 
+*/
+	{
+	CancelSessionFunction(EUpdateDecision);
+	}
+
+EXPORT_C void RUpsManagement::DeleteDecisionsForExeL(const TSecureId& aExeSid)
+/**
+	Delete all decisions in the database for the specified executable.
+
+	@param aExeSid	The SID of the executable which has been deleted.
+
+	@capability SWI observer plugin SID only
+*/
+	{
+	User::LeaveIfError(CallSessionFunction(EDeleteDecisionsForExe, TIpcArgs(aExeSid.iId)));
+	}
+
+EXPORT_C void RUpsManagement::NotifyPluginsMayHaveChangedL()
+/**
+	Notify the UPS that an ECOM plugin has been installed somewhere, which may be an evaluator.
+	The UPS will reload all ECOM plugins ASAP.
+
+	@capability SWI observer plugin SID only
+*/
+	{
+	User::LeaveIfError(CallSessionFunction(ENotifyPluginsMayHaveChanged));
+	}
+
+EXPORT_C void RUpsManagement::NotifyPolicyFilesChanged(TRequestStatus &aStatus)
+/**
+	Policy files have been added, changed or deleted.
+
+	The UPS server will rebuild its policy file cache and delete decisions which relate to policy files
+	which are no longer active (ie. have been deleted, or eclipsed by a policy file with a different
+	major version number).
+
+	@capability SWI observer plugin SID only
+*/
+	{
+	TIpcArgs args;
+	CallSessionFunction(ENotifyPolicyFilesChanged, args, aStatus);
+
+	}
+
+EXPORT_C void RUpsManagement::CancelNotifyPolicyFilesChanged()
+	/**
+	Cancel a previous call to NotifyPolicyFilesChanged.
+
+	Normally this functions should not be used, it is only present for testing the handling
+	of abnormal events.
+
+	@capability SWI observer plugin SID only
+	*/
+	{
+	CancelSessionFunction(ENotifyPolicyFilesChanged);
+	}
+
+
+
+} // End of namespace UserPromptService
+
+// End of file
+