Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "uri_encoder.h" | |
| 6 | |
| 7 using base::StringPiece; | |
| 8 | |
| 9 namespace { | |
| 10 | |
| 11 struct expansion { | |
| 12 char code; | |
| 13 const char* value; | |
| 14 }; | |
| 15 | |
| 16 // The two following data structures are the expansions code tables for URI | |
| 17 // encoding described in the following specification: | |
| 18 // https://github.com/google/uribeacon/blob/master/specification/AdvertisingMode .md | |
| 19 | |
| 20 // For the prefix of the URI. | |
| 21 struct expansion prefix_expansions_list[] = { | |
| 22 {0, "http://www."}, | |
| 23 {1, "https://www."}, | |
| 24 {2, "http://"}, | |
| 25 {3, "https://"}, | |
| 26 {4, "urn:uuid:"}, | |
| 27 }; | |
| 28 | |
| 29 // For the remaining part of the URI. | |
| 30 struct expansion expansions_list[] = { | |
| 31 {0, ".com/"}, | |
| 32 {1, ".org/"}, | |
| 33 {2, ".edu/"}, | |
| 34 {3, ".net/"}, | |
| 35 {4, ".info/"}, | |
| 36 {5, ".biz/"}, | |
| 37 {6, ".gov/"}, | |
| 38 {7, ".com"}, | |
| 39 {8, ".org"}, | |
| 40 {9, ".edu"}, | |
| 41 {10, ".net"}, | |
| 42 {11, ".info"}, | |
| 43 {12, ".biz"}, | |
| 44 {13, ".gov"}, | |
| 45 }; | |
| 46 | |
| 47 } // namespace | |
| 48 | |
| 49 void device::EncodeUriBeaconUri(const StringPiece& input, std::string* output) { | |
|
armansito
2015/02/26 00:39:15
It's generally difficult to understand what the co
dvh
2015/03/03 20:26:03
Done.
| |
| 50 unsigned int i = 0; | |
| 51 const char* bytes = input.data(); | |
| 52 while (i < input.size()) { | |
| 53 int found = -1; | |
| 54 int foundLength = -1; | |
|
armansito
2015/02/26 00:39:15
Variable names need to be all lowercase and using
dvh
2015/03/03 20:26:03
Done.
| |
| 55 struct expansion* table = NULL; | |
| 56 unsigned int tableLength = 0; | |
| 57 if (i == 0) { | |
| 58 // Prefix of the URI. | |
| 59 table = prefix_expansions_list; | |
| 60 tableLength = | |
| 61 sizeof(prefix_expansions_list) / sizeof(prefix_expansions_list[0]); | |
|
armansito
2015/02/26 00:39:15
Use arraysize(x) from base/ (i.e. arraysize(prefix
dvh
2015/03/03 20:26:03
Done.
| |
| 62 } else { | |
| 63 table = expansions_list; | |
| 64 tableLength = sizeof(expansions_list) / sizeof(expansions_list[0]); | |
| 65 } | |
| 66 // Search for the longest match. | |
| 67 for (unsigned int k = 0; k < tableLength; k++) { | |
| 68 const char* value = table[k].value; | |
| 69 int len = strlen(table[k].value); | |
| 70 if (strncmp(bytes + i, value, len) == 0 && len > foundLength) { | |
| 71 found = k; | |
| 72 foundLength = len; | |
| 73 } | |
| 74 } | |
| 75 if (found != -1) { | |
| 76 char b = (char)found; | |
| 77 output->append(&b, 1); | |
| 78 i += strlen(table[found].value); | |
| 79 } else { | |
| 80 output->append(bytes + i, 1); | |
| 81 i++; | |
| 82 } | |
| 83 } | |
| 84 } | |
|
armansito
2015/02/26 00:39:15
You should generally make sure that the native C++
dvh
2015/03/03 20:26:03
Done.
| |
| 85 | |
| 86 void device::DecodeUriBeaconUri(const StringPiece& input, std::string* output) { | |
| 87 const char* bytes = input.data(); | |
| 88 unsigned int length = input.size(); | |
| 89 for (unsigned int i = 0; i < length; i++) { | |
| 90 const char* expansion_value = NULL; | |
| 91 if (i == 0 && | |
| 92 (unsigned char)bytes[i] < sizeof(prefix_expansions_list) / | |
| 93 sizeof(prefix_expansions_list[0])) { | |
| 94 // Prefix of the URI. | |
| 95 expansion_value = prefix_expansions_list[(unsigned char)bytes[i]].value; | |
| 96 } else if ((unsigned char)bytes[i] < | |
| 97 sizeof(expansions_list) / sizeof(expansions_list[0])) { | |
| 98 expansion_value = expansions_list[(unsigned char)bytes[i]].value; | |
| 99 } | |
| 100 if (expansion_value == NULL) { | |
| 101 output->append(&bytes[i], 1); | |
| 102 } else { | |
| 103 output->append(expansion_value, strlen(expansion_value)); | |
| 104 } | |
| 105 } | |
| 106 } | |
| OLD | NEW |