|         |      1 /* | 
|         |      2 * Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).  | 
|         |      3 * All rights reserved. | 
|         |      4 * This component and the accompanying materials are made available | 
|         |      5 * under the terms of "Eclipse Public License v1.0"" | 
|         |      6 * which accompanies this distribution, and is available | 
|         |      7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". | 
|         |      8 * | 
|         |      9 * Initial Contributors: | 
|         |     10 * Nokia Corporation - initial contribution. | 
|         |     11 * | 
|         |     12 * Contributors: | 
|         |     13 * | 
|         |     14 * Description:   Predective text input engine user dictionary  | 
|         |     15 *               class implementation. | 
|         |     16 * | 
|         |     17 */ | 
|         |     18  | 
|         |     19  | 
|         |     20 #include <s32file.h> | 
|         |     21 #include "PtiUserDictionary.h" | 
|         |     22  | 
|         |     23 //                                 Core UID          Symbol class      CRC checksum | 
|         |     24 #define UDB_HEADER_SIZE (TInt32)(sizeof(iCoreUID) + sizeof(TUint32) + sizeof(TUint32)) | 
|         |     25  | 
|         |     26 // --------------------------------------------------------------------------- | 
|         |     27 // CPtiUserDictionary::NewL | 
|         |     28 //  | 
|         |     29 // --------------------------------------------------------------------------- | 
|         |     30 // | 
|         |     31 EXPORT_C CPtiUserDictionary* CPtiUserDictionary::NewL(TInt aMaxSize) | 
|         |     32 	{ | 
|         |     33 	CPtiUserDictionary* ud = new (ELeave) CPtiUserDictionary(); | 
|         |     34 	CleanupStack::PushL( ud ); | 
|         |     35 	ud->ConstructL(aMaxSize); | 
|         |     36 	CleanupStack::Pop(); // ud | 
|         |     37 	return ud; | 
|         |     38 	} | 
|         |     39 	 | 
|         |     40 // --------------------------------------------------------------------------- | 
|         |     41 // CPtiUserDictionary::NewL | 
|         |     42 //  | 
|         |     43 // --------------------------------------------------------------------------- | 
|         |     44 // | 
|         |     45 EXPORT_C CPtiUserDictionary* CPtiUserDictionary::NewL(TDesC& aFileName, TInt aMaxSize) | 
|         |     46 	{ | 
|         |     47 	CPtiUserDictionary* ud = new (ELeave) CPtiUserDictionary(); | 
|         |     48 	CleanupStack::PushL( ud ); | 
|         |     49 	ud->ConstructL(aFileName, aMaxSize); | 
|         |     50 	CleanupStack::Pop(); // ud | 
|         |     51 	return ud; | 
|         |     52 	} | 
|         |     53  | 
|         |     54 // --------------------------------------------------------------------------- | 
|         |     55 // CPtiUserDictionary::CPtiUserDictionary | 
|         |     56 //  | 
|         |     57 // --------------------------------------------------------------------------- | 
|         |     58 // | 
|         |     59 EXPORT_C CPtiUserDictionary::CPtiUserDictionary() | 
|         |     60 	{ | 
|         |     61 	} | 
|         |     62  | 
|         |     63 // --------------------------------------------------------------------------- | 
|         |     64 // CPtiUserDictionary::~CPtiUserDictionary | 
|         |     65 //  | 
|         |     66 // --------------------------------------------------------------------------- | 
|         |     67 //	 | 
|         |     68 EXPORT_C CPtiUserDictionary::~CPtiUserDictionary() | 
|         |     69 	{ | 
|         |     70 	delete iData; | 
|         |     71 	} | 
|         |     72  | 
|         |     73 // --------------------------------------------------------------------------- | 
|         |     74 // CPtiUserDictionary::ConstructL | 
|         |     75 //  | 
|         |     76 // --------------------------------------------------------------------------- | 
|         |     77 // | 
|         |     78 void CPtiUserDictionary::ConstructL(TInt aMaxSize) | 
|         |     79 	{ | 
|         |     80 	iData = HBufC8::NewL(aMaxSize); | 
|         |     81 	TPtr8 bufP8( iData->Des() ); | 
|         |     82 	bufP8.SetLength(aMaxSize); | 
|         |     83 	bufP8.FillZ(); | 
|         |     84 	} | 
|         |     85  | 
|         |     86 // --------------------------------------------------------------------------- | 
|         |     87 // CPtiUserDictionary::ConstructL | 
|         |     88 //  | 
|         |     89 // --------------------------------------------------------------------------- | 
|         |     90 // | 
|         |     91 void CPtiUserDictionary::ConstructL(TDesC& aFileName, TInt aMaxSize) | 
|         |     92 	{ | 
|         |     93 	User::LeaveIfError(OpenL(aFileName, aMaxSize)); | 
|         |     94 	iFileName.Copy(aFileName); | 
|         |     95 	} | 
|         |     96  | 
|         |     97 // --------------------------------------------------------------------------- | 
|         |     98 // CPtiUserDictionary::OpenL | 
|         |     99 //  | 
|         |    100 // --------------------------------------------------------------------------- | 
|         |    101 // | 
|         |    102 EXPORT_C TInt CPtiUserDictionary::OpenL(TDesC& aFileName, TInt aMaxSize) | 
|         |    103 	{ | 
|         |    104 	iFileName.Copy(aFileName); | 
|         |    105  | 
|         |    106 	RFs fsSession; | 
|         |    107 	User::LeaveIfError(fsSession.Connect()); // Start session | 
|         |    108 	CleanupClosePushL(fsSession); | 
|         |    109  | 
|         |    110 	TEntry entry; | 
|         |    111 	User::LeaveIfError(fsSession.Entry(aFileName, entry)); | 
|         |    112  | 
|         |    113 	RFileReadStream inStream; | 
|         |    114 	inStream.PushL(); | 
|         |    115 	User::LeaveIfError(inStream.Open(fsSession, aFileName, EFileRead|EFileShareAny)); | 
|         |    116  | 
|         |    117 	if (entry.iSize > aMaxSize + UDB_HEADER_SIZE) | 
|         |    118 		{ | 
|         |    119 		User::Leave(KErrCorrupt); | 
|         |    120 		} | 
|         |    121 		 | 
|         |    122 	delete iData; | 
|         |    123 	iData = NULL; | 
|         |    124 	iData = HBufC8::NewL(aMaxSize); | 
|         |    125 	TPtr8 dataDes = iData->Des(); | 
|         |    126 	dataDes.SetLength(aMaxSize); | 
|         |    127 	dataDes.FillZ();		 | 
|         |    128 	 | 
|         |    129 	// First read header data. | 
|         |    130 	iCoreUID = inStream.ReadInt32L(); | 
|         |    131 	iSymbolClass = inStream.ReadInt32L(); | 
|         |    132 	 | 
|         |    133 	// Then read and check actual data if it is there. | 
|         |    134 	if (entry.iSize > sizeof(TInt32) + sizeof(TInt32))	 | 
|         |    135 		{	 | 
|         |    136 		TUint32 crc = inStream.ReadInt32L(); | 
|         |    137 		inStream.ReadL(dataDes, entry.iSize - UDB_HEADER_SIZE);		 | 
|         |    138 		 | 
|         |    139 		TUint32 dataCrc = 0; | 
|         |    140 		Mem::Crc32(dataCrc, Data().Ptr(), Data().Length()); | 
|         |    141 		if (dataCrc != crc) | 
|         |    142 			{ | 
|         |    143 			// Crc check failed, something wierd going on, initialize data and leave. | 
|         |    144 			dataDes.FillZ(); | 
|         |    145 			User::Leave(KErrCorrupt);	 | 
|         |    146 			}		 | 
|         |    147 		iChecksum = crc;			 | 
|         |    148 		} | 
|         |    149 		 | 
|         |    150 	CleanupStack::PopAndDestroy(2); // fsSession, inStream | 
|         |    151 	 | 
|         |    152 	return KErrNone; | 
|         |    153 	} | 
|         |    154  | 
|         |    155 // --------------------------------------------------------------------------- | 
|         |    156 // CPtiUserDictionary::WriteL | 
|         |    157 //  | 
|         |    158 // --------------------------------------------------------------------------- | 
|         |    159 // | 
|         |    160 EXPORT_C TInt CPtiUserDictionary::WriteL(TDesC& aFileName) | 
|         |    161 	{ | 
|         |    162 	RFs fsSession; | 
|         |    163 	User::LeaveIfError(fsSession.Connect()); // Start session | 
|         |    164 	CleanupClosePushL(fsSession); | 
|         |    165  | 
|         |    166 	RFileWriteStream outStream; | 
|         |    167 	outStream.PushL(); | 
|         |    168 	User::LeaveIfError(outStream.Open(fsSession, aFileName, EFileWrite|EFileShareAny)); | 
|         |    169 	 | 
|         |    170 	// First write header data.	 | 
|         |    171 	outStream.WriteInt32L(iCoreUID); | 
|         |    172 	outStream.WriteInt32L(iSymbolClass); | 
|         |    173 	TUint32 c = 0;		 | 
|         |    174 	Mem::Crc32(c, Data().Ptr(), Data().Length()); | 
|         |    175 	outStream.WriteInt32L(c); | 
|         |    176 	 | 
|         |    177 	// Then write actual data. | 
|         |    178 	outStream.WriteL(Data().Ptr(), Data().Length());	 | 
|         |    179 		 | 
|         |    180 	outStream.CommitL();	 | 
|         |    181 	CleanupStack::PopAndDestroy(2); // fsSession, outStream  	 | 
|         |    182 		 | 
|         |    183 	iChecksum = c; | 
|         |    184  | 
|         |    185 	return KErrNone; | 
|         |    186 	} | 
|         |    187  | 
|         |    188 // --------------------------------------------------------------------------- | 
|         |    189 // CPtiUserDictionary::WriteL | 
|         |    190 //  | 
|         |    191 // --------------------------------------------------------------------------- | 
|         |    192 // | 
|         |    193 EXPORT_C TInt CPtiUserDictionary::WriteL() | 
|         |    194 	{ | 
|         |    195 	if (iFileName.Length() == 0) | 
|         |    196 		{ | 
|         |    197 		return KErrCorrupt; | 
|         |    198 		} | 
|         |    199 	 | 
|         |    200 	return WriteL( iFileName ); | 
|         |    201 	} | 
|         |    202  | 
|         |    203 // --------------------------------------------------------------------------- | 
|         |    204 // CPtiUserDictionary::SpaceLeft | 
|         |    205 //  | 
|         |    206 // --------------------------------------------------------------------------- | 
|         |    207 // | 
|         |    208 EXPORT_C TInt CPtiUserDictionary::SpaceLeft() const	 | 
|         |    209 	{ | 
|         |    210 	return -1; | 
|         |    211 	} | 
|         |    212  | 
|         |    213 // --------------------------------------------------------------------------- | 
|         |    214 // CPtiUserDictionary::SetDataL | 
|         |    215 //  | 
|         |    216 // --------------------------------------------------------------------------- | 
|         |    217 // | 
|         |    218 EXPORT_C void CPtiUserDictionary::SetDataL(TAny* aData, TInt aLength) | 
|         |    219 	{ | 
|         |    220 	// Keep possible existing maxlength value, because it is coming from  | 
|         |    221 	// host. | 
|         |    222 	TInt maxLength = (iData ? iData->Des().MaxLength() : aLength); | 
|         |    223  | 
|         |    224 	delete iData; | 
|         |    225 	iData = NULL; | 
|         |    226 	iData = HBufC8::NewL(maxLength); | 
|         |    227 	TPtr8 dataP((TUint8*)aData, maxLength); | 
|         |    228 	dataP.Set((TUint8*)aData, aLength, maxLength); | 
|         |    229 	(*iData) = dataP; | 
|         |    230 	} | 
|         |    231  | 
|         |    232 // End of file | 
|         |    233  |