コード例 #1
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;
	}
コード例 #2
0
static void sWriteAsXML(ZStrimW_ML& s, const ZTuple& iTuple)
	{
	for (ZTuple::const_iterator i = iTuple.begin(); i != iTuple.end(); ++i)
		sWriteAsXML(s, iTuple.NameOf(i), iTuple.GetValue(i));
	}
コード例 #3
0
static void sToStrim_Tuple(const ZStrimW& s, const ZTuple& iTuple,
                           size_t iLevel, const ZUtil_Tuple::Options& iOptions, bool iMayNeedInitialLF)
{
    if (iTuple.Empty())
    {
        // We've got an empty tuple.
        s.Write("{}");
        return;
    }

    const ZTuple::const_iterator theBegin = iTuple.begin();
    const ZTuple::const_iterator theEnd = iTuple.end();
    bool needsIndentation = false;
    if (iOptions.DoIndentation())
    {
        for (ZTuple::const_iterator i = theBegin; i != theEnd; ++i)
        {
            if (sIsComplex(iOptions, iTuple.GetValue(i)))
            {
                needsIndentation = true;
                break;
            }
        }
    }

    if (needsIndentation)
    {
        if (iMayNeedInitialLF)
        {
            // We're going to be indenting, but need to start
            // a fresh line to have our { and contents line up.
            sWriteLFIndent(s, iLevel, iOptions);
        }
        s.Write("{");
        for (ZTuple::const_iterator i = theBegin; i != theEnd; ++i)
        {
            sWriteLFIndent(s, iLevel, iOptions);

            ZUtil_Tuple::sWrite_PropName(s, iTuple.NameOf(i));

            s << " = ";

            sToStrim_TupleValue(s, iTuple.GetValue(i), iLevel + 1, iOptions, true);
            s.Write(";");
        }

        sWriteLFIndent(s, iLevel, iOptions);

        s.Write("}");
    }
    else
    {
        s.Write("{");
        for (ZTuple::const_iterator i = theBegin; i != theEnd; ++i)
        {
            s.Write(" ");

            ZUtil_Tuple::sWrite_PropName(s, iTuple.NameOf(i));

            s << " = ";

            sToStrim_TupleValue(s, iTuple.GetValue(i), iLevel + 1, iOptions, true);
            s.Write(";");
        }

        s.Write(" }");
    }
}