--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pkiutilities/PKCS12/CrBer/Src/crdata.cpp Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,668 @@
+/*
+* Copyright (c) 2000, 2004 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: This module contains the implementation of CCrTemplate class.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "crdata.h"
+
+
+
+// -----------------------------------------------------------------------------
+// CCrData
+// Constructors
+// These functions construct CCrData object.
+// -----------------------------------------------------------------------------
+CCrData::CCrData() : iIsFile(ETrue), iPointer(0), iBuffer(NULL)
+ {
+ }
+
+CCrData::CCrData(TBool aIsFile) : iIsFile(aIsFile), iPointer(0), iBuffer(NULL), iPath(NULL)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData
+// Destructor
+// This function destructs CCrData object.
+// -----------------------------------------------------------------------------
+CCrData::~CCrData()
+ {
+ if (iBuffer != NULL)
+ {
+ delete iBuffer;
+ }
+ if (iPath != NULL)
+ {
+ delete iPath;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::ConstructL
+// This function initializes CCrData object's member objects.
+// -----------------------------------------------------------------------------
+TAny CCrData::ConstructL()
+ {
+ if (iIsFile == EFalse)
+ {
+ iBuffer = HBufC8::NewL(0);
+ iPath = HBufC::NewL(0);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::NewLC
+// -----------------------------------------------------------------------------
+EXPORT_C CCrData* CCrData::NewLC(TBool aIsFile) // default value ETrue
+ {
+ CCrData* self = new CCrData(aIsFile);
+ CleanupStack::PushL(self);
+
+ self->ConstructL();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::NewL
+// -----------------------------------------------------------------------------
+EXPORT_C CCrData* CCrData::NewL(TBool aIsFile) // default value ETrue
+ {
+ CCrData* self = NewLC(aIsFile);
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::Open
+// Opens an existing file for reading or writing. If the file
+// does not already exist, an error is returned.
+// Parameters: aFs The file server session
+// aName The name of the file. Any path
+// components which are not specified here will be
+// taken from the session path.
+// aFileMode The mode in which the file is opened.
+// For more information see EFileShareExclusive and
+// other file sharing and access modes.
+// Return Values: TInt KErrNone if successful, otherwise
+// another of the system-wide error codes.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCrData::Open(RFs& aFs,const TDesC& aName,TUint aFileMode)
+ {
+ if (iIsFile) // file
+ {
+ TInt result = iFile.Open(aFs, aName, aFileMode);
+ SetPathL(aName);
+ return result;
+ }
+ else // Buffer
+ {
+ return KErrNotSupported;
+ }
+
+ }
+
+EXPORT_C TInt CCrData::Open(RFs& aFs,TUint aFileMode)
+ {
+ TInt result = KErrNone;
+ if (iIsFile) // file
+ {
+ if (iPath != NULL)
+ {
+ result = iFile.Open(aFs, *iPath, aFileMode);
+ }
+ else
+ {
+ result = KErrPathNotFound;
+ }
+ }
+ else // Buffer
+ {
+ result = KErrNotSupported;
+ }
+ return result;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCrData::Replace
+// Replaces a file. If there is an existing file with the same
+// name, this function will overwrite it. If the file does not
+// already exist, this function creates it.
+// Parameters: aFs The file server session
+// aName The name of the file.
+// Any path components which are not specified
+// here will be taken from the session path.
+// aFileMode The mode in which the file is opened.
+// For more information see EFileShareExclusive and
+// other file sharing and access modes. Note that the
+// access mode is set to
+// EFileWrite whatever the caller specifies.
+// Return Values: KErrNone if successful, otherwise
+// another of the system-wide error codes.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCrData::Replace(RFs& aFs, const TDesC& aName, TUint aFileMode)
+ {
+ if (iIsFile) // File
+ {
+ TInt result = iFile.Replace(aFs, aName, aFileMode);
+ return result;
+ }
+ else // Buffer
+ {
+ return KErrNotSupported;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::Close
+// Closes the file. Any open files are closed when the file server
+// session is closed. Close() is guaranteed to return, and provides
+// no indication of whether it completed successfully or not. When
+// closing a file that you have written to, you should ensure that
+// data is committed to the file by invoking RFile::Flush() before
+// closing. If Flush() completes successfully, Close() is essentially
+// a no-operation.
+// -----------------------------------------------------------------------------
+EXPORT_C void CCrData::Close()
+ {
+ if (iIsFile) // File
+ {
+ iFile.Close();
+ return;
+ }
+ else // Buffer
+ {
+ return;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::Read
+// Reading transfers data from a file (or a buffer) to a descriptor.
+// If CCrData object is created to be a file function only call
+// RFile::Read(.), but if CCrData is buffer, function makes same things
+// to buffer as RFile::Read make to file. (See EPOC documentation)
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCrData::Read(TDes8& aDes)
+ {
+ TInt err = KErrNone;
+
+ if (!iIsFile) // CCrData is buf
+ {
+ if (aDes.MaxLength() < iBuffer->Length())
+ {
+ err = KErrOverflow;
+ }
+ else
+ {
+ aDes.Copy(*iBuffer); // Copy iBuffer to aDes
+ iPointer = aDes.Length(); // Set pointer to end of buf
+ }
+ }
+ else // else it is file
+ {
+ err = iFile.Read(aDes);
+ }
+ return err; // error code
+ }
+
+
+EXPORT_C TInt CCrData::Read(TDes8& aDes,TInt aLength)
+ {
+ TInt err = KErrNone;
+ TInt i;
+
+ if (!iIsFile) // CCrData is buffer
+ {
+ if ((aLength < NULL) || (aLength > aDes.MaxLength()))
+ {
+ err = KErrGeneral;
+ }
+ else
+ {
+ aDes.Zero();
+ for (i = iPointer; (i < (aLength + iPointer)) &&
+ (i < iBuffer->Length()); i++)
+ {
+ aDes.Append((*iBuffer)[i]); // append data to aDes
+ }
+ iPointer = i; // set pointer to next byte
+ }
+ }
+ else // else CCrData is file
+ {
+ err = iFile.Read(aDes, aLength);
+ }
+
+ return err;
+ }
+
+
+EXPORT_C TInt CCrData::Read(TInt aPos,TDes8& aDes,TInt aLength)
+ {
+ TInt i;
+ TInt err = KErrNone;
+
+ if (!iIsFile) // CCrDAta is buffer
+ {
+ if (aLength < NULL) // aLength must be positive
+ {
+ err = KErrArgument;
+ }
+ else if (aLength > aDes.MaxLength()) // if buffer is too small
+ {
+ err = KErrOverflow;
+ }
+ else
+ {
+ aDes.Delete(0, aDes.Length()); // delete old string
+ TPtr8 ptr = iBuffer->Des();
+
+ for (i = aPos; (i < (aLength + aPos)) &&
+ (i < iBuffer->Length()); i++)
+ {
+ aDes.Append(ptr[i]);
+ }
+ iPointer = i; // set pointer to end of read
+ }
+ }
+ else // CCrData is file
+ {
+ err = iFile.Read(aPos, aDes, aLength);
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::Write
+// Writing transfers data from a descriptor to a buffer or file.
+// If CCrData object is created to be a file function only call
+// RFile::Write(.), but if CCrData is buffer, function makes same things
+// to buffer as RFile::Write make to file. After Write(..) iPointer is moved
+// to end of the buffer.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCrData::Write(const TDesC8& aDes)
+ {
+ TInt err = KErrNone;
+ if (!iIsFile) // buf
+ {
+ err = Write(aDes, aDes.Length());
+ }
+
+ else // file
+ {
+ err = iFile.Write(aDes);
+ }
+
+ return err;
+ }
+
+EXPORT_C TInt CCrData::Write(const TDesC8& aDes, TInt aLength)
+ {
+ TInt err = KErrNone;
+ if (aLength < NULL) // aLen must be positive
+ {
+ err = KErrArgument;
+ }
+
+ if (!iIsFile) // buf
+ {
+ TInt bufferLength = iBuffer->Length();
+ TInt neededBufferLength = iPointer + aLength;
+ if (neededBufferLength > bufferLength) // Reallocation is needed
+ {
+ TRAP(err, iBuffer = iBuffer->ReAllocL(neededBufferLength));
+ if (err != KErrNone)
+ {
+ return KErrNoMemory;
+ }
+ }
+
+ TPtr8 ptr = iBuffer->Des();
+ // append new data, ONLY the amount of aLength
+ if (aLength == aDes.Length())
+ {
+ ptr.Append(aDes);
+ }
+ else // aLength < a.Des.Length()
+ {
+ ptr.Append(aDes.Left(aLength));
+ }
+ // iPointer is moved to the end of the buffer.
+ iPointer = iBuffer->Length();
+ }
+ else // file
+ {
+ err = iFile.Write(aDes);
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::Zero
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCrData::Zero(const TInt aPos, const TInt aLength)
+ {
+ TPtr8 ptr = iBuffer->Des();
+ if (ptr.Length() < aPos + aLength)
+ {
+ // Out of bounds
+ return KErrArgument;
+ }
+ for (TInt i = 0; i < aLength; i++)
+ {
+ ptr[aPos+i] = 0;
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::Seek
+// If CCrData object is created to be a file function only call
+// RFile::Seek(.), but if CCrData is buffer, function makes same things
+// to buffer as RFile::Seek make to file. (See EPOC documentation)
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCrData::Seek(TSeek aMode,TInt& aPos)
+ {
+ TInt err = KErrNone;
+
+ if (aPos < NULL) // aPos must be positive
+ {
+ err = KErrArgument;
+ }
+
+ else if (!iIsFile) // CCrData is buffer
+ {
+ switch (aMode)
+ {
+ case (ESeekCurrent): // this place
+ {
+ iPointer += aPos;
+ break;
+ }
+ case (ESeekStart): // from start of buf
+ {
+ iPointer = aPos;
+ break;
+ }
+ case (ESeekEnd): // from end of buf
+ {
+ iPointer = iBuffer->Length() - aPos;
+ break;
+ }
+ default:
+ {
+ break; // ESeekAddress
+ }
+ }
+
+ if (iPointer < NULL) // iPointer must be positive
+ {
+ iPointer = NULL; // set pointer to start of buf
+ }
+
+ else if (iPointer > iBuffer->Length())
+ {
+ iPointer = iBuffer->Length(); // set pointer to end of buf
+ }
+
+ aPos = iPointer;
+
+ }
+
+ else // CCrData is file
+ {
+ err = iFile.Seek(aMode, aPos);
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::Size
+// Reading the size of data.
+// If CCrData is a buffer, returns length of the buffer. Otherwise
+// calls RFile::Size( TInt ).
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCrData::Size(TInt& aSize)
+ {
+ TInt err = KErrNone;
+
+ if (!iIsFile) // CCrData is buf
+ {
+ aSize = iBuffer->Length();
+ }
+ else // else it is file
+ {
+ err = iFile.Size(aSize);
+ }
+ return err; // error code
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCrData::LineL
+// LineL sets data from the current place, where iPointer is, till next new
+// line character to aLine.
+// iPointer moves to the following item from the found new line character.
+// If no new line character is found, aLine is the rest of the data and
+// iPointer is moved to the end of the iBuffer or the iFile.
+// Return Values: KErrNone if everything succeeds
+// KErrNoMemory if aLine is not length enough
+// KErrEof if iPointer is at the end of file.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCrData::LineL(TDes8& aLine)
+ {
+ TBufC8<2> newLine(KNewLine); // New line
+
+ // Area to find the new line
+ TInt size = 0;
+ Size(size);
+ TInt currentPlace = iPointer;
+ TInt neededLengthToFind = size - currentPlace;
+
+ if(neededLengthToFind == 0) // If the area is empty
+ {
+ return KErrEof;
+ }
+ TInt newLinePlace = 0;
+
+ if (!iIsFile) // CCrData is a buffer.
+ {
+ TPtrC8 temp = iBuffer->Mid(currentPlace, neededLengthToFind);
+
+ // Find next new line.
+ newLinePlace = temp.Find(newLine);
+ // If not found, return the whole area.
+ if (newLinePlace == KErrNotFound)
+ {
+ newLinePlace = neededLengthToFind;
+ }
+ else
+ {
+ newLinePlace = newLinePlace + newLine.Length();
+ }
+
+
+ if (aLine.MaxLength() < newLinePlace)
+ {
+ return KErrNoMemory;
+ }
+
+ // Put the line to aLine
+ aLine = temp.Left(newLinePlace);
+ }
+
+ else // CCrData is a file.
+ {
+
+ HBufC8* tempBuf = HBufC8::NewL(neededLengthToFind);
+ TDes8 tempDes = tempBuf->Des();
+
+ // Read data to a buffer from iPointer to end of file
+ Read(currentPlace, tempDes, neededLengthToFind);
+
+ // Find the next new line character
+ newLinePlace = tempDes.Find(newLine);
+ // If not found, return the whole area.
+ if (newLinePlace == KErrNotFound)
+ {
+ newLinePlace = neededLengthToFind;
+ }
+ else
+ {
+ newLinePlace = newLinePlace + newLine.Length();
+ }
+
+ // Is there enough memory
+ if (aLine.MaxLength() < newLinePlace)
+ {
+ delete tempBuf;
+ tempBuf = NULL;
+ return KErrNoMemory;
+ }
+
+ // Put data to aLine
+ aLine = tempBuf->Left(newLinePlace);
+
+ delete tempBuf;
+ tempBuf = NULL;
+ }
+
+ // Move iPointer to next place from newLine.
+ iPointer = currentPlace + newLinePlace;
+
+ return KErrNone;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::Path
+// -----------------------------------------------------------------------------
+EXPORT_C HBufC* CCrData::Path()
+ {
+ return iPath;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::SetPathL
+// -----------------------------------------------------------------------------
+EXPORT_C TAny CCrData::SetPathL(const TDesC& aPath )
+ {
+ delete iPath;
+ iPath = NULL;
+ iPath = HBufC::NewL( aPath.Length() );
+ TPtr pointer = iPath->Des();
+ pointer.Copy( aPath );
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::IsFile
+// -----------------------------------------------------------------------------
+EXPORT_C TBool CCrData::IsFile()
+ {
+ return iIsFile;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrData::Delete
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCrData::Delete( TInt aPos, TInt aLength )
+ {
+ if (!iIsFile) // CCrData is buf
+ {
+ if(aPos >= 0)
+ {
+ TPtr8 pointer = iBuffer->Des();
+ pointer.Delete(aPos, aLength);
+ }
+ else
+ {
+ return KErrArgument;
+ }
+ }
+ else // else it is file
+ {
+ return KErrNotSupported;
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrDataSet
+// -----------------------------------------------------------------------------
+
+
+// -----------------------------------------------------------------------------
+// CCrDataSet
+// Constructor.
+// This function constructs CCrDataSet object.
+// -----------------------------------------------------------------------------
+CCrDataSet::CCrDataSet(TInt aGranularity)
+ : CArrayPtrSeg<CCrData>(aGranularity)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCrDataSet
+// Destructor.
+// This function destructs CCrDataSet object.
+// -----------------------------------------------------------------------------
+CCrDataSet::~CCrDataSet()
+ {
+ ResetAndDestroy();
+ }
+
+// -----------------------------------------------------------------------------
+// CCrDataSet::ConstructL
+// This function initializes CCrDataSet object's member objects.
+// -----------------------------------------------------------------------------
+TAny CCrDataSet::ConstructL()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCrDataSet::NewLC
+// -----------------------------------------------------------------------------
+EXPORT_C CCrDataSet* CCrDataSet::NewLC(TInt aGranularity)
+ {
+ CCrDataSet* self = new CCrDataSet(aGranularity);
+ CleanupStack::PushL(self);
+
+ self->ConstructL();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCrDataSet::NewL
+// -----------------------------------------------------------------------------
+EXPORT_C CCrDataSet* CCrDataSet::NewL(TInt aGranularity)
+ {
+ CCrDataSet* self = NewLC(aGranularity);
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// End of file
+