3 #include "MessagingUtils.h"
5 #include "Configuration.h"
8 * BaseMessage class functions
10 BaseMessage::BaseMessage()
13 qDebug( "BaseMessage::BaseMessage" );
15 iMessage = new QDomDocument();
17 qDebug( "BaseMessage::BaseMessage end" );
21 BaseMessage::~BaseMessage()
24 qDebug( "BaseMessage::~BaseMessage" );
32 qDebug( "BaseMessage::~BaseMessage end" );
36 QList<QDomNode> BaseMessage::getNodesByName( const QString& aNodeName, const QString& aParentName, QDomNode* aRootNode )
39 qDebug( "BaseMessage::getNodesByName" );
42 //TODO: Add implementation for attribute search
45 QList<QDomNode> specList;
47 list = ( aRootNode ) ? aRootNode->toElement().elementsByTagName( aNodeName ) : iMessage->elementsByTagName( aNodeName );
49 for( int i=0; i<list.count(); i++ )
51 if( aParentName != QString::null )
53 if( !list.item( i ).parentNode().isNull() && list.item( i ).parentNode().isElement() && list.item( i ).parentNode().toElement().tagName().compare( aParentName ) == 0 )
54 specList.append( list.item( i ) );
57 specList.append( list.item( i ) );
60 qDebug( "BaseMessage::getNodesByName end" );
65 QDomNode BaseMessage::getNodeFromDocument( const QString& aNodeName,
66 QDomNode::NodeType aNodeType,
67 const QString& aParentName,
72 qDebug( "BaseMessage::getNodeFromDocument" );
75 if( aNodeType == QDomNode::ElementNode )
76 node = getElementFromDocument( aNodeName, aParentName, aIndex, aRootNode );
77 else if( aNodeType == QDomNode::AttributeNode )
78 node = getAttributeFromDocument( aNodeName, aParentName, aIndex, aRootNode );
80 qDebug( "BaseMessage::getNodeFromDocument end" );
85 QDomNode BaseMessage::getAttributeFromDocument( const QString& aAttributeName,
86 const QString& aParentName,
91 qDebug( "BaseMessage::getAttributeFromDocument" );
98 root = ( !aRootNode ) ? iMessage->documentElement() : *aRootNode;
102 qDebug( "BaseMessage::getAttributeFromDocument : RootNode is NULL." );
107 if( aParentName != QString::null )
109 if( root.isElement() )
111 QDomNodeList list = root.toElement().elementsByTagName( aParentName );
112 if( list.count() > 0 ) parent = list.item( 0 );
116 QDomNamedNodeMap attrs = parent.attributes();
118 int count = attrs.count();
119 if( count==0 || aIndex >= count || !attrs.contains( aAttributeName ) ) return root;
121 QList<QDomAttr> list;
123 for( int i=0; i<count; i++ )
125 QDomAttr attr = attrs.item( i ).toAttr();
127 if( attr.name().compare( aAttributeName ) == 0 || attr.localName().compare( aAttributeName ) == 0 )
129 if( aParentName != QString::null && ( attr.ownerElement().tagName().compare( aParentName ) == 0 || attr.ownerElement().localName().compare( aParentName ) == 0 ))
139 if( list.count() > 0 )
140 node = list.at( aIndex );
143 qDebug( "BaseMessage::getAttributeFromDocument end." );
149 QDomNode BaseMessage::getElementFromDocument( const QString& aElementName,
150 const QString& aParentName,
152 QDomNode* aRootNode )
155 qDebug( "BaseMessage::getElementFromDocument" );
162 elems = iMessage->elementsByTagName( aElementName );
166 elems = aRootNode->toElement().elementsByTagName( aElementName );
169 int count = elems.count();
170 if( count == 0 || aIndex >= count )
173 qDebug( "BaseMessage::getElementFromDocument : No Elements found." );
175 return node; //no elements found
178 QList<QDomElement> list;
180 for( int i=0; i<count; i++ )
182 QDomElement elem = elems.item( i ).toElement();
183 if( elem.tagName().compare( aElementName ) == 0 || elem.localName().compare( aElementName ) == 0 )
185 if( aParentName != QString::null )
187 if( !elem.parentNode().isNull() )
189 if( elem.parentNode().toElement().tagName().compare( aParentName ) == 0 || elem.parentNode().toElement().tagName().compare( aParentName ) == 0 )
199 if( list.count() > 0 )
200 node = list.at( aIndex );
203 qDebug( "BaseMessage::getElementFromDocument end" );
208 bool BaseMessage::matchName( const QDomNode& aNode, const QString& aName )
211 qDebug( "BaseMessage::matchName" );
213 if( aNode.isElement() )
215 if( aNode.toElement().tagName().toLower().compare( aName.toLower() ) == 0
216 || aNode.localName().toLower().compare( aName.toLower() ) == 0 )
219 qDebug( "BaseMessage::matchName end" );
224 else if( aNode.isAttr() )
226 if( aNode.toAttr().name().toLower().compare( aName.toLower() ) == 0
227 || aNode.localName().toLower().compare( aName.toLower() ) == 0 )
230 qDebug( "BaseMessage::matchName end" );
236 qDebug( "BaseMessage::matchName : No match." );
241 QByteArray BaseMessage::getMessage()
244 qDebug( "BaseMessage::getMessage" );
249 msg.append( iMessage->toByteArray() );
252 qDebug( "BaseMessage::getMessage end" );
258 * RequestMessage class functions
260 RequestMessage::RequestMessage( RequestCommandId aCommandId ) : iCurrCmd( aCommandId )
263 qDebug( "RequestMessage::RequestMessage" );
265 createEnvelopeBase();
267 if( aCommandId != ReqCmdNoCommand )
269 createMessageStructure( aCommandId );
272 qDebug( "RequestMessage::RequestMessage end" );
276 RequestMessage::RequestMessage( const QString& /*aFileName*/ )
278 //createEnvelopeBase();
279 //TODO: read operation structures from a file
282 int RequestMessage::addNode( const QDomNode& aNode, QDomNode::NodeType aNodeType, const QString& aParentName, int aIndex, QDomNode* aRootNode )
285 qDebug( "RequestMessage::addNode" );
291 qDebug( "RequestMessage::addNode : iMessage is NULL." );
293 return MsgErrSomeError;
296 int err = MsgErrNoError;
298 if( aNodeType == QDomNode::ElementNode && aNode.isElement() )
300 if( aParentName == QString::null )
303 iMessage->appendChild( aNode );
305 aRootNode->appendChild( aNode );
309 QDomNodeList list = ( aRootNode ) ? aRootNode->toElement().elementsByTagName( aParentName ) : iMessage->elementsByTagName( aParentName );
311 if( list.count() == 0 || aIndex >= list.count() ) err = MsgErrSomeError;
314 QDomElement node = list.at( aIndex ).toElement();
315 node.appendChild( aNode );
319 else if( aNodeType == QDomNode::AttributeNode && aNode.isAttr() )
321 if( aParentName != QString::null )
323 QDomNodeList list = ( aRootNode ) ? aRootNode->toElement().elementsByTagName( aParentName ) : iMessage->elementsByTagName( aParentName );
325 if( list.count() == 0 || aIndex >= list.count() ) err = MsgErrSomeError;
328 QDomElement node = list.at( aIndex ).toElement();
329 node.setAttributeNode( aNode.toAttr() );
333 err = MsgErrSomeError; //Attribute must have a parent specified
336 err = MsgErrSomeError;
339 qDebug( "RequestMessage::addNode end : err=%d", err );
344 int RequestMessage::setNodeValue( const QString& aNodeName, const QString& aValue, QDomNode::NodeType aNodeType, const QString& aParentName, int aIndex, QDomNode* aRootNode )
347 qDebug( "RequestMessage::setNodeValue" );
350 QDomNode node = getNodeFromDocument( aNodeName, aNodeType, aParentName, aIndex, aRootNode );
351 if( node.isNull() || !iMessage )
354 qDebug( "RequestMessage::setNodeValue : Node is NULL or iMessage is NULL." );
356 return MsgErrSomeError;
359 int err = MsgErrNoError;
361 if( node.isElement() )
363 node.appendChild( iMessage->createTextNode( aValue ) );
365 else if( node.isAttr() )
366 node.toAttr().setValue( aValue );
368 err = MsgErrSomeError;
371 qDebug( "RequestMessage::setNodeValue end : err=%d", err );
376 int RequestMessage::createEnvelopeBase()
379 qDebug( "RequestMessage::createEnvelopeBase" );
387 iMessage = new QDomDocument();
389 int size = sizeof( reqCmdArrayEnvelopeBase ) / sizeof( MessageBodyElement );
390 int err = MsgErrNoError;
392 QDomNode base = constructArrayToNode( reqCmdArrayEnvelopeBase, size );
395 err = addNode( base );
396 else err = MsgErrSomeError;
399 qDebug( "RequestMessage::createEnvelopeBase end : err=%d", err );
404 QString RequestMessage::getContentTypeForHeader( RequestCommandId aCommandId )
407 qDebug( "RequestMessage::getContentTypeForHeader" );
409 QString contentType( QString::null );
411 RequestCommandId cmd = ( aCommandId == ReqCmdNoCommand ) ? iCurrCmd : aCommandId;
413 if( cmd != ReqCmdNoCommand )
415 QString operation( QString::null );
419 case ReqCmdGetUserAvailability : { operation = "GetUserAvailability"; } break;
420 case ReqCmdConvertId : { operation = "ConvertId"; } break;
421 case ReqCmdGetItem : { operation = "GetItem"; } break;
423 //Currently unused operations
425 /*case ReqCmdAddDelegate : { operation = "AddDelegate"; } break;
426 case ReqCmdCopyFolder : { operation = "CopyFolder"; } break;
427 case ReqCmdCopyItem : { operation = "CopyItem"; } break;
428 case ReqCmdCreateAttachment : { operation = "CreateAttachment"; } break;
429 case ReqCmdCreateFolder : { operation = "CreateFolder"; } break;
430 case ReqCmdCreateItem : { operation = "CreateItem"; } break;
431 case ReqCmdCreateManagedFolder : { operation = "CreateManagedFolder"; } break;
432 case ReqCmdDeleteAttachment : { operation = "DeleteAttachment"; } break;
433 case ReqCmdDeleteFolder : { operation = "DeleteFolder"; } break;
434 case ReqCmdDeleteItem : { operation = "DeleteItem"; } break;
435 case ReqCmdExpandDL : { operation = "ExpandDL"; } break;
436 case ReqCmdFindFolder : { operation = "FindFolder"; } break;
437 case ReqCmdFindItem : { operation = "FindItem"; } break;
438 case ReqCmdGetAttachment : { operation = "GetAttachment"; } break;
439 case ReqCmdGetDelegate : { operation = "GetDelegate"; } break;
440 case ReqCmdGetEvents : { operation = "GetEvents"; } break;
441 case ReqCmdGetFolder : { operation = "GetFolder"; } break;
442 case ReqCmdGetUserOofSettings : { operation = "GetUserOofSettings"; } break;
443 case ReqCmdMoveFolder : { operation = "MoveFolder"; } break;
444 case ReqCmdMoveItem : { operation = "MoveItem"; } break;
445 case ReqCmdRemoveDelegate : { operation = "RemoveDelegate"; } break;
446 case ReqCmdResolveNames : { operation = "ResolveNames"; } break;
447 case ReqCmdSendItem : { operation = "SendItem"; } break;
448 case ReqCmdSetUserOofSettings : { operation = "SetUserOofSettings"; } break;
449 case ReqCmdSubscribe : { operation = "Subscribe"; } break;
450 case ReqCmdSyncFolderHierarchy : { operation = "SyncFolderHierarchy"; } break;
451 case ReqCmdSyncFolderItems : { operation = "SyncFolderItems"; } break;
452 case ReqCmdUnsubscribe : { operation = "Unsubscribe"; } break;
453 case ReqCmdUpdateDelegate : { operation = "UpdateDelegate"; } break;
454 case ReqCmdUpdateFolder : { operation = "UpdateFolder"; } break;
455 case ReqCmdUpdateItem : { operation = "UpdateItem"; } break;*/
459 if( operation != QString::null )
461 QString content( "text/xml; " );
462 QString charset( "utf-8; " );
463 contentType = QString( content + "charset=" + charset + "action=\"" + ACTION_URL + operation + "\"" );
467 qDebug( "RequestMessage::getContentTypeForHeader end : contentType=%s", contentType.toStdString().data() );
472 int RequestMessage::createMessageStructure()
474 return createMessageStructure( iCurrCmd );
477 int RequestMessage::createMessageStructure( RequestCommandId aCommandId )
480 qDebug( "RequestMessage::createMessageStructure" );
485 qDebug( "RequestMessage::createMessageStructure : iMessage is NULL" );
487 return MsgErrSomeError;
490 //Should always be soap:Envelope or first element in envelopebase array
491 QDomNode last = iMessage->documentElement();
493 if( !matchName( last, reqCmdArrayEnvelopeBase[0].iElementName ) )
496 qDebug( "RequestMessage::createMessageStructure : Document element is not valid SOAP envelope" );
498 return MsgErrSomeError;
502 int err = MsgErrNoError;
506 case ReqCmdGetUserAvailability : { cmd = constructArrayToNode( reqCmdArrayGetUserAvailability, sizeof( reqCmdArrayGetUserAvailability ) / sizeof( MessageBodyElement ) ); } break;
507 case ReqCmdConvertId : { cmd = constructArrayToNode( reqCmdArrayConvertId, sizeof( reqCmdArrayConvertId ) / sizeof( MessageBodyElement ) ); } break;
508 case ReqCmdGetItem : { cmd = constructArrayToNode( reqCmdArrayGetCalendarItem, sizeof( reqCmdArrayGetCalendarItem ) / sizeof( MessageBodyElement ) ); } break;
512 if( cmd.isNull() ) err = MsgErrSomeError;
514 err = addNode( cmd, QDomNode::ElementNode, reqCmdArrayEnvelopeBase[0].iElementName );
517 qDebug( "RequestMessage::createMessageStructure end : err=%d", err );
522 QDomNode RequestMessage::constructArrayToNode( const MessageBodyElement* aArray, int aSize )
525 qDebug( "RequestMessage::constructArrayToNode" );
527 QDomElement target; //final node to be returned
529 if( !iMessage || aSize == 0 )
532 qDebug( "RequestMessage::constructArrayToNode : iMessage is NULL or aSize is 0." );
537 QDomElement last; // last appended node
539 int currentLvl = 0; //current traversal level
543 MessageBodyElement root = aArray[idx];
544 if( root.iNodeType != QDomNode::ElementNode || root.iTraversalLevel > 0 )
547 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
549 return target; //Root must be an element and on level 0
553 if( root.iNamespace != QString::null )
555 //QString prefix = root.iNamespace
556 target = iMessage->createElementNS( root.iNamespace, root.iElementName );
560 target = iMessage->createElement( root.iElementName );
566 for( int i=idx; i<aSize; i++ )
568 MessageBodyElement element = aArray[i];
570 if( element.iNodeType == QDomNode::ElementNode )
572 //Node is an element node
574 if( element.iNamespace != QString::null )
576 elem = iMessage->createElementNS( element.iNamespace, element.iElementName );
580 elem = iMessage->createElement( element.iElementName );
582 if( element.iTraversalLevel == currentLvl )
584 if( currentLvl == 0 )
587 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
589 return target; //Only root can be at traversal level 0
593 //Sibling to previous
594 if( !last.parentNode().isNull() )
595 last.parentNode().appendChild( elem );
599 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
601 return target; //malformed. if last has no parent, it's a rootnode
605 else if( element.iTraversalLevel > currentLvl )
607 //check if node is child to previous
608 //else there is something wrong in array representing the structure
609 if( element.iTraversalLevel == currentLvl+1 )
611 last.appendChild( elem );
616 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
621 else if( element.iTraversalLevel < currentLvl )
624 //Node is on more shallow level than previous
625 //let's get it's parent
626 int diff = currentLvl - element.iTraversalLevel;
628 for( int j=0; j<diff; j++ )
630 QDomNode temp = last.parentNode();
631 last = temp.toElement();
633 last.parentNode().appendChild( elem );
638 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
640 //some undefined error
646 else if( element.iNodeType == QDomNode::AttributeNode )
648 //Node is an attribute node
651 if( element.iNamespace != QString::null )
652 attr = iMessage->createAttributeNS( element.iNamespace, element.iElementName );
654 attr = iMessage->createAttribute( element.iElementName );
656 if( element.iTraversalLevel == currentLvl )
658 last.setAttributeNode( attr );
663 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
665 //error in template array.
666 //attributes for element must be specified right after element
667 //and must have same traversalId
674 qDebug( "RequestMessage::constructArrayToNode : Node type not supported." );
676 //node type not supported
680 currentLvl = element.iTraversalLevel;
683 qDebug( "RequestMessage::constructArrayToNode : end" );
689 * ResponseMessage class functions
691 ResponseMessage::ResponseMessage()
694 qDebug( "ResponseMessage::ResponseMessage" );
696 iMessage = new QDomDocument();
698 qDebug( "ResponseMessage::ResponseMessage end" );
702 ResponseMessage::ResponseMessage( const QByteArray& aData )
705 qDebug( "ResponseMessage::ResponseMessage" );
707 iMessage->setContent( aData, true );
709 qDebug( "ResponseMessage::ResponseMessage end" );
713 QString ResponseMessage::getNodeValue( const QString& aNodeName, QDomNode::NodeType aNodeType, const QString& aParentName, int aIndex, QDomNode* aRootNode )
716 qDebug( "ResponseMessage::getNodeValue" );
718 QString value = QString::null;
719 QDomNode node = getNodeFromDocument( aNodeName, aNodeType, aParentName, aIndex, aRootNode );
722 if( node.isElement() )
723 value = node.toElement().text();
724 else if( node.isAttr() )
725 value = node.toAttr().value();
728 qDebug( "ResponseMessage::getNodeValue end" );
733 bool ResponseMessage::hasErrors()
736 qDebug( "ResponseMessage::hasErrors" );
741 qDebug( "ResponseMessage::hasErrors : iMessage is NULL." );
746 QDomElement root = iMessage->documentElement();
749 QString rootname = ( root.prefix() == QString::null ) ? root.tagName() : root.localName();
750 err = ( rootname.compare( QString( "Envelope" ) ) == 0 ) ? false : true;
752 QDomNodeList list = iMessage->elementsByTagName( QString( "m:ResponseCode" ) );
753 for( int i=0; i<list.count(); i++ )
755 if( list.item(i).nodeValue().compare( "NoError" ) != 0 )
761 qDebug( "ResponseMessage::hasErrors end : err=%d", err );
767 * ReqMsgGetUserAvailability class functions
770 ReqMsgGetUserAvailability::ReqMsgGetUserAvailability() : RequestMessage( ReqCmdGetUserAvailability )
773 qDebug( "ReqMsgGetUserAvailability::ReqMsgGetUserAvailability" );
775 if( iMessage && iCurrCmd == ReqCmdGetUserAvailability )
777 setNodeValue( QString( "MergedFreeBusyIntervalInMinutes" ), QString::number( 60 ) );
778 setNodeValue( QString( "RequestedView" ), QString( "DetailedMerged" ) );
781 qDebug( "ReqMsgGetUserAvailability::ReqMsgGetUserAvailability end" );
785 int ReqMsgGetUserAvailability::addUser( const QString& aAddress, const QString& /*aAttendeeType*/, const QString& aExcludeConflicts )
788 qDebug( "ReqMsgGetUserAvailability::addUser" );
790 if( !iMessage || iCurrCmd != ReqCmdGetUserAvailability )
793 qDebug( "ReqMsgGetUserAvailability::addUser : iMessage is NULL or current command id is wrong" );
795 return MsgErrSomeError;
798 int err = MsgErrNoError;
799 int size = sizeof( reqCmdMailboxElement ) / sizeof( MessageBodyElement );
801 //Create mailbox data element
802 QDomNode mailbox = constructArrayToNode( reqCmdMailboxElement, size );
803 if( !mailbox.isNull() )
807 if( mailbox.hasChildNodes() )
809 for ( QDomNode subnode = mailbox.firstChild(); !subnode.isNull(); subnode = subnode.nextSibling() )
811 qDebug( "subnode: %s", subnode.toElement().tagName().toStdString().data() );
812 if( matchName( subnode, QString( "Email" ) ) )
819 setNodeValue( QString( "Address" ), aAddress, QDomNode::ElementNode, QString( "Email" ), 0, &email );
820 setNodeValue( QString( "AttendeeType" ), QString( "Required" ), QDomNode::ElementNode, QString( "MailboxData" ), 0, &mailbox );
821 setNodeValue( QString( "ExcludeConflicts" ), aExcludeConflicts, QDomNode::ElementNode, QString( "MailboxData" ), 0, &mailbox );
823 err = addNode( mailbox, QDomNode::ElementNode, QString( "MailboxDataArray" ) );
826 err = MsgErrSomeError;
829 qDebug( "ReqMsgGetUserAvailability::addUser end : err=%d", err );
834 int ReqMsgGetUserAvailability::setTimeWindow( const QDateTime& aStart, const QDateTime& aEnd )
837 qDebug( "ReqMsgGetUserAvailability::setTimeWindow" );
839 if( !iMessage || iCurrCmd != ReqCmdGetUserAvailability )
842 qDebug( "ReqMsgGetUserAvailability::setTimeWindow : iMessage is NULL or command id is wrong" );
844 return MsgErrSomeError;
847 int err = MsgErrNoError;
849 err = setNodeValue( QString( "StartTime" ), aStart.toString( Qt::ISODate ) );
850 err = setNodeValue( QString( "EndTime" ), aEnd.toString( Qt::ISODate ) );
853 qDebug( "ReqMsgGetUserAvailability::setTimeWindow end : err=%d", err );
858 int ReqMsgGetUserAvailability::setTimeZone()
861 qDebug( "ReqMsgGetUserAvailability::setTimeZone" );
863 if( !iMessage || iCurrCmd != ReqCmdGetUserAvailability )
866 qDebug( "ReqMsgGetUserAvailability::setTimeZone : iMessage is NULL or command id is wrong" );
868 return MsgErrSomeError;
870 int err = MsgErrNoError;
871 //TODO: timezone and daylight times to application configuration
872 setNodeValue( QString( "Bias" ), QString::number( -120 ), QDomNode::ElementNode, QString( "TimeZone" ) );
873 setNodeValue( QString( "Bias" ), QString::number( 0 ), QDomNode::ElementNode, QString( "StandardTime" ) );
874 setNodeValue( QString( "Time" ), QString( "03:00:00" ), QDomNode::ElementNode, QString( "StandardTime" ) );
875 setNodeValue( QString( "DayOrder" ), QString::number( 5 ), QDomNode::ElementNode, QString( "StandardTime" ) );
876 setNodeValue( QString( "Month" ), QString::number( 10 ), QDomNode::ElementNode, QString( "StandardTime" ) );
877 setNodeValue( QString( "DayOfWeek" ), QString( "Sunday" ), QDomNode::ElementNode, QString( "StandardTime" ) );
878 setNodeValue( QString( "Bias" ), QString::number( -60 ), QDomNode::ElementNode, QString( "DaylightTime" ) );
879 setNodeValue( QString( "Time" ), QString( "03:00:00" ), QDomNode::ElementNode, QString( "DaylightTime" ) );
880 setNodeValue( QString( "DayOrder" ), QString::number( 1 ), QDomNode::ElementNode, QString( "DaylightTime" ) );
881 setNodeValue( QString( "Month" ), QString::number( 4 ), QDomNode::ElementNode, QString( "DaylightTime" ) );
882 setNodeValue( QString( "DayOfWeek" ), QString( "Sunday" ), QDomNode::ElementNode, QString( "DaylightTime" ) );
885 qDebug( "ReqMsgGetUserAvailability::setTimeZone end : err=%d", err );
891 * ReqMsgConvertMeetingId class functions
893 ReqMsgConvertMeetingId::ReqMsgConvertMeetingId( const QString& aItemId, const QString& aMailbox )
896 qDebug( "ReqMsgConvertMeetingId::ReqMsgConvertMeetingId" );
898 //For this class, we're not going to provide id for base class as parameter,
899 //because before content structure initialization, we must add SOAP header to envelope
900 iCurrCmd = ReqCmdConvertId;
902 QDomNode header = constructArrayToNode( reqCmdArrayConvertIdHeader, sizeof( reqCmdArrayConvertIdHeader ) / sizeof( MessageBodyElement ) );
904 if( !header.isNull() )
906 int err = addNode( header, QDomNode::ElementNode, reqCmdArrayEnvelopeBase[0].iElementName );
908 if( err == MsgErrNoError )
910 createMessageStructure( ReqCmdConvertId );
912 if( aItemId != QString::null ) setItemId( aItemId );
913 if( aMailbox != QString::null ) setMailbox( aMailbox );
915 setNodeValue( QString( "Version" ), QString( "Exchange2007_SP1" ), QDomNode::AttributeNode, QString( "RequestServerVersion" ) );
916 setNodeValue( QString( "DestinationFormat" ), QString( "EwsLegacyId" ), QDomNode::AttributeNode, QString( "ConvertId" ) );
917 setNodeValue( QString( "Format" ), QString( "HexEntryId" ), QDomNode::AttributeNode, QString( "AlternateId" ) );
920 //setNodeValue( QString( "xmlns:t" ), NS_T, QDomNode::AttributeNode, QString( "ConvertId" ) );
922 //Must be added (for now at least) like this, because Envelope is initialized already, without attributes
923 /*QDomAttr attr = iMessage->createAttribute( QString( "xmlns:t" ) );
924 attr.setValue( NS_T );
925 addNode( attr, QDomNode::AttributeNode, QString( "Envelope" ) );
928 qDebug( "ReqMsgConvertMeetingId::ReqMsgConvertMeetingId end" );
932 int ReqMsgConvertMeetingId::setItemId( const QString& aItemId )
935 qDebug( "ReqMsgConvertMeetingId::setItemId" );
937 int err = setNodeValue( QString( "Id" ), aItemId, QDomNode::AttributeNode, QString( "AlternateId" ) );
939 qDebug( "ReqMsgConvertMeetingId::setItemId end : err=%d", err );
944 int ReqMsgConvertMeetingId::setMailbox( const QString& aMailbox )
947 qDebug( "ReqMsgConvertMeetingId::setMailbox" );
949 int err = setNodeValue( QString( "Mailbox" ), aMailbox, QDomNode::AttributeNode, QString( "AlternateId" ) );
951 qDebug( "ReqMsgConvertMeetingId::setMailbox end : err=%d", err );
957 * ReqMsgGetCalendarItem class functions
959 ReqMsgGetCalendarItem::ReqMsgGetCalendarItem( const QString& aItemId ) : RequestMessage( ReqCmdGetItem )
962 qDebug( "ReqMsgGetCalendarItem::ReqMsgGetCalendarItem" );
964 if( iMessage && iCurrCmd == ReqCmdGetItem )
966 setNodeValue( QString( "BaseShape" ), QString( "AllProperties" ) );
968 if( aItemId != QString::null )
969 setItemId( aItemId );
972 qDebug( "ReqMsgGetCalendarItem::ReqMsgGetCalendarItem end" );
976 int ReqMsgGetCalendarItem::setItemId( const QString& aItemId )
979 qDebug( "ReqMsgGetCalendarItem::setItemId" );
981 int err = setNodeValue( QString( "Id" ), aItemId, QDomNode::AttributeNode, QString( "ItemId" ), 0 );
983 qDebug( "ReqMsgGetCalendarItem::setItemId end : err=%d", err );
989 * ResMsgGetUserAvailability class functions
991 ResMsgGetUserAvailability::ResMsgGetUserAvailability( const QByteArray& aData ) : ResponseMessage( aData )
994 qDebug( "ResMsgGetUserAvailability::ResMsgGetUserAvailability" );
995 qDebug( "ResMsgGetUserAvailability::ResMsgGetUserAvailability end" );
999 int ResMsgGetUserAvailability::getMeetingsFromResponse( QList<Meeting*>& aMeetings, const Room &aRoom )
1002 qDebug( "ResMsgGetUserAvailability::getMeetingsFromResponse" );
1007 qDebug( "ResMsgGetUserAvailability::getMeetingsFromResponse : iMessage is NULL" );
1009 return MsgErrSomeError;
1012 //TODO: Clean this function a bit (see getMeetingDetailsFromResponse)
1014 int err = MsgErrNoError;
1016 QDomNodeList list = iMessage->elementsByTagName( QString( "CalendarEvent" ) );
1018 for( int i=0; i<list.count(); i++ )
1020 QDomElement e = list.item( i ).toElement();
1021 QString tagName = ( e.prefix() == QString::null ) ? e.tagName().toLower() : e.localName().toLower();
1023 if( !e.isNull() && tagName == "calendarevent" )
1026 QString id, startsAt, endsAt, organizer, subject;
1028 for ( QDomNode subnode = e.firstChild(); !subnode.isNull(); subnode = subnode.nextSibling() )
1030 QDomElement e = subnode.toElement();
1031 QString tagName = ( e.prefix() == QString::null ) ? e.tagName().toLower() : e.localName().toLower();
1033 if( tagName == QString( "starttime" ) )
1035 startsAt = e.text();
1037 else if( tagName == QString( "endtime" ) )
1041 else if( tagName == QString( "calendareventdetails" ) )
1044 for ( QDomNode detailnode = subnode.firstChild(); !detailnode.isNull(); detailnode = detailnode.nextSibling() )
1047 QDomElement e = detailnode.toElement();
1048 QString tagName = ( e.prefix() == QString::null ) ? e.tagName().toLower() : e.localName().toLower();
1050 if( tagName == QString( "id" ) )
1055 if( tagName == QString( "subject" ) )
1063 QDateTime start = QDateTime::fromString( startsAt, Qt::ISODate );
1064 QDateTime end = QDateTime::fromString( endsAt, Qt::ISODate );
1066 aMeetings.append( new Meeting(
1076 qDebug( "ResMsgGetUserAvailability::getMeetingsFromResponse end : err=%d", err );
1082 * ResMsgGetCalendarItem class functions
1084 int ResMsgGetCalendarItem::getMeetingDetailsFromResponse( Meeting& aMeeting )
1087 qDebug( "ResMsgGetCalendarItem::getMeetingDetailsFromResponse" );
1089 if( !iMessage || hasErrors() )
1092 qDebug( "ResMsgGetCalendarItem::getMeetingDetailsFromResponse : iMessage is NULL or response has errors." );
1094 return MsgErrSomeError;
1097 QString name, address, description; //Organizer
1099 QDomNode box = getElementFromDocument( QString( "Mailbox" ), QString( "Organizer" ), 0 );
1101 if( !box.isNull() && box.hasChildNodes() )
1103 for ( QDomNode subnode = box.firstChild(); !subnode.isNull(); subnode = subnode.nextSibling() )
1105 if( matchName( subnode, QString( "Name" ) ) )
1106 name = subnode.toElement().text();
1107 else if( matchName( subnode, QString( "EmailAddress" ) ) )
1108 address = subnode.toElement().text();
1112 QDomNode body = getElementFromDocument( QString( "Body" ), QString( "CalendarItem" ), 0 );
1114 if( body.isElement() )
1115 description = body.toElement().text();
1117 aMeeting.setOrganizer( name, address );
1118 aMeeting.setDescription( description );
1121 qDebug( "ResMsgGetCalendarItem::getMeetingDetailsFromResponse end" );
1123 return MsgErrNoError;