1// Copyright 2009 Google Inc. 2// Author: James deBoer 3// 4// Licensed under the Apache License, Version 2.0 (the "License"); 5// you may not use this file except in compliance with the License. 6// You may obtain a copy of the License at 7// 8// http://www.apache.org/licenses/LICENSE-2.0 9// 10// Unless required by applicable law or agreed to in writing, software 11// distributed under the License is distributed on an "AS IS" BASIS, 12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13// See the License for the specific language governing permissions and 14// limitations under the License. 15// 16// A class for a code table writer which outputs JSON. 17 18#ifndef OPEN_VCDIFF_JSONWRITER_H_ 19#define OPEN_VCDIFF_JSONWRITER_H_ 20 21#include <config.h> 22#include <string> 23#include "addrcache.h" 24#include "checksum.h" 25#include "codetable.h" 26#include "codetablewriter_interface.h" 27 28namespace open_vcdiff { 29 30// class JSONCodeTableWriter: 31// 32// A code table writer which outputs a JSON representation of the diff. 33// The output is a JSON array of commands. 34// * Each ADD is represented by a single JSON string containing 35// the data to add. 36// * Each COPY is represented by two numbers. The first is an offset into 37// the dictionary. The second is a length. 38// * Each RUN is represented by a JSON string containing the data to add, 39// similar to the ADD command. 40// 41class JSONCodeTableWriter : public CodeTableWriterInterface { 42 public: 43 JSONCodeTableWriter(); 44 ~JSONCodeTableWriter(); 45 46 // Initializes the writer. 47 virtual bool Init(size_t dictionary_size); 48 49 // Encode an ADD opcode with the "size" bytes starting at data 50 virtual void Add(const char* data, size_t size); 51 52 // Encode a COPY opcode with args "offset" (into dictionary) and "size" bytes. 53 virtual void Copy(int32_t offset, size_t size); 54 55 // Encode a RUN opcode for "size" copies of the value "byte". 56 virtual void Run(size_t size, unsigned char byte); 57 58 // Writes the header to the output string. 59 virtual void WriteHeader(OutputStringInterface* out, 60 VCDiffFormatExtensionFlags format_extensions); 61 62 virtual void AddChecksum(VCDChecksum) { } 63 64 // Appends the encoded delta window to the output 65 // string. The output string is not null-terminated. 66 virtual void Output(OutputStringInterface* out); 67 68 // Finishes the encoding. 69 virtual void FinishEncoding(OutputStringInterface *out); 70 71 // Returns the number of target bytes processed, which is the sum of all the 72 // size arguments passed to Add(), Copy(), and Run(). 73 // TODO(ajenjo): Eliminate the need for this method. 74 virtual size_t target_length() const; 75 private: 76 typedef std::string string; 77 78 // Escape the input data to conform with the JSON string spec 79 // and add it to the 'out' string. 80 void JSONEscape(const char* data, size_t size, string* out); 81 82 // Stores the JSON data before it is sent to the OutputString. 83 string output_; 84 85 // The sum of all the size arguments passed to Add(), Copy() and Run(). 86 size_t target_length_; 87 88 // Set if some data has been output. 89 bool output_called_; 90}; 91 92} // namespace open_vcdiff 93#endif // OPEN_VCDIFF_JSONWRITER_H_ 94