mmlibs/mmfw/Recogniser/src/filereader.cpp
changeset 58 b6dbf97aba93
parent 0 40261b775718
--- a/mmlibs/mmfw/Recogniser/src/filereader.cpp	Thu Sep 16 18:39:58 2010 +0100
+++ b/mmlibs/mmfw/Recogniser/src/filereader.cpp	Thu Sep 16 18:57:38 2010 +0100
@@ -93,7 +93,8 @@
 		{
 		// We need to seek to the start and fill the buffer.
 		iFilePos = 0;
-		TInt err = iFile->Seek(ESeekStart, iFilePos);
+		TInt filepos = 0;
+		TInt err = iFile->Seek(ESeekStart, filepos);
 		if (err == KErrNone)
 			{
 			err = iFile->Read(iFileBuffer);
@@ -135,18 +136,31 @@
 //
 void CFileReader::SeekL(TInt64 aOffset)
 	{
-	if (aOffset < (TInt64)KMinTInt)
+	if (aOffset < KMinTInt64)
 		{
 		User::Leave(KErrNotSupported);
 		}
 		
-	if (aOffset > (TInt64)KMaxTInt)
+	if (aOffset > KMaxTInt64)
 		{
 		User::Leave(KErrNotSupported);
 		}
-		
-	TInt low = (TInt)I64LOW(aOffset);
-	SeekL(low);
+	
+	if (aOffset < (TInt64)KMaxTInt)
+	    {
+        TInt low = (TInt)I64LOW(aOffset);
+        SeekL(low);
+	    }
+	else
+	    {
+        TInt err = CReader::Seek(aOffset);
+        if (err == KErrUnderflow)
+            {
+            TInt64 bufPos = CBufferReader::Position();
+            aOffset += bufPos - iFileBuffer.Length();
+            User::LeaveIfError(PhysicallySeekAndRead(aOffset));
+            }
+	    }
 	}
 	
 //
@@ -161,7 +175,31 @@
 	CBufferReader::Reset();
 	
 	iFilePos = aOffset;
-	err = iFile->Seek(ESeekCurrent, iFilePos);
+	err = iFile->Seek(ESeekCurrent, aOffset);
+	
+	if (err != KErrNone)
+		{
+		return err;
+		}
+
+	err = iFile->Read(iFileBuffer);
+	if (err != KErrNone)
+		{
+		return err;
+		}
+	return (iFileBuffer.Length() == 0 ? KErrEof : KErrNone);
+	}
+TInt CFileReader::PhysicallySeekAndRead(TInt64 aOffset)
+    {
+    TInt err;
+    // New buffer contents so read from the start of it.
+    CBufferReader::Reset();
+    
+    iFilePos = aOffset;
+    RFile64* tempfile;
+    tempfile = static_cast<RFile64*> (iFile);
+ 
+    err = tempfile->Seek(ESeekCurrent, iFilePos);
 	if (err != KErrNone)
 		{
 		return err;