installationservices/swi/source/sisfile/swtypereginfo.cpp
branchRCL_3
changeset 25 7333d7932ef7
parent 17 741e5bba2bd1
child 26 8b7f4e561641
equal deleted inserted replaced
24:5cc91383ab1e 25:7333d7932ef7
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 
    18 
    19 #include "swtypereginfo.h"
    19 #include "swtypereginfo.h"
    20 
    20 #include "arrayutils.h"
       
    21 #include "ipcutil.h"
    21 using namespace Swi;
    22 using namespace Swi;
    22 
    23 
    23 CLocalizedSoftwareTypeName::CLocalizedSoftwareTypeName()
    24 EXPORT_C void SoftwareTypeRegInfoUtils::SerializeArrayL(const RPointerArray<Usif::CSoftwareTypeRegInfo>& aSwTypeRegInfoArray, RBuf8& aSerializedArray)
    24 	{
       
    25 	}
       
    26 
       
    27 CLocalizedSoftwareTypeName::CLocalizedSoftwareTypeName(TLanguage aLocale)
       
    28 	:	iLocale(aLocale)
       
    29 	{
       
    30 	}
       
    31 
       
    32 EXPORT_C CLocalizedSoftwareTypeName::~CLocalizedSoftwareTypeName()
       
    33 	{
       
    34 	delete iName;
       
    35 	}
       
    36 
       
    37 EXPORT_C CLocalizedSoftwareTypeName* CLocalizedSoftwareTypeName::NewL(const TDesC& aName, TLanguage aLocale)
       
    38 	{
       
    39 	CLocalizedSoftwareTypeName *self = CLocalizedSoftwareTypeName::NewLC(aName, aLocale);
       
    40 	CleanupStack::Pop(self);
       
    41 	return self;
       
    42 	}
       
    43 
       
    44 EXPORT_C CLocalizedSoftwareTypeName* CLocalizedSoftwareTypeName::NewLC(const TDesC& aName, TLanguage aLocale)
       
    45 	{
       
    46 	CLocalizedSoftwareTypeName *self = new(ELeave) CLocalizedSoftwareTypeName(aLocale);
       
    47 	CleanupStack::PushL(self);
       
    48 	self->iName = aName.AllocL();
       
    49 	return self;
       
    50 	}
       
    51 
       
    52 EXPORT_C CLocalizedSoftwareTypeName* CLocalizedSoftwareTypeName::NewL(RReadStream& aStream)
       
    53 	{
       
    54 	CLocalizedSoftwareTypeName* self = new(ELeave) CLocalizedSoftwareTypeName();
       
    55 	CleanupStack::PushL(self);
       
    56 	self->InternalizeL(aStream);
       
    57 	CleanupStack::Pop(self);
       
    58 	return self;
       
    59 	}
       
    60 
       
    61 EXPORT_C void CLocalizedSoftwareTypeName::ExternalizeL(RWriteStream& aStream) const
       
    62 	{
       
    63 	aStream.WriteInt32L(iLocale);
       
    64 	aStream << *iName;
       
    65 	}
       
    66 
       
    67 void CLocalizedSoftwareTypeName::InternalizeL(RReadStream& aStream)
       
    68 	{
       
    69 	TLanguage locale = static_cast<TLanguage>(aStream.ReadInt32L());
       
    70 	iLocale = locale;
       
    71 
       
    72 	delete iName;
       
    73 	iName = HBufC::NewL(aStream, KMaxTInt); // No restriction on length
       
    74 	}
       
    75 
       
    76 // ##########################################################################################
       
    77 
       
    78 EXPORT_C CSoftwareTypeRegInfo* CSoftwareTypeRegInfo::NewL(const TDesC& aUniqueSoftwareTypeName)
       
    79 	{
       
    80 	CSoftwareTypeRegInfo* self = new (ELeave) CSoftwareTypeRegInfo();
       
    81 	CleanupStack::PushL(self);
       
    82 	self->iUniqueSoftwareTypeName = HBufC::NewL(aUniqueSoftwareTypeName.Length());
       
    83 	self->iUniqueSoftwareTypeName->Des().Copy(aUniqueSoftwareTypeName);
       
    84 	CleanupStack::Pop(self);
       
    85 	return self;
       
    86 	}
       
    87 
       
    88 EXPORT_C CSoftwareTypeRegInfo* CSoftwareTypeRegInfo::NewL(RReadStream& aStream)
       
    89 	{
       
    90 	CSoftwareTypeRegInfo* self = new (ELeave) CSoftwareTypeRegInfo();
       
    91 	CleanupStack::PushL(self);
       
    92 	self->InternalizeL(aStream);
       
    93 	CleanupStack::Pop(self);
       
    94 	return self;
       
    95 	}
       
    96 
       
    97 CSoftwareTypeRegInfo::CSoftwareTypeRegInfo()
       
    98 	{
       
    99 	}
       
   100 
       
   101 EXPORT_C CSoftwareTypeRegInfo::~CSoftwareTypeRegInfo()
       
   102 	{
       
   103 	delete iUniqueSoftwareTypeName;
       
   104 	iMimeTypes.Close();
       
   105 	iLocalizedSoftwareTypeNames.Close();
       
   106 	}
       
   107 
       
   108 EXPORT_C void CSoftwareTypeRegInfo::ExternalizeL(RWriteStream& aStream) const
       
   109 	{
       
   110 	aStream << *iUniqueSoftwareTypeName;
       
   111 	aStream << iSifPluginUid.iUid;
       
   112 	
       
   113 	TUid installerUid = iInstallerSecureId;
       
   114 	aStream << installerUid.iUid;
       
   115 	
       
   116 	TUid executionLayerUid = iExecutionLayerSecureId;
       
   117 	aStream << executionLayerUid.iUid;
       
   118 	
       
   119 	// MIME types
       
   120 	const TInt numMimeTypes = iMimeTypes.Count();
       
   121 	aStream.WriteInt32L(numMimeTypes);
       
   122 	for (TInt i=0; i<numMimeTypes; ++i)
       
   123 		{
       
   124 		aStream << *iMimeTypes[i];
       
   125 		}
       
   126 	 
       
   127 	// Localized names
       
   128 	const TInt numLocalizedNames = iLocalizedSoftwareTypeNames.Count();
       
   129 	aStream.WriteInt32L(numLocalizedNames);
       
   130 	for (TInt i=0; i<numLocalizedNames; ++i)
       
   131 		{
       
   132 		aStream << *iLocalizedSoftwareTypeNames[i];
       
   133 		}
       
   134 	}
       
   135 
       
   136 EXPORT_C TInt CSoftwareTypeRegInfo::ExternalizedSize() const
       
   137 	{
       
   138 	TInt size = sizeof(TUid) + sizeof(TSecureId) + sizeof(TSecureId);
       
   139 	size += sizeof(TInt) + iUniqueSoftwareTypeName->Size();
       
   140 	
       
   141 	// MIME types
       
   142 	const TInt numMimeTypes = iMimeTypes.Count();
       
   143 	size += sizeof(TInt);
       
   144 	for (TInt i=0; i<numMimeTypes; ++i)
       
   145 		{
       
   146 		size += sizeof(TInt) + iMimeTypes[i]->Size();
       
   147 		}
       
   148 	 
       
   149 	// Localized names
       
   150 	const TInt numLocalizedNames = iLocalizedSoftwareTypeNames.Count();
       
   151 	size += sizeof(TInt);
       
   152 	for (TInt i=0; i<numLocalizedNames; ++i)
       
   153 		{
       
   154 		size += sizeof(TInt) + sizeof(TInt) + iLocalizedSoftwareTypeNames[i]->Name().Size();
       
   155 		}
       
   156 
       
   157 	return size;
       
   158 	}
       
   159 
       
   160 void CSoftwareTypeRegInfo::InternalizeL(RReadStream& aStream)
       
   161 	{
       
   162 	ASSERT(iUniqueSoftwareTypeName == NULL);
       
   163 	
       
   164 	iUniqueSoftwareTypeName = HBufC::NewL(aStream, EUniqueSwTypeNameMaxLength);
       
   165 	
       
   166 	iSifPluginUid = TUid::Uid(aStream.ReadInt32L());
       
   167 	iInstallerSecureId = TUid::Uid(aStream.ReadInt32L());
       
   168 	iExecutionLayerSecureId = TUid::Uid(aStream.ReadInt32L());
       
   169 	
       
   170 	// MIME types
       
   171 	const TInt numMimeTypes = aStream.ReadInt32L();
       
   172 	for (TInt i=0; i<numMimeTypes; ++i)
       
   173 		{
       
   174 		HBufC* mimeType = HBufC::NewLC(aStream, EUniqueSwTypeNameMaxLength);
       
   175 		iMimeTypes.AppendL(mimeType);
       
   176 		CleanupStack::Pop(mimeType);
       
   177 		}
       
   178 	
       
   179 	// Localized names
       
   180 	const TInt numLocalizedNames = aStream.ReadInt32L();
       
   181 	for (TInt i=0; i<numLocalizedNames; ++i)
       
   182 		{
       
   183 		CLocalizedSoftwareTypeName* name = CLocalizedSoftwareTypeName::NewL(aStream);
       
   184 		CleanupStack::PushL(name);
       
   185 		iLocalizedSoftwareTypeNames.AppendL(name);
       
   186 		CleanupStack::Pop(name);
       
   187 		}
       
   188 	}
       
   189 
       
   190 EXPORT_C void CSoftwareTypeRegInfo::SetMimeTypeL(const TDesC& aMimeType)
       
   191 	{
       
   192 	HBufC* mimeType = HBufC::NewLC(aMimeType.Length());
       
   193 	mimeType->Des().Copy(aMimeType);
       
   194 	iMimeTypes.AppendL(mimeType);
       
   195 	CleanupStack::Pop(mimeType);
       
   196 	}
       
   197 
       
   198 EXPORT_C void CSoftwareTypeRegInfo::SetLocalizedSoftwareTypeNameL(TLanguage aLanguage, const TDesC& aName)
       
   199 	{
       
   200 	CLocalizedSoftwareTypeName* name = CLocalizedSoftwareTypeName::NewLC(aName, aLanguage);
       
   201 	iLocalizedSoftwareTypeNames.AppendL(name);
       
   202 	CleanupStack::Pop(name);
       
   203 	}
       
   204 
       
   205 // ##########################################################################################
       
   206 
       
   207 EXPORT_C void SoftwareTypeRegInfoUtils::SerializeArrayL(const RPointerArray<CSoftwareTypeRegInfo>& aSwTypeRegInfoArray, RBuf8& aSerializedArray)
       
   208 	{
    25 	{
   209 	TInt bufLen = sizeof(TInt);
    26 	TInt bufLen = sizeof(TInt);
   210 	const TInt count = aSwTypeRegInfoArray.Count();
    27 	const TInt count = aSwTypeRegInfoArray.Count();
   211 	for (TInt i=0; i<count; ++i)
    28 	for (TInt i=0; i<count; ++i)
   212 		{
    29 	    {
   213 		bufLen += aSwTypeRegInfoArray[i]->ExternalizedSize();
    30 	    bufLen += GetObjectSizeL(aSwTypeRegInfoArray[i]);
   214 		}
    31 	    }
   215 
    32 
   216 	aSerializedArray.ReAllocL(aSerializedArray.Length()+bufLen);
    33 	aSerializedArray.ReAllocL(aSerializedArray.Length()+bufLen);
   217 	RDesWriteStream ws(aSerializedArray);
    34 	RDesWriteStream ws(aSerializedArray);
   218 	CleanupClosePushL(ws);
    35 	CleanupClosePushL(ws);
   219 
    36 
   220 	ws.WriteInt32L(count);
    37 	ExternalizePointerArrayL(aSwTypeRegInfoArray, ws);
   221 	for (TInt i=0; i<count; ++i)
       
   222 		{
       
   223 		const CSoftwareTypeRegInfo& info = *aSwTypeRegInfoArray[i];
       
   224 		ws << info;
       
   225 		}
       
   226 
    38 
   227 	ws.CommitL();
    39 	ws.CommitL();
   228 	CleanupStack::PopAndDestroy(&ws);
    40 	CleanupStack::PopAndDestroy(&ws);
   229 	}
    41 	}
   230 
    42 
   231 EXPORT_C void SoftwareTypeRegInfoUtils::UnserializeArrayL(RReadStream& aStream, RPointerArray<CSoftwareTypeRegInfo>& aSwTypeRegInfoArray)
    43 EXPORT_C void SoftwareTypeRegInfoUtils::UnserializeArrayL(RReadStream& aStream, RPointerArray<Usif::CSoftwareTypeRegInfo>& aSwTypeRegInfoArray)
   232 	{
    44 	{
   233 	CleanupResetAndDestroyPushL(aSwTypeRegInfoArray);
       
   234 	const TInt numElems = aStream.ReadInt32L();
    45 	const TInt numElems = aStream.ReadInt32L();
   235 	for (TInt i=0; i<numElems; ++i)
    46 	for (TInt i=0; i<numElems; ++i)
   236 		{
    47 		{
   237 		CSoftwareTypeRegInfo* info = CSoftwareTypeRegInfo::NewL(aStream);
    48 		Usif::CSoftwareTypeRegInfo* info = Usif::CSoftwareTypeRegInfo::NewL(aStream);
   238 		CleanupStack::PushL(info);
    49 		CleanupStack::PushL(info);
   239 		aSwTypeRegInfoArray.AppendL(info);
    50 		aSwTypeRegInfoArray.AppendL(info);
   240 		CleanupStack::Pop(info);
    51 		CleanupStack::Pop(info);
   241 		}
    52 		}
   242 	CleanupStack::Pop(&aSwTypeRegInfoArray);
       
   243 	}
    53 	}
   244 
    54 
   245 EXPORT_C void SoftwareTypeRegInfoUtils::SerializeUniqueSwTypeNamesL(const RPointerArray<CSoftwareTypeRegInfo>& aSwTypeRegInfoArray, RBuf& aSerializedNames)
    55 EXPORT_C void SoftwareTypeRegInfoUtils::SerializeUniqueSwTypeNamesL(const RPointerArray<Usif::CSoftwareTypeRegInfo>& aSwTypeRegInfoArray, RBuf& aSerializedNames)
   246 	{
    56 	{
   247 	const TInt numNames = aSwTypeRegInfoArray.Count();
    57 	const TInt numNames = aSwTypeRegInfoArray.Count();
   248 	
    58 	
   249 	TInt bufLen = 0;
    59 	TInt bufLen = 0;
   250 	for (TInt i=0; i<numNames; ++i)
    60 	for (TInt i=0; i<numNames; ++i)
   251 		{
    61 		{
   252 		const CSoftwareTypeRegInfo& info = *aSwTypeRegInfoArray[i];
    62 		const Usif::CSoftwareTypeRegInfo& info = *aSwTypeRegInfoArray[i];
   253 		bufLen += info.UniqueSoftwareTypeName().Length() + sizeof(TChar);
    63 		bufLen += info.UniqueSoftwareTypeName().Length() + sizeof(TChar);
   254 		}
    64 		}
   255 	
    65 	
   256 	aSerializedNames.ReAllocL(aSerializedNames.Length()+bufLen);
    66 	aSerializedNames.ReAllocL(aSerializedNames.Length()+bufLen);
   257 	
    67 	
   258 	for (TInt i=0; i<numNames; ++i)
    68 	for (TInt i=0; i<numNames; ++i)
   259 		{
    69 		{
   260 		const CSoftwareTypeRegInfo& info = *aSwTypeRegInfoArray[i];
    70 		const Usif::CSoftwareTypeRegInfo& info = *aSwTypeRegInfoArray[i];
   261 		aSerializedNames.Append(info.UniqueSoftwareTypeName());
    71 		aSerializedNames.Append(info.UniqueSoftwareTypeName());
   262 		aSerializedNames.Append(static_cast<TChar>(KUniqueNameSeparator));
    72 		aSerializedNames.Append(static_cast<TChar>(KUniqueNameSeparator));
   263 		}
    73 		}
   264 	}
    74 	}
   265 
    75 
   266 EXPORT_C void SoftwareTypeRegInfoUtils::UnserializeUniqueSwTypeNamesL(const TDesC& aSerializedNames, RArray<TPtrC>& aUniqueSwTypeNames)
    76 EXPORT_C void SoftwareTypeRegInfoUtils::UnserializeUniqueSwTypeNamesL(const TDesC& aSerializedNames, RArray<TPtrC>& aUniqueSwTypeNames)
   267 	{
    77 	{
   268 	CleanupClosePushL(aUniqueSwTypeNames);
       
   269 	TPtrC buf(aSerializedNames);
    78 	TPtrC buf(aSerializedNames);
   270 	for (;;)
    79 	for (;;)
   271 		{
    80 		{
   272 		const TInt sep = buf.Locate(static_cast<TChar>(KUniqueNameSeparator));
    81 		const TInt sep = buf.Locate(static_cast<TChar>(KUniqueNameSeparator));
   273 		if (sep != KErrNotFound)
    82 		if (sep != KErrNotFound)
   282 				User::Leave(KErrGeneral);
    91 				User::Leave(KErrGeneral);
   283 				}
    92 				}
   284 			break;
    93 			break;
   285 			}
    94 			}
   286 		}
    95 		}
   287 	CleanupStack::Pop(&aUniqueSwTypeNames);
       
   288 	}
    96 	}
   289 
    97 
   290 EXPORT_C void SoftwareTypeRegInfoUtils::ExtractMimeTypesL(const RPointerArray<CSoftwareTypeRegInfo>& aSwTypeRegInfoArray, RPointerArray<HBufC8>& aMimeTypes)
    98 EXPORT_C void SoftwareTypeRegInfoUtils::ExtractMimeTypesL(const RPointerArray<Usif::CSoftwareTypeRegInfo>& aSwTypeRegInfoArray, RPointerArray<HBufC8>& aMimeTypes)
   291 	{
    99 	{
   292 	for (TInt i=0; i<aSwTypeRegInfoArray.Count(); ++i)
   100 	for (TInt i=0; i<aSwTypeRegInfoArray.Count(); ++i)
   293 		{
   101 		{
   294 		const RPointerArray<HBufC>& mimeTypes = aSwTypeRegInfoArray[i]->MimeTypes();
   102 		const RPointerArray<HBufC>& mimeTypes = aSwTypeRegInfoArray[i]->MimeTypes();
   295 		for (TInt m=0; m<mimeTypes.Count(); ++m)
   103 		for (TInt m=0; m<mimeTypes.Count(); ++m)