1 #include "CommunicationManager.h"
2 #include "Communication.h"
3 #include "ConnectionSettings.h"
7 #include <QDomDocument>
10 static const int ERROR_BASE=100;
12 CommunicationManager::CommunicationManager( const ConnectionSettings &aConnection )
14 iConnectionSettings = new ConnectionSettings( aConnection );
15 iModifyingCommunication = NULL;
16 iFetchingCommunication = new Communication( aConnection );
18 if ( iFetchingCommunication )
20 connect( iFetchingCommunication,
21 SIGNAL( readProgress( int, int, int ) ),
23 SLOT( readProgress( int, int, int ) )
25 connect( iFetchingCommunication,
26 SIGNAL( requestFinished( int, int ) ),
28 SLOT( requestFinished( int, int ) )
33 CommunicationManager::~CommunicationManager()
35 delete iConnectionSettings;
36 delete iModifyingCommunication;
37 delete iFetchingCommunication;
38 while ( !iMeetings.isEmpty() )
39 delete iMeetings.takeFirst();
42 void CommunicationManager::fetchMeetings( const int aWeek, const int aYear, const Room &aIn )
44 //prevent making multiple simultaneous user availibility requests
45 //TODO: Would be nice to queue these requests instead of just aborting
46 const RequestData* rd = findRequest( GetUserAvailability );
50 // Set from to beginning, 00:00 of the requested week
51 QDateTime from = QDateTime::currentDateTime();
52 from = from.addYears( aYear - from.date().year() );
53 from = from.addDays( -1*(from.date().dayOfWeek()-1) );
54 from = from.addDays( (aWeek - from.date().weekNumber())*7 );
55 QTime midnight = from.time();
56 midnight.setHMS( 0,0,0 );
57 from.setTime( midnight );
58 qDebug() << "CommunicationManager::fetchMeetings from: " << from.toString();
60 QDateTime until = from.addDays(7);
61 qDebug() << "CommunicationManager::fetchMeetings until: " << until.toString();
64 ReqMsgGetUserAvailability msg;
66 msg.setTimeWindow( from, until );
67 msg.addUser( aIn.address() );
69 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), msg.getMessage() );
70 qDebug() << "CommunicationManager::fetchMeetings: id: " << id;
73 addRequest( GetUserAvailability, id );
74 iRequestInfos.first()->room = new Room( aIn );
78 void CommunicationManager::getSecondaryIdForMeeting( Meeting &aMeeting )
80 ReqMsgConvertMeetingId msg( aMeeting.primaryId(), aMeeting.room().address() );
82 QByteArray arr = msg.getMessage();
84 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), arr );
85 qDebug() << "CommunicationManager::getSecondaryIdForMeeting: id: " << id;
88 addRequest( ConvertId, id );
89 iRequestInfos.first()->meeting = &aMeeting;
93 void CommunicationManager::fetchMeetingDetails( Meeting& aMeeting )
95 if( aMeeting.detailsAvailable() )
97 emit meetingDetailsFetched( aMeeting );
100 if( aMeeting.secondaryId().isEmpty() )
102 getSecondaryIdForMeeting( aMeeting );
106 getMeetingDetails( aMeeting );
110 void CommunicationManager::cancelFetchMeetingDetails()
112 const RequestData *rd = findRequest( GetCalendarItem );
114 int id = rd->requestId;
115 iCancelledRequests.append( id );
119 void CommunicationManager::getMeetingDetails( Meeting &aMeeting )
121 ReqMsgGetCalendarItem msg( aMeeting.secondaryId() );
123 QByteArray arr = msg.getMessage();
125 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), arr );
126 qDebug() << "CommunicationManager::getMeetingDetails: id: " << id;
129 addRequest( GetCalendarItem, id );
130 iRequestInfos.first()->meeting = &aMeeting;
134 void CommunicationManager::requestFinished( int aRequestId, int aError )
136 RequestData* rd = takeRequest( aRequestId );
137 if( iCancelledRequests.contains( rd->requestId ) )
139 iCancelledRequests.removeAll( rd->requestId );
143 QByteArray* response = iFetchingCommunication->response( aRequestId );
144 qDebug() << "CommunicationManager::requestFinished: id: " << aRequestId << " error: " << aError;
146 if( aError != (int)(QHttp::NoError) || rd == NULL || response == NULL )
149 if( rd == NULL || response == NULL )
152 emit error( ERROR_BASE+(int)err, CommunicationManager::FetchingCommunication );
158 case GetUserAvailability:
160 ResMsgGetUserAvailability msg( *response );
162 while ( !iMeetings.isEmpty() )
163 delete iMeetings.takeFirst();
165 int err = msg.getMeetingsFromResponse( iMeetings, *(rd->room) );
167 emit error( ERROR_BASE+8, CommunicationManager::FetchingCommunication );
169 emit meetingsFetched( iMeetings );
174 ResponseMessage msg( *response );
175 QString id = msg.getNodeValue( QString( "Id" ),
176 QDomNode::AttributeNode,
177 QString( "AlternateId" ) );
178 qDebug( "ID IS: %s", id.toStdString().data() );
179 rd->meeting->setSecondaryId( id );
180 getMeetingDetails( *(rd->meeting) );
183 case GetCalendarItem:
185 ResMsgGetCalendarItem msg( *response );
186 int err = msg.getMeetingDetailsFromResponse( *(rd->meeting) );
188 emit error( ERROR_BASE+9, CommunicationManager::FetchingCommunication );
190 emit meetingDetailsFetched( *(rd->meeting) );
198 void CommunicationManager::readProgress( int /*aRequestId*/, int aDone, int aTotal )
200 emit readProgress( aDone, aTotal, CommunicationManager::FetchingCommunication );
203 void CommunicationManager::addRequest( RequestType aType, int aRequestId )
205 RequestData* rd = new RequestData( aType, aRequestId );
206 iRequestInfos.append( rd );
209 CommunicationManager::RequestData* CommunicationManager::takeRequest( int aRequestId )
211 if( aRequestId == 0 )
214 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
216 struct RequestData* rd = iRequestInfos[i];
217 if( rd->requestId == aRequestId )
219 iRequestInfos.removeAt( i );
226 const CommunicationManager::RequestData* CommunicationManager::findRequest( RequestType aRequestType ) const
228 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
230 struct RequestData* rd = iRequestInfos[i];
231 if( rd->type == aRequestType )