crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianStructuresLib/Compression/Common/SymbianDecompressor.cs
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:50:58 +0200
changeset 0 818e61de6cd1
permissions -rw-r--r--
Add initial version of Crash Analyser cmdline under EPL


/*
* 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:
*
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using SymbianUtils;
using SymbianStructuresLib.Compression.BytePair;
using SymbianStructuresLib.Compression.Inflate;

namespace SymbianStructuresLib.Compression.Common
{
    public abstract class SymbianDecompressor : DisposableObject
    {
        #region Factory
        public static SymbianDecompressor NewByType( TSymbianCompressionType aType )
        {
            SymbianDecompressor ret = null;
            //
            switch ( aType )
            {
            case TSymbianCompressionType.EBytePair:
                ret = new SymbianDecompressorBytePair();
                break;
            case TSymbianCompressionType.EDeflate:
                ret = new SymbianDecompressorInflate();
                break;
            }
            //
            return ret;
        }
        #endregion

        #region Constructors
        protected SymbianDecompressor()
        {
        }
        #endregion

        #region Framework API
        public abstract TSymbianCompressionType Type
        {
            get;
        }

        protected abstract int DoDecompressRaw( IntPtr aSource, int aSourceLength, IntPtr aDestination, int aDestinationLength );

        protected virtual int DoDecompressImage( IntPtr aSource, int aSourceLength, IntPtr aDestination, int aDestinationLength, out int aAmountOfSourceRead )
        {
            throw new NotImplementedException();
        }
        #endregion

        #region API
        public int DecompressRaw( byte[] aSource, byte[] aDestination )
        {
            if ( aSource == null || aDestination == null )
            {
                throw new ArgumentException( "Must supply data buffers" );
            }
            //
            int ret = 0;
            //
            unsafe
            {
                fixed ( byte* source = aSource )
                {
                    fixed ( byte* dest = aDestination )
                    {
                        IntPtr pSource = new IntPtr( source );
                        IntPtr pDest = new IntPtr( dest );
                        //
                        ret = DoDecompressRaw( pSource, aSource.Length, pDest, aDestination.Length );
                    }
                }
            }
            //
            return ret;
        }

        public int DecompressImage( byte[] aSource, byte[] aDestination, out int aAmountOfSourceRead )
        {
            if ( aSource == null || aDestination == null )
            {
                throw new ArgumentException( "Must supply data buffers" );
            }
            //
            int ret = 0;
            //
            unsafe
            {
                fixed ( byte* source = aSource )
                {
                    fixed ( byte* dest = aDestination )
                    {
                        IntPtr pSource = new IntPtr( source );
                        IntPtr pDest = new IntPtr( dest );
                        //
                        ret = DoDecompressImage( pSource, aSource.Length, pDest, aDestination.Length, out aAmountOfSourceRead );
                    }
                }
            }
            //
            return ret;
        }
        #endregion

        #region Properties
        #endregion

        #region Internal methods
        #endregion

        #region Data members
        #endregion
    }
}