X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2FBusinessLogic%2FEngine.cpp;h=a61006c59250c752772eae107c27d94265b44e16;hb=deb6aee06a80416a24a64c2ac6349a2341acdc39;hp=2f943a792903a920b90d2067f14331f537c67475;hpb=9ee999fe4a7de48abc3b4f950699cd4564d16562;p=qtmeetings diff --git a/src/BusinessLogic/Engine.cpp b/src/BusinessLogic/Engine.cpp index 2f943a7..a61006c 100644 --- a/src/BusinessLogic/Engine.cpp +++ b/src/BusinessLogic/Engine.cpp @@ -1,49 +1,65 @@ #include "Engine.h" - -#include -#include #include "Room.h" #include "Meeting.h" #include "ConnectionSettings.h" #include "Configuration.h" +#include "DisplaySettings.h" #include "CommunicationManager.h" #include "DeviceManager.h" #include "Clock.h" #include "ErrorMapper.h" +#include "WeeklyViewWidget.h" +#include +#include +#include #include 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 ), iCurrentRoom( 0 ) + 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, SIGNAL( initializationFailed() ) ); + QTimer::singleShot( 0, this, SLOT( closeApplication() ) ); return; } + + //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& ) ) - ); + 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& ) ) ); + + //initialize idle time counter + iIdleTimeCounter = new QTimer(); + iIdleTimeCounter->setSingleShot( true ); + iIdleTimeCounter->setInterval( IDLE_TIME_MULTIPLIER * iConfiguration->displaySettings()->screensaver() ); + 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 ) ) ); iAutoRefresh = new QTimer; iAutoRefresh->setInterval( iConfiguration->connectionSettings()->refreshInterval() * 1000 ); @@ -51,9 +67,15 @@ Engine::Engine() : 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( 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(); QTimer::singleShot( 0, this, SLOT( fetchMeetings() ) ); @@ -62,32 +84,49 @@ Engine::Engine() : 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; } -Room* Engine::defaultRoom() -{ - return iConfiguration->defaultRoom(); -} - -Clock* Engine::clock() +void Engine::closeApplication() { - return iClock; + qDebug() << "Engine::closeApplication()"; + // closes application after 1 second + QTimer::singleShot( 1000, QApplication::instance(), SLOT( quit() ) ); } -Configuration* Engine::configuration() +void Engine::observedEventDetected() { - return iConfiguration; + qDebug() << "Engine::observedEventDetected()"; + iWindowManager->showWeeklyView(); + // prepare to restart idle counter + if ( iIdleTimeCounter->isActive() ) + { + iIdleTimeCounter->stop(); + } + // (re)start idle counter + iIdleTimeCounter->start(); } -DeviceManager* Engine::deviceManager() +Room* Engine::defaultRoom() { - return iDevice; + qDebug() << "Engine::defaultRoom()"; + return iConfiguration->defaultRoom(); } void Engine::checkStatusOfAllRooms() { + qDebug() << "Engine::checkStatusOfAllRooms()"; // iterate trough on the rooms for ( int i = 0; i < iConfiguration->rooms().count(); i++ ) { @@ -98,6 +137,7 @@ void Engine::checkStatusOfAllRooms() int Engine::indexOfMeetingAt( Room *aRoom, QDateTime aAt ) { + 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 @@ -113,6 +153,7 @@ int Engine::indexOfMeetingAt( Room *aRoom, QDateTime aAt ) int Engine::indexOfMeetingAfter( Room *aRoom, QDateTime aAfter ) { + 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++ ) @@ -135,6 +176,7 @@ int Engine::indexOfMeetingAfter( Room *aRoom, QDateTime aAfter ) void Engine::roomStatusInfoNeeded( Room *aRoom ) { + qDebug() << "Engine::roomStatusInfoNeeded( Room * )"; if ( aRoom == 0 ) { return; @@ -143,8 +185,6 @@ void Engine::roomStatusInfoNeeded( Room *aRoom ) int indexOfCurrentMeeting = indexOfMeetingAt( aRoom, iClock->datetime() ); int indexOfNextMeeting = indexOfMeetingAfter( aRoom, iClock->datetime() ); -// qDebug() << QString( "Engine::roomStatusInfoNeeded\troom:%1current:%2 next:%3" ).arg( aRoom->toString() ).arg( indexOfCurrentMeeting ).arg( indexOfNextMeeting ); - // if there is no meeting, then status is Free; otherwise Busy Room::Status status = ( indexOfCurrentMeeting == -1 ) ? Room::FreeStatus : Room::BusyStatus; // if room is Busy, then check end time, otherwise... @@ -152,30 +192,34 @@ void Engine::roomStatusInfoNeeded( Room *aRoom ) // ...if there is meeting following on the same day then check end time, otherwise end is the of the working day (( indexOfNextMeeting != -1 ) ? iMeetings.at( indexOfNextMeeting )->startsAt().time() : Engine::endOfTheDay ); - emit roomStatusChanged( aRoom, status, until ); + //currently works only for deafult room + if( aRoom->equals( *(defaultRoom() ) ) ) + iWindowManager->roomStatusChanged( aRoom, status, until ); } void Engine::fetchMeetings() { - // TODO : define interval correctly. at the moment it's +/- 14 days - Room *room = iCurrentRoom; - if ( room == 0 ) room = defaultRoom(); + Room *room = defaultRoom(); qDebug() << "Engine::fetchMeetings for " << room->name(); - fetchMeetings( iClock->datetime().addDays( -14 ), iClock->datetime().addDays( 14 ), room ); -} - -void Engine::fetchMeetings( const QDateTime &aFrom, const QDateTime &aUntil, Room *aIn ) -{ - iCommunication->fetchMeetings( aFrom, aUntil, *aIn ); + 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 ); } bool Engine::isMeetingInList( const QList &aList, const Meeting *aMeeting ) { + qDebug() << "Engine::isMeetingInList( const QList &, const Meeting * )"; for ( int i = 0; i < aList.count(); i++ ) { if ( aMeeting->equals( *(aList.at( i )) ) ) @@ -188,6 +232,7 @@ bool Engine::isMeetingInList( const QList &aList, const Meeting *aMeet 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++ ) { @@ -198,7 +243,7 @@ void Engine::meetingsFetched( const QList &aMeetings ) Meeting* m = new Meeting( *(aMeetings.at( i )) ); iMeetings.append( m ); // and signal the changes - emit meetingAdded( m ); + iWindowManager->insertMeeting( m ); } } @@ -210,7 +255,7 @@ void Engine::meetingsFetched( const QList &aMeetings ) { Meeting* m = iMeetings.takeAt( i ); // signal the changes - emit meetingDeleted( m ); + iWindowManager->deleteMeeting( m ); // delete the meeting from the local list delete m; } @@ -222,20 +267,93 @@ void Engine::meetingsFetched( const QList &aMeetings ) void Engine::meetingDetailsFetched( Meeting &aDetailedMeeting ) { - emit meetingDetailsFetched( &aDetailedMeeting ); + qDebug() << "Engine::meetingDetailsFetched( Meeting & )"; + iWindowManager->closeProgressBar(); + iWindowManager->showMeetingInfo( &aDetailedMeeting ); } void Engine::errorHandler( int aCode, const QString &aAddInfo ) { qDebug() << "Engine::ErrorHandler, aCode: " << aCode; // inform UI about the problem - if( aCode >= 100 && aCode <= 110 ) + if( aCode >= 100 && aCode <= 150 ) qDebug() << "CommunicationManager signaled an error:" << aCode; - emit error( ErrorMapper::codeToString( aCode, aAddInfo ) ); + iWindowManager->closeProgressBar(); + iWindowManager->error( ErrorMapper::codeToString( aCode, aAddInfo ) ); } void Engine::currentRoomChanged( Room *aCurrentRoom ) { - iCurrentRoom = aCurrentRoom; - qDebug() << "Engine::currentRoomChanged to " << iCurrentRoom->name(); + qDebug() << "Engine::currentRoomChanged to " << aCurrentRoom->name(); + QDateTime from( iWindowManager->weeklyView()->beginnigOfShownWeek() ); + QDateTime to( from.addDays( 8 ) ); + fetchMeetings( from, to, aCurrentRoom ); +} + +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::shownWeekChanged( QDate aFrom ) +{ + 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() ); +} + +void Engine::changeModeOrdered( DeviceManager::OperationMode aMode ) +{ + qDebug() << "Engine::changeModeOrdered( DeviceManager::OperationMode )"; + QString message = tr( "You are about to change operation mode to %1." ) + .arg( iDevice->operationModeToString( aMode ) ); + + iWindowManager->showPasswordDialog( iConfiguration->adminPassword(), message ); +} + +void Engine::passwordEntered( PasswordDialog::PasswordStatus aPasswordStatus ) +{ + qDebug() << "Engine::passwordEntered( PasswordDialog::PasswordStatus )"; + iWindowManager->closePasswordDialog(); + + switch ( aPasswordStatus ) + { + case PasswordDialog::Correct : + { + iWindowManager->showProgressBar( "Changing current operation mode.", true ); + connect( iWindowManager, SIGNAL( progressBarCancelled() ), this, SLOT( progressBarCancelled() ) ); + connect( iDevice, SIGNAL( changingMode( const QString & ) ), + iWindowManager, SLOT( updateProgressBar( const QString & ) ) ); + connect( iDevice, SIGNAL( changingModeFailed() ), this, SLOT( progressBarCancelled() ) ); + iDevice->changeMode( true ); + break; + } + case PasswordDialog::Incorrect : + { + iWindowManager->error( tr( "Incorrect password." ) ); + iDevice->changeMode( false ); + break; + } + default : //case PasswordDialog::Canceled + { + iDevice->changeMode( false ); + } + } +} + +void Engine::progressBarCancelled() +{ + qDebug() << "Engine::progressBarCancelled()"; + //TODO: cancel the on-going event + iWindowManager->closeProgressBar(); + iDevice->changeMode( false ); +} + +void Engine::fetchMeetingDetailsCancelled() +{ + iCommunication->cancelFetchMeetingDetails(); + iWindowManager->closeProgressBar(); }