blob: 0f6513a5ac19aa7458dbca17a43c7a37f7b42e64 [file] [log] [blame]
openvcdiff@gmail.com732fff22010-08-04 18:00:00 +00001// 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_