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 = NULL;
97 for( rd = findRequest( GetCalendarItem );rd != NULL; )
99 int id = rd->requestId;
100 iCancelledRequests.append( id );
101 rd = findRequest( GetCalendarItem );
105 void CommunicationManager::getMeetingDetails( Meeting &aMeeting )
107 ReqMsgGetCalendarItem msg( aMeeting.secondaryId() );
109 QByteArray arr = msg.getMessage();
111 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), arr );
112 qDebug() << "CommunicationManager::getMeetingDetails: id: " << id;
115 addRequest( GetCalendarItem, id );
116 iRequestInfos.first()->meeting = &aMeeting;
120 void CommunicationManager::requestFinished( int aRequestId, int aError )
122 RequestData* rd = takeRequest( aRequestId );
123 if( iCancelledRequests.contains( rd->requestId ) )
125 iCancelledRequests.removeAll( rd->requestId );
129 QByteArray* response = iFetchingCommunication->response( aRequestId );
130 qDebug() << "CommunicationManager::requestFinished: id: " << aRequestId << " error: " << aError;
132 if( aError != (int)(QHttp::NoError) || rd == NULL || response == NULL )
135 if( rd == NULL || response == NULL )
138 emit error( ERROR_BASE+(int)err, CommunicationManager::FetchingCommunication );
144 case GetUserAvailability:
146 ResMsgGetUserAvailability msg( *response );
148 while ( !iMeetings.isEmpty() )
149 delete iMeetings.takeFirst();
151 int err = msg.getMeetingsFromResponse( iMeetings, *(rd->room) );
153 emit error( ERROR_BASE+8, CommunicationManager::FetchingCommunication );
155 emit meetingsFetched( iMeetings );
160 ResponseMessage msg( *response );
161 QString id = msg.getNodeValue( QString( "Id" ),
162 QDomNode::AttributeNode,
163 QString( "AlternateId" ) );
164 qDebug( "ID IS: %s", id.toStdString().data() );
165 rd->meeting->setSecondaryId( id );
166 getMeetingDetails( *(rd->meeting) );
169 case GetCalendarItem:
171 ResMsgGetCalendarItem msg( *response );
172 int err = msg.getMeetingDetailsFromResponse( *(rd->meeting) );
174 emit error( ERROR_BASE+9, CommunicationManager::FetchingCommunication );
176 emit meetingDetailsFetched( *(rd->meeting) );
184 void CommunicationManager::readProgress( int /*aRequestId*/, int aDone, int aTotal )
186 emit readProgress( aDone, aTotal, CommunicationManager::FetchingCommunication );
189 void CommunicationManager::addRequest( RequestType aType, int aRequestId )
191 RequestData* rd = new RequestData( aType, aRequestId );
192 iRequestInfos.append( rd );
195 CommunicationManager::RequestData* CommunicationManager::takeRequest( int aRequestId )
197 if( aRequestId == 0 )
200 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
202 struct RequestData* rd = iRequestInfos[i];
203 if( rd->requestId == aRequestId )
205 iRequestInfos.removeAt( i );
212 const CommunicationManager::RequestData* CommunicationManager::findRequest( RequestType aRequestType ) const
214 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
216 struct RequestData* rd = iRequestInfos[i];
217 if( rd->type == aRequestType )