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 QDateTime &aFrom, const QDateTime &aUntil, const Room &aIn )
44 //prevent making multiple simultaneous user availibility requests
45 const RequestData* rd = findRequest( GetUserAvailability );
48 ReqMsgGetUserAvailability msg;
50 msg.setTimeWindow( aFrom, aUntil );
51 msg.addUser( aIn.address() );
53 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), msg.getMessage() );
54 qDebug() << "CommunicationManager::fetchMeetings: id: " << id;
57 addRequest( GetUserAvailability, id );
58 iRequestInfos.first()->room = new Room( aIn );
62 void CommunicationManager::getSecondaryIdForMeeting( Meeting &aMeeting )
64 ReqMsgConvertMeetingId msg( aMeeting.primaryId(), aMeeting.room().address() );
66 QByteArray arr = msg.getMessage();
68 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), arr );
69 qDebug() << "CommunicationManager::getSecondaryIdForMeeting: id: " << id;
72 addRequest( ConvertId, id );
73 iRequestInfos.first()->meeting = &aMeeting;
77 void CommunicationManager::fetchMeetingDetails( Meeting& aMeeting )
79 if( aMeeting.detailsAvailable() )
81 emit meetingDetailsFetched( aMeeting );
84 if( aMeeting.secondaryId().isEmpty() )
86 getSecondaryIdForMeeting( aMeeting );
90 getMeetingDetails( aMeeting );
94 void CommunicationManager::cancelFetchMeetingDetails()
96 const RequestData *rd = findRequest( GetCalendarItem );
98 int id = rd->requestId;
99 iCancelledRequests.append( id );
103 void CommunicationManager::getMeetingDetails( Meeting &aMeeting )
105 ReqMsgGetCalendarItem msg( aMeeting.secondaryId() );
107 QByteArray arr = msg.getMessage();
109 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), arr );
110 qDebug() << "CommunicationManager::getMeetingDetails: id: " << id;
113 addRequest( GetCalendarItem, id );
114 iRequestInfos.first()->meeting = &aMeeting;
118 void CommunicationManager::requestFinished( int aRequestId, int aError )
120 RequestData* rd = takeRequest( aRequestId );
121 if( iCancelledRequests.contains( rd->requestId ) )
123 iCancelledRequests.removeAll( rd->requestId );
127 QByteArray* response = iFetchingCommunication->response( aRequestId );
128 qDebug() << "CommunicationManager::requestFinished: id: " << aRequestId << " error: " << aError;
130 if( aError != (int)(QHttp::NoError) || rd == NULL || response == NULL )
133 if( rd == NULL || response == NULL )
136 emit error( ERROR_BASE+(int)err, CommunicationManager::FetchingCommunication );
142 case GetUserAvailability:
144 ResMsgGetUserAvailability msg( *response );
146 while ( !iMeetings.isEmpty() )
147 delete iMeetings.takeFirst();
149 int err = msg.getMeetingsFromResponse( iMeetings, *(rd->room) );
151 emit error( ERROR_BASE+8, CommunicationManager::FetchingCommunication );
153 emit meetingsFetched( iMeetings );
158 ResponseMessage msg( *response );
159 QString id = msg.getNodeValue( QString( "Id" ),
160 QDomNode::AttributeNode,
161 QString( "AlternateId" ) );
162 qDebug( "ID IS: %s", id.toStdString().data() );
163 rd->meeting->setSecondaryId( id );
164 getMeetingDetails( *(rd->meeting) );
167 case GetCalendarItem:
169 ResMsgGetCalendarItem msg( *response );
170 int err = msg.getMeetingDetailsFromResponse( *(rd->meeting) );
172 emit error( ERROR_BASE+9, CommunicationManager::FetchingCommunication );
174 emit meetingDetailsFetched( *(rd->meeting) );
182 void CommunicationManager::readProgress( int /*aRequestId*/, int aDone, int aTotal )
184 emit readProgress( aDone, aTotal, CommunicationManager::FetchingCommunication );
187 void CommunicationManager::addRequest( RequestType aType, int aRequestId )
189 RequestData* rd = new RequestData( aType, aRequestId );
190 iRequestInfos.append( rd );
193 CommunicationManager::RequestData* CommunicationManager::takeRequest( int aRequestId )
195 if( aRequestId == 0 )
198 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
200 struct RequestData* rd = iRequestInfos[i];
201 if( rd->requestId == aRequestId )
203 iRequestInfos.removeAt( i );
210 const CommunicationManager::RequestData* CommunicationManager::findRequest( RequestType aRequestType ) const
212 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
214 struct RequestData* rd = iRequestInfos[i];
215 if( rd->type == aRequestType )