static tb_bool_t tb_oc_xml_writer_func_data(tb_oc_xml_writer_t* writer, tb_object_ref_t object, tb_size_t level) { // check tb_assert_and_check_return_val(writer && writer->stream, tb_false); // no empty? if (tb_oc_data_size(object)) { // writ beg if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, "<data>") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; // decode base64 data tb_byte_t const* ib = (tb_byte_t const*)tb_oc_data_getp(object); tb_size_t in = tb_oc_data_size(object); tb_size_t on = in << 1; tb_char_t* ob = tb_malloc0_cstr(on); tb_assert_and_check_return_val(ob && on, tb_false); on = tb_base64_encode(ib, in, ob, on); tb_trace_d("base64: %u => %u", in, on); // writ data tb_char_t const* p = ob; tb_char_t const* e = ob + on; tb_size_t n = 0; for (; p < e && *p; p++, n++) { if (!(n & 63)) { if (n) if (!tb_oc_writer_newline(writer->stream, writer->deflate)) break; if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) break; } if (tb_stream_printf(writer->stream, "%c", *p) < 0) break; } // free the data tb_free(ob); // check tb_check_return_val(p == e, tb_false); // writ newline if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; // writ end if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, "</data>") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; } else { // writ if (!tb_oc_writer_tab(writer->stream, writer->deflate, level)) return tb_false; if (tb_stream_printf(writer->stream, "<data/>") < 0) return tb_false; if (!tb_oc_writer_newline(writer->stream, writer->deflate)) return tb_false; } // ok return tb_true; }
static tb_bool_t tb_oc_bplist_writer_func_data(tb_oc_bplist_writer_t* writer, tb_object_ref_t object, tb_size_t item_size) { // check tb_assert_and_check_return_val(writer && writer->stream && object, tb_false); // writ return tb_oc_bplist_writer_func_rdata(writer, TB_OBJECT_BPLIST_TYPE_DATA, (tb_byte_t const*)tb_oc_data_getp(object), tb_oc_data_size(object), item_size); }