1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2010 Google Inc.  All rights reserved.
3 // http://code.google.com/p/protobuf/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 //     * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 //     * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 // Author: wink@google.com (Wink Saville)
32 
33 #ifndef PROTOBUF_COMPILER_JAVANANO_JAVANANO_PARAMS_H_
34 #define PROTOBUF_COMPILER_JAVANANO_JAVANANO_PARAMS_H_
35 
36 #include <map>
37 #include <set>
38 #include <google/protobuf/stubs/strutil.h>
39 
40 namespace google {
41 namespace protobuf {
42 namespace compiler {
43 namespace javanano {
44 
45 enum eMultipleFiles { JAVANANO_MUL_UNSET, JAVANANO_MUL_FALSE, JAVANANO_MUL_TRUE };
46 
47 // Parameters for used by the generators
48 class Params {
49  public:
50   typedef map<string, string> NameMap;
51   typedef set<string> NameSet;
52  private:
53   string empty_;
54   string base_name_;
55   eMultipleFiles override_java_multiple_files_;
56   bool store_unknown_fields_;
57   NameMap java_packages_;
58   NameMap java_outer_classnames_;
59   NameSet java_multiple_files_;
60   bool generate_has_;
61   bool java_enum_style_;
62   bool optional_field_accessors_;
63   bool use_reference_types_for_primitives_;
64   bool generate_equals_;
65   bool ignore_services_;
66   bool parcelable_messages_;
67   bool reftypes_primitive_enums_;
68   bool generate_clear_;
69   bool generate_clone_;
70   bool generate_intdefs_;
71   bool bytes_offset_length_;
72 
73  public:
Params(const string & base_name)74   Params(const string & base_name) :
75     empty_(""),
76     base_name_(base_name),
77     override_java_multiple_files_(JAVANANO_MUL_UNSET),
78     store_unknown_fields_(false),
79     generate_has_(false),
80     java_enum_style_(false),
81     optional_field_accessors_(false),
82     use_reference_types_for_primitives_(false),
83     generate_equals_(false),
84     ignore_services_(false),
85     parcelable_messages_(false),
86     reftypes_primitive_enums_(false),
87     generate_clear_(true),
88     generate_clone_(false),
89     generate_intdefs_(false),
90     bytes_offset_length_(false) {
91   }
92 
base_name()93   const string& base_name() const {
94     return base_name_;
95   }
96 
has_java_package(const string & file_name)97   bool has_java_package(const string& file_name) const {
98     return java_packages_.find(file_name)
99                         != java_packages_.end();
100   }
set_java_package(const string & file_name,const string & java_package)101   void set_java_package(const string& file_name,
102       const string& java_package) {
103     java_packages_[file_name] = java_package;
104   }
java_package(const string & file_name)105   const string& java_package(const string& file_name) const {
106     NameMap::const_iterator itr;
107 
108     itr = java_packages_.find(file_name);
109     if  (itr == java_packages_.end()) {
110       return empty_;
111     } else {
112       return itr->second;
113     }
114   }
java_packages()115   const NameMap& java_packages() {
116     return java_packages_;
117   }
118 
has_java_outer_classname(const string & file_name)119   bool has_java_outer_classname(const string& file_name) const {
120     return java_outer_classnames_.find(file_name)
121                         != java_outer_classnames_.end();
122   }
set_java_outer_classname(const string & file_name,const string & java_outer_classname)123   void set_java_outer_classname(const string& file_name,
124       const string& java_outer_classname) {
125     java_outer_classnames_[file_name] = java_outer_classname;
126   }
java_outer_classname(const string & file_name)127   const string& java_outer_classname(const string& file_name) const {
128     NameMap::const_iterator itr;
129 
130     itr = java_outer_classnames_.find(file_name);
131     if  (itr == java_outer_classnames_.end()) {
132       return empty_;
133     } else {
134       return itr->second;
135     }
136   }
java_outer_classnames()137   const NameMap& java_outer_classnames() {
138     return java_outer_classnames_;
139   }
140 
set_override_java_multiple_files(bool java_multiple_files)141   void set_override_java_multiple_files(bool java_multiple_files) {
142     if (java_multiple_files) {
143       override_java_multiple_files_ = JAVANANO_MUL_TRUE;
144     } else {
145       override_java_multiple_files_ = JAVANANO_MUL_FALSE;
146     }
147   }
clear_override_java_multiple_files()148   void clear_override_java_multiple_files() {
149     override_java_multiple_files_ = JAVANANO_MUL_UNSET;
150   }
151 
set_java_multiple_files(const string & file_name,bool value)152   void set_java_multiple_files(const string& file_name, bool value) {
153     if (value) {
154       java_multiple_files_.insert(file_name);
155     } else {
156       java_multiple_files_.erase(file_name);
157     }
158   }
java_multiple_files(const string & file_name)159   bool java_multiple_files(const string& file_name) const {
160     switch (override_java_multiple_files_) {
161       case JAVANANO_MUL_FALSE:
162         return false;
163       case JAVANANO_MUL_TRUE:
164         return true;
165       default:
166         return java_multiple_files_.find(file_name)
167                 != java_multiple_files_.end();
168     }
169   }
170 
set_store_unknown_fields(bool value)171   void set_store_unknown_fields(bool value) {
172     store_unknown_fields_ = value;
173   }
store_unknown_fields()174   bool store_unknown_fields() const {
175     return store_unknown_fields_;
176   }
177 
set_generate_has(bool value)178   void set_generate_has(bool value) {
179     generate_has_ = value;
180   }
generate_has()181   bool generate_has() const {
182     return generate_has_;
183   }
184 
set_java_enum_style(bool value)185   void set_java_enum_style(bool value) {
186     java_enum_style_ = value;
187   }
java_enum_style()188   bool java_enum_style() const {
189     return java_enum_style_;
190   }
191 
set_optional_field_accessors(bool value)192   void set_optional_field_accessors(bool value) {
193     optional_field_accessors_ = value;
194   }
optional_field_accessors()195   bool optional_field_accessors() const {
196     return optional_field_accessors_;
197   }
198 
set_use_reference_types_for_primitives(bool value)199   void set_use_reference_types_for_primitives(bool value) {
200     use_reference_types_for_primitives_ = value;
201   }
use_reference_types_for_primitives()202   bool use_reference_types_for_primitives() const {
203     return use_reference_types_for_primitives_;
204   }
205 
set_generate_equals(bool value)206   void set_generate_equals(bool value) {
207     generate_equals_ = value;
208   }
generate_equals()209   bool generate_equals() const {
210     return generate_equals_;
211   }
212 
set_ignore_services(bool value)213   void set_ignore_services(bool value) {
214     ignore_services_ = value;
215   }
ignore_services()216   bool ignore_services() const {
217     return ignore_services_;
218   }
219 
set_parcelable_messages(bool value)220   void set_parcelable_messages(bool value) {
221     parcelable_messages_ = value;
222   }
parcelable_messages()223   bool parcelable_messages() const {
224     return parcelable_messages_;
225   }
226 
set_reftypes_primitive_enums(bool value)227   void set_reftypes_primitive_enums(bool value) {
228     reftypes_primitive_enums_ = value;
229   }
reftypes_primitive_enums()230   bool reftypes_primitive_enums() const {
231     return reftypes_primitive_enums_;
232   }
233 
set_generate_clear(bool value)234   void set_generate_clear(bool value) {
235     generate_clear_ = value;
236   }
generate_clear()237   bool generate_clear() const {
238     return generate_clear_;
239   }
240 
set_generate_clone(bool value)241   void set_generate_clone(bool value) {
242     generate_clone_ = value;
243   }
generate_clone()244   bool generate_clone() const {
245     return generate_clone_;
246   }
247 
set_generate_intdefs(bool value)248   void set_generate_intdefs(bool value) {
249     generate_intdefs_ = value;
250   }
generate_intdefs()251   bool generate_intdefs() const {
252     return generate_intdefs_;
253   }
254 
255   // An advanced setting which uses buffer/offset/length tuples for each
256   // non-repeated bytes field, instead of a byte array which is serialized
257   // directly.
258   // The field is considered present iff the offset is not equal to the default
259   // value of -1; the value of the buffer has no relevance otherwise.
260   // In serialization, the [fieldName]Buffer array will be serialized starting
261   // at [fieldName]Offset and with length [fieldName]Length.
262   // In deserialization, the underlying byte array will be the same instance
263   // backing the underlying CodedInputByteBufferNano for all bytes fields, with
264   // appropriate offsets and lengths.
265   // Use with caution! This feature comes with no SLA.
set_bytes_offset_length(bool value)266   void set_bytes_offset_length(bool value) {
267     bytes_offset_length_ = value;
268   }
bytes_offset_length()269   bool bytes_offset_length() const {
270     return bytes_offset_length_;
271   }
272 };
273 
274 }  // namespace javanano
275 }  // namespace compiler
276 }  // namespace protobuf
277 }  // namespace google
278 #endif  // PROTOBUF_COMPILER_JAVANANO_JAVANANO_PARAMS_H_
279