/*
 * Copyright (c) 2002 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:  
 *     An active object class which takes care of reading the possible new
 *     service centres from SIM and adds them to Sms Settings.
 *
 */

#ifndef __SIMSCNUMBERDETECTOR_H__
#define __SIMSCNUMBERDETECTOR_H__

//  INCLUDES
#include <msvapi.h>     // for MsvSession
#include <smsclnt.h>    // for CSmsClientMtm
#include <e32base.h>
#include <smutsimparam.h>   // for CSmsSimParamOperation

// CONSTANTS
const TInt KMaxNameLength = 60;
const TInt KSmumGranularity = 4;
const TInt KSmumRetryCount = 20;
const TInt KSmumRetryDelay = 5000000; // 5 secs
const TInt KSmumSMSPid = 50;
const TInt KTestStringLength = 100;
const TInt KDefDeliveryReport = 1;
const TInt KDefValidityPeriod = 1440;
const TInt KDefMessageConversion = 0;
const TInt KDefPreferredConnection = 3;
const TInt KDefReplyViaSameCentre = 0;

// CONSTANTS
_LIT( KSmsService,         "Sms Service" );
_LIT( KSmscDefaultName,    "New service centre");
_LIT( KSmscSimDefaultName, "New SIM service centre");
_LIT( KFmtSpec,            "%S(%02d)");

// FORWARD DECLARATIONS
class CClientMtmRegistry;
class CStartUpMonitor;
class CRepository;

/**
 * Observer to indicate when SIM operation has been completed.
 */
class MSimOperationObserver
{
public:
    virtual void CompleteOperation()=0;
};

/**
 *  CMsgSimOperation
 *  Inherited from CBase, MMsvSessionObserver
 */
class CMsgSimOperation : public CBase, public MMsvSessionObserver
{
public:
    
    /**
     * Constructor.
     */
    IMPORT_C static CMsgSimOperation* NewL(MSimOperationObserver& aObserver);

    /**
     * Destructor
     */
    ~CMsgSimOperation();

public:
    

    /**
     * Callback function for startup state monitor object
     */
    void HandleStartupReadyL();

private:
    
    /**
     * C++ constructor which initializes the active object with a 
     * default priority and adds it to the active scheduler.
     * @param TRequestStatus& aStatus, TInt aPriority
     * @return nothing
     */
    CMsgSimOperation(MSimOperationObserver& aObserver);

    /**
     * This function simulates issuing request, activates the object 
     * and starts to open Msv session
     * @param none
     * @return nothing
     */
    void StartL();

    /**
     * Complete the client's active object request status
     * @param TInt aValue
     * @return nothing
     */
    
    void CompleteClientRequest(TInt aValue);
    
    /**
     * Checks if the device has SIM when phone boots
     * @reutrn bool
     */  
    TBool IsSIMPresent();

    /**
     * Checks if the SIM has been changed in the next boot
     * @reutrn bool
     */
    TBool HasSIMChanged();

    /**
     * Checks if already SMSC setting is there
     * @reutrn bool
     */
    TBool HasNoSmscSettings();
    
    /**
     * Gets default name for SMSC, if SIM does not have one 
     */
    void FindNameForSCL(TDes& aName, TBool aNameIsForSCentreFromSIM,
                               CDesCArrayFlat* aSCNamesList);

    /**
     * Creates a SMS service, if not there
     */
    TMsvId CreateSmsServiceL();
    
    /**
     * Creates default settings for the SMS account
     */
    void CreateDefaultSettingsL(TMsvId aServiceId);

    /**
     * Reads default settings from the Cenrep
     */
    void ReadDefaultSettingsFromSharedDataL(CSmsSettings* aServiceSettings);
    
    /**
     * Gets the Service Id 
     */
    TMsvId ServiceIdL();
     
private:

    /**
     *
     */
    enum TSimOperationPanic
    {
        ESimOperationPanicRequestAlreadyActive = 0,
        ESimOperationPanicClientsRequestAlreadyCompleted
    };

    /**
     * Panic the thread
     * @param TSimOperationPanic aPanic
     * @return nothing
     */
    static void Panic(TSimOperationPanic aPanic);

private:

    void StartRunL(TInt aError);
    
    void DoStartRunL();

    /**
     * From MMsvSessionObserver 
     */
    void HandleSessionEventL(TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2,
                             TAny* aArg3);

    /**
     * By default Symbian OS constructor is private.
     */
    void ConstructL();

private:
    // Data
    CSmsSimParamOperation* iSimOperation;
    CMsvSession* iMsvSession;
    CSmsClientMtm* iSmsClientMtm;
    CClientMtmRegistry* iClientRegistry;
    TInt iRetryCount;
    CStartUpMonitor* iStartupMonitor;
    MSimOperationObserver& iObserver;
    CRepository* iCenRepSession;


};

#endif  // not defined __SIMSCNUMBERDETECTOR_H__
// End of file
