1 // Copyright 2012 Google Inc. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef POLO_ENCODING_ENCODINGOPTION_H_
16 #define POLO_ENCODING_ENCODINGOPTION_H_
17 
18 #include <stdint.h>
19 #include <functional>
20 #include <set>
21 #include <string>
22 
23 namespace polo {
24 namespace encoding {
25 
26 // An encoding option for a challenge message consisting of an encoding scheme
27 // and symbol length.
28 class EncodingOption {
29  public:
30   // Representation of a specific encoding type. The numeric values should
31   // be sorted by encoding complexity from least to greatest.
32   enum EncodingType {
33     // Unknown encoding type.
34     kUnknown = 0,
35 
36     // Text message composed of characters [0-9].
37     kNumeric = 1,
38 
39     // Text message composed of characters [0-9A-Za-z]+.
40     kAlphaNumeric = 2,
41 
42     // Text message composed of characters [0-9A-Fa-f]+.
43     kHexadecimal = 3,
44 
45     // 2-dimensional barcode, containing binary bitstream.
46     kQRCode = 4,
47   };
48 
49   // Creates a new encoding option.
50   // @param encoding_type the encoding type
51   // @param symbol_length the encoding symbole length
52   EncodingOption(EncodingType encoding_type, uint32_t symbol_length);
53 
54   // Gets the encoding scheme for the challenge message.
55   EncodingType encoding_type() const;
56 
57   // Gets the number of symbols used in the challenge message for the encoding
58   // type specified by this encoding option. For example, a single symbol for
59   // hexadecimal encoding consists of 4-bits from the set [0-9A-Fa-f].
60   uint32_t symbol_length() const;
61 
62   // Determines whether the given encoding option is the same as this one.
63   bool Equals(const EncodingOption& other) const;
64 
65   // Returns a string representation of this encoding option.
66   std::string ToString() const;
67 
68   // EncodingOption comparator for set ordering.
69   struct EncodingOptionComparator : public std::binary_function<
70       EncodingOption, EncodingOption, bool> {
operatorEncodingOptionComparator71     bool operator()(const EncodingOption& option1,
72                     const EncodingOption& option2) {
73       // Sort encoding options by complexity.
74       return (option1.encoding_type() == option2.encoding_type()
75           && option1.symbol_length() < option2.symbol_length())
76           || (option1.encoding_type() < option2.encoding_type());
77     }
78   };
79 
80   // Predicate for finding an encoding option.
81   struct EncodingOptionPredicate
82       : public std::unary_function<EncodingOption, bool> {
83     const EncodingOption& option_;
84 
EncodingOptionPredicateEncodingOptionPredicate85     explicit EncodingOptionPredicate(const EncodingOption& option)
86         : option_(option) {}
87 
operatorEncodingOptionPredicate88     bool operator()(const EncodingOption& other) const {
89       return option_.Equals(other);
90     }
91   };
92 
93   // Definition for a set of EncodingOptions that are ordered by complexity.
94   typedef std::set<EncodingOption, EncodingOptionComparator>
95       EncodingSet;
96 
97  private:
98   EncodingType encoding_type_;
99   uint32_t symbol_length_;
100 };
101 
102 }  // namespace encoding
103 }  // namespace polo
104 
105 #endif  // POLO_ENCODING_ENCODINGOPTION_H_
106