diff -r 675a964f4eb5 -r 35751d3474b7 authorisation/userpromptservice/server/source/upsclient/rupsmanagement.cpp --- /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 +#include + +#include "upscommon.h" +#include + +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 +