X-Git-Url: http://Server1/repobrowser/?a=blobdiff_plain;f=source%2Fobjects%2FCalDAV%2FCalDAV-XMLProcessing.cpp;h=d216a336d29cf1b42fb2d65c081d1dc6eeb14228;hb=63dac73eaf34576dd6bfb5251307ae61ed1d94f3;hp=f84daed735c7b205b64367376b2f9cb761d7d0f0;hpb=3c82d9b1245400208b2d167683a82a39cdbc2689;p=xestiacalendar%2F.git diff --git a/source/objects/CalDAV/CalDAV-XMLProcessing.cpp b/source/objects/CalDAV/CalDAV-XMLProcessing.cpp index f84daed..d216a33 100644 --- a/source/objects/CalDAV/CalDAV-XMLProcessing.cpp +++ b/source/objects/CalDAV/CalDAV-XMLProcessing.cpp @@ -49,6 +49,12 @@ string CalDAV::ProcessXMLUserPrincipal(){ } + if (NodeFound == false){ + + return UserPrincipalURI; + + } + // Look for response. if (NodeFound == false){ return UserPrincipalURI; } else { NodeFound = false; } @@ -113,6 +119,12 @@ string CalDAV::ProcessXMLCalendarHome(){ } + if (NodeFound == false){ + + return CalendarHomeURI; + + } + // Look for response. if (NodeFound == false){ return CalendarHomeURI; } else { NodeFound = false; } @@ -182,6 +194,12 @@ CalDAVCalendarList CalDAV::ProcessXMLCalendarList(){ } + if (NodeFound == false){ + + return CalendarList; + + } + for (NodeResponse = NodeSeek->children; NodeResponse != nullptr; NodeResponse = NodeResponse->next) @@ -333,6 +351,20 @@ CalDAVCalendarList CalDAV::ProcessXMLCalendarList(){ } + // Get the calendar tag URL. + + NodeData = xmlCopyNode(NodeMatch, 1); + + string CalendarTagURL = ""; + + if (!MatchXMLNameTransverse(&NodeData, "propstat")){ continue; } + if (!MatchXMLNameTransverse(&NodeData, "prop")){ continue; } + if (MatchXMLNameTransverse(&NodeData, "sync-token")){ + + CalendarTagURL = FetchXMLData(&NodeData); + + } + // Insert the calendar information into the // list if all the information is there. @@ -342,6 +374,7 @@ CalDAVCalendarList CalDAV::ProcessXMLCalendarList(){ CalendarList.CalColour.insert(make_pair(ResponseCount, CalendarColour)); CalendarList.Order.insert(make_pair(ResponseCount, CalendarOrder)); CalendarList.Tag.insert(make_pair(ResponseCount, CalendarTag)); + CalendarList.TagURL.insert(make_pair(ResponseCount, CalendarTagURL)); ResponseCount++; @@ -384,6 +417,12 @@ string CalDAV::ProcessXMLEntryETag(){ } + if (NodeFound == false){ + + return EntryETag; + + } + // Look for response. if (NodeFound == false){ return EntryETag; } else { NodeFound = false; } @@ -425,6 +464,211 @@ string CalDAV::ProcessXMLEntryETag(){ } +CalDAVEntryList CalDAV::ProcessXMLEntryList(){ + + CalDAVEntryList EntryList; + + xmlDocPtr xmlCalDAVDoc; + xmlCalDAVDoc = xmlReadMemory(ServerData.c_str(), (int)ServerData.size(), "noname.xml", NULL, 0); + + xmlNodePtr NodeSeek = NULL; + xmlNodePtr NodeResponse = NULL; + xmlNodePtr NodeMatch = NULL; + xmlNodePtr NodeData = NULL; + bool NodeFound = false; + int ResponseCount = 0; + + // Start with the first node, look for multistatus. + + for (NodeSeek = xmlCalDAVDoc->children; + NodeSeek != NULL; + NodeSeek = NodeSeek->next) + { + + if (!xmlStrcmp(NodeSeek->name, (const xmlChar *)"multistatus") || + !xmlStrcmp(NodeSeek->name, (const xmlChar *)"d:multistatus") || + !xmlStrcmp(NodeSeek->name, (const xmlChar *)"D:multistatus") + ){ + + NodeResponse = NodeSeek->children; + NodeFound = true; + break; + + } + + } + + if (NodeFound == false){ + + return EntryList; + + } + + for (NodeResponse = NodeSeek->children; + NodeResponse != nullptr; + NodeResponse = NodeResponse->next) + { + + // Go through each of the responses and find the calendars. + + NodeMatch = xmlCopyNode(NodeResponse, 1); + + if (MatchXMLName(&NodeMatch, "response")){ + + NodeData = xmlCopyNode(NodeMatch, 1); + + // Get the HREF. + + NodeData = xmlCopyNode(NodeMatch, 1); + + if (!MatchXMLNameTransverse(&NodeData, "href")){ continue; } + + string HREFAddress = FetchXMLData(&NodeData); + + // Get the calendar data. + + NodeData = xmlCopyNode(NodeMatch, 1); + + string EntryDescription = ""; + + if (!MatchXMLNameTransverse(&NodeData, "propstat")){ continue; } + if (!MatchXMLNameTransverse(&NodeData, "prop")){ continue; } + if (MatchXMLNameTransverse(&NodeData, "calendar-data")){ + + // Note: libxml2 will strip the CDATA part at the start and + // end of each calendar-data section. + + EntryDescription = FetchXMLData(&NodeData); + + } + + // Get the entry entity tag. + + NodeData = xmlCopyNode(NodeMatch, 1); + + string EntryEntityTag = ""; + + if (!MatchXMLNameTransverse(&NodeData, "propstat")){ continue; } + if (!MatchXMLNameTransverse(&NodeData, "prop")){ continue; } + if (MatchXMLNameTransverse(&NodeData, "getetag")){ + + EntryEntityTag = FetchXMLData(&NodeData); + + } + + // Insert the calendar information into the + // list if all the information is there. + + EntryList.HREF.insert(make_pair(ResponseCount, HREFAddress)); + EntryList.Data.insert(make_pair(ResponseCount, EntryDescription)); + EntryList.Tag.insert(make_pair(ResponseCount, EntryEntityTag)); + + ResponseCount++; + + } + + } + + xmlFreeDoc(xmlCalDAVDoc); + + return EntryList; + +} + +CalDAVEntryList CalDAV::ProcessXMLSyncTokenList(){ + + CalDAVEntryList EntryList; + + xmlDocPtr xmlCalDAVDoc; + xmlCalDAVDoc = xmlReadMemory(ServerData.c_str(), (int)ServerData.size(), "noname.xml", NULL, 0); + + xmlNodePtr NodeSeek = NULL; + xmlNodePtr NodeResponse = NULL; + xmlNodePtr NodeMatch = NULL; + xmlNodePtr NodeData = NULL; + bool NodeFound = false; + int ResponseCount = 0; + + // Start with the first node, look for multistatus. + + for (NodeSeek = xmlCalDAVDoc->children; + NodeSeek != NULL; + NodeSeek = NodeSeek->next) + { + + if (!xmlStrcmp(NodeSeek->name, (const xmlChar *)"multistatus") || + !xmlStrcmp(NodeSeek->name, (const xmlChar *)"d:multistatus") || + !xmlStrcmp(NodeSeek->name, (const xmlChar *)"D:multistatus") + ){ + + NodeResponse = NodeSeek->children; + NodeFound = true; + break; + + } + + } + + if (NodeFound == false){ + + return EntryList; + + } + + for (NodeResponse = NodeSeek->children; + NodeResponse != nullptr; + NodeResponse = NodeResponse->next) + { + + // Go through each of the responses and find the calendars. + + NodeMatch = xmlCopyNode(NodeResponse, 1); + + if (MatchXMLName(&NodeMatch, "response")){ + + NodeData = xmlCopyNode(NodeMatch, 1); + + // Get the HREF. + + NodeData = xmlCopyNode(NodeMatch, 1); + + if (!MatchXMLNameTransverse(&NodeData, "href")){ continue; } + + string HREFAddress = FetchXMLData(&NodeData); + + // Get the entry entity tag. + + NodeData = xmlCopyNode(NodeMatch, 1); + + string EntryEntityTag = ""; + + if (!MatchXMLNameTransverse(&NodeData, "propstat")){ continue; } + if (!MatchXMLNameTransverse(&NodeData, "prop")){ continue; } + if (MatchXMLNameTransverse(&NodeData, "getetag")){ + + EntryEntityTag = FetchXMLData(&NodeData); + + } + + // Insert the calendar information into the + // list if all the information is there. + + EntryList.HREF.insert(make_pair(ResponseCount, HREFAddress)); + EntryList.Data.insert(make_pair(ResponseCount, "")); + EntryList.Tag.insert(make_pair(ResponseCount, EntryEntityTag)); + + ResponseCount++; + + } + + } + + xmlFreeDoc(xmlCalDAVDoc); + + return EntryList; + +} + bool CalDAV::MatchXMLNameTransverse(xmlNodePtr *NodePtr, string NodeName){ string NodeNameSmallD = "d:" + NodeName;