os/security/contentmgmt/contentaccessfwfordrm/source/caf/agentinfo.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include <ecom/ecom.h>
sl@0
    20
#include "agentinfo.h"
sl@0
    21
#include <caf/agent.h>
sl@0
    22
#include <caf/agentfactory.h>
sl@0
    23
#include <caf/agentinterface.h>
sl@0
    24
sl@0
    25
using namespace ContentAccess;
sl@0
    26
sl@0
    27
// Default buffer size of zero
sl@0
    28
const TInt KCafApparcBufferSize = 0;
sl@0
    29
sl@0
    30
CAgentInfo* CAgentInfo::NewLC(const CImplementationInformation& aImplInfo)
sl@0
    31
	{
sl@0
    32
	CAgentInfo* self = new (ELeave) CAgentInfo;
sl@0
    33
	CleanupStack::PushL(self);
sl@0
    34
	self->ConstructL(aImplInfo);
sl@0
    35
	return self;
sl@0
    36
	}
sl@0
    37
sl@0
    38
CAgentInfo::CAgentInfo()
sl@0
    39
	{
sl@0
    40
	}
sl@0
    41
sl@0
    42
CAgentInfo::~CAgentInfo()
sl@0
    43
	{
sl@0
    44
	iSupplierMimeTypes.ResetAndDestroy();
sl@0
    45
	iSupplierMimeTypes.Close();
sl@0
    46
	iConsumerMimeTypes.ResetAndDestroy();
sl@0
    47
	iConsumerMimeTypes.Close();
sl@0
    48
	
sl@0
    49
	// Delete the agent manager and agent factory, this may unload the agent DLL
sl@0
    50
	delete iAgentManager;
sl@0
    51
	delete iAgentFactory;
sl@0
    52
	}
sl@0
    53
sl@0
    54
sl@0
    55
void CAgentInfo::ConstructL(const CImplementationInformation& aImplInfo)
sl@0
    56
	{
sl@0
    57
	// Set up the agent member with the name and Uid of the agent
sl@0
    58
	iAgent.SetValue(aImplInfo.DisplayName(), aImplInfo.ImplementationUid());
sl@0
    59
sl@0
    60
	// get the name of the agents private directory
sl@0
    61
	TInt length = aImplInfo.OpaqueData().Length();
sl@0
    62
	if(length > KMaxSIDLength)
sl@0
    63
		{
sl@0
    64
		User::Leave(KErrCorrupt);
sl@0
    65
		}
sl@0
    66
	else
sl@0
    67
		{
sl@0
    68
		iPrivateDirectoryName.Copy(aImplInfo.OpaqueData().Left(KMaxSIDLength));
sl@0
    69
		}
sl@0
    70
			
sl@0
    71
	// Extract from the data field from the info.
sl@0
    72
	// The data field should be of the form:
sl@0
    73
	// "<bufferlength>|<supplier1>,<supplier2>,....,<suppliern>:<consumer1>,<consumer2>"
sl@0
    74
	// bufferlength is the desired length of the buffer passed from apparc to DoRecognize
sl@0
    75
	TPtrC8 data(aImplInfo.DataType());
sl@0
    76
	TPtrC8 supplier(KNullDesC8());
sl@0
    77
	TPtrC8 consumer(KNullDesC8());
sl@0
    78
sl@0
    79
	// Search for the "|" field to delimit buffersize and supplier mime types
sl@0
    80
	TInt index = data.LocateF('|');
sl@0
    81
	if(index < 0)
sl@0
    82
		{
sl@0
    83
		// No default buffersize, ie. corrupt
sl@0
    84
		User::Leave(KErrCorrupt);
sl@0
    85
		}
sl@0
    86
	else
sl@0
    87
		{
sl@0
    88
		TPtrC8 buffersize(data.Left(index));
sl@0
    89
		TLex8 bufferLex(buffersize);
sl@0
    90
		bufferLex.Val(iPreferredBufferSize);
sl@0
    91
sl@0
    92
		// Make sure a buffer size was actually specified before the | character
sl@0
    93
		if(iPreferredBufferSize == 0)
sl@0
    94
			{
sl@0
    95
			iPreferredBufferSize = KCafApparcBufferSize;
sl@0
    96
			}
sl@0
    97
sl@0
    98
		// Make sure '|' is not the last character
sl@0
    99
		if (index + 1 < data.Length())
sl@0
   100
			{
sl@0
   101
			data.Set(aImplInfo.DataType().Mid(index + 1));
sl@0
   102
			}
sl@0
   103
		else 
sl@0
   104
			{
sl@0
   105
			User::Leave(KErrCorrupt);
sl@0
   106
			}
sl@0
   107
		}
sl@0
   108
sl@0
   109
	
sl@0
   110
	// Search for the ":" field to delimit supplier and consumer
sl@0
   111
	index = data.LocateF(':');
sl@0
   112
	
sl@0
   113
	// If the colon was present, then set the pointers appropriately
sl@0
   114
	if (index >= 0)
sl@0
   115
		{
sl@0
   116
		// Set supplier pointer
sl@0
   117
		supplier.Set(data.Left(index));
sl@0
   118
sl@0
   119
		// Check that ':' is not the last character before setting consumer pointer
sl@0
   120
		if (index + 1 < data.Length())
sl@0
   121
			{
sl@0
   122
			consumer.Set(data.Mid(index + 1));
sl@0
   123
			}
sl@0
   124
		}
sl@0
   125
	else
sl@0
   126
		{
sl@0
   127
		User::Leave(KErrCorrupt);
sl@0
   128
		}
sl@0
   129
sl@0
   130
	// Now parse the supplier mime types
sl@0
   131
	ParseMimeTypesL(supplier, iSupplierMimeTypes);
sl@0
   132
	
sl@0
   133
	// Do the same for the consumer mime types
sl@0
   134
	ParseMimeTypesL(consumer, iConsumerMimeTypes);
sl@0
   135
	}
sl@0
   136
sl@0
   137
CAgentFactory& CAgentInfo::AgentFactoryL()
sl@0
   138
	{
sl@0
   139
	// Create the agent factory if it hasn't been done already
sl@0
   140
	if (!iAgentFactory)
sl@0
   141
		{
sl@0
   142
		iAgentFactory = CAgentFactory::NewL(iAgent.ImplementationUid());
sl@0
   143
		}
sl@0
   144
	return *iAgentFactory;
sl@0
   145
	}
sl@0
   146
sl@0
   147
CAgentManager& CAgentInfo::AgentManagerL()
sl@0
   148
	{
sl@0
   149
	// Create the agent manager
sl@0
   150
	if (!iAgentManager)
sl@0
   151
		{
sl@0
   152
		iAgentManager = AgentFactoryL().CreateManagerL();
sl@0
   153
		}
sl@0
   154
	return *iAgentManager;
sl@0
   155
	}	
sl@0
   156
sl@0
   157
TBool CAgentInfo::IsSupportedSupplier(const TDesC8& aSupplierMime) const
sl@0
   158
	{
sl@0
   159
	for (TInt i = 0; i < iSupplierMimeTypes.Count(); ++i)
sl@0
   160
		{
sl@0
   161
		if (aSupplierMime == *iSupplierMimeTypes[i])
sl@0
   162
			{
sl@0
   163
			return ETrue;
sl@0
   164
			}
sl@0
   165
		}
sl@0
   166
	return EFalse;
sl@0
   167
	}
sl@0
   168
sl@0
   169
TBool CAgentInfo::IsSupportedConsumer(const TDesC8& aConsumerMime) const
sl@0
   170
	{
sl@0
   171
sl@0
   172
	for (TInt i = 0; i < iConsumerMimeTypes.Count(); ++i)
sl@0
   173
		{
sl@0
   174
		if (aConsumerMime == *iConsumerMimeTypes[i])
sl@0
   175
			{
sl@0
   176
			return ETrue;
sl@0
   177
			}
sl@0
   178
		}
sl@0
   179
	return EFalse;
sl@0
   180
	}
sl@0
   181
		
sl@0
   182
const RPointerArray<HBufC8>& CAgentInfo::SupplierMimeTypes() const
sl@0
   183
	{
sl@0
   184
	return iSupplierMimeTypes;
sl@0
   185
	}
sl@0
   186
sl@0
   187
const RPointerArray<HBufC8>& CAgentInfo::ConsumerMimeTypes() const
sl@0
   188
	{
sl@0
   189
	return iConsumerMimeTypes;
sl@0
   190
	}
sl@0
   191
sl@0
   192
void CAgentInfo::AddToArrayL(const TDesC8& aElement, 
sl@0
   193
							 RPointerArray<HBufC8>& aArray)
sl@0
   194
	{
sl@0
   195
	// Don't bother adding empty elements
sl@0
   196
	if (aElement.Length())
sl@0
   197
		{
sl@0
   198
		HBufC8* newElem = aElement.AllocLC();
sl@0
   199
		TPtr8 lowerCasePtr = newElem->Des();
sl@0
   200
		lowerCasePtr.LowerCase();
sl@0
   201
		User::LeaveIfError(aArray.Append(newElem));
sl@0
   202
		CleanupStack::Pop(newElem);
sl@0
   203
		}
sl@0
   204
	}
sl@0
   205
sl@0
   206
void CAgentInfo::ParseMimeTypesL(const TDesC8& aBuf, 
sl@0
   207
								 RPointerArray<HBufC8>& aMimeTypes)
sl@0
   208
	{
sl@0
   209
	TPtrC8 ptr(aBuf);
sl@0
   210
	TInt pos = 0;
sl@0
   211
	while ((pos = ptr.LocateF(',')) >= 0)
sl@0
   212
		{
sl@0
   213
		// Take into account possibility of ,,
sl@0
   214
		if (pos > 0)
sl@0
   215
			{
sl@0
   216
			AddToArrayL(ptr.Left(pos), aMimeTypes);
sl@0
   217
			}
sl@0
   218
sl@0
   219
		// Now, move the pointer to the position after the ','. BUT if the
sl@0
   220
		// ',' is the last position, then we are done, so return (a bit
sl@0
   221
		// dirty, but makes things easier
sl@0
   222
		if (pos + 1 < ptr.Length())
sl@0
   223
			{
sl@0
   224
			ptr.Set(ptr.Mid(pos + 1));
sl@0
   225
			}
sl@0
   226
		else
sl@0
   227
			{
sl@0
   228
			// The ',' is the last character, so quit
sl@0
   229
			return;
sl@0
   230
			}
sl@0
   231
		}
sl@0
   232
sl@0
   233
	// Now extract the last mime type.
sl@0
   234
	AddToArrayL(ptr, aMimeTypes);
sl@0
   235
	}
sl@0
   236
sl@0
   237
TInt CAgentInfo::PreferredBufferSize() const
sl@0
   238
	{
sl@0
   239
	return iPreferredBufferSize;
sl@0
   240
	}
sl@0
   241
sl@0
   242
const TDesC& CAgentInfo::PrivateDirectoryName() const
sl@0
   243
	{
sl@0
   244
	return iPrivateDirectoryName;
sl@0
   245
	}
sl@0
   246
	
sl@0
   247
TAgent& CAgentInfo::Agent()
sl@0
   248
	{
sl@0
   249
	return iAgent;
sl@0
   250
	}