Esempio n. 1
0
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));
	}
Esempio n. 2
0
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;
	}
Esempio n. 3
0
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);
		}
	}