harvester/server/src/restorewatcher.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:34:07 +0200
changeset 0 c53acadfccc6
child 1 acef663c1218
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
* Copyright (c) 2008-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:  This implements CRestoreWatcher class.
*
*/

// SYSTEM INCLUDE
#include <centralrepository.h>
#include <sbdefs.h>
#include <driveinfo.h>
#include <PathInfo.h>

// USER INCLUDE
#include "restorewatcher.h"
#include "harvesterlog.h"
#include "propertywatcher.h"
#include "clientkeywatcherkeys.h"

// STATIC MEMBERS
TInt CRestoreWatcher::iRegisteredClients = 0;
TBool CRestoreWatcher::iRestoreDone = EFalse;


// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CRestoreWatcher::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CRestoreWatcher* CRestoreWatcher::NewL()
	{
	WRITELOG("CRestoreWatcher* CRestoreWatcher::NewL()");
	CRestoreWatcher* self = new (ELeave) CRestoreWatcher();
	CleanupStack::PushL( self );
	self->ConstructL();
	CleanupStack::Pop( self );
	return self;
	}

// -----------------------------------------------------------------------------
// CRestoreWatcher::CRestoreWatcher
// Standard C++ constructor.
// -----------------------------------------------------------------------------
//
CRestoreWatcher::CRestoreWatcher() : iPropertyWatcher( NULL ), iClients( 0 )
	{
	// No implementation required.
	}

// -----------------------------------------------------------------------------
// CRestoreWatcher::~CRestoreWatcher
// Standard C++ destructor.
// -----------------------------------------------------------------------------
//
CRestoreWatcher::~CRestoreWatcher()
	{
	
	if( iPropertyWatcher )
		{
		iPropertyWatcher->StopListeningKeyChanges( 
				KUidSystemCategory,
				conn::KUidBackupRestoreKey, this );
		
	
		iPropertyWatcher->StopListeningKeyChanges( 
				KPSRestoreWatcherCategory,
				KPSRestoreWatcherClientsKey, this );
		
		iPropertyWatcher->Delete(); // Release connection to TLS object.
		}
	}

// -----------------------------------------------------------------------------
// CRestoreWatcher::ConstructL
// Symbian 2nd phase constructor.
// -----------------------------------------------------------------------------
//
void CRestoreWatcher::ConstructL()
	{
	WRITELOG("CRestoreWatcher::ConstructL()");

	CreateFileNameL();
	CheckRestoreL();
    WRITELOG1("CRestoreWatcher::ConstructL() - iRestoreDone: %d", iRestoreDone );
	
	WRITELOG("CRestoreWatcher::ConstructL() - creating restore watcher PS key");
	RProperty clientsProperty;
    const TInt error = clientsProperty.Define(
    		KPSRestoreWatcherCategory, 
			KPSRestoreWatcherClientsKey,
			RProperty::EInt );
	
    clientsProperty.Close();
	
	if( error != KErrAlreadyExists ) // KErrAlreadyExists not error.
		{
		User::LeaveIfError( error );
		}
	
	iPropertyWatcher = CPropertyWatcher::GetInstanceL();
	
	// Want to listen when backup/restore starts.
	// Calls NotifyKeyL when key's state has changed. 
	iPropertyWatcher->ListenKeyChangesL( 
			KUidSystemCategory,
			conn::KUidBackupRestoreKey, this );
	
	// Listen message clients.
	iPropertyWatcher->ListenKeyChangesL( 
			KPSRestoreWatcherCategory,
			KPSRestoreWatcherClientsKey, this );
	
	
	WRITELOG("CRestoreWatcher::ConstructL() ends");
	}
	
// -----------------------------------------------------------------------------
// CRestoreWatcher::CreateFileNameL
// Filename flag can be changed to use cen rep!
// -----------------------------------------------------------------------------
//
void CRestoreWatcher::CreateFileNameL() 
	{
	TInt drive ( 0 );
	User::LeaveIfError( 
			DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, drive ) );

    RFs fsSession;
    User::LeaveIfError( fsSession.Connect() );
  
    TChar driveLetter;
    fsSession.DriveToChar( drive, driveLetter );
	
    iFileName.Append( driveLetter );
    iFileName.Append( KRestoreFile );  // result-> C:\\private\\200009F5\\restoredone
 
    fsSession.Close();
	}


// -----------------------------------------------------------------------------
// CRestoreWatcher::NotifyKeyL
// CPropertyWatcher's callback.
// -----------------------------------------------------------------------------
//
void CRestoreWatcher::NotifyKeyL( 
		const TInt aKeyValue,
		const TUid aPropertyCategory,
		const TUint aKey )
	{
	WRITELOG("CRestoreWatcher::NotifyKeyL() - begin");
	
	if( aPropertyCategory == KUidSystemCategory &&
			aKey == conn::KUidBackupRestoreKey )
		{
		HandleBackupRestoreKeyActionL( aKeyValue );
		}
	
	if( aPropertyCategory == KPSRestoreWatcherCategory &&
			aKey == KPSRestoreWatcherClientsKey )
		{
		HandleClientsKeyActionL( aKeyValue );
		}
	
	WRITELOG("CRestoreWatcher::NotifyKeyL() - end");
	}

// -----------------------------------------------------------------------------
// CRestoreWatcher::HandleBackupKeyActionL
// When user starts restore sets flag on.
// -----------------------------------------------------------------------------
//
void CRestoreWatcher::HandleBackupRestoreKeyActionL( const TUint aKeyValue )
	{	
	WRITELOG("CRestoreWatcher::HandleBackupKeyActionL() - begin");
	
	TInt backupStateValue = aKeyValue;
	backupStateValue &= conn::KBURPartTypeMask;

	if ( backupStateValue == conn::EBURRestoreFull ||
	     backupStateValue == conn::EBURRestorePartial )
		{
		WRITELOG("CRestoreWatcher::RunL() - setting restore to TRUE");
		SetRestoreFlagL( ETrue );
		}
	
	WRITELOG("CRestoreWatcher::HandleBackupKeyActionL() - end");
	}

// -----------------------------------------------------------------------------
// CRestoreWatcher::HandleClientsKeyActionL
// Handle message clients registering to watcher.
// -----------------------------------------------------------------------------
//
void CRestoreWatcher::HandleClientsKeyActionL( const TUint aKeyValue )
	{	
	WRITELOG("CRestoreWatcher::HandleBackupKeyActionL() - begin");

	// aKeyValue contains clients count.
	if ( aKeyValue < iClients )
		{
		WRITELOG("CRestoreWatcher::HandleClientsKeyActionL - unregistering");
		UnregisterL();
		}
	else if ( aKeyValue > iClients )
		{
		WRITELOG("CRestoreWatcher::HandleClientsKeyActionL - registering");
		Register();
		}
	
	iClients = aKeyValue;

	WRITELOG("CRestoreWatcher::HandleBackupKeyActionL() - end");	
	}

// -----------------------------------------------------------------------------
// CRestoreWatcher::Register
// Registers client to watcher.
// -----------------------------------------------------------------------------
//
TBool CRestoreWatcher::Register()
	{	
	WRITELOG("CRestoreWatcher::Register()");
	if ( iRestoreDone )
		{
		WRITELOG("CRestoreWatcher::Register() - partial restore was done.");
		iRegisteredClients++;
		WRITELOG1("CRestoreWatcher::Register() - registered clients: %d", iRegisteredClients);
		}
	
	return iRestoreDone;
	}

// -----------------------------------------------------------------------------
// CRestoreWatcher::UnregisterL
// Unregister client to watcher.
// -----------------------------------------------------------------------------
//
void CRestoreWatcher::UnregisterL()
	{
	WRITELOG("CRestoreWatcher::UnregisterL()");
	if ( iRegisteredClients <= 0 )
		{
		WRITELOG("CRestoreWatcher::UnregisterL() - 0 clients");
		return;
		}
	
	iRegisteredClients--;
	WRITELOG1("CRestoreWatcher::UnregisterL() - registered clients: %d", iRegisteredClients);
	
	if ( iRegisteredClients == 0 )
		{
		WRITELOG("CRestoreWatcher::UnregisterL() - setting CentRep value to 0");
		SetRestoreFlagL( EFalse );
		}
	}

// -----------------------------------------------------------------------------
// CRestoreWatcher::SetRestoreFlagL
// Sets restore flag on.
// -----------------------------------------------------------------------------
//
void CRestoreWatcher::SetRestoreFlagL( TBool aRestoreDone )
	{	
	RFs fs;
	User::LeaveIfError( fs.Connect() );
	
	iRestoreDone = aRestoreDone;
	if( aRestoreDone )
		{	
		RFile64 file;
		file.Replace( fs, iFileName, EFileWrite );
		file.Close();
		}
	else
		{
		fs.Delete( iFileName );
		}
	
	fs.Close();
	}

// -----------------------------------------------------------------------------
// CRestoreWatcher::CheckRestoreL
// Check if restore has done when booting up harvester server.
// -----------------------------------------------------------------------------
//
void CRestoreWatcher::CheckRestoreL()
	{
	RFs fs;
	RFile64 file;
	User::LeaveIfError( fs.Connect() );
	TInt fileError( KErrNotFound );
	fileError = file.Open( fs, iFileName, EFileRead );
	file.Close();
	fs.Close();
    
	WRITELOG1("CRestoreWatcher::StartMonitoring - fileError: %d", fileError);
	
    if ( fileError == KErrNone )
    	{
    	iRestoreDone = ETrue;
    	}
    else
    	{
    	iRestoreDone = EFalse;
    	}
	}

// End of file.