/* * Copyright (C) 2007 Esmertec AG. * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef WBXML_ENCODER_H #define WBXML_ENCODER_H #include <stdint.h> #include "wbxml_const.h" #include "wbxml_stl.h" class WbxmlHandler { public: virtual ~WbxmlHandler() {} virtual void wbxmlData(const char *data, uint32_t len) = 0; }; enum EncoderError { NO_ERROR = 0, ERROR_NO_PUBLIC_ID = 1, ERROR_UNSUPPORTED_DOCTYPE, ERROR_UNSUPPORTED_TAG, ERROR_UNSUPPORTED_ATTR, ERROR_INVALID_DATA, ERROR_INVALID_INTEGER_VALUE, ERROR_INVALID_DATETIME_VALUE, ERROR_INVALID_END_ELEMENT, }; class WbxmlEncoder { public: WbxmlEncoder(int publicId):mPublicId(publicId) {} virtual ~WbxmlEncoder() {} void setWbxmlHandler(WbxmlHandler * handler) { mHandler = handler; } virtual EncoderError startElement(const char *name, const char **atts) = 0; virtual EncoderError characters(const char *chars, int len) = 0; virtual EncoderError endElement() = 0; /** * Reset the encoder so that it may be used again. The WbxmlHandler is * NOT cleared by reset(). */ virtual void reset() = 0; static bool isXmlWhitespace(int ch); static bool parseUint(const char * s, int len, uint32_t *res); protected: WbxmlHandler * mHandler; int mPublicId; EncoderError encodeInteger(const char *chars, int len); EncoderError encodeDatetime(const char *chars, int len); void encodeInlinedStr(const char *s, int len); void encodeMbuint(uint32_t i); void clearResult() { mResult.clear(); } void appendResult(int ch) { mResult += (char)ch; } void appendResult(const char *s, int len) { mResult.append(s, len); } void sendResult(); /** * Append a string into the string table, return the index of the string in * the string table. */ int appendToStringTable(const char *s); private: string mResult; vector<string> mStringTable; }; #endif