nettools/conntest/Engine/ipdumpengine.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 14:51:55 +0300
changeset 17 e2b83f60b858
parent 0 857a3e953887
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c) 2006 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: CIpdumpEngine is used to control the ip logging protocol
*
*/

#include <f32file.h>
#include <nifman.h>
#include "ipdumpengine.h"


//
// CIpdumpEngine.
//

CIpdumpEngine* CIpdumpEngine::NewL()
{
    CIpdumpEngine* self = new (ELeave) CIpdumpEngine();
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
}

CIpdumpEngine::CIpdumpEngine()
: iLoggingEnabled(EFalse)
{
    // If changed change the filename also
    // in the ip logging protocol to match
    _LIT(KLogFilePath, "c:\\logs\\tcpdump\\probe.cap"); 
    iLogFileName.Append(KLogFilePath);
}

// This is to get around of the restrictions of the secure file system,
// when the conntest and the probe are installed from a sis
// You cannot install the esk to the right place directly, so copy it here
// Requires all files capability
_LIT(KIpDumpEskImport, "\\private\\101f7989\\import\\esock\\ip.probe.esk");
_LIT(KIpDumpEskEsock, "\\private\\101f7989\\esock\\ip.probe.esk");

void AttemptToCopyEskFile()
	{
	RFs fs;
	TInt err = fs.Connect();

	if (err)
		{
		return;
		}

	CFileMan* fileman = NULL;
	TRAP(err, fileman = CFileMan::NewL(fs));

	if (err)
		{
		fs.Close();
		return;
		}

	(void)fileman->Copy(KIpDumpEskImport, KIpDumpEskEsock, CFileMan::ERecurse);

	delete fileman;
	fs.Close();
	}

void CIpdumpEngine::ConstructL()
{
	AttemptToCopyEskFile();
}


CIpdumpEngine::~CIpdumpEngine()
{
    DisableLogging();
}



TInt CIpdumpEngine::CreateLogDirectory()
{

    RFs fs;
    TInt r;
    
    r = fs.Connect();
    
    if(r==KErrNone)
    {
        
        // Delete the old log file. After disabling the logging the file
        // is in use for short period of time, therefore doing the deletion
        // in loop to avoid error message in UI.
        while((r = fs.Delete(iLogFileName)) == KErrInUse)
        	User::After(1);
        
        if(r == KErrNotFound || r == KErrPathNotFound)
        {
            r = fs.MkDirAll(iLogFileName);
            r = (r==KErrAlreadyExists) ? KErrNone : r;
        }
    }
    
    fs.Close();
    return r;
}




void CIpdumpEngine::EnableLoggingL()
{
    
    if(iLoggingEnabled)
    {
        return;
    }
    
    User::LeaveIfError(CreateLogDirectory());
    
    User::LeaveIfError(iSocketServ.Connect());    
    
    TProtocolDesc protocol;
    TProtocolName name(_S("probe"));
        
    User::LeaveIfError(iSocketServ.FindProtocol(name, protocol));
    
    User::LeaveIfError(iSocket.Open(iSocketServ, name));
        
    iLoggingEnabled = ETrue;
    
    return;
}

void CIpdumpEngine::DisableLogging()
{
    if(iLoggingEnabled)
    {
        iSocket.Close();
        iSocketServ.Close();
        
        iLoggingEnabled = EFalse;
    }
}

TBool CIpdumpEngine::LoggingEnabled() const
{
    
    return iLoggingEnabled;
}

const TDesC& CIpdumpEngine::LogFileName() const
{
       return iLogFileName;
}