Arquivos
hhvm/hphp/runtime/ext/ext_xmlwriter.cpp
T
Sara Golemon 6ec64e8bf9 make #includes consistent
I was learning from @jdelong and he said that you should use
double quotes for local includes and angle brackets for library
includes. I asked why our code was the way it was, and he said he wanted
to clean it up. I beat him to it :)

Conflicts:

	hphp/runtime/base/server/admin_request_handler.cpp
	hphp/runtime/vm/named_entity.h
2013-05-15 13:05:06 -07:00

767 linhas
22 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010- Facebook, Inc. (http://www.facebook.com) |
| Copyright (c) 1997-2010 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#include "hphp/runtime/ext/ext_xmlwriter.h"
#include "hphp/system/lib/systemlib.h"
namespace HPHP {
IMPLEMENT_DEFAULT_EXTENSION(xmlwriter);
///////////////////////////////////////////////////////////////////////////////
// functions are just wrappers of object methods
Variant f_xmlwriter_open_memory() {
c_XMLWriter *x = NEWOBJ(c_XMLWriter)();
Object ret(x);
if (x->t_openmemory()) {
return ret;
}
return false;
}
Object f_xmlwriter_open_uri(CStrRef uri) {
c_XMLWriter *x = NEWOBJ(c_XMLWriter)();
Object ret(x);
if (x->t_openuri(uri)) {
return ret;
}
return NULL;
}
bool f_xmlwriter_set_indent_string(CObjRef xmlwriter, CStrRef indentstring) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_setindentstring(indentstring);
}
bool f_xmlwriter_set_indent(CObjRef xmlwriter, bool indent) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_setindent(indent);
}
bool f_xmlwriter_start_document(CObjRef xmlwriter,
CStrRef version /* = "1.0" */,
CStrRef encoding /* = null_string */,
CStrRef standalone /* = null_string */) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startdocument(version, encoding, standalone);
}
bool f_xmlwriter_start_element(CObjRef xmlwriter, CStrRef name) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startelement(name);
}
bool f_xmlwriter_start_element_ns(CObjRef xmlwriter, CStrRef prefix,
CStrRef name, CStrRef uri) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startelementns(prefix, name, uri);
}
bool f_xmlwriter_write_element_ns(CObjRef xmlwriter, CStrRef prefix,
CStrRef name, CStrRef uri,
CStrRef content /* = null_string */) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writeelementns(prefix, name, uri, content);
}
bool f_xmlwriter_write_element(CObjRef xmlwriter, CStrRef name,
CStrRef content /* = null_string */) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writeelement(name, content);
}
bool f_xmlwriter_end_element(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_endelement();
}
bool f_xmlwriter_full_end_element(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_fullendelement();
}
bool f_xmlwriter_start_attribute_ns(CObjRef xmlwriter, CStrRef prefix,
CStrRef name, CStrRef uri) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startattributens(prefix, name, uri);
}
bool f_xmlwriter_start_attribute(CObjRef xmlwriter, CStrRef name) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startattribute(name);
}
bool f_xmlwriter_write_attribute_ns(CObjRef xmlwriter, CStrRef prefix,
CStrRef name, CStrRef uri,
CStrRef content) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writeattributens(prefix, name, uri, content);
}
bool f_xmlwriter_write_attribute(CObjRef xmlwriter, CStrRef name,
CStrRef value) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writeattribute(name, value);
}
bool f_xmlwriter_end_attribute(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_endattribute();
}
bool f_xmlwriter_start_cdata(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startcdata();
}
bool f_xmlwriter_write_cdata(CObjRef xmlwriter, CStrRef content) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writecdata(content);
}
bool f_xmlwriter_end_cdata(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_endcdata();
}
bool f_xmlwriter_start_comment(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startcomment();
}
bool f_xmlwriter_write_comment(CObjRef xmlwriter, CStrRef content) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writecomment(content);
}
bool f_xmlwriter_end_comment(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_endcomment();
}
bool f_xmlwriter_end_document(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_enddocument();
}
bool f_xmlwriter_start_pi(CObjRef xmlwriter, CStrRef target) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startpi(target);
}
bool f_xmlwriter_write_pi(CObjRef xmlwriter, CStrRef target, CStrRef content) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writepi(target, content);
}
bool f_xmlwriter_end_pi(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_endpi();
}
bool f_xmlwriter_text(CObjRef xmlwriter, CStrRef content) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_text(content);
}
bool f_xmlwriter_write_raw(CObjRef xmlwriter, CStrRef content) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writeraw(content);
}
bool f_xmlwriter_start_dtd(CObjRef xmlwriter, CStrRef qualifiedname,
CStrRef publicid /* = null_string */,
CStrRef systemid /* = null_string */) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startdtd(qualifiedname, publicid, systemid);
}
bool f_xmlwriter_write_dtd(CObjRef xmlwriter, CStrRef name,
CStrRef publicid /* = null_string */,
CStrRef systemid /* = null_string */,
CStrRef subset /* = null_string */) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writedtd(name, publicid, systemid, subset);
}
bool f_xmlwriter_start_dtd_element(CObjRef xmlwriter, CStrRef qualifiedname) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startdtdelement(qualifiedname);
}
bool f_xmlwriter_write_dtd_element(CObjRef xmlwriter, CStrRef name,
CStrRef content) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writedtdelement(name, content);
}
bool f_xmlwriter_end_dtd_element(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_enddtdelement();
}
bool f_xmlwriter_start_dtd_attlist(CObjRef xmlwriter, CStrRef name) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startdtdattlist(name);
}
bool f_xmlwriter_write_dtd_attlist(CObjRef xmlwriter, CStrRef name,
CStrRef content) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writedtdattlist(name, content);
}
bool f_xmlwriter_end_dtd_attlist(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_enddtdattlist();
}
bool f_xmlwriter_start_dtd_entity(CObjRef xmlwriter, CStrRef name,
bool isparam) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_startdtdentity(name, isparam);
}
bool f_xmlwriter_write_dtd_entity(CObjRef xmlwriter, CStrRef name,
CStrRef content, bool pe /* = false */,
CStrRef publicid /* = null_string */,
CStrRef systemid /* = null_string */,
CStrRef ndataid /* = null_string */) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_writedtdentity(name, content);
}
bool f_xmlwriter_end_dtd_entity(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_enddtdentity();
}
bool f_xmlwriter_end_dtd(CObjRef xmlwriter) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_enddtd();
}
Variant f_xmlwriter_flush(CObjRef xmlwriter, bool empty /* = true */) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_flush(empty);
}
String f_xmlwriter_output_memory(CObjRef xmlwriter, bool flush /* = true */) {
return xmlwriter.getTyped<c_XMLWriter>()->
t_outputmemory(flush);
}
///////////////////////////////////////////////////////////////////////////////
// helpers
static int write_file(void *context, const char *buffer, int len) {
return ((c_XMLWriter*)context)->m_uri->writeImpl(buffer, len);
}
static int close_file(void *context) {
return 0;
}
static xmlChar *xmls(CStrRef s) {
return s.isNull() ? NULL : (xmlChar*)s.data();
}
///////////////////////////////////////////////////////////////////////////////
c_XMLWriter::c_XMLWriter(Class* cb) :
ExtObjectData(cb), m_ptr(NULL), m_output(NULL), m_uri_output(NULL) {
}
c_XMLWriter::~c_XMLWriter() {
if (m_ptr) {
xmlFreeTextWriter(m_ptr);
}
if (m_output) {
xmlBufferFree(m_output);
}
if (m_uri_output) {
xmlOutputBufferClose(m_uri_output);
}
}
void c_XMLWriter::t___construct() {
}
bool c_XMLWriter::t_openmemory() {
m_output = xmlBufferCreate();
if (m_output == NULL) {
raise_warning("Unable to create output buffer");
return false;
}
return (m_ptr = xmlNewTextWriterMemory(m_output, 0));
}
bool c_XMLWriter::t_openuri(CStrRef uri) {
Variant file = File::Open(uri, "wb");
if (same(file, false)) {
return false;
}
m_uri = file.toObject().getTyped<File>();
m_uri_output = xmlOutputBufferCreateIO(write_file, close_file, this, NULL);
if (m_uri_output == NULL) {
raise_warning("Unable to create output buffer");
return false;
}
m_ptr = xmlNewTextWriter(m_uri_output);
return true;
}
bool c_XMLWriter::t_setindentstring(CStrRef indentstring) {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterSetIndentString(m_ptr, (xmlChar*)indentstring.data());
}
return ret != -1;
}
bool c_XMLWriter::t_setindent(bool indent) {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterSetIndent(m_ptr, indent);
}
return ret != -1;
}
bool c_XMLWriter::t_startdocument(CStrRef version /* = "1.0" */,
CStrRef encoding /* = null_string */,
CStrRef standalone /* = null_string */) {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartDocument(m_ptr, (const char *)xmls(version),
(const char *)xmls(encoding),
(const char *)xmls(standalone));
}
return ret != -1;
}
bool c_XMLWriter::t_startelement(CStrRef name) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid element name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartElement(m_ptr, (xmlChar*)name.data());
}
return ret != -1;
}
bool c_XMLWriter::t_startelementns(CStrRef prefix, CStrRef name, CStrRef uri) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid element name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartElementNS(m_ptr, (xmlChar*)prefix.data(),
(xmlChar*)name.data(),
(xmlChar*)uri.data());
}
return ret != -1;
}
bool c_XMLWriter::t_writeelementns(CStrRef prefix, CStrRef name, CStrRef uri,
CStrRef content /* = null_string */) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid element name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
if (content.isNull()) {
ret = xmlTextWriterStartElementNS(m_ptr, (xmlChar*)prefix.data(),
(xmlChar*)name.data(),
(xmlChar*)uri.data());
if (ret == -1) return false;
ret = xmlTextWriterEndElement(m_ptr);
if (ret == -1) return false;
} else {
ret = xmlTextWriterWriteElementNS(m_ptr, (xmlChar*)prefix.data(),
(xmlChar*)name.data(),
(xmlChar*)uri.data(),
(xmlChar*)content.data());
}
}
return ret != -1;
}
bool c_XMLWriter::t_writeelement(CStrRef name,
CStrRef content /* = null_string */) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid element name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
if (content.isNull()) {
ret = xmlTextWriterStartElement(m_ptr, (xmlChar*)name.data());
if (ret == -1) return false;
ret = xmlTextWriterEndElement(m_ptr);
if (ret == -1) return false;
} else {
ret = xmlTextWriterWriteElement(m_ptr, (xmlChar*)name.data(),
(xmlChar*)content.data());
}
}
return ret != -1;
}
bool c_XMLWriter::t_endelement() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndElement(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_fullendelement() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterFullEndElement(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_startattributens(CStrRef prefix, CStrRef name,
CStrRef uri) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid attribute name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartAttributeNS(m_ptr, (xmlChar*)prefix.data(),
(xmlChar*)name.data(),
(xmlChar*)uri.data());
}
return ret != -1;
}
bool c_XMLWriter::t_startattribute(CStrRef name) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid attribute name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartAttribute(m_ptr, (xmlChar*)name.data());
}
return ret != -1;
}
bool c_XMLWriter::t_writeattributens(CStrRef prefix, CStrRef name, CStrRef uri,
CStrRef content) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid attribute name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteAttributeNS(m_ptr, (xmlChar*)prefix.data(),
(xmlChar*)name.data(),
(xmlChar*)uri.data(),
(xmlChar*)content.data());
}
return ret != -1;
}
bool c_XMLWriter::t_writeattribute(CStrRef name, CStrRef value) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid attribute name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteAttribute(m_ptr, (xmlChar*)name.data(),
(xmlChar*)value.data());
}
return ret != -1;
}
bool c_XMLWriter::t_endattribute() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndAttribute(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_startcdata() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartCDATA(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_writecdata(CStrRef content) {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteCDATA(m_ptr, (xmlChar*)content.data());
}
return ret != -1;
}
bool c_XMLWriter::t_endcdata() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndCDATA(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_startcomment() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartComment(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_writecomment(CStrRef content) {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteComment(m_ptr, (xmlChar*)content.data());
}
return ret != -1;
}
bool c_XMLWriter::t_endcomment() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndComment(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_enddocument() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndDocument(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_startpi(CStrRef target) {
if (xmlValidateName((xmlChar*)target.data(), 0)) {
raise_warning("invalid PI target: %s", target.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartPI(m_ptr, (xmlChar*)target.data());
}
return ret != -1;
}
bool c_XMLWriter::t_writepi(CStrRef target, CStrRef content) {
if (xmlValidateName((xmlChar*)target.data(), 0)) {
raise_warning("invalid PI target: %s", target.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWritePI(m_ptr, (xmlChar*)target.data(),
(xmlChar*)content.data());
}
return ret != -1;
}
bool c_XMLWriter::t_endpi() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndPI(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_text(CStrRef content) {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteString(m_ptr, (xmlChar*)content.data());
}
return ret != -1;
}
bool c_XMLWriter::t_writeraw(CStrRef content) {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteRaw(m_ptr, (xmlChar*)content.data());
}
return ret != -1;
}
bool c_XMLWriter::t_startdtd(CStrRef qualifiedname,
CStrRef publicid /* = null_string */,
CStrRef systemid /* = null_string */) {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartDTD(m_ptr, (xmlChar*)qualifiedname.data(),
xmls(publicid), xmls(systemid));
}
return ret != -1;
}
bool c_XMLWriter::t_writedtd(CStrRef name,
CStrRef publicid /* = null_string */,
CStrRef systemid /* = null_string */,
CStrRef subset /* = null_string */) {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteDTD(m_ptr, (xmlChar*)name.data(),
xmls(publicid), xmls(systemid), xmls(subset));
}
return ret != -1;
}
bool c_XMLWriter::t_startdtdelement(CStrRef qualifiedname) {
if (xmlValidateName((xmlChar*)qualifiedname.data(), 0)) {
raise_warning("invalid element name: %s", qualifiedname.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartDTDElement(m_ptr, (xmlChar*)qualifiedname.data());
}
return ret != -1;
}
bool c_XMLWriter::t_writedtdelement(CStrRef name, CStrRef content) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid element name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteDTDElement(m_ptr, (xmlChar*)name.data(),
(xmlChar*)content.data());
}
return ret != -1;
}
bool c_XMLWriter::t_enddtdelement() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndDTDElement(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_startdtdattlist(CStrRef name) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid element name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartDTDAttlist(m_ptr, (xmlChar*)name.data());
}
return ret != -1;
}
bool c_XMLWriter::t_writedtdattlist(CStrRef name, CStrRef content) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid element name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteDTDAttlist(m_ptr, (xmlChar*)name.data(),
(xmlChar*)content.data());
}
return ret != -1;
}
bool c_XMLWriter::t_enddtdattlist() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndDTDAttlist(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_startdtdentity(CStrRef name, bool isparam) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid attribute name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterStartDTDEntity(m_ptr, isparam, (xmlChar*)name.data());
}
return ret != -1;
}
bool c_XMLWriter::t_writedtdentity(CStrRef name, CStrRef content,
bool pe /* = false */,
CStrRef publicid /* = null_string */,
CStrRef systemid /* = null_string */,
CStrRef ndataid /* = null_string */) {
if (xmlValidateName((xmlChar*)name.data(), 0)) {
raise_warning("invalid element name: %s", name.data());
return false;
}
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterWriteDTDEntity(m_ptr, pe, (xmlChar*)name.data(),
xmls(publicid), xmls(systemid),
xmls(ndataid), (xmlChar*)content.data());
}
return ret != -1;
}
bool c_XMLWriter::t_enddtdentity() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndDTDEntity(m_ptr);
}
return ret != -1;
}
bool c_XMLWriter::t_enddtd() {
int ret = -1;
if (m_ptr) {
ret = xmlTextWriterEndDTD(m_ptr);
}
return ret != -1;
}
Variant c_XMLWriter::t_flush(bool empty /* = true */) {
if (m_ptr && m_output) {
xmlTextWriterFlush(m_ptr);
String ret((char*)m_output->content, CopyString);
if (empty) {
xmlBufferEmpty(m_output);
}
return ret;
}
return "";
}
String c_XMLWriter::t_outputmemory(bool flush /* = true */) {
return t_flush(flush);
}
///////////////////////////////////////////////////////////////////////////////
}