xdmprotocols/LocalProtocol/LocalOperations/src/LocalOperationBase.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:14 +0100
branchRCL_3
changeset 35 fbd2e7cec7ef
parent 0 c8caa15ef882
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201027 Kit: 201035

/*
* Copyright (c) 2005 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: CLocalOperationBase
*
*/





// INCLUDES
#include "XdmXmlParser.h"
#include "LocalProtocol.h"
#include "LocalDocument.h"
#include "LocalOperationBase.h"

// ---------------------------------------------------------
// C++ constructor can NOT contain any code, that
// might leave.
// ---------------------------------------------------------
//
CLocalOperationBase::CLocalOperationBase( const CLocalDocument& aTargetDoc,
                                          CLocalOperationFactory& aOperationFactory ) :
                                          iTargetDoc( CONST_CAST( CLocalDocument&, aTargetDoc ) ),
                                          iOperationFactory( aOperationFactory ) 
    {
    }

// ---------------------------------------------------------
// Destructor
//
// ---------------------------------------------------------
//
CLocalOperationBase::~CLocalOperationBase()
    {
    iXmlFile.Close();
    delete iXmlParser;
    delete iFileManager;
    }

// ---------------------------------------------------------
// CLocalOperationBase::BaseConstructL
//
// ---------------------------------------------------------
//
void CLocalOperationBase::BaseConstructL()
    {
    iXmlParser = CXdmXmlParser::NewL();
    iFileManager = CFileMan::NewL( CLocalProtocol::FileSession() );
    }
    
// ---------------------------------------------------------
// CLocalOperationBase::WriteFileL
//
// ---------------------------------------------------------
//
void CLocalOperationBase::WriteFileL( const CXdmDocumentNode* aRootNode )
    {
    __ASSERT_DEBUG( aRootNode != NULL, User::Panic( _L( "CLocalOperationBase" ), 1 ) );
    HBufC8* data = iXmlParser->FormatToXmlLC( ETrue, &iTargetDoc, aRootNode );
    User::LeaveIfError( iXmlFile.Write( data->Des() ) );
    CleanupStack::PopAndDestroy();  //data
    GenerateTimeStampL();
    }

// ---------------------------------------------------------
// CLocalOperationBase::GenerateTimeStampL
//
// ---------------------------------------------------------
//
void CLocalOperationBase::GenerateTimeStampL()
    {
    RFile timeStamp;
    HBufC8* time = TimeLC();
    HBufC* timeStampName = ConstructTimestampNameL();
    CleanupStack::PushL( timeStampName );
    User::LeaveIfError( timeStamp.Replace( CLocalProtocol::FileSession(), timeStampName->Des(), EFileWrite ) );
    User::LeaveIfError( timeStamp.Write( time->Des() ) );
    timeStamp.Close();
    CleanupStack::PopAndDestroy( 2 );  //timeStampName, time
    }

// ---------------------------------------------------------
// CLocalOperationBase::ConstructTimestampNameL
//
// ---------------------------------------------------------
//
HBufC* CLocalOperationBase::ConstructTimestampNameL()
    {
    const TChar backSlash = 92;
    const TChar idSeparator = 46;
    TInt index = iFullPath.LocateReverse( backSlash );
    TPtrC path = iFullPath.Left( index + 1 );
    HBufC* fileName = HBufC::NewLC( iTargetDoc.Name().Length() + KTimeStampFileExt().Length() );
    HBufC* fullPath = HBufC::NewLC( path.Length() + fileName->Des().MaxLength() );
    TPtr ptr( fileName->Des() );
    ptr.Copy( iTargetDoc.Name() );
    index = ptr.LocateReverse( idSeparator );
    TPtrC tmspName = index > 0 ? ptr.Left( index ) : ptr;
    fullPath->Des().Copy( path );
    fullPath->Des().Append( tmspName );
    fullPath->Des().Append( KTimeStampFileExt );
    CleanupStack::Pop();  //fullPath
    CleanupStack::PopAndDestroy();  //fileName
    return fullPath;
    }

// ---------------------------------------------------------
// CLocalOperationBase::Time
//
// ---------------------------------------------------------
//
HBufC8* CLocalOperationBase::TimeLC()
    {
    TTime time;
    TBuf<KDateBufferMaxSize> dateBuffer;
	time.HomeTime();
    time.FormatL( dateBuffer, KDateFormat );
    TBuf<KDateBufferMaxSize> timeBuffer;
	time.HomeTime();
	time.FormatL( timeBuffer, KTimeFormat );
    TBuf<KDateTimeMaxSize> buffer;
    buffer.SetLength( 0 );
    buffer.Copy( dateBuffer );
    buffer.Append( _L( " " ) );
    buffer.Append( timeBuffer );
    HBufC8* ret = HBufC8::NewLC( buffer.Length() );
    ret->Des().Copy( buffer );
    return ret;        
    }

// ---------------------------------------------------------
// CLocalOperationBase::FetchXmlDataL
//
// ---------------------------------------------------------
//
HBufC8* CLocalOperationBase::FetchXmlDataL( TInt aFileSize )
    {
    HBufC8* data = HBufC8::NewLC( aFileSize );
    TPtr8 desc( data->Des() );
    User::LeaveIfError( iXmlFile.Read( desc ) );
    CleanupStack::Pop();  //data
    return data;
    }

// ---------------------------------------------------------
// CLocalOperationBase::FetchXmlDataL
//
// ---------------------------------------------------------
//
TInt CLocalOperationBase::OpenDataFileL( const TDesC& aFilePath )
    {
    TInt length = 0;
    iFullPath.Set( aFilePath );
    TInt error = iXmlFile.Open( CLocalProtocol::FileSession(), iFullPath,
                                EFileRead | EFileWrite | EFileShareExclusive );
    if( error != KErrNone )
        {
        if( error == KErrPathNotFound )
            User::LeaveIfError( CLocalProtocol::FileSession().MkDirAll( CLocalProtocol::RootFolder() ) );
        error = iXmlFile.Create( CLocalProtocol::FileSession(), iFullPath,
                                 EFileRead | EFileWrite | EFileShareExclusive );                                 
        }
    error = error == KErrNone ? iXmlFile.Size( length ) : KErrUnknown;
    return error == KErrNone ? length : error;
    }

// ---------------------------------------------------------
// CLocalOperationBase::ReplaceDataFileL
//
// ---------------------------------------------------------
//
void CLocalOperationBase::ReplaceDataFileL()
    {
    User::LeaveIfError( iXmlFile.Replace( CLocalProtocol::FileSession(), iFullPath,
                                          EFileRead | EFileWrite | EFileShareExclusive ) );
    }

// ---------------------------------------------------------
// CLocalOperationBase::DeleteDataFileL
//
// ---------------------------------------------------------
//
void CLocalOperationBase::DeleteDataFileL()
    {
    User::LeaveIfError( CLocalProtocol::FileSession().Delete( iFullPath ) );
    HBufC* timeStampName = ConstructTimestampNameL();
    CleanupStack::PushL( timeStampName );
    User::LeaveIfError( CLocalProtocol::FileSession().Delete( timeStampName->Des() ) );
    CleanupStack::PopAndDestroy();  //timeStampName
    }      

// ---------------------------------------------------------
// CLocalOperationBase::ExecuteL
//
// ---------------------------------------------------------
//
void CLocalOperationBase::ExecuteL( TRequestStatus& /*aStatus*/, TUint /*aOptions*/ )
    {
    }
        
// ---------------------------------------------------------
// CLocalOperationBase::CancelOperation
//
// ---------------------------------------------------------
//
void CLocalOperationBase::CancelOperation()
    {
    }

// ---------------------------------------------------------
// CLocalOperationBase::CompletionData
//
// ---------------------------------------------------------
//     
const TXdmCompletionData& CLocalOperationBase::CompletionData() const
    {
    return iCompletionData;
    }
        
// ---------------------------------------------------------
// CLocalOperationBase::IsCompleted
//
// ---------------------------------------------------------
//        
TBool CLocalOperationBase::IsCompleted() const
    {
    return ETrue;
    }
        
// ---------------------------------------------------------
// CLocalOperationBase::TargetNode
//
// ---------------------------------------------------------
//      
CXdmDocumentNode* CLocalOperationBase::TargetNode() const
    {
    return NULL;
    }                      

// ---------------------------------------------------------
// CLocalOperationBase::Result
//
// ---------------------------------------------------------
//        
TInt CLocalOperationBase::Result() const
    {
    return KErrNone;
    }   
     
//  End of File