xdmprotocols/LocalProtocol/src/LocalProtocol.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:14 +0100
branchRCL_3
changeset 18 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: CLocalProtocol
*
*/



#include <hal.h>
#include <f32file.h>
#include <xdmlogwriter.h>
#include <implementationproxy.h>
#include "XdmXmlParser.h"
#include "LocalProtocol.h"
#include "LocalDocument.h"
#include "LocalDocumentNode.h"
#include "LocalDirectory.h"
#include "XdmCredentials.h"
#include "XdmProtocolInfo.h"
#include "XdmOperationFactory.h"

// ----------------------------------------------------------
// CLocalProtocol::CLocalProtocol
// 
// ----------------------------------------------------------
//
CLocalProtocol::CLocalProtocol( const CXdmEngine& aXdmEngine,
                                const CXdmProtocolInfo& aProtocolInfo ) :
                                iTransferMediaOpen( EFalse ),
                                iXdmEngine( CONST_CAST( CXdmEngine&, aXdmEngine ) ),
                                iProtocolInfo( aProtocolInfo )
    {   
    }
    
// ----------------------------------------------------------
// CLocalProtocol::DeleteLogFileL
// 
// ----------------------------------------------------------
//
CLocalProtocol* CLocalProtocol::NewL( const TXdmProtocolParams& aProtocolParams )
    {
    CLocalProtocol* self = new ( ELeave ) CLocalProtocol( aProtocolParams.iXdmEngine,
                                                          aProtocolParams.iProtocolInfo );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

// ----------------------------------------------------------
// CLocalProtocol::DeleteLogFileL
// 
// ----------------------------------------------------------
//
CLocalProtocol::~CLocalProtocol()
    {
    #ifdef _DEBUG
        WriteToLog( _L8( "CLocalProtocol::~CLocalProtocol()" ) );  
    #endif
    delete iRootFolder;
    delete iXmlParser;
    delete iLogWriter;
    iFileSession.Close();
    Dll::FreeTls();
    }
        
// ----------------------------------------------------------
// CLocalProtocol::ConstructL
// 
// ----------------------------------------------------------
//
void CLocalProtocol::ConstructL()
    {
    #ifdef _DEBUG
        iLogWriter = CXdmLogWriter::NewL( KLocalEngLogFile );
        WriteToLog( _L8( "CLocalProtocol::ConstructL() " ) );  
    #endif
    iXmlParser = CXdmXmlParser::NewL();
    SetRootDirectoryL( iProtocolInfo.Root() ); 
    User::LeaveIfError( iFileSession.Connect() );
    Dll::SetTls( this );                                                                               
    }

// ----------------------------------------------------------
// CLocalProtocol::SetRootDirectoryL
// 
// ----------------------------------------------------------
//
void CLocalProtocol::SetRootDirectoryL( const TDesC& aRootPath )
    {
    TUid id = RProcess().Identity();
    TBuf<32> processId;
    processId.Zero();
    processId.Format( _L( "%x" ), id );
    #ifdef _DEBUG
        WriteToLog( _L8( "CLocalProtocol::SetRootDirectoryL()" ) );  
    #endif
    if( aRootPath.Length() > 0 )
        {
        iRootFolder = HBufC::NewL( aRootPath.Length() +
                                   processId.Length() + 
                                   TPtrC( KLocalEngPrivateRoot ).Length() + 4 );
        iRootFolder->Des().Copy( KLocalEngPrivateRoot );
        iRootFolder->Des().Append( processId );
        iRootFolder->Des().Append( _L( "\\" ) );
        iRootFolder->Des().Append( aRootPath );
        iRootFolder->Des().Append( _L( "\\" ) );
        }
    else
        {
        iRootFolder = HBufC::NewL( processId.Length() + 
                                   KLocalEngPrivateRoot().Length() + 2 );
        iRootFolder->Des().Copy( KLocalEngPrivateRoot );
        iRootFolder->Des().Append( processId );
        iRootFolder->Des().Append( _L( "\\" ) );
        }
    #ifdef _DEBUG
        TBuf8<256> eight;
        eight.Copy( iRootFolder->Des() );
        WriteToLog( _L8( "  Path: %S" ), &eight );  
    #endif
    }

// ----------------------------------------------------------
// CLocalProtocol::.WriteToLog
// 
// ----------------------------------------------------------
//
void CLocalProtocol::WriteToLog( TRefByValue<const TDesC8> aFmt,... ) const                                
    {
    VA_LIST list;
    VA_START( list, aFmt );
    TBuf8<KLogBufferMaxSize> buf;
    buf.FormatList( aFmt, list );
    iLogWriter->WriteToLog( buf );
    }
    
// ----------------------------------------------------
// CLocalProtocol::InitTransferMedia
// 
// ----------------------------------------------------
//
void CLocalProtocol::InitTransferMedium( TInt /*aIdleTimeout*/,
                                        TRequestStatus& aStatus )
    {
    TRequestStatus* status = &aStatus;
    User::RequestComplete( status, KErrNone );
    }

// ----------------------------------------------------
// CLocalProtocol::CancelTransferMediaInit
// 
// ----------------------------------------------------
//
void CLocalProtocol::CancelTransferMediumInit()
    {
    }

// ----------------------------------------------------
// CLocalProtocol::IsTransferAvailable
// 
// ----------------------------------------------------
//
TBool CLocalProtocol::IsTransferAvailable() const
    {
    return ETrue;
    }
            
// ----------------------------------------------------
// CLocalProtocol::RFSession
// 
// ----------------------------------------------------
//
RFs& CLocalProtocol::RFSession()
    {
    return iFileSession;
    }

// ----------------------------------------------------
// CLocalProtocol::Root
// 
// ----------------------------------------------------
//
TPtrC CLocalProtocol::Root()
    {
    return iRootFolder != NULL ? iRootFolder->Des() : TPtrC();
    }
    
// ----------------------------------------------------------
// void CXcapProtocol::DeleteLogFileL
// 
// ----------------------------------------------------------
//
EXPORT_C RFs& CLocalProtocol::FileSession()
    {
    TAny* ptr = Dll::Tls();
    CLocalProtocol* self = ( CLocalProtocol* )ptr;
    return self->RFSession();  
    }
    
// ----------------------------------------------------
// CLocalProtocol::RootFolder
// 
// ----------------------------------------------------
//
EXPORT_C TPtrC CLocalProtocol::RootFolder()
    {
    TAny* ptr = Dll::Tls();
    CLocalProtocol* self = ( CLocalProtocol* )ptr;
    return self->Root();
    }

// ----------------------------------------------------
// CLocalProtocol::CreateDocumentNodeL
// 
// ----------------------------------------------------
//
CXdmDocumentNode* CLocalProtocol::CreateDocumentNodeL()
    {
    return CLocalDocumentNode::NewL( iXdmEngine, *this );
    }
    
// ----------------------------------------------------
// CLocalProtocol::CreateDocumentL
// 
// ----------------------------------------------------
//
CXdmDocument* CLocalProtocol::CreateDocumentL( const TDesC& aDocumentName,
                                               const TXdmDocType /*aDocumentType*/ )
    {
    return CLocalDocument::NewL( iXdmEngine, aDocumentName, *this );
    }

// ----------------------------------------------------
// CLocalProtocol::CreateDirectoryL
//
// ----------------------------------------------------
//
CXdmDirectory* CLocalProtocol::CreateDirectoryL( const TDesC& aDirectoryPath )
    {
    TPtrC root = iRootFolder->Des();
    HBufC* fullName = HBufC::NewLC( root.Length() + aDirectoryPath.Length() );
    fullName->Des().Copy( root );
    fullName->Des().Append( aDirectoryPath );
    CXdmDirectory* dir = CLocalDirectory::NewL( fullName->Des(), iXdmEngine, *this );
    CleanupStack::PopAndDestroy();  //fullName
    return dir;
    }

// ---------------------------------------------------------
// Map the interface UIDs to implementation factory functions
// 
// ---------------------------------------------------------
//
const TImplementationProxy ImplementationTable[] = 
    {
    #ifdef __EABI__
        IMPLEMENTATION_PROXY_ENTRY( 0x10207424, CLocalProtocol::NewL )
    #else
        { { 0x10207424 }, CLocalProtocol::NewL }
    #endif
    };

// ---------------------------------------------------------
// Return the implementation table & number of implementations
// 
// ---------------------------------------------------------
//
EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
    {
    aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
    return ImplementationTable;
    }
    

// End of File