diff -r f5050f1da672 -r 04becd199f91 javacommons/fileutils/src/driveobserverserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/fileutils/src/driveobserverserver.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,254 @@ +/* +* Copyright (c) 2008 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: DriveObserverServer - platform independent +* +*/ + + + +#include "logger.h" +#include "comms.h" +#include "commsmessage.h" +#include "commsendpoint.h" + +#include "driveobserverserver.h" +#include "driveobservermessages.h" +#include "drivechangedeventgenerator.h" + +using java::comms::CommsEndpoint; +using java::comms::CommsMessage; + +namespace java +{ +namespace fileutils +{ + +DriveObserverServer::DriveObserverServer() + :iComms(0), iEventGenerator(0) +{ + JELOG2(EJavaFile); +} + +DriveObserverServer::~DriveObserverServer() +{ + JELOG2(EJavaFile); + + // delete event generator + if (iEventGenerator) + { + iEventGenerator->stopEvents(); + delete iEventGenerator; + } + + // Clear listeners and subscribers collections + iListeners.clear(); + iSubscribers.clear(); +} + +void DriveObserverServer::startServer(CommsEndpoint* aComms) +{ + JELOG2(EJavaFile); + + iComms = aComms; + + // Register moduleId + if (iComms) + { + iComms->registerListener(java::comms::PLUGIN_ID_DRIVE_OBSERVER_NATIVE_C, this); + } +} + +void DriveObserverServer::stopServer() +{ + JELOG2(EJavaFile); + + if (iEventGenerator) + { + iEventGenerator->stopEvents(); + } + + if (iComms) + { + // Unregister moduleId + iComms->unregisterListener(java::comms::PLUGIN_ID_DRIVE_OBSERVER_NATIVE_C, this); + } +} + + +void DriveObserverServer::registerListener(DriveListenerInterface* aListener) +{ + JELOG2(EJavaFile); + + iListeners.push_back(aListener); + + enableEvents(); +} + +void DriveObserverServer::unregisterListener(DriveListenerInterface* aListener) +{ + JELOG2(EJavaFile); + + for (listenersIter iter = iListeners.begin(); + iter != iListeners.end() ; /* Empty*/) + { + if (*iter == aListener) + { + iter = iListeners.erase(iter); + } + else + { + ++iter; + } + } + disableEventsIfNotNeeded(); +} + +void DriveObserverServer::driveChanged(const int& aOperation, const driveInfo& aDriveInfo) +{ + JELOG2(EJavaFile); + + for (listenersIter iter = iListeners.begin() ; + iter != iListeners.end() ; ++iter) + { + (*iter)->driveChanged(aOperation, aDriveInfo); + } + + if (iSubscribers.size() > 0) + { + CommsMessage msg; + + for (subscribersIter iter = iSubscribers.begin() ; + iter != iSubscribers.end() ; ++iter) + { + setDriveChangedParams(msg, (*iter)->iSubscriberAddress, + (*iter)->iModuleId, aOperation, aDriveInfo); + int rc = 0; + LOG2(EJavaFile, EInfo, "Sending driveChanged message to %d/%d", + (*iter)->iSubscriberAddress, (*iter)->iModuleId); + if (0 != (rc = iComms->send(msg))) + { + ELOG1(EJavaFile, "Event message sent failed %d", rc); + } + msg.reset(); + } + } +} + +void DriveObserverServer::processMessage(CommsMessage& aMessage) +{ + JELOG2(EJavaFile); + + switch (aMessage.getMessageId()) + { + case DRIVEOBSERVER_MSG_SUBSCRIBE_EVENTS: + registerSubscriber(aMessage); + break; + + case DRIVEOBSERVER_MSG_UNSUBSCRIBE_EVENTS: + unregisterSubscriber(aMessage); + break; + + case DRIVEOBSERVER_MSG_GETDRIVES_REQUEST: + getDrives(aMessage); + break; + + default: + ELOG1(EJavaFile, "Unknown message received %d", aMessage.getMessageId()); + } +} + +void DriveObserverServer::registerSubscriber(CommsMessage& aMessage) +{ + JELOG2(EJavaFile); + + int subsModuleId = 0; + getSubscribeParams(aMessage, subsModuleId); + iSubscribers.push_back(new subscriberData(subsModuleId, + aMessage.getSender())); + enableEvents(); +} + +void DriveObserverServer::unregisterSubscriber(CommsMessage& aMessage) +{ + JELOG2(EJavaFile); + + for (subscribersIter iter = iSubscribers.begin() ; + iter != iSubscribers.end() ; /* empty*/) + { + if ((*iter)->iSubscriberAddress == aMessage.getSender() && + (*iter)->iModuleId == aMessage.getModuleId()) + { + iter = iSubscribers.erase(iter); + } + else + { + ++iter; + } + } + disableEventsIfNotNeeded(); +} + +void DriveObserverServer::getDrives(CommsMessage& aMessage) +{ + JELOG2(EJavaFile); + + int driveTypes = 0; + getGetDrivesParams(aMessage, driveTypes); + + driveInfos drives; + CommsMessage replyMsg; + replyMsg.replyTo(aMessage); + + switch (driveTypes) + { + case DRIVEOBSERER_GET_DRIVES_ALL: + DriveUtilities::getAllDrives(drives); + break; + case DRIVEOBSERER_GET_DRIVES_ACCESIBLE: + DriveUtilities::getAccesibleDrives(drives); + break; + } + + setGetDrivesResultParams(replyMsg, drives); + iComms->send(replyMsg); +} + +void DriveObserverServer::enableEvents() +{ + JELOG2(EJavaFile); + + if (!iEventGenerator) + { + // Create platform specific event generator + iEventGenerator = new DriveChangedEventGenerator(this); + iEventGenerator->startEvents(); + } +} + +void DriveObserverServer::disableEventsIfNotNeeded() +{ + JELOG2(EJavaFile); + + if (0 == iSubscribers.size() && + 0 == iListeners.size() && + iEventGenerator) + { + iEventGenerator->stopEvents(); + delete iEventGenerator; + iEventGenerator = 0; + } +} + +} // end of namespace fileutils +} // end of namespace java