static ZRef<ZTBQueryNode> sNodeFromTuple(const ZTuple& iTuple) { string nodeKind = iTuple.GetString("Kind"); if (false) {} else if (nodeKind == "All") { return new ZTBQueryNode_All; } else if (nodeKind == "Combo") { vector<ZTBQuery::SortSpec> theSort; const vector<ZTupleValue>& vectorSort = iTuple.GetVector("Sort"); for (vector<ZTupleValue>::const_iterator i = vectorSort.begin(); i != vectorSort.end(); ++i) { const ZTuple& temp = (*i).GetTuple(); theSort.push_back(ZTBQuery::SortSpec( temp.GetString("PropName"), temp.GetBool("Ascending"), temp.GetInt32("Strength"))); } const vector<ZTupleValue>& sourceSect = iTuple.GetVector("Intersections"); vector<ZTBQueryNode_Combo::Intersection> theIntersections; for (vector<ZTupleValue>::const_iterator i = sourceSect.begin(); i != sourceSect.end(); ++i) theIntersections.push_back(ZTBQueryNode_Combo::Intersection((*i).GetTuple())); return new ZTBQueryNode_Combo(theSort, theIntersections); } else if (nodeKind == "Difference") { ZRef<ZTBQueryNode> leftNode = sNodeFromTuple(iTuple.GetTuple("LeftNode")); ZRef<ZTBQueryNode> rightNode = sNodeFromTuple(iTuple.GetTuple("RightNode")); return new ZTBQueryNode_Difference(leftNode, rightNode); } else if (nodeKind == "First") { string propName = iTuple.GetString("PropName"); ZRef<ZTBQueryNode> sourceNode = sNodeFromTuple(iTuple.GetTuple("SourceNode")); return new ZTBQueryNode_First(propName, sourceNode); } else if (nodeKind == "ID_Constant") { vector<uint64> theIDs; iTuple.GetVector_T("IDs", back_inserter(theIDs), uint64()); return new ZTBQueryNode_ID_Constant(theIDs, true); } else if (nodeKind == "ID_FromSource") { ZRef<ZTBQueryNode> sourceNode = sNodeFromTuple(iTuple.GetTuple("SourceNode")); string sourcePropName = iTuple.GetString("SourcePropName"); return new ZTBQueryNode_ID_FromSource(sourceNode, sourcePropName); } else if (nodeKind == "Property") { string propName = iTuple.GetString("PropName"); ZRef<ZTBQueryNode> sourceNode = sNodeFromTuple(iTuple.GetTuple("SourceNode")); return new ZTBQueryNode_Property(propName, sourceNode); } throw runtime_error(string("ZTBQuery, sNodeFromTuple, unknown nodeKind: " + nodeKind)); }
bool ZWebDAV::sHandle_PROPFIND(const ZTrail& iPrefix, ZNode iRoot, const ZStreamR& iStreamR, const ZStreamW& iStreamW, const ZTuple& iHeader, const ZTrail& iTrail, const ZTuple& iParam) { int depth = sGetDepth(iHeader); ZRef<ZStrimmerR> theStrimmerR = sMakeStrimmer(iHeader, iStreamR); const ZStrimR& theStrimR = theStrimmerR->GetStrimR(); ZHTTP::Response r; r.Set("Date", sAsString_WebDAV(ZTime::sNow())); ZNode theNode = iRoot.Trail(iTrail); if (!theNode.Exists()) { theStrimR.SkipAll(); r.Set("Content-Length", 0); r.SetResult(404); r.Send(iStreamW); } else { ZTuple t = sReadTuple(theStrimR); ZTuple results; if (t.Empty() || t.Has("D:allprop")) { sHandle_PROPFIND_All(iPrefix, iRoot, theNode, depth, results); } else { ZTuple propT = t.GetTuple("D:prop"); vector<string> thePropNames; for (ZTuple::const_iterator i = propT.begin(); i != propT.end(); ++i) thePropNames.push_back(propT.NameOf(i)); sHandle_PROPFIND_Some(iPrefix, iRoot, theNode, depth, thePropNames, results); } if (const ZLog::S& s = ZLog::S(ZLog::eDebug, "ZWebDAV")) { s << "PropFind Request:" << t << "\n"; s << "PropFind Results:" << results << "\n"; } r.SetResult(207, "Multi-Status"); r.Set("Content-Type", "text/xml; charset=\"utf-8\""); r.Set("Transfer-Encoding", "chunked"); r.Send(iStreamW); ZHTTP::StreamW_Chunked chunkedStream(iStreamW); ZStrimW_StreamUTF8 theStrimW(chunkedStream); ZStrimW_ML s(false, theStrimW); s.PI("xml"); s.Attr("version", "1.0"); s.Attr("encoding", "utf-8"); s.Begin("D:multistatus"); s.Attr("xmlns:D", "DAV:"); sWriteAsXML(s, results); s.End("D:multistatus"); } return true; }
ZTBQueryNode_Combo::Intersection::Intersection(const ZTuple& iTuple) { fFilter = ZTBSpec(iTuple.GetTuple("Filter")); const vector<ZTupleValue>& nodes = iTuple.GetVector("Nodes"); for (vector<ZTupleValue>::const_iterator i = nodes.begin(); i != nodes.end(); ++i) { if (ZRef<ZTBQueryNode> aNode = sNodeFromTuple((*i).GetTuple())) fNodes.push_back(aNode); } }