os/persistentdata/persistentstorage/sql/SRC/Security/SqlSecurityImpl.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200 (2014-06-10)
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <s32buf.h>
sl@0
    17
#include "SqlSecurityImpl.h"
sl@0
    18
#include "SqlUtil.h"
sl@0
    19
sl@0
    20
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
sl@0
    21
////////////////////////////    CSqlSecurityPolicy implementation      ////////////////////////////////////////
sl@0
    22
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
sl@0
    23
sl@0
    24
/**
sl@0
    25
Casts aPolicyType parameter to an integer value, which is used as policy index.
sl@0
    26
sl@0
    27
@param aPolicyType Security policy type: schema, write, read
sl@0
    28
sl@0
    29
@return Security policy type casted to an integer value, which is used as a poicy index
sl@0
    30
*/
sl@0
    31
inline TInt CSqlSecurityPolicy::PolicyType2Index(RSqlSecurityPolicy::TPolicyType aPolicyType)
sl@0
    32
	{
sl@0
    33
	return static_cast <TInt> (aPolicyType);
sl@0
    34
	}
sl@0
    35
sl@0
    36
/**
sl@0
    37
Returns a pointer to the data of the current flat buffer cell. The pointer type is CSqlSecurityPolicy::TPolicyItem.
sl@0
    38
sl@0
    39
@param aBegin Points to the beginning of flat buffer header
sl@0
    40
@param aCurrent Points to a cell in the flat buffer header, to which data a pointer will be cast and returned.
sl@0
    41
sl@0
    42
@return CSqlSecurityPolicy::TPolicyItem pointer, which can be used for R/W operations on the database security policy data.
sl@0
    43
*/
sl@0
    44
inline CSqlSecurityPolicy::TPolicyItem* CSqlSecurityPolicy::PolicyItemPtr(const RSqlBufFlat::TCell* aBegin, const RSqlBufFlat::TCell* aCurrent)
sl@0
    45
	{
sl@0
    46
	__ASSERT_DEBUG(aBegin != NULL && aCurrent != NULL, __SQLPANIC2(ESqlPanicBadArgument));
sl@0
    47
	__ASSERT_DEBUG(aCurrent->iPos != 0, __SQLPANIC2(ESqlPanicBadArgument));
sl@0
    48
	const TUint8* begin = reinterpret_cast <const TUint8*> (aBegin);
sl@0
    49
	return reinterpret_cast <CSqlSecurityPolicy::TPolicyItem*> (const_cast <TUint8*> (begin) + aCurrent->iPos);
sl@0
    50
	}
sl@0
    51
sl@0
    52
/**
sl@0
    53
Searhes the flat buffer for an entry, which "object type" and "object name" attributes match aObjectType and aObjectName parameters.
sl@0
    54
If such entry exists, a pointer to the entry's data will be returned.
sl@0
    55
sl@0
    56
@param aObjectType Database object type
sl@0
    57
@param aObjectName Database object name
sl@0
    58
sl@0
    59
@return A pointer to the data of an entry which "object type" and "object name" attributes match aObjectType and aObjectName parameters.
sl@0
    60
		If no such entry exists, the function returns NULL.
sl@0
    61
*/
sl@0
    62
const CSqlSecurityPolicy::TPolicyItem* CSqlSecurityPolicy::FindPolicyItemPtr(RSqlSecurityPolicy::TObjectType aObjectType, 
sl@0
    63
																	   		 const TDesC& aObjectName) const
sl@0
    64
	{
sl@0
    65
	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
sl@0
    66
	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
    67
	const RSqlBufFlat::TCell* end = begin + Count();
sl@0
    68
	const RSqlBufFlat::TCell* current = begin + CSqlSecurityPolicy::EDbPolicyIdx;//ignore default and database policiy types ("current" points before the first non-database policy)
sl@0
    69
	while(++current < end)
sl@0
    70
		{
sl@0
    71
		if(current->iPos > 0 && current->Type() == (TInt)aObjectType) //if present and the same type as aObjectType
sl@0
    72
			{
sl@0
    73
			const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, current);
sl@0
    74
			__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
    75
			__ASSERT_DEBUG(((current->Size() - sizeof(CSqlSecurityPolicy::TPolicyItem) - sizeof(TInt)) / sizeof(TUint16)) == item->NameSize(), __SQLPANIC(ESqlPanicInternalError));
sl@0
    76
			if(::CompareNoCase16(aObjectName, TPtrC(item->NamePtr(), item->NameSize())) == 0)
sl@0
    77
				{
sl@0
    78
				return item;	
sl@0
    79
				}
sl@0
    80
			}
sl@0
    81
		}
sl@0
    82
	return NULL;
sl@0
    83
	}
sl@0
    84
		
sl@0
    85
/**
sl@0
    86
Standard, phase-one CSqlSecurityPolicy factory method.
sl@0
    87
sl@0
    88
@param aDefaultPolicy Default security policy which will be used as a default replacement for all database and
sl@0
    89
                      database object security policies.
sl@0
    90
sl@0
    91
@return A pointer to the created CSqlSecurityPolicy instance.
sl@0
    92
sl@0
    93
@leave KErrNoMemory, an out of memory condition has occurred;
sl@0
    94
*/
sl@0
    95
CSqlSecurityPolicy* CSqlSecurityPolicy::NewL(const TSecurityPolicy& aDefaultPolicy)
sl@0
    96
	{
sl@0
    97
	CSqlSecurityPolicy* self = CSqlSecurityPolicy::NewLC(aDefaultPolicy);
sl@0
    98
	CleanupStack::Pop(self);
sl@0
    99
	return self;
sl@0
   100
	}
sl@0
   101
sl@0
   102
/**
sl@0
   103
Standard, phase-one CSqlSecurityPolicy factory method.
sl@0
   104
sl@0
   105
@param aDefaultPolicy Default security policy which will be used as a default replacement for all database and
sl@0
   106
                      database object security policies.
sl@0
   107
sl@0
   108
@return A pointer to the created CSqlSecurityPolicy instance.
sl@0
   109
sl@0
   110
@leave KErrNoMemory, an out of memory condition has occurred;
sl@0
   111
*/
sl@0
   112
CSqlSecurityPolicy* CSqlSecurityPolicy::NewLC(const TSecurityPolicy& aDefaultPolicy)
sl@0
   113
	{
sl@0
   114
	CSqlSecurityPolicy* self = new (ELeave) CSqlSecurityPolicy;
sl@0
   115
	CleanupStack::PushL(self);
sl@0
   116
	self->ConstructL(aDefaultPolicy);
sl@0
   117
	return self;
sl@0
   118
	}
sl@0
   119
sl@0
   120
/**
sl@0
   121
*/
sl@0
   122
CSqlSecurityPolicy::~CSqlSecurityPolicy()
sl@0
   123
	{
sl@0
   124
	iBufFlat.Close();
sl@0
   125
	}
sl@0
   126
sl@0
   127
/**
sl@0
   128
@return A const reference to the flat buffer
sl@0
   129
*/
sl@0
   130
const RSqlBufFlat& CSqlSecurityPolicy::BufFlat() const
sl@0
   131
	{
sl@0
   132
	return iBufFlat;
sl@0
   133
	}
sl@0
   134
sl@0
   135
/**
sl@0
   136
@return A reference to the flat buffer
sl@0
   137
*/
sl@0
   138
RSqlBufFlat& CSqlSecurityPolicy::BufFlat()
sl@0
   139
	{
sl@0
   140
	return iBufFlat;
sl@0
   141
	}
sl@0
   142
sl@0
   143
/**
sl@0
   144
@return Database security policy entry count. This number is at least 2, because every CSqlSecurityPolicy object has by default
sl@0
   145
        one default security policy entry and one database security policy entry.
sl@0
   146
*/
sl@0
   147
TInt CSqlSecurityPolicy::Count() const
sl@0
   148
	{
sl@0
   149
	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
sl@0
   150
	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   151
	return *reinterpret_cast <const TInt*> (reinterpret_cast <const TUint8*> (begin) + (begin + CSqlSecurityPolicy::ECountIdx)->iPos);
sl@0
   152
	}
sl@0
   153
sl@0
   154
/**
sl@0
   155
Sets the number of database security entries.
sl@0
   156
*/
sl@0
   157
void CSqlSecurityPolicy::SetCount(TInt aCount)
sl@0
   158
	{
sl@0
   159
	__ASSERT_DEBUG(aCount >= 0, __SQLPANIC(ESqlPanicBadArgument));
sl@0
   160
	RSqlBufFlat::TCell* begin = iBufFlat.Header();
sl@0
   161
	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   162
	*reinterpret_cast <TInt*> (reinterpret_cast <TUint8*> (begin) + (begin + CSqlSecurityPolicy::ECountIdx)->iPos) = aCount;
sl@0
   163
	}
sl@0
   164
sl@0
   165
/**
sl@0
   166
Sets the default policy.
sl@0
   167
*/
sl@0
   168
void CSqlSecurityPolicy::SetDefaultPolicy(const TSecurityPolicy& aPolicy)
sl@0
   169
	{
sl@0
   170
	RSqlBufFlat::TCell* begin = iBufFlat.Header();
sl@0
   171
	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   172
	CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDefaultPolicyIdx);
sl@0
   173
	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   174
	item->iPolicy[0] = aPolicy;
sl@0
   175
	}
sl@0
   176
	
sl@0
   177
/**
sl@0
   178
@param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy, 
sl@0
   179
				   RSqlSecurityPolicy::EReadPolicy, RSqlSecurityPolicy::EWritePolicy.
sl@0
   180
@param aPolicy Security policy data used for setting the related database security policy.
sl@0
   181
sl@0
   182
@panic SqlDb 4 In _DEBUG mode. Invalid policy type.
sl@0
   183
*/
sl@0
   184
void CSqlSecurityPolicy::SetDbPolicy(RSqlSecurityPolicy::TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
sl@0
   185
	{
sl@0
   186
	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
sl@0
   187
	__ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
sl@0
   188
	RSqlBufFlat::TCell* begin = iBufFlat.Header();
sl@0
   189
	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   190
	CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDbPolicyIdx);
sl@0
   191
	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   192
	//KPolicyIndex value is tested at the beginning of the function
sl@0
   193
	//coverity[overrun-local]
sl@0
   194
	item->iPolicy[KPolicyIndex] = aPolicy;
sl@0
   195
	}
sl@0
   196
sl@0
   197
/**
sl@0
   198
If there is no entry in the container for the object with aObjectName name, a new entry for this object will be 
sl@0
   199
created and all object security policies will be initialized with the default security policy. aPolicyType object 
sl@0
   200
policy will be reinitialized with aPolicy argument after that.
sl@0
   201
sl@0
   202
If an entry for aObjectName object already exists, its aPolicyType security policy will be reinitialized with aPolicy
sl@0
   203
argument.
sl@0
   204
sl@0
   205
@param aObjectType Database object type. At the moment there is only one database object type allowed for use with
sl@0
   206
					SetPolicy() - RSqlSecurityPolicy::ETable.
sl@0
   207
@param aObjectName Database object name. It cannot be a null descriptor.
sl@0
   208
@param aPolicyType Database object security policy type: RSqlSecurityPolicy::EReadPolicy, 
sl@0
   209
				   RSqlSecurityPolicy::EWritePolicy.
sl@0
   210
@param aPolicy Security policy data used for setting the related database object security policy type.
sl@0
   211
sl@0
   212
@return KErrNone, operation completed successfully;
sl@0
   213
		KErrNoMemory, an out of memory condition has occurred;
sl@0
   214
		KErrNotSupported, the count of the security policies is too big.
sl@0
   215
sl@0
   216
@panic SqlDb 4 In _DEBUG mode. Invalid policy type.
sl@0
   217
@panic SqlDb 4 In _DEBUG mode. Invalid database object name (Null descriptor).
sl@0
   218
*/
sl@0
   219
TInt CSqlSecurityPolicy::SetPolicy(RSqlSecurityPolicy::TObjectType aObjectType, const TDesC& aObjectName,
sl@0
   220
							   	   RSqlSecurityPolicy::TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
sl@0
   221
	{
sl@0
   222
	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
sl@0
   223
	__ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
sl@0
   224
	__ASSERT_DEBUG(aObjectName.Length() > 0, __SQLPANIC(ESqlPanicBadArgument));
sl@0
   225
	CSqlSecurityPolicy::TPolicyItem* item = const_cast <CSqlSecurityPolicy::TPolicyItem*> (FindPolicyItemPtr(aObjectType, aObjectName));
sl@0
   226
	if(item)
sl@0
   227
		{//There is a field in the flat buffer for {aObjectType, aObjectName}. Set the policy.
sl@0
   228
		//KPolicyIndex value is tested at the beginning of the function
sl@0
   229
		//coverity[overrun-local]
sl@0
   230
		item->iPolicy[KPolicyIndex] = aPolicy;
sl@0
   231
		return KErrNone;
sl@0
   232
		}
sl@0
   233
	//No field in the flat buffer for {aObjectType, aObjectName}.
sl@0
   234
	TInt idx = Count();
sl@0
   235
	if(idx >= iBufFlat.Count())
sl@0
   236
		{
sl@0
   237
		return KErrNotSupported;
sl@0
   238
		}
sl@0
   239
	//Create and fill a new CSqlSecurityPolicy::TPolicyItem object.
sl@0
   240
	const TInt KPolicyDataLen = TPolicyItem::CalcSize(aObjectName.Length());
sl@0
   241
	TUint8* buf = new TUint8[KPolicyDataLen];
sl@0
   242
	if(!buf)
sl@0
   243
		{
sl@0
   244
		return KErrNoMemory;	
sl@0
   245
		}
sl@0
   246
	item = reinterpret_cast <CSqlSecurityPolicy::TPolicyItem*> (buf);
sl@0
   247
	//coverity[DEADCODE]
sl@0
   248
	//The ASSERT might be useful in catching future defect in this function
sl@0
   249
	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   250
	TSecurityPolicy defaultPolicy = DefaultPolicy();
sl@0
   251
	for(TInt i=0;i<CSqlSecurityPolicy::EPolicyTypeCount;++i)
sl@0
   252
		{
sl@0
   253
		item->iPolicy[i] = defaultPolicy;
sl@0
   254
		}
sl@0
   255
	item->iPolicy[KPolicyIndex] = aPolicy;
sl@0
   256
	//Set the object name length and the object name.
sl@0
   257
	*item->NameSizePtr() = aObjectName.Length();
sl@0
   258
	TPtr name(item->NamePtr(), item->NameSize());
sl@0
   259
	name.Copy(aObjectName);
sl@0
   260
	//Copy the item in iBufFlat and release the allocated memory.
sl@0
   261
	TInt err = iBufFlat.SetField(idx, (TInt)aObjectType, item, KPolicyDataLen);
sl@0
   262
	delete [] buf;
sl@0
   263
	if(err == KErrNone)
sl@0
   264
		{
sl@0
   265
		SetCount(idx + 1);
sl@0
   266
		}
sl@0
   267
	return err;
sl@0
   268
	}
sl@0
   269
sl@0
   270
/**
sl@0
   271
@return The default security policy.
sl@0
   272
*/
sl@0
   273
TSecurityPolicy CSqlSecurityPolicy::DefaultPolicy() const
sl@0
   274
	{
sl@0
   275
	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
sl@0
   276
	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   277
	const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDefaultPolicyIdx);
sl@0
   278
	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   279
	return item->iPolicy[0];
sl@0
   280
	}
sl@0
   281
	
sl@0
   282
/**
sl@0
   283
@param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy, 
sl@0
   284
				   RSqlSecurityPolicy::EReadPolicy, RSqlSecurityPolicy::EWritePolicy.
sl@0
   285
sl@0
   286
Note: By default all database security policies will be initialized with the default security policy.
sl@0
   287
sl@0
   288
@return The requested database security policy.
sl@0
   289
				   
sl@0
   290
@panic SqlDb 4 In _DEBUG mode. Invalid policy type.
sl@0
   291
*/
sl@0
   292
TSecurityPolicy CSqlSecurityPolicy::DbPolicy(RSqlSecurityPolicy::TPolicyType aPolicyType) const
sl@0
   293
	{
sl@0
   294
	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
sl@0
   295
	__ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
sl@0
   296
	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
sl@0
   297
	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   298
	const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDbPolicyIdx);
sl@0
   299
	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   300
	//KPolicyIndex value is tested at the beginning of the function
sl@0
   301
	//coverity[overrun-local]
sl@0
   302
	return item->iPolicy[KPolicyIndex];
sl@0
   303
	}
sl@0
   304
	
sl@0
   305
/**
sl@0
   306
Searches the container for an entry belonging to an object with aObjectName name and aObjectType type. If such entry
sl@0
   307
exists the method returns aPolicyType object security policy.
sl@0
   308
sl@0
   309
If there is no entry for the object with aObjectName name, the default security policy will be returned.
sl@0
   310
sl@0
   311
@param aObjectType Database object type. At the moment there is only one database object type allowed for use with
sl@0
   312
					Policy() - RSqlSecurityPolicy::ETable.
sl@0
   313
@param aObjectName Database object name. It cannot be a null descriptor.
sl@0
   314
@param aPolicyType Database object security policy type: RSqlSecurityPolicy::ERead, RSqlSecurityPolicy::EWrite.
sl@0
   315
sl@0
   316
Note: By default all database object security policies will be initialized with the default security policy. 
sl@0
   317
	  
sl@0
   318
@return The requested security policy
sl@0
   319
sl@0
   320
@panic SqlDb 4 In _DEBUG mode. Invalid policy type.
sl@0
   321
@panic SqlDb 4 In _DEBUG mode. Invalid onject name (Null descriptor).
sl@0
   322
*/
sl@0
   323
TSecurityPolicy CSqlSecurityPolicy::Policy(RSqlSecurityPolicy::TObjectType aObjectType, 
sl@0
   324
										   const TDesC& aObjectName, RSqlSecurityPolicy::TPolicyType aPolicyType)
sl@0
   325
	{
sl@0
   326
	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
sl@0
   327
	__ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
sl@0
   328
	__ASSERT_DEBUG(aObjectName.Length() > 0, __SQLPANIC(ESqlPanicBadArgument));
sl@0
   329
	const CSqlSecurityPolicy::TPolicyItem* item = FindPolicyItemPtr(aObjectType, aObjectName);
sl@0
   330
	//KPolicyIndex value is tested at the beginning of the function
sl@0
   331
	//coverity[overrun-local]
sl@0
   332
	return item ? item->iPolicy[KPolicyIndex] : DefaultPolicy();
sl@0
   333
	}
sl@0
   334
sl@0
   335
/**
sl@0
   336
*/
sl@0
   337
CSqlSecurityPolicy::CSqlSecurityPolicy()
sl@0
   338
	{
sl@0
   339
	}
sl@0
   340
sl@0
   341
/**
sl@0
   342
Standard, phase-two CSqlSecurityPolicy construction method.
sl@0
   343
sl@0
   344
Note: By default all database security policies will be initialized with the default security policy.
sl@0
   345
sl@0
   346
@param aDefaultPolicy Security policy data used for setting the default database security policy and
sl@0
   347
                      database security policies.
sl@0
   348
sl@0
   349
@leave KErrNoMemory, an out of memory condition has occurred;
sl@0
   350
*/
sl@0
   351
void CSqlSecurityPolicy::ConstructL(const TSecurityPolicy& aDefaultPolicy)
sl@0
   352
	{
sl@0
   353
	//Create the policy flat buffer.
sl@0
   354
	__SQLLEAVE_IF_ERROR(iBufFlat.SetCount(CSqlSecurityPolicy::EMaxCount));
sl@0
   355
	//Reserve places for the default policy and database policies.
sl@0
   356
	CSqlSecurityPolicy::TPolicyItem item;
sl@0
   357
	for(TInt i=0;i<CSqlSecurityPolicy::EPolicyTypeCount;++i)
sl@0
   358
		{
sl@0
   359
		item.iPolicy[i]	= aDefaultPolicy;
sl@0
   360
		}
sl@0
   361
	TInt count = CSqlSecurityPolicy::EDbPolicyIdx + 1;//count + default policy + database policy;
sl@0
   362
	__SQLLEAVE_IF_ERROR(iBufFlat.SetField(CSqlSecurityPolicy::ECountIdx, 0, &count, sizeof(count)));
sl@0
   363
	__SQLLEAVE_IF_ERROR(iBufFlat.SetField(CSqlSecurityPolicy::EDefaultPolicyIdx, 0, &item, sizeof(item) - sizeof(TSecurityPolicy) * (CSqlSecurityPolicy::EPolicyTypeCount - 1)));
sl@0
   364
	__SQLLEAVE_IF_ERROR(iBufFlat.SetField(CSqlSecurityPolicy::EDbPolicyIdx, 0, &item, sizeof(item)));
sl@0
   365
	}
sl@0
   366
sl@0
   367
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
sl@0
   368
////////////////////           TSqlSecurityPolicyIterator  implementation        //////////////////////////////
sl@0
   369
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
sl@0
   370
sl@0
   371
/**
sl@0
   372
@param aSecuritySettings Const reference to CSqlSecurityPolicy object on which content the iterator will work.
sl@0
   373
*/
sl@0
   374
TSqlSecurityPolicyIterator::TSqlSecurityPolicyIterator(const CSqlSecurityPolicy& aSqlSecurityPolicy) :
sl@0
   375
	iBegin(aSqlSecurityPolicy.iBufFlat.Header()),
sl@0
   376
	iCurrent(iBegin + CSqlSecurityPolicy::EDbPolicyIdx),//ignore the default and database policies
sl@0
   377
	iEnd(iBegin + aSqlSecurityPolicy.Count()),
sl@0
   378
	iCurPolicyIdx(CSqlSecurityPolicy::EPolicyTypeCount)
sl@0
   379
	{
sl@0
   380
	__ASSERT_DEBUG(iBegin != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   381
	}
sl@0
   382
	
sl@0
   383
/**
sl@0
   384
Moves the iterator one step forward and gives a read-only access to the next database object security policy.
sl@0
   385
sl@0
   386
@param aObjectType Output parameter. Next database object type, if the iteration was successful.
sl@0
   387
@param aObjectName Output parameter. Set to point to the next database object name, if the iteration was successful.
sl@0
   388
@param aPolicyType Output parameter. Next database object security policy type, if the iteration was successful.
sl@0
   389
@param aPolicy     Output parameter. Next database object security policy, if the iteration was successful.
sl@0
   390
sl@0
   391
@return Non-zero - successful iteration step, zero otherwise (no more security policies in the CSqlSecurityPolicy container).
sl@0
   392
*/
sl@0
   393
TBool TSqlSecurityPolicyIterator::Next(RSqlSecurityPolicy::TObjectType& aObjectType, TPtrC& aObjectName, 
sl@0
   394
									   RSqlSecurityPolicy::TPolicyType& aPolicyType, TSecurityPolicy& aPolicy)
sl@0
   395
	{
sl@0
   396
	if(++iCurPolicyIdx >= CSqlSecurityPolicy::EPolicyTypeCount)
sl@0
   397
		{
sl@0
   398
		iCurPolicyIdx = static_cast <TInt> (RSqlSecurityPolicy::EReadPolicy);
sl@0
   399
		if(++iCurrent >= iEnd)
sl@0
   400
			{
sl@0
   401
			return EFalse;	
sl@0
   402
			}
sl@0
   403
		}
sl@0
   404
	const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(iBegin, iCurrent);
sl@0
   405
	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
sl@0
   406
	aObjectType = static_cast <RSqlSecurityPolicy::TObjectType> (iCurrent->Type());
sl@0
   407
	aPolicyType = static_cast <RSqlSecurityPolicy::TPolicyType> (iCurPolicyIdx);
sl@0
   408
	aPolicy = item->iPolicy[iCurPolicyIdx];
sl@0
   409
	aObjectName.Set(item->NamePtr(), item->NameSize());
sl@0
   410
	return ETrue;		
sl@0
   411
	}