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> { 71 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 85 explicit EncodingOptionPredicate(const EncodingOption& option) 86 : option_(option) {} 87 88 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