/*
* 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:
*
*/
#ifndef __FILE_LOGGER_H__
#define __FILE_LOGGER_H__

#include <f32file.h>
#include <eikenv.h>

class FileLogger{
    class LogFile{
    public:
        LogFile(){
            _LIT( KLogFile, "C:\\atbtn.log" );
            RFs& fs = CEikonEnv::Static()->FsSession();
            if ( iFile.Open( fs, KLogFile, EFileWrite | EFileShareAny ) != KErrNone )
            {
                iFile.Create( fs, KLogFile, EFileWrite | EFileShareAny );
            }
            
            TInt pos=0;  // this must be 0
            iFile.Seek( ESeekEnd, pos );
        }

        ~LogFile(){ iFile.Close(); }

        RFile& operator()(){ return iFile; }
    private:
        RFile iFile;
    };

public:
    // dll can not hold static vars, so...
    static FileLogger& GetInstance(){
        static FileLogger logger;
        return logger;
    }

    const FileLogger& operator<<(const TDesC& aText)
    {
        LogFile file;
        
        HBufC8* text = HBufC8::NewL( aText.Length() );
        TPtr8 textPtr = text->Des();
        textPtr.Copy( aText );
        file().Write( *text );
        delete text;

        TBuf8<2> enter;
        enter.Append( 13 );
        enter.Append( 10 );
        file().Write( enter );

        return *this;
    }

    const FileLogger& operator<<(TInt n){
        LogFile file;
        
        TInt i=1;
        for(TInt v=n; v!=0; ++i, v/=10){}
        HBufC* text = HBufC::NewL( i );
        TPtr textPtr = text->Des();

        _LIT(KFmt, "%d");
        textPtr.Format( KFmt, n );
        HBufC8*  text8 = HBufC8::NewL( textPtr.Length() );
        TPtr8 textPtr8 = text8->Des();
        textPtr8.Copy(*text);

        file().Write( *text8 );
        delete text;
        delete text8;

        TBuf8<2> enter;
        enter.Append( 13 );
        enter.Append( 10 );
        file().Write( enter );

        return *this;
    }

private:
    FileLogger(){}
};

#endif //__FILE_LOGGER_H__