/* * upb - a minimalist implementation of protocol buffers. * * Copyright (c) 2009-2010 Google Inc. See LICENSE for details. * Author: Josh Haberman * * Implements a set of upb_handlers that write protobuf data to the binary wire * format. * * This encoder implementation does not have any access to any out-of-band or * precomputed lengths for submessages, so it must buffer submessages internally * before it can emit the first byte. */ #ifndef UPB_ENCODER_H_ #define UPB_ENCODER_H_ #include "upb/env.h" #include "upb/sink.h" #ifdef __cplusplus namespace upb { namespace pb { class Encoder; } // namespace pb } // namespace upb #endif UPB_DECLARE_TYPE(upb::pb::Encoder, upb_pb_encoder); #define UPB_PBENCODER_MAX_NESTING 100 /* upb::pb::Encoder ***********************************************************/ // Preallocation hint: decoder won't allocate more bytes than this when first // constructed. This hint may be an overestimate for some build configurations. // But if the decoder library is upgraded without recompiling the application, // it may be an underestimate. #define UPB_PB_ENCODER_SIZE 768 #ifdef __cplusplus class upb::pb::Encoder { public: // Creates a new encoder in the given environment. The Handlers must have // come from NewHandlers() below. static Encoder* Create(Environment* env, const Handlers* handlers, BytesSink* output); // The input to the encoder. Sink* input(); // Creates a new set of handlers for this MessageDef. static reffed_ptr NewHandlers(const MessageDef* msg); static const size_t kSize = UPB_PB_ENCODER_SIZE; private: UPB_DISALLOW_POD_OPS(Encoder, upb::pb::Encoder); }; #endif UPB_BEGIN_EXTERN_C const upb_handlers *upb_pb_encoder_newhandlers(const upb_msgdef *m, const void *owner); upb_sink *upb_pb_encoder_input(upb_pb_encoder *p); upb_pb_encoder* upb_pb_encoder_create(upb_env* e, const upb_handlers* h, upb_bytessink* output); UPB_END_EXTERN_C #ifdef __cplusplus namespace upb { namespace pb { inline Encoder* Encoder::Create(Environment* env, const Handlers* handlers, BytesSink* output) { return upb_pb_encoder_create(env, handlers, output); } inline Sink* Encoder::input() { return upb_pb_encoder_input(this); } inline reffed_ptr Encoder::NewHandlers( const upb::MessageDef *md) { const Handlers* h = upb_pb_encoder_newhandlers(md, &h); return reffed_ptr(h, &h); } } // namespace pb } // namespace upb #endif #endif /* UPB_ENCODER_H_ */