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::getMeetingDetails( Meeting &aMeeting )
96 ReqMsgGetCalendarItem msg( aMeeting.secondaryId() );
98 QByteArray arr = msg.getMessage();
100 int id = iFetchingCommunication->request( msg.getContentTypeForHeader(), arr );
101 qDebug() << "CommunicationManager::getMeetingDetails: id: " << id;
104 addRequest( GetCalendarItem, id );
105 iRequestInfos.first()->meeting = &aMeeting;
109 void CommunicationManager::requestFinished( int aRequestId, int aError )
111 RequestData* rd = takeRequest( aRequestId );
112 QByteArray* response = iFetchingCommunication->response( aRequestId );
113 qDebug() << "CommunicationManager::requestFinished: id: " << aRequestId << " error: " << aError;
115 if( aError != (int)(QHttp::NoError) || rd == NULL || response == NULL )
118 if( rd == NULL || response == NULL )
121 emit error( ERROR_BASE+(int)err, CommunicationManager::FetchingCommunication );
127 case GetUserAvailability:
129 ResMsgGetUserAvailability msg( *response );
131 while ( !iMeetings.isEmpty() )
132 delete iMeetings.takeFirst();
134 int err = msg.getMeetingsFromResponse( iMeetings, *(rd->room) );
136 emit error( ERROR_BASE+8, CommunicationManager::FetchingCommunication );
138 emit meetingsFetched( iMeetings );
143 ResponseMessage msg( *response );
144 QString id = msg.getNodeValue( QString( "Id" ),
145 QDomNode::AttributeNode,
146 QString( "AlternateId" ) );
147 qDebug( "ID IS: %s", id.toStdString().data() );
148 rd->meeting->setSecondaryId( id );
149 getMeetingDetails( *(rd->meeting) );
152 case GetCalendarItem:
154 ResMsgGetCalendarItem msg( *response );
155 int err = msg.getMeetingDetailsFromResponse( *(rd->meeting) );
157 emit error( ERROR_BASE+9, CommunicationManager::FetchingCommunication );
159 emit meetingDetailsFetched( *(rd->meeting) );
167 void CommunicationManager::readProgress( int /*aRequestId*/, int aDone, int aTotal )
169 emit readProgress( aDone, aTotal, CommunicationManager::FetchingCommunication );
172 void CommunicationManager::addRequest( RequestType aType, int aRequestId )
174 RequestData* rd = new RequestData( aType, aRequestId );
175 iRequestInfos.append( rd );
178 CommunicationManager::RequestData* CommunicationManager::takeRequest( int aRequestId )
180 if( aRequestId == 0 )
183 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
185 struct RequestData* rd = iRequestInfos[i];
186 if( rd->requestId == aRequestId )
188 iRequestInfos.removeAt( i );
195 const CommunicationManager::RequestData* CommunicationManager::findRequest( RequestType aRequestType ) const
197 for( int i = iRequestInfos.count() - 1; i >= 0 ; i-- )
199 struct RequestData* rd = iRequestInfos[i];
200 if( rd->type == aRequestType )