qtinternetradio/irqstatisticsreport/src/irqstatisticsreporter.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 19 Apr 2010 14:01:53 +0300
changeset 0 09774dfdd46b
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c) 2009-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:  Qt wrapper class implementation for CIRReportGenerator
*
*/

#include "irsessionlogger.h" // CIRReportGenerator

#include "irqstatisticsreporter.h"
#include "irqnetworkcontroller.h"
#include "irqreportsender.h"

//Network Indicator
_LIT(KGPRS,"gprs");
_LIT(KWCDMA,"wcdma");
_LIT(KWLAN,"wlan");
_LIT(KCDMA2000,"cdma2000");
_LIT(KEDGE,"edge");

//Music Shop Type
_LIT(KFind,"find");
_LIT(KLaunch,"launch");

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::openInstance()
// Static function to get a singleton instance of IRQStatisticsReporter
// ---------------------------------------------------------------------------
//
EXPORT_C IRQStatisticsReporter* IRQStatisticsReporter::openInstance(IRQIsdsClient *aIsdsClient)
{
    // Get singleton instance
    IRQStatisticsReporter* reportGenerator =
                           reinterpret_cast<IRQStatisticsReporter*>(Dll::Tls());

    if (NULL == reportGenerator)
    {
        TRAPD(error, reportGenerator = createInstanceL(aIsdsClient));
        if (KErrNone != error)
        {
            delete reportGenerator;
            reportGenerator = NULL;
            Dll::SetTls(NULL);
        }
    }
    else
    {
        reportGenerator->iSingletonInstances++;
    }

    return reportGenerator;
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::closeInstance()
// Close a singleton instance of IRQStatisticsReporter
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::closeInstance()
{
    iSingletonInstances--;

    if (0 == iSingletonInstances)
    {
        Dll::SetTls(NULL);
        delete this;
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::IRQStatisticsReporter()
// Creates IRQStatisticsReporter instance
// ---------------------------------------------------------------------------
//
IRQStatisticsReporter* IRQStatisticsReporter::createInstanceL(IRQIsdsClient *aIsdsClient)
{
    IRQStatisticsReporter* reportGenerator = new (ELeave) IRQStatisticsReporter();
    reportGenerator->constructL(aIsdsClient);
    User::LeaveIfError(Dll::SetTls(reportGenerator));
    reportGenerator->iSingletonInstances = 1;

    return reportGenerator;
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::IRQStatisticsReporter()
// Constructor.
// ---------------------------------------------------------------------------
//
IRQStatisticsReporter::IRQStatisticsReporter():iBody(NULL),
                                               iSender(NULL),
                                               iNetworkController(NULL),
                                               iCurrentNetwork(0),
                                               iHomeOperator(0),
                                               iSingletonInstances(0)
{

}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::constructL()
// Two-Phase Constructor.
// ---------------------------------------------------------------------------
//
void IRQStatisticsReporter::constructL(IRQIsdsClient *aIsdsClient)
{
    iBody = CIRReportGenerator::OpenL();

    iNetworkController = IRQNetworkController::openInstance();

    iSender = new IRQReportSender(aIsdsClient);

    if(iBody && iSender)
    {
        iBody->SetDbStatusObserser(iSender);
    }

    connect(iSender, SIGNAL(reportSent()), this, SLOT(reportSent()));
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::~IRQStatisticsReporter()
// Destructor.
// ---------------------------------------------------------------------------
//
IRQStatisticsReporter::~IRQStatisticsReporter()
{
    if(iBody)
    {
        iBody->SetDbStatusObserser(NULL);
        iBody->Close();
    }

    if(iNetworkController)
    {
        iNetworkController->closeInstance();
    }

    delete iSender;
    iSender = NULL;
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::sessionStarted()
// starts a new session
// ---------------------------------------------------------------------------
//
EXPORT_C bool IRQStatisticsReporter::sessionStarted(const int aChanneldId, const IRQConnectedFrom aConnectedFrom)
{
    if(iBody)
    {
    	updateConnectedFrom(aConnectedFrom);
        iBody->UpdateChannelID(aChanneldId);
        updateConnectionType();

        TRAPD(error,iBody->SessionStartedL());
        if(error)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    return false;
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::markSessionStart()
// marks the start of a session
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::markSessionStart()
{
    if(iBody)
    {
        iBody->MarkSessionStart();
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::suspendSession()
// function handle session suspend
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::suspendSession()
{
    if(iBody)
    {
        iBody->HandleStopEvents(EFalse);
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::restartSession()
// function handle session restart
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::restartSession()
{
    if(iBody)
    {
        iBody->HandleStopEvents(ETrue);
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::sessionEnded()
// ends the session
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::sessionEnded(const IRQTerminatedType aTerminatedBy)
{
    if(iBody)
    {
        updateTerminatedBy(aTerminatedBy);
        TRAP_IGNORE(iBody->SessionEndL(EFalse));
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::logServerResult()
// logs server connection result
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::logServerResult(const QString& aUrl, const IRQError aServerResult)
{
    if(iBody)
    {
        TPtrC url(reinterpret_cast<const TUint16*>(aUrl.utf16()));
        switch(aServerResult)
        {
            case EIRQErrorNone:
                iBody->LogServerResult(url,EIRConnected);
                break;
            case EIRQPlayerErrorServerFull:
                iBody->LogServerResult(url,EIRFull);
                break;
            case EIRQPlayerErrorTimeOut:
                iBody->LogServerResult(url,EIRConnTimeOut);
                break;
            case EIRQPlayerErrorConnectingFailed:
                iBody->LogServerResult(url,EIRConnFailed);
                break;
            default:
                break;
        }
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::logNmsEvents()
// logs nmsEvents to Xml file
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::logNmsEvent(const IRQNmsType aNmsType, const int aChanneldId)
{
    TRAP_IGNORE(doLogNmsEventL(aNmsType,aChanneldId));
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::doLogNmsEventsL()
// logs nmsEvents to Xml file
// ---------------------------------------------------------------------------
//
void IRQStatisticsReporter::doLogNmsEventL(const IRQNmsType aNmsType, const int aChanneldId)
{
    if(iBody)
    {
    	updateNmsType(aNmsType);
        iBody->UpdateNmsChannelID(aChanneldId);
        iBody->NmsLogStartedL();
        iBody->WriteNmsLogtoXmlL();
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::logSongRecogEvent()
// logs songRecog event to Xml file 
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::logSongRecogEvent()
{
    if(iBody)
    {
        iBody->LogSongRecog();
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::updateCurrentNetwork()
// updates the current network
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::updateCurrentNetwork(const QString &aCurrentNwkMCC, const QString &aCurrentNwkMNC)
{
    QString nwkCode = aCurrentNwkMCC + aCurrentNwkMNC;
    iCurrentNetwork = nwkCode.toInt();
    iBody->UpdateCurrentNetwork(iCurrentNetwork);
    iBody->UpdateCurrentBrowseNetwork(iCurrentNetwork);
    iBody->UpdateNmsCurrentNetwork(iCurrentNetwork);    
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::updateHomeOperator()
// updates the home network
// ---------------------------------------------------------------------------
//
EXPORT_C void IRQStatisticsReporter::updateHomeOperator(const QString &aHomeNetworkMCC, const QString &aHomeNetworkMNC)
{
    QString nwkCode = aHomeNetworkMCC + aHomeNetworkMNC;
    iHomeOperator = nwkCode.toInt();
    iBody->UpdateHomeOperator(iHomeOperator);
    iBody->UpdateNmsHomeOperator(iHomeOperator);    
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::reportSent()
// should be called after report is sent to isds server
// ---------------------------------------------------------------------------
//
void IRQStatisticsReporter::reportSent()
{
    if(iBody)
    {
        iBody->ReportSent();
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::updateTerminatedBy()
// updates the termination status
// ---------------------------------------------------------------------------
//
void IRQStatisticsReporter::updateTerminatedBy(const IRQTerminatedType aTerminatedBy)
{
    if(iBody)
    {
        switch(aTerminatedBy)
        {
            case EIRQUserTerminated:
                iBody->UpdateTerminatedBy(EUserTerminated);
                break;
            case EIRQNoConnectionToServer:
                iBody->UpdateTerminatedBy(ENoConnectionToServer);
                break;
            case EIRQNoConnectionToNetwork:
                iBody->UpdateTerminatedBy(ENoConnectionToNetwork);
                break;
            default:
                // do NOT cover all cases
                iBody->UpdateTerminatedBy(EUserTerminated);
                break;
        }
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::updateConnectedFrom()
// updateds connected information
// ---------------------------------------------------------------------------
//
void IRQStatisticsReporter::updateConnectedFrom(const IRQConnectedFrom aConnectedFrom)
{
    if(iBody)
    {
        switch(aConnectedFrom)
        {
            case EIRQIsds:
                iBody->UpdateConnectedFrom(EIRIsds);
                break;
            case EIRQPresetAdhoc:
                iBody->UpdateConnectedFrom(EIRPresetAdhoc);
                break;
            case EIRQPresetIsds:
                iBody->UpdateConnectedFrom(EIRPresetIsds);
                break;
            case EIRQHistoryAdhoc:
                iBody->UpdateConnectedFrom(EIRHistoryAdhoc);
                break;
            case EIRQHistoryIsds:
                iBody->UpdateConnectedFrom(EIRHistoryIsds);
                break;
            case EIRQAdhocManual:
                iBody->UpdateConnectedFrom(EIRAdhocManual);
                break;
            case EIRQAdhocExternal:
                iBody->UpdateConnectedFrom(EIRAdhocExternal);
                break;                                
            default:
                break;
        }
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::updateConnectionType()
// updates the connection type
// ---------------------------------------------------------------------------
//
void IRQStatisticsReporter::updateConnectionType()
{
    if(iBody && iNetworkController)
    {
        IRQConnectionType connectionType = iNetworkController->identifyConnectionType();
        switch(connectionType)
        {
            case EIRQGprs:
                iBody->UpdateConnectionType(KGPRS);
                break;
            case EIRQWcdma:
                iBody->UpdateConnectionType(KWCDMA);
                break;
            case EIRQCdma2000:
                iBody->UpdateConnectionType(KCDMA2000);
                break;                
            case EIRQWiFi:
                iBody->UpdateConnectionType(KWLAN);
                break;
            case EIRQEdge:
                iBody->UpdateConnectionType(KEDGE);
                break;
            default:
                // do NOT cover all cases
                iBody->UpdateConnectionType(KNullDesC);
                break;
        }
    }
}

// ---------------------------------------------------------------------------
// IRQStatisticsReporter::updateNmsType()
// updates the nokia music shop access type
// ---------------------------------------------------------------------------
//
void IRQStatisticsReporter::updateNmsType(const IRQNmsType aNmsType)
{
    if(iBody)
    {
        switch(aNmsType)
        {
            case EIRQFind:
                iBody->UpdateNmsType(KFind);
                break;
            case EIRQLaunch:
                iBody->UpdateNmsType(KLaunch);
                break;
            default:
                break;
        }
    }
}