Exemple #1
0
void XPathValidator::parseDTD()
{
    QString dtdPath = (d_corpusReader && d_corpusReader->type() == "tueba_tree") ?
      ":/dtd/tueba_tree.dtd" : ":/dtd/alpino_ds.dtd"; // XXX - hardcode?
    QFile dtdFile(dtdPath);

    if (!dtdFile.open(QFile::ReadOnly)) {
        qWarning() << "StatisticsWindow::readNodeAttributes(): Could not read DTD.";
        return;
    }
    QByteArray dtdData(dtdFile.readAll());

    d_dtd = QSharedPointer<SimpleDTD>(new SimpleDTD(dtdData.constData()));
}
HRESULT STDMETHODCALLTYPE W32EntityResolver::resolveEntity(const wchar_t *pwchPublicId,
		const wchar_t *pwchSystemId, VARIANT *pvarInput) {

	if (FBREADER_PUBLIC_ID.compare(pwchPublicId) != 0) {
		return S_OK;
	}

	if (FBREADER_SYSTEM_PREFIX.compare(0, FBREADER_SYSTEM_PREFIX.length(),
			pwchSystemId, FBREADER_SYSTEM_PREFIX.length()) != 0) {
		return S_OK;
	}

	char *buffer = 0;
	unsigned size = 0;
	int len = MSXMLUtil::decodeWideChars(pwchSystemId + FBREADER_SYSTEM_PREFIX.length(), -1, &buffer, &size);
	if (len < 0) {
		if (buffer != 0) {
			delete[] buffer;
		}
		return E_FAIL;
	}
	std::string pattern(buffer, len);
	delete[] buffer;
	buffer = 0;

	if (ZLibrary::FileNameDelimiter.compare("/") != 0) {
		size_t index = 0;
		while ((index = pattern.find("/", index)) != -1) {
			pattern.replace(index, 1, ZLibrary::FileNameDelimiter);
		}
	}

	const std::vector<std::string> &dtds = myReader.externalDTDs();
	for (std::vector<std::string>::const_iterator it = dtds.begin(); it != dtds.end(); ++it) {
		const std::string &fileName = *it;
		if (fileName.find(pattern, 0) == -1) {
			continue;
		}
		ZLFile dtdFile(fileName);
		shared_ptr<ZLInputStream> entityStream = dtdFile.inputStream();
		if (!entityStream.isNull() && entityStream->open()) {
			VariantInit(pvarInput);
			V_VT(pvarInput) = VT_UNKNOWN;
			V_UNKNOWN(pvarInput) = new W32SynchronousStream(entityStream, true);
			return S_OK;
		}
	}
	return E_FAIL;
}
static void parseDTD(XML_Parser parser, const std::string &fileName) {
	XML_Parser entityParser = XML_ExternalEntityParserCreate(parser, 0, 0);
	ZLFile dtdFile(fileName);
	shared_ptr<ZLInputStream> entityStream = dtdFile.inputStream();
	if (!entityStream.isNull() && entityStream->open()) {
		char buffer[BUFSIZE];
		size_t length;
		do {
			length = entityStream->read(buffer, BUFSIZE);
			if (XML_Parse(entityParser, buffer, length, 0) == XML_STATUS_ERROR) {
				break;
			}
		} while (length == BUFSIZE);
	}
	XML_ParserFree(entityParser);
}