X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2FBusinessLogic%2FEngine.cpp;h=1a798515a2182cc7d2a7cdbd5d5aa443d4914add;hb=2cf43eccdaf498030f5155f66385ca7d8b9fc483;hp=104bbdfcc4cfdf6d36cda9d411ed7d53b68e52e8;hpb=47ed106398a5c3ac172e2ea7cc5fb983649d18cf;p=qtmeetings diff --git a/src/BusinessLogic/Engine.cpp b/src/BusinessLogic/Engine.cpp index 104bbdf..1a79851 100644 --- a/src/BusinessLogic/Engine.cpp +++ b/src/BusinessLogic/Engine.cpp @@ -5,10 +5,10 @@ #include "Configuration.h" #include "DisplaySettings.h" #include "CommunicationManager.h" -#include "DeviceManager.h" +// #include "DeviceManager.h" #include "Clock.h" #include "ErrorMapper.h" -#include "WeeklyViewWidget.h" +#include "UIManager.h" #include #include @@ -18,61 +18,53 @@ QTime Engine::endOfTheDay = QTime( 23, 59, 0, 0); // end of the day is 11:59pm const int IDLE_TIME_MULTIPLIER = 60000; // Multiplies milliseconds to minutes -Engine::Engine() : - iClock( 0), iConfiguration(Configuration::instance() ), iCommunication( 0) -{ - qDebug() << "Engine::Engine()"; - // if reading of configuration fails, signal that initialization failed - if (iConfiguration == 0) - { - QTimer::singleShot( 0, this, SLOT( closeApplication() )); - return; +// Macro to help deleting objects. This could be global. +#define QT_DELETE(X) \ + if ( X != 0 ) \ + { \ + delete X; \ + X = 0; \ } - //initialize window manager - iWindowManager = new WindowManager( iConfiguration ); - connect(iWindowManager, SIGNAL( roomStatusInfoNeeded( Room * ) ), this, SLOT( roomStatusInfoNeeded( Room * ) )); - connect(iWindowManager, SIGNAL( observedEventDetected() ), this, SLOT( observedEventDetected() )); - connect(iWindowManager, SIGNAL( meetingActivated( Meeting * ) ), this, SLOT( fetchMeetingDetails( Meeting * ) )); - connect(iWindowManager, SIGNAL( currentRoomChanged( Room * ) ), this, SLOT( currentRoomChanged( Room * ) )); - connect(iWindowManager, SIGNAL( shownWeekChanged( QDate ) ), this, SLOT( shownWeekChanged( QDate ) )); - connect(iWindowManager, SIGNAL( passwordEntered( PasswordDialog::PasswordStatus ) ), this, SLOT( passwordEntered( PasswordDialog::PasswordStatus ) )); - - // initialize communication - iCommunication = new CommunicationManager( *(iConfiguration->connectionSettings()) ); - connect(iCommunication, SIGNAL( error( int, CommunicationManager::CommunicationType ) ), this, SLOT( errorHandler( int ) )); - connect(iCommunication, SIGNAL( meetingsFetched( const QList& ) ), this, SLOT( meetingsFetched( const QList& ) )); - connect(iCommunication, SIGNAL( meetingDetailsFetched( Meeting& ) ), this, SLOT( meetingDetailsFetched( Meeting& ) )); +Engine::Engine() : + iClock( 0 ), iConfiguration( 0 ), iCommunication( 0 ), + iWindowManager( 0 ), iUIManager( 0 ) +{ + qDebug() << "Engine::Engine()"; + + initConfiguration(); + initDevice(); + initCommunication(); + initUserInterface(); + //initialize idle time counter iIdleTimeCounter = new QTimer(); - iIdleTimeCounter->setSingleShot( true); - iIdleTimeCounter->setInterval(IDLE_TIME_MULTIPLIER - * iConfiguration->displaySettings()->screensaver() ); + iIdleTimeCounter->setSingleShot( true ); + // iIdleTimeCounter->setInterval( IDLE_TIME_MULTIPLIER * iConfiguration->displaySettings()->screensaver() ); + iIdleTimeCounter->setInterval( 10000 ); iIdleTimeCounter->start(); - connect(iIdleTimeCounter, SIGNAL( timeout() ), iWindowManager, SLOT( showRoomStatus() )); // create application clock iClock = new Clock; - connect(iClock, SIGNAL( tick( QDateTime ) ), this, SLOT( checkStatusOfAllRooms() )); - connect(iClock, SIGNAL( tick( QDateTime ) ), iWindowManager, SLOT( distributeDateTimeInfo( QDateTime ) )); + connect( iClock, SIGNAL( tick( QDateTime ) ), this, SLOT( checkStatusOfAllRooms() ) ); + // connect( iClock, SIGNAL( tick( QDateTime ) ), iWindowManager, SLOT( distributeDateTimeInfo( QDateTime ) ) ); + // Create auto refresh timer iAutoRefresh = new QTimer; iAutoRefresh->setInterval(iConfiguration->connectionSettings()->refreshInterval() * 1000); iAutoRefresh->start(); - connect(iAutoRefresh, SIGNAL( timeout() ), iAutoRefresh, SLOT( start() )); - connect(iAutoRefresh, SIGNAL( timeout() ), this, SLOT( fetchMeetings() )); - - // create device manager - iDevice = new DeviceManager( iConfiguration->startupSettings() ); - connect(iDevice, SIGNAL( error( int, const QString& ) ), this, SLOT( errorHandler( int, const QString& ) )); - connect(iDevice, SIGNAL( changeModeOrdered( DeviceManager::OperationMode ) ), this, SLOT( changeModeOrdered( DeviceManager::OperationMode ) )); - iDevice->initDeviceManager(); - - if (iDevice->currentOperationMode() == DeviceManager::KioskMode) - iWindowManager->fullScreen(); + connect( iAutoRefresh, SIGNAL( timeout() ), iAutoRefresh, SLOT( start() ) ); + connect( iAutoRefresh, SIGNAL( timeout() ), this, SLOT( fetchMeetings() ) ); + + if( iDevice->currentOperationMode() == DeviceManager::KioskMode ) + { + iWindowManager->setFullscreen(); + } - QTimer::singleShot( 0, this, SLOT( fetchMeetings() )); + connectSignals(); + + QTimer::singleShot( 0, this, SLOT( fetchMeetings() ) ); // TODO: continue implementation } @@ -82,15 +74,18 @@ Engine::~Engine() qDebug() << "Engine::~Engine()"; while ( !iMeetings.isEmpty() ) delete iMeetings.takeFirst(); - iIdleTimeCounter->stop(); - delete iIdleTimeCounter; - iIdleTimeCounter = 0; - delete iWindowManager; - iWindowManager = 0; - delete iClock; - iClock = 0; - delete iDevice; - iDevice = 0; + + if ( iIdleTimeCounter != 0 ) + { + iIdleTimeCounter->stop(); + delete iIdleTimeCounter; + iIdleTimeCounter = 0; + } + QT_DELETE( iClock ); + QT_DELETE( iDevice ); + + QT_DELETE( iUIManager ); + QT_DELETE( iWindowManager ); } void Engine::closeApplication() @@ -100,27 +95,6 @@ void Engine::closeApplication() QTimer::singleShot( 1000, QApplication::instance(), SLOT( quit() )); } -void Engine::observedEventDetected() -{ - qDebug() << "Engine::observedEventDetected()"; -<<<<<<< HEAD:src/BusinessLogic/Engine.cpp - iWindowManager->refreshMeetings( iMeetings ); -======= - if ( !iIdleTimeCounter->isActive() ) - { - iWindowManager->weeklyView()->showCurrentWeek(); - } - iWindowManager->showWeeklyView(); ->>>>>>> 56f763c68a2ff56d344ef150b7378ca417d08b36:src/BusinessLogic/Engine.cpp - // prepare to restart idle counter - if (iIdleTimeCounter->isActive() ) - { - iIdleTimeCounter->stop(); - } - // (re)start idle counter - iIdleTimeCounter->start(); -} - Room* Engine::defaultRoom() { qDebug() << "Engine::defaultRoom()"; @@ -129,7 +103,7 @@ Room* Engine::defaultRoom() void Engine::checkStatusOfAllRooms() { - qDebug() << "Engine::checkStatusOfAllRooms()"; +// qDebug() << "Engine::checkStatusOfAllRooms()"; // iterate trough on the rooms for (int i = 0; i < iConfiguration->rooms().count(); i++) { @@ -140,8 +114,8 @@ void Engine::checkStatusOfAllRooms() int Engine::indexOfMeetingAt(Room *aRoom, QDateTime aAt) { - qDebug() << "Engine::indexOfMeetingAt( Room *, QDateTime )"; - for (int i = 0; i < iMeetings.count(); i++) +// qDebug() << "Engine::indexOfMeetingAt( Room *, QDateTime )"; + for ( int i = 0; i < iMeetings.count(); i++ ) { // exchange server ensures that there is only one meeting in a room at a specified time if (aRoom->equals(iMeetings.at( i )->room() ) && iMeetings.at( i )->startsAt() <= aAt && iMeetings.at( i )->endsAt() >= aAt) @@ -154,7 +128,7 @@ int Engine::indexOfMeetingAt(Room *aRoom, QDateTime aAt) int Engine::indexOfMeetingAfter(Room *aRoom, QDateTime aAfter) { - qDebug() << "Engine::indexOfMeetingAfter( Room *, QDateTime )"; +// qDebug() << "Engine::indexOfMeetingAfter( Room *, QDateTime )"; // seeks for the next meeting on the SAME DAY int min = -1; for (int i = 0; i < iMeetings.count(); i++) @@ -174,8 +148,8 @@ int Engine::indexOfMeetingAfter(Room *aRoom, QDateTime aAfter) void Engine::roomStatusInfoNeeded(Room *aRoom) { - qDebug() << "Engine::roomStatusInfoNeeded( Room * )"; - if (aRoom == 0) +// qDebug() << "Engine::roomStatusInfoNeeded( Room * )"; + if ( aRoom == 0 ) { return; } @@ -193,8 +167,8 @@ void Engine::roomStatusInfoNeeded(Room *aRoom) ((indexOfNextMeeting != -1 ) ? iMeetings.at( indexOfNextMeeting )->startsAt().time() : Engine::endOfTheDay ); //currently works only for deafult room - if (aRoom->equals( *(defaultRoom() )) ) - iWindowManager->roomStatusChanged(aRoom, status, until); +// if( aRoom->equals( *(defaultRoom() ) ) ) +// iWindowManager->roomStatusChanged( aRoom, status, until ); } void Engine::fetchMeetings() @@ -204,31 +178,6 @@ void Engine::fetchMeetings() fetchMeetings(iClock->datetime(), iClock->datetime().addDays( 7), room); } -void Engine::fetchMeetingDetails(Meeting *aMeeting) -{ - qDebug() << "Engine::fetchMeetingDetails( Meeting* )"; - iWindowManager->showProgressBar(tr("Please Wait"), true); - iWindowManager->updateProgressBar(tr("Fetching Meeting Details...") ); - connect(iWindowManager, - SIGNAL( progressBarCancelled() ), this, - SLOT( fetchMeetingDetailsCancelled() )); - iCommunication->fetchMeetingDetails( *aMeeting); -} - -<<<<<<< HEAD:src/BusinessLogic/Engine.cpp -void Engine::meetingsFetched( const QList &aMeetings ) -{ - qDebug() << "Engine::meetingsFetched( const QList & )"; - - for ( int i = 0; i < iMeetings.count(); ++i ) { - Meeting* m = iMeetings.takeAt( i ); - delete m; - } - iMeetings.clear(); - for ( int i = 0; i < aMeetings.count(); ++i ) { - Meeting* m = new Meeting( *(aMeetings.at( i )) ); - iMeetings.append( m ); -======= bool Engine::isMeetingInList(const QList &aList, const Meeting *aMeeting) { qDebug() @@ -246,6 +195,7 @@ bool Engine::isMeetingInList(const QList &aList, const Meeting *aMeeti void Engine::meetingsFetched(const QList &aMeetings) { qDebug() << "Engine::meetingsFetched( const QList & )"; + // check if there is any new meeting in the list came from the server -> added for (int i = 0; i < aMeetings.count(); i++) { @@ -255,8 +205,6 @@ void Engine::meetingsFetched(const QList &aMeetings) // add to the local database =) Meeting* m = new Meeting( *(aMeetings.at( i )) ); iMeetings.append(m); - // and signal the changes - iWindowManager->insertMeeting(m); } } @@ -267,112 +215,176 @@ void Engine::meetingsFetched(const QList &aMeetings) if ( !isMeetingInList(aMeetings, iMeetings.at(i) ) ) { Meeting* m = iMeetings.takeAt(i); - // signal the changes - iWindowManager->deleteMeeting(m); // delete the meeting from the local list delete m; } ->>>>>>> 56f763c68a2ff56d344ef150b7378ca417d08b36:src/BusinessLogic/Engine.cpp } - iWindowManager->refreshMeetings( iMeetings ); // refresh room status info roomStatusInfoNeeded(defaultRoom() ); } -void Engine::meetingDetailsFetched(Meeting &aDetailedMeeting) +void Engine::errorHandler( int aCode, const QString &aAddInfo ) +{ + if ( iWindowManager != 0 ) + { + iWindowManager->error( ErrorMapper::codeToString( aCode, aAddInfo ) ); + } +} + +void Engine::fetchMeetings( const QDateTime &aFrom, const QDateTime &aUntil, const Room *aIn ) +{ + qDebug() + << "Engine::fetchMeetings( const QDateTime &, const QDateTime &, const Room * )"; + iCommunication->fetchMeetings(aFrom, aUntil, *aIn); +} + +void Engine::fetchMeetingDetails(Meeting *aMeeting) { - qDebug() << "Engine::meetingDetailsFetched( Meeting & )"; - iWindowManager->closeProgressBar(); - iWindowManager->showMeetingInfo( &aDetailedMeeting); + qDebug() << "[Engine::fetchMeetingDetails] "; + Meeting tempMeeting(aMeeting->primaryId(), aMeeting->room(), aMeeting->startsAt(), aMeeting->endsAt() ); + iCommunication->fetchMeetingDetails( tempMeeting ); +// Meeting tempMeeting = aMeeting; +// iCommunication->fetchMeetingDetails( tempMeeting ); } -void Engine::errorHandler(int aCode, const QString &aAddInfo) +void Engine::cancelFetchMeetingDetails() { - qDebug() << "Engine::ErrorHandler, aCode: " << aCode; - // inform UI about the problem - if( aCode >= 100 && aCode <= 150 ) { //communication errors - //we don't want these to close operation changing - qDebug() << "CommunicationManager signaled an error:" << aCode; - iWindowManager->closeProgressBar(); + iCommunication->cancelFetchMeetingDetails(); +} + +void Engine::shownWeekChanged( QDate aFrom ) +{ + qDebug() << "[Engine::shownWeekChanged] "; + QDateTime from( aFrom ); + QDateTime to( aFrom.addDays( 7 ), QTime( 23, 59 ) ); + qDebug() << "[Engine::shownWeekChanged] "; + iCommunication->fetchMeetings( from, to, *defaultRoom() ); +// fetchMeetings( from, to, iWindowManager->weeklyView()->currentRoom() ); +} + +void Engine::changeDeviceMode( bool aChange ) +{ + if ( aChange ) + { + connect( iDevice, SIGNAL( changingModeFailed() ), this, SLOT( changeModeFailed() ) ); + iAutoRefresh->stop(); // Stop the meeting update } - iWindowManager->error(ErrorMapper::codeToString(aCode, aAddInfo) ); + iDevice->changeMode( aChange ); } -void Engine::currentRoomChanged(Room *aCurrentRoom) +void Engine::changeModeFailed() { - qDebug() << "Engine::currentRoomChanged to " << aCurrentRoom->name(); - QDateTime from(iWindowManager->weeklyView()->beginnigOfShownWeek() ); - QDateTime to(from.addDays( 8) ); - fetchMeetings(from, to, aCurrentRoom); + qDebug() << "Engine::progressBarCancelled()"; + iDevice->changeMode( false ); + iAutoRefresh->start(); //we start the metting updating } -void Engine::fetchMeetings(const QDateTime &aFrom, const QDateTime &aUntil, const Room *aIn) +void Engine::initUserInterface() { - qDebug() - << "Engine::fetchMeetings( const QDateTime &, const QDateTime &, const Room * )"; - iCommunication->fetchMeetings(aFrom, aUntil, *aIn); + qDebug() << "[Engine::initUserInterface] "; + + // Initialize the window manager and connect what ever signals can be connected + iWindowManager = new WindowManager; + // Create the UIManager which internally handles most of the UI actions + iUIManager = new UIManager( this, iWindowManager ); + + connect( iWindowManager, SIGNAL( eventDetected() ), this, SLOT( handleViewEvent() ) ); + connect( iWindowManager, SIGNAL( previousViewRestored() ), iUIManager, SLOT( previousViewRestored() ) ); + connect( iWindowManager, SIGNAL( dialogActivated() ), this, SLOT( dialogActivated() ) ); + connect( iWindowManager, SIGNAL( dialogDeactivated() ), this, SLOT( dialogDeactivated() ) ); + + // Show the UI + iWindowManager->setWindowState( Qt::WindowMaximized ); + iWindowManager->show(); + iUIManager->showMainView(); + + qDebug() << "[Engine::initUserInterface] "; +} + +void Engine::handleViewEvent() +{ + if ( iIdleTimeCounter != 0 ) + { + // Restart the idle time counter when view event is received + iIdleTimeCounter->stop(); + iIdleTimeCounter->start(); + } +} + +void Engine::initConfiguration() +{ + iConfiguration = Configuration::instance(); + if ( iConfiguration == 0 ) + { + QTimer::singleShot( 0, this, SLOT( closeApplication() ) ); + } +} + +void Engine::connectSignals() +{ + // Connect engine objects signals to UIManager + connect( iClock, SIGNAL( tick( QDateTime ) ), iUIManager, SLOT( updateTime( QDateTime ) ) ); + connect( iIdleTimeCounter, SIGNAL( timeout() ) , iUIManager, SLOT( roomStatusIndicatorRequested() ) ); + + iUIManager->connectDeviceManager( iDevice ); + iUIManager->connectCommunicationManager( iCommunication ); } -void Engine::shownWeekChanged(QDate aFrom) +void Engine::initCommunication() { - qDebug() << "Engine::shownWeekChanged( QDate )"; - QDateTime from(aFrom); - QDateTime to(aFrom.addDays( 7), QTime( 23, 59) ); - qDebug() << "Engine::shownWeekChanged " << aFrom.toString("d.m. h:mm") - << " to " << to.toString("d.m. h:mm"); - fetchMeetings(from, to, iWindowManager->weeklyView()->currentRoom() ); + // initialize communication + iCommunication = new CommunicationManager( *(iConfiguration->connectionSettings()) ); + connect( iCommunication, SIGNAL( error( int, CommunicationManager::CommunicationType ) ), + this, SLOT( errorHandler( int ) ) ); + connect( iCommunication, SIGNAL( meetingsFetched( const QList& ) ), + this, SLOT( meetingsFetched( const QList& ) ) ); } -void Engine::changeModeOrdered(DeviceManager::OperationMode aMode) +void Engine::initDevice() { - qDebug() << "Engine::changeModeOrdered( DeviceManager::OperationMode )"; - QString message = tr( "You are about to change operation mode to %1." ) - .arg(iDevice->operationModeToString(aMode) ); + // create device manager + iDevice = new DeviceManager( iConfiguration->startupSettings() ); + connect( iDevice, SIGNAL( error( int, const QString& ) ), this, SLOT( errorHandler( int, const QString& ) ) ); + iDevice->initDeviceManager(); +} - iWindowManager->showPasswordDialog(iConfiguration->adminPassword(), message); +void Engine::dialogActivated() +{ + if ( iIdleTimeCounter != 0 ) + { + iIdleTimeCounter->stop(); + } } -void Engine::passwordEntered(PasswordDialog::PasswordStatus aPasswordStatus) +void Engine::dialogDeactivated() { - qDebug() << "Engine::passwordEntered( PasswordDialog::PasswordStatus )"; - iWindowManager->closePasswordDialog(); + if ( iIdleTimeCounter != 0 ) + { + iIdleTimeCounter->start(); + } +} - switch (aPasswordStatus) +void Engine::previousViewRestored() +{ + if ( iIdleTimeCounter != 0 ) { - case PasswordDialog::Correct: - { - iAutoRefresh->stop(); //we stop the metting updating - iWindowManager->showProgressBar( "Changing current operation mode." ); - connect(iDevice, SIGNAL( changingMode( const QString & ) ), iWindowManager, SLOT( updateProgressBar( const QString & ) )); - connect( iDevice, SIGNAL( changingMode( const QString & ) ), - iWindowManager, SLOT( updateProgressBar( const QString & ) ) ); - connect( iDevice, SIGNAL( changeModeFailed() ), this, SLOT( changeModeFailed() ) ); - iDevice->changeMode( true); - break; - } - case PasswordDialog::Incorrect: - { - iWindowManager->error(tr("Incorrect password.") ); - iDevice->changeMode( false); - break; - } - default: //case PasswordDialog::Canceled - { - iDevice->changeMode( false); - } + iIdleTimeCounter->start(); } } -void Engine::changeModeFailed() +void Engine::stopIdleTimeCounter() { - qDebug() << "Engine::changeModeFailed()"; - iWindowManager->closeProgressBar(); - iAutoRefresh->start(); //we start the metting updating + if ( iIdleTimeCounter != 0 ) + { + iIdleTimeCounter->stop(); + } } -void Engine::fetchMeetingDetailsCancelled() +void Engine::startIdleTimeCounter() { - iCommunication->cancelFetchMeetingDetails(); - iWindowManager->closeProgressBar(); + if ( iIdleTimeCounter != 0 ) + { + iIdleTimeCounter->start(); + } }