4 #include "MessagingUtils.h"
6 #include "Configuration.h"
9 * BaseMessage class functions
11 BaseMessage::BaseMessage()
14 qDebug( "BaseMessage::BaseMessage" );
16 iMessage = new QDomDocument();
18 qDebug( "BaseMessage::BaseMessage end" );
22 BaseMessage::~BaseMessage()
25 qDebug( "BaseMessage::~BaseMessage" );
33 qDebug( "BaseMessage::~BaseMessage end" );
37 QList<QDomNode> BaseMessage::getNodesByName( const QString& aNodeName, const QString& aParentName, QDomNode* aRootNode )
40 qDebug( "BaseMessage::getNodesByName" );
43 //TODO: Add implementation for attribute search
46 QList<QDomNode> specList;
48 list = ( aRootNode ) ? aRootNode->toElement().elementsByTagName( aNodeName ) : iMessage->elementsByTagName( aNodeName );
50 for( int i=0; i<list.count(); i++ )
52 if( aParentName != QString::null )
54 if( !list.item( i ).parentNode().isNull() && list.item( i ).parentNode().isElement() && list.item( i ).parentNode().toElement().tagName().compare( aParentName ) == 0 )
55 specList.append( list.item( i ) );
58 specList.append( list.item( i ) );
61 qDebug( "BaseMessage::getNodesByName end" );
66 QDomNode BaseMessage::getNodeFromDocument( const QString& aNodeName,
67 QDomNode::NodeType aNodeType,
68 const QString& aParentName,
73 qDebug( "BaseMessage::getNodeFromDocument" );
76 if( aNodeType == QDomNode::ElementNode )
77 node = getElementFromDocument( aNodeName, aParentName, aIndex, aRootNode );
78 else if( aNodeType == QDomNode::AttributeNode )
79 node = getAttributeFromDocument( aNodeName, aParentName, aIndex, aRootNode );
81 qDebug( "BaseMessage::getNodeFromDocument end" );
86 QDomNode BaseMessage::getAttributeFromDocument( const QString& aAttributeName,
87 const QString& aParentName,
92 qDebug( "BaseMessage::getAttributeFromDocument" );
99 root = ( !aRootNode ) ? iMessage->documentElement() : *aRootNode;
103 qDebug( "BaseMessage::getAttributeFromDocument : RootNode is NULL." );
108 if( aParentName != QString::null )
110 if( root.isElement() )
112 QDomNodeList list = root.toElement().elementsByTagName( aParentName );
113 if( list.count() > 0 ) parent = list.item( 0 );
117 QDomNamedNodeMap attrs = parent.attributes();
119 int count = attrs.count();
120 if( count==0 || aIndex >= count || !attrs.contains( aAttributeName ) ) return root;
122 QList<QDomAttr> list;
124 for( int i=0; i<count; i++ )
126 QDomAttr attr = attrs.item( i ).toAttr();
128 if( attr.name().compare( aAttributeName ) == 0 || attr.localName().compare( aAttributeName ) == 0 )
130 if( aParentName != QString::null && ( attr.ownerElement().tagName().compare( aParentName ) == 0 || attr.ownerElement().localName().compare( aParentName ) == 0 ))
140 if( list.count() > 0 )
141 node = list.at( aIndex );
144 qDebug( "BaseMessage::getAttributeFromDocument end." );
150 QDomNode BaseMessage::getElementFromDocument( const QString& aElementName,
151 const QString& aParentName,
153 QDomNode* aRootNode )
156 qDebug( "BaseMessage::getElementFromDocument" );
163 elems = iMessage->elementsByTagName( aElementName );
167 elems = aRootNode->toElement().elementsByTagName( aElementName );
170 int count = elems.count();
171 if( count == 0 || aIndex >= count )
174 qDebug( "BaseMessage::getElementFromDocument : No Elements found." );
176 return node; //no elements found
179 QList<QDomElement> list;
181 for( int i=0; i<count; i++ )
183 QDomElement elem = elems.item( i ).toElement();
184 if( elem.tagName().compare( aElementName ) == 0 || elem.localName().compare( aElementName ) == 0 )
186 if( aParentName != QString::null )
188 if( !elem.parentNode().isNull() )
190 if( elem.parentNode().toElement().tagName().compare( aParentName ) == 0 || elem.parentNode().toElement().tagName().compare( aParentName ) == 0 )
200 if( list.count() > 0 )
201 node = list.at( aIndex );
204 qDebug( "BaseMessage::getElementFromDocument end" );
209 bool BaseMessage::matchName( const QDomNode& aNode, const QString& aName )
212 qDebug( "BaseMessage::matchName" );
214 if( aNode.isElement() )
216 if( aNode.toElement().tagName().toLower().compare( aName.toLower() ) == 0
217 || aNode.localName().toLower().compare( aName.toLower() ) == 0 )
220 qDebug( "BaseMessage::matchName end" );
225 else if( aNode.isAttr() )
227 if( aNode.toAttr().name().toLower().compare( aName.toLower() ) == 0
228 || aNode.localName().toLower().compare( aName.toLower() ) == 0 )
231 qDebug( "BaseMessage::matchName end" );
237 qDebug( "BaseMessage::matchName : No match." );
242 QByteArray BaseMessage::getMessage()
245 qDebug( "BaseMessage::getMessage" );
250 msg.append( iMessage->toByteArray() );
253 qDebug( "BaseMessage::getMessage end" );
259 * RequestMessage class functions
261 RequestMessage::RequestMessage( RequestCommandId aCommandId ) : iCurrCmd( aCommandId )
264 qDebug( "RequestMessage::RequestMessage" );
266 createEnvelopeBase();
268 if( aCommandId != ReqCmdNoCommand )
270 createMessageStructure( aCommandId );
273 qDebug( "RequestMessage::RequestMessage end" );
277 RequestMessage::RequestMessage( const QString& /*aFileName*/ )
279 //createEnvelopeBase();
280 //TODO: read operation structures from a file
283 int RequestMessage::addNode( const QDomNode& aNode, QDomNode::NodeType aNodeType, const QString& aParentName, int aIndex, QDomNode* aRootNode )
286 qDebug( "RequestMessage::addNode" );
292 qDebug( "RequestMessage::addNode : iMessage is NULL." );
294 return MsgErrSomeError;
297 int err = MsgErrNoError;
299 if( aNodeType == QDomNode::ElementNode && aNode.isElement() )
301 if( aParentName == QString::null )
304 iMessage->appendChild( aNode );
306 aRootNode->appendChild( aNode );
310 QDomNodeList list = ( aRootNode ) ? aRootNode->toElement().elementsByTagName( aParentName ) : iMessage->elementsByTagName( aParentName );
312 if( list.count() == 0 || aIndex >= list.count() ) err = MsgErrSomeError;
315 QDomElement node = list.at( aIndex ).toElement();
316 node.appendChild( aNode );
320 else if( aNodeType == QDomNode::AttributeNode && aNode.isAttr() )
322 if( aParentName != QString::null )
324 QDomNodeList list = ( aRootNode ) ? aRootNode->toElement().elementsByTagName( aParentName ) : iMessage->elementsByTagName( aParentName );
326 if( list.count() == 0 || aIndex >= list.count() ) err = MsgErrSomeError;
329 QDomElement node = list.at( aIndex ).toElement();
330 node.setAttributeNode( aNode.toAttr() );
334 err = MsgErrSomeError; //Attribute must have a parent specified
337 err = MsgErrSomeError;
340 qDebug( "RequestMessage::addNode end : err=%d", err );
345 int RequestMessage::setNodeValue( const QString& aNodeName, const QString& aValue, QDomNode::NodeType aNodeType, const QString& aParentName, int aIndex, QDomNode* aRootNode )
348 qDebug( "RequestMessage::setNodeValue" );
351 QDomNode node = getNodeFromDocument( aNodeName, aNodeType, aParentName, aIndex, aRootNode );
352 if( node.isNull() || !iMessage )
355 qDebug( "RequestMessage::setNodeValue : Node is NULL or iMessage is NULL." );
357 return MsgErrSomeError;
360 int err = MsgErrNoError;
362 if( node.isElement() )
364 node.appendChild( iMessage->createTextNode( aValue ) );
366 else if( node.isAttr() )
367 node.toAttr().setValue( aValue );
369 err = MsgErrSomeError;
372 qDebug( "RequestMessage::setNodeValue end : err=%d", err );
377 int RequestMessage::createEnvelopeBase()
380 qDebug( "RequestMessage::createEnvelopeBase" );
388 iMessage = new QDomDocument();
390 int size = sizeof( reqCmdArrayEnvelopeBase ) / sizeof( MessageBodyElement );
391 int err = MsgErrNoError;
393 QDomNode base = constructArrayToNode( reqCmdArrayEnvelopeBase, size );
396 err = addNode( base );
397 else err = MsgErrSomeError;
400 qDebug( "RequestMessage::createEnvelopeBase end : err=%d", err );
405 QString RequestMessage::getContentTypeForHeader( RequestCommandId aCommandId )
408 qDebug( "RequestMessage::getContentTypeForHeader" );
410 QString contentType( QString::null );
412 RequestCommandId cmd = ( aCommandId == ReqCmdNoCommand ) ? iCurrCmd : aCommandId;
414 if( cmd != ReqCmdNoCommand )
416 QString operation( QString::null );
420 case ReqCmdGetUserAvailability : { operation = "GetUserAvailability"; } break;
421 case ReqCmdConvertId : { operation = "ConvertId"; } break;
422 case ReqCmdGetItem : { operation = "GetItem"; } break;
424 //Currently unused operations
426 /*case ReqCmdAddDelegate : { operation = "AddDelegate"; } break;
427 case ReqCmdCopyFolder : { operation = "CopyFolder"; } break;
428 case ReqCmdCopyItem : { operation = "CopyItem"; } break;
429 case ReqCmdCreateAttachment : { operation = "CreateAttachment"; } break;
430 case ReqCmdCreateFolder : { operation = "CreateFolder"; } break;
431 case ReqCmdCreateItem : { operation = "CreateItem"; } break;
432 case ReqCmdCreateManagedFolder : { operation = "CreateManagedFolder"; } break;
433 case ReqCmdDeleteAttachment : { operation = "DeleteAttachment"; } break;
434 case ReqCmdDeleteFolder : { operation = "DeleteFolder"; } break;
435 case ReqCmdDeleteItem : { operation = "DeleteItem"; } break;
436 case ReqCmdExpandDL : { operation = "ExpandDL"; } break;
437 case ReqCmdFindFolder : { operation = "FindFolder"; } break;
438 case ReqCmdFindItem : { operation = "FindItem"; } break;
439 case ReqCmdGetAttachment : { operation = "GetAttachment"; } break;
440 case ReqCmdGetDelegate : { operation = "GetDelegate"; } break;
441 case ReqCmdGetEvents : { operation = "GetEvents"; } break;
442 case ReqCmdGetFolder : { operation = "GetFolder"; } break;
443 case ReqCmdGetUserOofSettings : { operation = "GetUserOofSettings"; } break;
444 case ReqCmdMoveFolder : { operation = "MoveFolder"; } break;
445 case ReqCmdMoveItem : { operation = "MoveItem"; } break;
446 case ReqCmdRemoveDelegate : { operation = "RemoveDelegate"; } break;
447 case ReqCmdResolveNames : { operation = "ResolveNames"; } break;
448 case ReqCmdSendItem : { operation = "SendItem"; } break;
449 case ReqCmdSetUserOofSettings : { operation = "SetUserOofSettings"; } break;
450 case ReqCmdSubscribe : { operation = "Subscribe"; } break;
451 case ReqCmdSyncFolderHierarchy : { operation = "SyncFolderHierarchy"; } break;
452 case ReqCmdSyncFolderItems : { operation = "SyncFolderItems"; } break;
453 case ReqCmdUnsubscribe : { operation = "Unsubscribe"; } break;
454 case ReqCmdUpdateDelegate : { operation = "UpdateDelegate"; } break;
455 case ReqCmdUpdateFolder : { operation = "UpdateFolder"; } break;
456 case ReqCmdUpdateItem : { operation = "UpdateItem"; } break;*/
460 if( operation != QString::null )
462 QString content( "text/xml; " );
463 QString charset( "utf-8; " );
464 contentType = QString( content + "charset=" + charset + "action=\"" + ACTION_URL + operation + "\"" );
468 qDebug( "RequestMessage::getContentTypeForHeader end : contentType=%s", contentType.toStdString().data() );
473 int RequestMessage::createMessageStructure()
475 return createMessageStructure( iCurrCmd );
478 int RequestMessage::createMessageStructure( RequestCommandId aCommandId )
481 qDebug( "RequestMessage::createMessageStructure" );
486 qDebug( "RequestMessage::createMessageStructure : iMessage is NULL" );
488 return MsgErrSomeError;
491 //Should always be soap:Envelope or first element in envelopebase array
492 QDomNode last = iMessage->documentElement();
494 if( !matchName( last, reqCmdArrayEnvelopeBase[0].iElementName ) )
497 qDebug( "RequestMessage::createMessageStructure : Document element is not valid SOAP envelope" );
499 return MsgErrSomeError;
503 int err = MsgErrNoError;
507 case ReqCmdGetUserAvailability : { cmd = constructArrayToNode( reqCmdArrayGetUserAvailability, sizeof( reqCmdArrayGetUserAvailability ) / sizeof( MessageBodyElement ) ); } break;
508 case ReqCmdConvertId : { cmd = constructArrayToNode( reqCmdArrayConvertId, sizeof( reqCmdArrayConvertId ) / sizeof( MessageBodyElement ) ); } break;
509 case ReqCmdGetItem : { cmd = constructArrayToNode( reqCmdArrayGetCalendarItem, sizeof( reqCmdArrayGetCalendarItem ) / sizeof( MessageBodyElement ) ); } break;
513 if( cmd.isNull() ) err = MsgErrSomeError;
515 err = addNode( cmd, QDomNode::ElementNode, reqCmdArrayEnvelopeBase[0].iElementName );
518 qDebug( "RequestMessage::createMessageStructure end : err=%d", err );
523 QDomNode RequestMessage::constructArrayToNode( const MessageBodyElement* aArray, int aSize )
526 qDebug( "RequestMessage::constructArrayToNode" );
528 QDomElement target; //final node to be returned
530 if( !iMessage || aSize == 0 )
533 qDebug( "RequestMessage::constructArrayToNode : iMessage is NULL or aSize is 0." );
538 QDomElement last; // last appended node
540 int currentLvl = 0; //current traversal level
544 MessageBodyElement root = aArray[idx];
545 if( root.iNodeType != QDomNode::ElementNode || root.iTraversalLevel > 0 )
548 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
550 return target; //Root must be an element and on level 0
554 if( root.iNamespace != QString::null )
556 //QString prefix = root.iNamespace
557 target = iMessage->createElementNS( root.iNamespace, root.iElementName );
561 target = iMessage->createElement( root.iElementName );
567 for( int i=idx; i<aSize; i++ )
569 MessageBodyElement element = aArray[i];
571 if( element.iNodeType == QDomNode::ElementNode )
573 //Node is an element node
575 if( element.iNamespace != QString::null )
577 elem = iMessage->createElementNS( element.iNamespace, element.iElementName );
581 elem = iMessage->createElement( element.iElementName );
583 if( element.iTraversalLevel == currentLvl )
585 if( currentLvl == 0 )
588 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
590 return target; //Only root can be at traversal level 0
594 //Sibling to previous
595 if( !last.parentNode().isNull() )
596 last.parentNode().appendChild( elem );
600 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
602 return target; //malformed. if last has no parent, it's a rootnode
606 else if( element.iTraversalLevel > currentLvl )
608 //check if node is child to previous
609 //else there is something wrong in array representing the structure
610 if( element.iTraversalLevel == currentLvl+1 )
612 last.appendChild( elem );
617 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
622 else if( element.iTraversalLevel < currentLvl )
625 //Node is on more shallow level than previous
626 //let's get it's parent
627 int diff = currentLvl - element.iTraversalLevel;
629 for( int j=0; j<diff; j++ )
631 QDomNode temp = last.parentNode();
632 last = temp.toElement();
634 last.parentNode().appendChild( elem );
639 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
641 //some undefined error
647 else if( element.iNodeType == QDomNode::AttributeNode )
649 //Node is an attribute node
652 if( element.iNamespace != QString::null )
653 attr = iMessage->createAttributeNS( element.iNamespace, element.iElementName );
655 attr = iMessage->createAttribute( element.iElementName );
657 if( element.iTraversalLevel == currentLvl )
659 last.setAttributeNode( attr );
664 qDebug( "RequestMessage::constructArrayToNode : Malformed message definition. Check array for faults." );
666 //error in template array.
667 //attributes for element must be specified right after element
668 //and must have same traversalId
675 qDebug( "RequestMessage::constructArrayToNode : Node type not supported." );
677 //node type not supported
681 currentLvl = element.iTraversalLevel;
684 qDebug( "RequestMessage::constructArrayToNode : end" );
690 * ResponseMessage class functions
692 ResponseMessage::ResponseMessage()
695 qDebug( "ResponseMessage::ResponseMessage" );
697 iMessage = new QDomDocument();
699 qDebug( "ResponseMessage::ResponseMessage end" );
703 ResponseMessage::ResponseMessage( const QByteArray& aData )
706 qDebug( "ResponseMessage::ResponseMessage" );
708 iMessage->setContent( aData, true );
710 qDebug( "ResponseMessage::ResponseMessage end" );
714 QString ResponseMessage::getNodeValue( const QString& aNodeName, QDomNode::NodeType aNodeType, const QString& aParentName, int aIndex, QDomNode* aRootNode )
717 qDebug( "ResponseMessage::getNodeValue" );
719 QString value = QString::null;
720 QDomNode node = getNodeFromDocument( aNodeName, aNodeType, aParentName, aIndex, aRootNode );
723 if( node.isElement() )
724 value = node.toElement().text();
725 else if( node.isAttr() )
726 value = node.toAttr().value();
729 qDebug( "ResponseMessage::getNodeValue end" );
734 bool ResponseMessage::hasErrors()
737 qDebug( "ResponseMessage::hasErrors" );
742 qDebug( "ResponseMessage::hasErrors : iMessage is NULL." );
747 QDomElement root = iMessage->documentElement();
750 QString rootname = ( root.prefix() == QString::null ) ? root.tagName() : root.localName();
751 err = ( rootname.compare( QString( "Envelope" ) ) == 0 ) ? false : true;
753 QDomNodeList list = iMessage->elementsByTagName( QString( "m:ResponseCode" ) );
754 for( int i=0; i<list.count(); i++ )
756 if( list.item(i).nodeValue().compare( "NoError" ) != 0 )
762 qDebug( "ResponseMessage::hasErrors end : err=%d", err );
768 * ReqMsgGetUserAvailability class functions
771 ReqMsgGetUserAvailability::ReqMsgGetUserAvailability() : RequestMessage( ReqCmdGetUserAvailability )
774 qDebug( "ReqMsgGetUserAvailability::ReqMsgGetUserAvailability" );
776 if( iMessage && iCurrCmd == ReqCmdGetUserAvailability )
778 setNodeValue( QString( "MergedFreeBusyIntervalInMinutes" ), QString::number( 60 ) );
779 setNodeValue( QString( "RequestedView" ), QString( "DetailedMerged" ) );
782 qDebug( "ReqMsgGetUserAvailability::ReqMsgGetUserAvailability end" );
786 int ReqMsgGetUserAvailability::addUser( const QString& aAddress, const QString& /*aAttendeeType*/, const QString& aExcludeConflicts )
789 qDebug( "ReqMsgGetUserAvailability::addUser" );
791 if( !iMessage || iCurrCmd != ReqCmdGetUserAvailability )
794 qDebug( "ReqMsgGetUserAvailability::addUser : iMessage is NULL or current command id is wrong" );
796 return MsgErrSomeError;
799 int err = MsgErrNoError;
800 int size = sizeof( reqCmdMailboxElement ) / sizeof( MessageBodyElement );
802 //Create mailbox data element
803 QDomNode mailbox = constructArrayToNode( reqCmdMailboxElement, size );
804 if( !mailbox.isNull() )
808 if( mailbox.hasChildNodes() )
810 for ( QDomNode subnode = mailbox.firstChild(); !subnode.isNull(); subnode = subnode.nextSibling() )
812 qDebug( "subnode: %s", subnode.toElement().tagName().toStdString().data() );
813 if( matchName( subnode, QString( "Email" ) ) )
820 setNodeValue( QString( "Address" ), aAddress, QDomNode::ElementNode, QString( "Email" ), 0, &email );
821 setNodeValue( QString( "AttendeeType" ), QString( "Required" ), QDomNode::ElementNode, QString( "MailboxData" ), 0, &mailbox );
822 setNodeValue( QString( "ExcludeConflicts" ), aExcludeConflicts, QDomNode::ElementNode, QString( "MailboxData" ), 0, &mailbox );
824 err = addNode( mailbox, QDomNode::ElementNode, QString( "MailboxDataArray" ) );
827 err = MsgErrSomeError;
830 qDebug( "ReqMsgGetUserAvailability::addUser end : err=%d", err );
835 int ReqMsgGetUserAvailability::setTimeWindow( const QDateTime& aStart, const QDateTime& aEnd )
838 qDebug( "ReqMsgGetUserAvailability::setTimeWindow" );
840 if( !iMessage || iCurrCmd != ReqCmdGetUserAvailability )
843 qDebug( "ReqMsgGetUserAvailability::setTimeWindow : iMessage is NULL or command id is wrong" );
845 return MsgErrSomeError;
848 int err = MsgErrNoError;
850 err = setNodeValue( QString( "StartTime" ), aStart.toString( Qt::ISODate ) );
851 err = setNodeValue( QString( "EndTime" ), aEnd.toString( Qt::ISODate ) );
854 qDebug( "ReqMsgGetUserAvailability::setTimeWindow end : err=%d", err );
859 int ReqMsgGetUserAvailability::setTimeZone()
862 qDebug( "ReqMsgGetUserAvailability::setTimeZone" );
864 if( !iMessage || iCurrCmd != ReqCmdGetUserAvailability )
867 qDebug( "ReqMsgGetUserAvailability::setTimeZone : iMessage is NULL or command id is wrong" );
869 return MsgErrSomeError;
871 int err = MsgErrNoError;
873 //QDateTime now = QDateTime::currentDateTime();
874 //int offsetMinutes = (now.toTime_t() - QDateTime(now.toUTC().date(), QTime(now.toUTC().time().hour(), now.toUTC().time().minute())).toTime_t()) / 60;
880 localTime = localtime(&rawtime);
882 int offsetMinutes = localTime->tm_gmtoff / 60;
883 if (localTime->tm_isdst)
884 offsetMinutes -= 60; // If DST is in use then reduce an hour from offset, because
885 // DST will be added to the offset later and it already includes
886 // DST. TODO: This is silly and must be changed if possible.
887 // If you can get UTC offset without DST, use it here.
890 qDebug( "ReqMsgGetUserAvailability::setTimeZone - offset in minutes=%d", offsetMinutes );
893 //TODO: timezone and daylight times to application configuration
894 setNodeValue( QString( "Bias" ), QString::number( -offsetMinutes ), QDomNode::ElementNode, QString( "TimeZone" ) );
895 setNodeValue( QString( "Bias" ), QString::number( 0 ), QDomNode::ElementNode, QString( "StandardTime" ) );
896 setNodeValue( QString( "Time" ), QString( "03:00:00" ), QDomNode::ElementNode, QString( "StandardTime" ) );
897 setNodeValue( QString( "DayOrder" ), QString::number( 5 ), QDomNode::ElementNode, QString( "StandardTime" ) );
898 setNodeValue( QString( "Month" ), QString::number( 10 ), QDomNode::ElementNode, QString( "StandardTime" ) );
899 setNodeValue( QString( "DayOfWeek" ), QString( "Sunday" ), QDomNode::ElementNode, QString( "StandardTime" ) );
900 setNodeValue( QString( "Bias" ), QString::number( -60 ), QDomNode::ElementNode, QString( "DaylightTime" ) );
901 setNodeValue( QString( "Time" ), QString( "03:00:00" ), QDomNode::ElementNode, QString( "DaylightTime" ) );
902 setNodeValue( QString( "DayOrder" ), QString::number( 1 ), QDomNode::ElementNode, QString( "DaylightTime" ) );
903 setNodeValue( QString( "Month" ), QString::number( 4 ), QDomNode::ElementNode, QString( "DaylightTime" ) );
904 setNodeValue( QString( "DayOfWeek" ), QString( "Sunday" ), QDomNode::ElementNode, QString( "DaylightTime" ) );
907 qDebug( "ReqMsgGetUserAvailability::setTimeZone end : err=%d", err );
913 * ReqMsgConvertMeetingId class functions
915 ReqMsgConvertMeetingId::ReqMsgConvertMeetingId( const QString& aItemId, const QString& aMailbox )
918 qDebug( "ReqMsgConvertMeetingId::ReqMsgConvertMeetingId" );
920 //For this class, we're not going to provide id for base class as parameter,
921 //because before content structure initialization, we must add SOAP header to envelope
922 iCurrCmd = ReqCmdConvertId;
924 QDomNode header = constructArrayToNode( reqCmdArrayConvertIdHeader, sizeof( reqCmdArrayConvertIdHeader ) / sizeof( MessageBodyElement ) );
926 if( !header.isNull() )
928 int err = addNode( header, QDomNode::ElementNode, reqCmdArrayEnvelopeBase[0].iElementName );
930 if( err == MsgErrNoError )
932 createMessageStructure( ReqCmdConvertId );
934 if( aItemId != QString::null ) setItemId( aItemId );
935 if( aMailbox != QString::null ) setMailbox( aMailbox );
937 setNodeValue( QString( "Version" ), QString( "Exchange2007_SP1" ), QDomNode::AttributeNode, QString( "RequestServerVersion" ) );
938 setNodeValue( QString( "DestinationFormat" ), QString( "EwsLegacyId" ), QDomNode::AttributeNode, QString( "ConvertId" ) );
939 setNodeValue( QString( "Format" ), QString( "HexEntryId" ), QDomNode::AttributeNode, QString( "AlternateId" ) );
942 //setNodeValue( QString( "xmlns:t" ), NS_T, QDomNode::AttributeNode, QString( "ConvertId" ) );
944 //Must be added (for now at least) like this, because Envelope is initialized already, without attributes
945 /*QDomAttr attr = iMessage->createAttribute( QString( "xmlns:t" ) );
946 attr.setValue( NS_T );
947 addNode( attr, QDomNode::AttributeNode, QString( "Envelope" ) );
950 qDebug( "ReqMsgConvertMeetingId::ReqMsgConvertMeetingId end" );
954 int ReqMsgConvertMeetingId::setItemId( const QString& aItemId )
957 qDebug( "ReqMsgConvertMeetingId::setItemId" );
959 int err = setNodeValue( QString( "Id" ), aItemId, QDomNode::AttributeNode, QString( "AlternateId" ) );
961 qDebug( "ReqMsgConvertMeetingId::setItemId end : err=%d", err );
966 int ReqMsgConvertMeetingId::setMailbox( const QString& aMailbox )
969 qDebug( "ReqMsgConvertMeetingId::setMailbox" );
971 int err = setNodeValue( QString( "Mailbox" ), aMailbox, QDomNode::AttributeNode, QString( "AlternateId" ) );
973 qDebug( "ReqMsgConvertMeetingId::setMailbox end : err=%d", err );
979 * ReqMsgGetCalendarItem class functions
981 ReqMsgGetCalendarItem::ReqMsgGetCalendarItem( const QString& aItemId ) : RequestMessage( ReqCmdGetItem )
984 qDebug( "ReqMsgGetCalendarItem::ReqMsgGetCalendarItem" );
986 if( iMessage && iCurrCmd == ReqCmdGetItem )
988 setNodeValue( QString( "BaseShape" ), QString( "AllProperties" ) );
990 if( aItemId != QString::null )
991 setItemId( aItemId );
994 qDebug( "ReqMsgGetCalendarItem::ReqMsgGetCalendarItem end" );
998 int ReqMsgGetCalendarItem::setItemId( const QString& aItemId )
1001 qDebug( "ReqMsgGetCalendarItem::setItemId" );
1003 int err = setNodeValue( QString( "Id" ), aItemId, QDomNode::AttributeNode, QString( "ItemId" ), 0 );
1005 qDebug( "ReqMsgGetCalendarItem::setItemId end : err=%d", err );
1011 * ResMsgGetUserAvailability class functions
1013 ResMsgGetUserAvailability::ResMsgGetUserAvailability( const QByteArray& aData ) : ResponseMessage( aData )
1016 qDebug( "ResMsgGetUserAvailability::ResMsgGetUserAvailability" );
1017 qDebug( "ResMsgGetUserAvailability::ResMsgGetUserAvailability end" );
1021 int ResMsgGetUserAvailability::getMeetingsFromResponse( QList<Meeting*>& aMeetings, const Room &aRoom )
1024 qDebug( "ResMsgGetUserAvailability::getMeetingsFromResponse" );
1029 qDebug( "ResMsgGetUserAvailability::getMeetingsFromResponse : iMessage is NULL" );
1031 return MsgErrSomeError;
1034 //TODO: Clean this function a bit (see getMeetingDetailsFromResponse)
1036 int err = MsgErrNoError;
1038 QDomNodeList list = iMessage->elementsByTagName( QString( "CalendarEvent" ) );
1040 for( int i=0; i<list.count(); i++ )
1042 QDomElement e = list.item( i ).toElement();
1043 QString tagName = ( e.prefix() == QString::null ) ? e.tagName().toLower() : e.localName().toLower();
1045 if( !e.isNull() && tagName == "calendarevent" )
1048 QString id, startsAt, endsAt, organizer, subject;
1050 for ( QDomNode subnode = e.firstChild(); !subnode.isNull(); subnode = subnode.nextSibling() )
1052 QDomElement e = subnode.toElement();
1053 QString tagName = ( e.prefix() == QString::null ) ? e.tagName().toLower() : e.localName().toLower();
1055 if( tagName == QString( "starttime" ) )
1057 startsAt = e.text();
1059 else if( tagName == QString( "endtime" ) )
1063 else if( tagName == QString( "calendareventdetails" ) )
1066 for ( QDomNode detailnode = subnode.firstChild(); !detailnode.isNull(); detailnode = detailnode.nextSibling() )
1069 QDomElement e = detailnode.toElement();
1070 QString tagName = ( e.prefix() == QString::null ) ? e.tagName().toLower() : e.localName().toLower();
1072 if( tagName == QString( "id" ) )
1077 if( tagName == QString( "subject" ) )
1085 QDateTime start = QDateTime::fromString( startsAt, Qt::ISODate );
1086 QDateTime end = QDateTime::fromString( endsAt, Qt::ISODate );
1088 aMeetings.append( new Meeting(
1098 qDebug( "ResMsgGetUserAvailability::getMeetingsFromResponse end : err=%d", err );
1104 * ResMsgGetCalendarItem class functions
1106 int ResMsgGetCalendarItem::getMeetingDetailsFromResponse( Meeting& aMeeting )
1109 qDebug( "ResMsgGetCalendarItem::getMeetingDetailsFromResponse" );
1111 if( !iMessage || hasErrors() )
1114 qDebug( "ResMsgGetCalendarItem::getMeetingDetailsFromResponse : iMessage is NULL or response has errors." );
1116 return MsgErrSomeError;
1119 QString name, address, description; //Organizer
1121 QDomNode box = getElementFromDocument( QString( "Mailbox" ), QString( "Organizer" ), 0 );
1123 if( !box.isNull() && box.hasChildNodes() )
1125 for ( QDomNode subnode = box.firstChild(); !subnode.isNull(); subnode = subnode.nextSibling() )
1127 if( matchName( subnode, QString( "Name" ) ) )
1128 name = subnode.toElement().text();
1129 else if( matchName( subnode, QString( "EmailAddress" ) ) )
1130 address = subnode.toElement().text();
1134 QDomNode body = getElementFromDocument( QString( "Body" ), QString( "CalendarItem" ), 0 );
1136 if( body.isElement() )
1137 description = body.toElement().text();
1139 aMeeting.setOrganizer( name, address );
1140 aMeeting.setDescription( description );
1143 qDebug( "ResMsgGetCalendarItem::getMeetingDetailsFromResponse end" );
1145 return MsgErrNoError;