diff -r f5050f1da672 -r 04becd199f91 javacommons/fileutils/src.s60/drivechangedeventgenerator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/fileutils/src.s60/drivechangedeventgenerator.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,153 @@ +/* +* Copyright (c) 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: DriveChangedEventGenerator - S60 specific +* +*/ + + +#include "logger.h" + +#include "drivechangedeventgenerator.h" +#include "driveutilities.h" + +namespace java +{ +namespace fileutils +{ + +DriveChangedEventGenerator::DriveChangedEventGenerator(DriveListenerInterface* aEventDispatcher) + :iEventDispatcher(aEventDispatcher) +{ + JELOG2(EJavaFile); +} + +DriveChangedEventGenerator::~DriveChangedEventGenerator() +{ + JELOG2(EJavaFile); +} + +void DriveChangedEventGenerator::startEvents() +{ + JELOG2(EJavaFile); + + driveInfos drives; + DriveUtilities::getAllDrives(drives); + + if (KErrNone == iFs.Connect()) + { + for (driveInfos::const_iterator iter = drives.begin() ; + iter != drives.end() ; ++iter) + { + if (iter->iIsRemovable) + { + iDriveObjects.push_back(new DriveChangedActive(*iter, this, &iFs)); + } + } + } +} +void DriveChangedEventGenerator::stopEvents() +{ + JELOG2(EJavaFile); + iFs.Close(); +} + + +// DriveListenerInterface +void DriveChangedEventGenerator::driveChanged(const int& aOperation, const driveInfo& aDriveInfo) +{ + JELOG2(EJavaFile); + + iEventDispatcher->driveChanged(aOperation, aDriveInfo); +} +// change notification will be generated for this directory +_LIT(KNotificationDirectory,"mediachange\\"); + +DriveChangedEventGenerator::DriveChangedActive::DriveChangedActive(driveInfo aDriveInfo, + DriveListenerInterface* aEventDispatcher, RFs* aFsSession) + :CActive(EPriorityNormal), + iDrive(0), + iDriveInfo(aDriveInfo), + iEventDispatcher(aEventDispatcher), + iFs(aFsSession) +{ + JELOG2(EJavaFile); + + CActiveScheduler::Add(this); + + TChar driveChar = (TChar) iDriveInfo.iRootPath[0]; + iFs->CharToDrive(driveChar, iDrive); + + TPath privatePath; + iFs->PrivatePath(privatePath); + + // obtain notification path + iNotificationPath.Append(driveChar); + iNotificationPath.Append(KDriveDelimiter); + iNotificationPath.Append(privatePath); + iNotificationPath.Append(KNotificationDirectory); + + iFs->NotifyChange(ENotifyEntry, iStatus, iNotificationPath); + SetActive(); +} + +DriveChangedEventGenerator::DriveChangedActive::~DriveChangedActive() +{ + JELOG2(EJavaFile); + + Cancel(); +} + +void DriveChangedEventGenerator::DriveChangedActive::RunL() +{ + JELOG2(EJavaFile); + + TDriveInfo driveInfo; + TInt rc = iFs->Drive(driveInfo, iDrive); + if (KErrNone == rc) + { + LOG(EJavaFile, EInfo, "iFs->Drive() returns KErrNone"); + LOG1(EJavaFile, EInfo, "driveInfo.iType = %d", driveInfo.iType); + } + + TVolumeInfo volumeInfo; + int operation = 0; + rc = iFs->Volume(volumeInfo, iDrive); + if (KErrNone == rc) + { + LOG(EJavaFile, EInfo, "iFs->Volume() returns KErrNone"); + operation = DriveListenerInterface::REMOVABLE_MEDIA_INSERTED_C; + iDriveInfo.iIsPresent = true; + iDriveInfo.iId = volumeInfo.iUniqueID; + } + else + { + LOG1(EJavaFile, EInfo, "iFs->Volume() returns %d", rc); + operation = DriveListenerInterface::REMOVABLE_MEDIA_REMOVED_C; + iDriveInfo.iIsPresent = false; + } + + iEventDispatcher->driveChanged(operation, iDriveInfo); + + iFs->NotifyChange(ENotifyEntry, iStatus, iNotificationPath); + SetActive(); +} + +void DriveChangedEventGenerator::DriveChangedActive::DoCancel() +{ + JELOG2(EJavaFile); + + iFs->NotifyChangeCancel(); +} +} // namespace fileutils +} // namespace java