1 #include "CommunicationManager.h"
2 #include "Communication.h"
3 #include "ConnectionSettings.h"
7 #include <QDomDocument>
9 #include "../../Domain/Configuration/Configuration.h"
11 static const int ERROR_BASE=100;
14 CommunicationManager::CommunicationManager()
17 iModifyingCommunication = NULL;
19 iFetchingCommunication = new Communication();
21 if ( iFetchingCommunication )
23 connect( iFetchingCommunication,
24 SIGNAL( readProgress( int, int, int ) ),
26 SLOT( readProgress( int, int, int ) )
28 connect( iFetchingCommunication,
29 SIGNAL( requestFinished( int, int ) ),
31 SLOT( requestFinished( int, int ) )
37 CommunicationManager::~CommunicationManager()
39 //delete iConnectionSettings;
40 delete iModifyingCommunication;
41 delete iFetchingCommunication;
42 while ( !iMeetings.isEmpty() )
43 delete iMeetings.takeFirst();
46 void CommunicationManager::fetchMeetings( const int aWeek, const int aYear, const Room &aIn )
48 //prevent making multiple simultaneous user availibility requests
49 //TODO: Would be nice to queue these requests instead of just aborting
50 const RequestData* rd = findRequest( GetUserAvailability );
54 // Set from to beginning, 00:00 of the requested week
55 QDateTime from = QDateTime::currentDateTime();
56 from = from.addYears( aYear - from.date().year() );
57 from = from.addDays( -1*(from.date().dayOfWeek()-1) );
58 from = from.addDays( (aWeek - from.date().weekNumber())*7 );
59 QTime midnight = from.time();
60 midnight.setHMS( 0,0,0 );
61 from.setTime( midnight );
62 qDebug() << "CommunicationManager::fetchMeetings from: " << from.toString();
64 QDateTime until = from.addDays(7);
65 qDebug() << "CommunicationManager::fetchMeetings until: " << until.toString();
68 ReqMsgGetUserAvailability msg;
70 msg.setTimeWindow( from, until );
71 msg.addUser( aIn.address() );
73 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), msg.getMessage() );
74 qDebug() << "CommunicationManager::fetchMeetings: id: " << id;
77 addRequest( GetUserAvailability, id );
78 iRequestInfos.first()->room = new Room( aIn );
82 void CommunicationManager::getSecondaryIdForMeeting( Meeting &aMeeting )
84 ReqMsgConvertMeetingId msg( aMeeting.primaryId(), aMeeting.room().address() );
86 QByteArray arr = msg.getMessage();
88 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), arr );
89 qDebug() << "CommunicationManager::getSecondaryIdForMeeting: id: " << id;
92 addRequest( ConvertId, id );
93 iRequestInfos.first()->meeting = &aMeeting;
97 void CommunicationManager::fetchMeetingDetails( Meeting& aMeeting )
99 if( aMeeting.detailsAvailable() )
101 emit meetingDetailsFetched( aMeeting );
104 if( aMeeting.secondaryId().isEmpty() )
106 getSecondaryIdForMeeting( aMeeting );
110 getMeetingDetails( aMeeting );
114 void CommunicationManager::cancelFetchMeetingDetails()
116 const RequestData *rd = findRequest( GetCalendarItem );
118 int id = rd->requestId;
119 iCancelledRequests.append( id );
123 void CommunicationManager::getMeetingDetails( Meeting &aMeeting )
125 ReqMsgGetCalendarItem msg( aMeeting.secondaryId() );
127 QByteArray arr = msg.getMessage();
129 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), arr );
130 qDebug() << "CommunicationManager::getMeetingDetails: id: " << id;
133 addRequest( GetCalendarItem, id );
134 iRequestInfos.first()->meeting = &aMeeting;
138 void CommunicationManager::requestFinished( int aRequestId, int aError )
140 RequestData* rd = takeRequest( aRequestId );
141 if( iCancelledRequests.contains( rd->requestId ) )
143 iCancelledRequests.removeAll( rd->requestId );
147 QByteArray* response = iFetchingCommunication->response( aRequestId );
148 qDebug() << "CommunicationManager::requestFinished: id: " << aRequestId << " error: " << aError;
150 if( aError != (int)(QHttp::NoError) || rd == NULL || response == NULL )
153 if( rd == NULL || response == NULL )
156 emit error( ERROR_BASE+(int)err, CommunicationManager::FetchingCommunication );
157 while ( !iMeetings.isEmpty() )
158 delete iMeetings.takeFirst();
159 emit meetingsFetched( iMeetings );
165 case GetUserAvailability:
167 ResMsgGetUserAvailability msg( *response );
169 while ( !iMeetings.isEmpty() )
170 delete iMeetings.takeFirst();
172 int err = msg.getMeetingsFromResponse( iMeetings, *(rd->room) );
175 emit error( ERROR_BASE+8, CommunicationManager::FetchingCommunication );
176 while ( !iMeetings.isEmpty() )
177 delete iMeetings.takeFirst();
178 emit meetingsFetched( iMeetings );
182 qDebug("*** COMMUNICATIONMANAGER ::: Meetings fetched!");
183 emit meetingsFetched( iMeetings );
189 ResponseMessage msg( *response );
190 QString id = msg.getNodeValue( QString( "Id" ),
191 QDomNode::AttributeNode,
192 QString( "AlternateId" ) );
193 qDebug( "ID IS: %s", id.toStdString().data() );
194 rd->meeting->setSecondaryId( id );
195 getMeetingDetails( *(rd->meeting) );
198 case GetCalendarItem:
200 ResMsgGetCalendarItem msg( *response );
201 int err = msg.getMeetingDetailsFromResponse( *(rd->meeting) );
204 emit error( ERROR_BASE+9, CommunicationManager::FetchingCommunication );
205 while ( !iMeetings.isEmpty() )
206 delete iMeetings.takeFirst();
207 emit meetingsFetched( iMeetings );
211 emit meetingDetailsFetched( *(rd->meeting) );
219 void CommunicationManager::readProgress( int /*aRequestId*/, int aDone, int aTotal )
221 emit readProgress( aDone, aTotal, CommunicationManager::FetchingCommunication );
224 void CommunicationManager::addRequest( RequestType aType, int aRequestId )
226 RequestData* rd = new RequestData( aType, aRequestId );
227 iRequestInfos.append( rd );
230 CommunicationManager::RequestData* CommunicationManager::takeRequest( int aRequestId )
232 if( aRequestId == 0 )
235 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
237 struct RequestData* rd = iRequestInfos[i];
238 if( rd->requestId == aRequestId )
240 iRequestInfos.removeAt( i );
247 const CommunicationManager::RequestData* CommunicationManager::findRequest( RequestType aRequestType ) const
249 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
251 struct RequestData* rd = iRequestInfos[i];
252 if( rd->type == aRequestType )