/*
* 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:   Declaration of CNcdDeviceService
*
*/


#ifndef C_NCD_DEVICE_SERVICE_IMPL_H
#define C_NCD_DEVICE_SERVICE_IMPL_H

#include <e32base.h>
#include <AknsSrvClient.h>

#include "ncddeviceservice.h"

class CTelephony;
class CNcdTestConfig;

// Uncomment this if device ID should be retrieved from 
// CUserAgent instead of CTelephony
#define GET_DEVICE_ID_FROM_USERAGENT


/**
 *
 */
class CNcdDeviceService : public CActive,
                          public MNcdDeviceService
    {
public: // Construction & destruction

    /**
     * Constructor.
     * @return CNcdDeviceService* Device service.
     */
    static CNcdDeviceService* NewL();
    
    /**
     * Constructor.
     * @return CNcdDeviceService* Device service.
     */
    static CNcdDeviceService* NewLC();
    
    /**
     * Destructor.
     */
    ~CNcdDeviceService();
    
private: // Construction

    /**
     * Constructor.
     */
    CNcdDeviceService();
    
    void ConstructL();

private: // From CActive

    void RunL();
    void DoCancel();
    TInt RunError( TInt aError );

public: // From MNcdDeviceService

    /**
     * @see MNcdDeviceService::SetAsRingingToneL
     */
    void SetAsRingingToneL( const TDesC& aFileName );

    /**
     * @see MNcdDeviceService::SetAsWallpaper
     */
    void SetAsWallpaperL( const TDesC& aFileName );

    /**
     * @see MNcdDeviceService::SetAsThemeL
     */
    void SetAsThemeL( const TDesC& aThemeName );

    /**
     * @see MNcdDeviceService::CurrentThemeNameL
     */
    const TDesC& CurrentThemeNameL();

    /**
     * @see MNcdDeviceService::HomeNetworkInfoL
     */
    void HomeNetworkInfoL( TDes& aMCC, TDes& aMNC );

   
    /**
     * @see MNcdDeviceService::CurrentMccL
     */
    const TDesC& CurrentMccL();
    
    /**
     * @see MNcdDeviceService::CurrentMncL
     */
    const TDesC& CurrentMncL();
    
    
    /**
     * @see MNcdDeviceService::ServiceProviderL
     */
    void ServiceProviderL( TDes& aServiceProvider );

    /**
     * @see MNcdDeviceService::ImsiL()
     */
    const TDesC& ImsiL();


    const TDesC& ImeiL();

    /**
     * @see MNcdDeviceService::DeviceIdentificationLC()
     */
    HBufC* DeviceIdentificationLC();


    /**
     * @see MNcdDeviceService::DeviceManufacturerL()
     */
    const TDesC& DeviceManufacturerL();


    /**
     * @see MNcdDeviceService::DeviceModelL()
     */
    const TDesC& DeviceModelL();
    
    
    /**
     * @see MNcdDeviceService::Series60VersionL()
     */
    //TVersion Series60VersionL();

    /**
     * @see MNcdDeviceService::DeviceLanguageLC()
     */
    HBufC* DeviceLanguageLC();
    
    
    /** 
     * @see MNcdDeviceService::FirmwareL()
     */
    const TDesC& FirmwareL();


    void ConnectL();
    
    TInt Close();
    

    /** 
     * @see MNcdDeviceService::AppendVariantToFirmwareL()
     */
    void AppendVariantToFirmwareL( RFs& aFs );
    
    /**
     * see MNcdDeviceService::FlashPlayerUidL()
     */
    TUid FlashPlayerUidL();
    
    
    void InitializeL();
    
    /**
     * @see MNcdDeviceService::ProductCodeLC()
     */
    HBufC* ProductCodeLC();
    
    /**
     * @see MNcdDeviceService::GetProductType()
     */
    TInt GetProductType( TDes& aType, RFs& aFs );

    /**
     * @see MNcdDeviceService::GetFirmwareId()
     */
    TInt GetFirmwareId( TDes& aId, RFs& aFs );
    
    
    void GetFirmwareVersion1( TDes& aTarget );

    void GetFirmwareVersion2( TDes& aTarget );
    
    void GetFirmwareVersion3( TDes& aTarget, RFs& aFs );
        
    
#ifdef CATALOGS_BUILD_CONFIG_DEBUG
    /**
     * Used to set a test configuration that overrides device config
     *
     * @note Ownership is transferred to the device service
     */
    void SetTestConfig( CNcdTestConfig* aTestConfig );
#endif

private: // New functions

    /**
     * Parses skin package location from path.
     * @param aPath Skin path.
     * @return TAknSkinSrvSkinPackageLocation Skin location.
     */
    TAknSkinSrvSkinPackageLocation SkinLocationFromPath( const TDesC& aPath );
    
#ifdef GET_DEVICE_ID_FROM_USERAGENT    
    HBufC8* UserAgentL() const;
#endif    
    
    void GetPhoneLC( RTelServer& aServer, RPhone& aPhone );

    void GetSubscriberId();
    
    void GetNetworkInfo();
            
    void GetNetworkRegistrationStatus();

    void WaitForInitL();
    
    void DeleteWait();
    
    // Finishes the initialization 
    void FinishInitialization();

    // Reads phone variant information and returns it
    HBufC* ReadVariantInformationLC( RFs& aFs );
    
private:

    enum TDeviceServiceState
        {
        ENotInitialized = 0,
        EGetPhoneId,
        EGetSubscriberId,
        EGetNetworkInfo,        
        EInitialized
        };
    
private: // data

    HBufC* iCurrentThemeName;    

    CTelephony* iTelephony;
    CTelephony::TPhoneIdV1 iPhoneIdV1;
    CTelephony::TPhoneIdV1Pckg iPhoneIdV1Pckg;

    CTelephony::TSubscriberIdV1 iSubscriberIdV1;
    CTelephony::TSubscriberIdV1Pckg iSubscriberIdV1Pckg;
    
    CTelephony::TNetworkInfoV1 iNetworkInfoV1;
    CTelephony::TNetworkInfoV1Pckg iNetworkInfoV1Pckg;
                
    CActiveSchedulerWait* iWaiter;
    
    HBufC* iImsi;
    HBufC* iFirmware;    

    HBufC* iDeviceManufacturer;
    HBufC* iDeviceModel;

    RTelServer iServer;
    RMobilePhone iPhone;
    TBool iConnected;
    
    TDeviceServiceState iState;
    CTelephony::TCancellationRequest iCurrentCancelCode;
    
    TInt iError;
    
#ifdef CATALOGS_BUILD_CONFIG_DEBUG
    CNcdTestConfig* iTestConfig;
#endif
    };

#endif // C_NCD_DEVICE_SERVICE_IMPL_H
