memspy/Driver/User/Source/MemSpyDriverStreamReaderImp.cpp
changeset 0 a03f92240627
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspy/Driver/User/Source/MemSpyDriverStreamReaderImp.cpp	Tue Feb 02 01:57:15 2010 +0200
@@ -0,0 +1,118 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "MemSpyDriverStreamReaderImp.h"
+
+
+
+
+CMemSpyMemStreamReader::CMemSpyMemStreamReader( const TDesC8& aData )
+    {
+    iCurrent = aData.Ptr();
+    iMax = iCurrent + aData.Length();
+    }
+
+
+void CMemSpyMemStreamReader::ConstructL()
+    {
+    }
+
+
+TInt32 CMemSpyMemStreamReader::ReadInt32L()
+    {
+    TInt32 ret = 0;
+    //
+    const TInt size = sizeof( TInt32 );
+    IsAvailableL( size );
+    Mem::Copy( (TAny*) &ret, iCurrent, size );
+    IncrementPos( size );
+    //
+    return ret;
+    }
+
+
+TUint32 CMemSpyMemStreamReader::ReadUint32L()
+    {
+    TUint32 ret = 0;
+    //
+    const TInt size = sizeof( TUint32 );
+    IsAvailableL( size );
+    Mem::Copy( (TAny*) &ret, iCurrent, size );
+    IncrementPos( size );
+    //
+    return ret;
+    }
+
+
+void CMemSpyMemStreamReader::ReadL( TDes8& aDes )
+    {
+    const TInt length = ReadInt32L();
+
+    // Need to check the remaining text is actually present...
+    IsAvailableL( length );
+
+    // Now read into client descriptor
+    aDes.SetLength( length );
+    if  ( length > 0 ) 
+        {
+        TUint8* dest = const_cast< TUint8* >( aDes.Ptr() );
+        Mem::Copy( dest, iCurrent, length );
+        }
+    //
+    IncrementPos( length );
+    }
+
+
+void CMemSpyMemStreamReader::ReadL( TDes16& aDes )
+    {
+    // The kernel driver only ever writes narrow descriptors.
+    // However, we can expand them to be UCS2
+    const TInt length = ReadInt32L();
+
+    // Need to check the remaining text is actually present...
+    IsAvailableL( length );
+
+    // Set final length in descriptor
+    aDes.SetLength( length );
+
+    // Read each char
+    TUint16* dest = const_cast< TUint16* >( aDes.Ptr() );
+    for( TInt i=0; i<length; i++ )
+        {
+        *dest++ = *iCurrent++;
+        }
+    }
+
+
+void CMemSpyMemStreamReader::IsAvailableL( TInt aRequired ) const
+    {
+    const TUint8* endPos = iCurrent + aRequired;
+    if  ( endPos > iMax )
+        {
+        User::Leave( KErrOverflow );
+        }
+    }
+
+
+void CMemSpyMemStreamReader::IncrementPos( TInt aAmount )
+    {
+    iCurrent += aAmount;
+    }
+
+
+
+