3using namespace LibXR::USB;
6 const std::initializer_list<const LanguagePack*>& lang_list,
const uint8_t* uid,
8 : LANG_NUM(lang_list.size()),
9 header_(new uint16_t[LANG_NUM + 1]),
10 land_id_(header_ + 1),
14 ASSERT(uid !=
nullptr || uid_len == 0);
16 auto lang = lang_list.begin();
17 size_t max_str_len = 0;
20 const size_t EXTRA_SERIAL_UTF16 = uid ? uid_len * 4 : 0;
22 for (
size_t i = 0; i <
LANG_NUM; i++)
24 land_id_[i] =
static_cast<uint16_t
>((*lang)->lang_id);
29 if (EXTRA_SERIAL_UTF16 != 0)
32 size_t serial_prefix_len = (*lang)->string_lens[IDX_SERIAL];
33 size_t serial_total_len = serial_prefix_len + EXTRA_SERIAL_UTF16;
34 if (serial_total_len > lang_max)
36 lang_max = serial_total_len;
40 if (max_str_len < lang_max)
42 max_str_len = lang_max;
52 ASSERT(max_str_len + 2 <= 255);
64 return ErrorCode::NOT_SUPPORT;
68 for (
size_t i = 0; i <
LANG_NUM; ++i)
72 ans =
static_cast<int>(i);
78 return ErrorCode::NOT_FOUND;
81 uint8_t* buffer =
reinterpret_cast<uint8_t*
>(
buffer_.
addr_);
89 const char*
const SERIAL_PREFIX = pack->
strings[IDX];
90 const size_t PREFIX_UTF16_LEN = pack->
string_lens[IDX];
92 const uint8_t DATA_LEN =
100 uint8_t* out = buffer + 2;
103 ToUTF16LE(SERIAL_PREFIX, out);
104 out += PREFIX_UTF16_LEN;
107 static const char HEX[16] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
108 '8',
'9',
'A',
'B',
'C',
'D',
'E',
'F'};
113 char hi = HEX[(b >> 4) & 0x0F];
114 char lo = HEX[b & 0x0F];
117 *out++ =
static_cast<uint8_t
>(hi);
121 *out++ =
static_cast<uint8_t
>(lo);
125 return ErrorCode::OK;
132 buffer[0] =
static_cast<uint8_t
>(data_len);
134 ToUTF16LE(str, buffer + 2);
135 return ErrorCode::OK;
141 uint8_t* buffer =
reinterpret_cast<uint8_t*
>(
buffer_.
addr_);
150void DescriptorStrings::ToUTF16LE(
const char* str, uint8_t* buffer)
153 const unsigned char* s =
reinterpret_cast<const unsigned char*
>(str);
157 uint32_t codepoint = 0;
163 else if ((*s & 0xE0) == 0xC0)
165 codepoint = (*s & 0x1F) << 6;
167 codepoint |= (*s & 0x3F);
170 else if ((*s & 0xF0) == 0xE0)
172 codepoint = (*s & 0x0F) << 12;
174 codepoint |= (*s & 0x3F) << 6;
176 codepoint |= (*s & 0x3F);
179 else if ((*s & 0xF8) == 0xF0)
203 buffer[len++] = codepoint & 0xFF;
204 buffer[len++] = (codepoint >> 8) & 0xFF;
原始数据封装类。 A class for encapsulating raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
ErrorCode GenerateString(Index index, uint16_t lang)
生成指定语言和索引的字符串描述符 Generate USB string descriptor for given language and string index
const size_t LANG_NUM
已注册语言数量 / Registered language count
RawData GetData()
获取当前构建好的字符串描述符数据 Get the descriptor buffer
RawData buffer_
临时描述符缓冲区 / Temp descriptor buffer
size_t serial_uid_len_
UID 字节数 / UID byte count.
RawData GetLangIDData()
获取语言ID描述符内容 Get LangID descriptor data
DescriptorStrings(const std::initializer_list< const LanguagePack * > &lang_list, const uint8_t *uid=nullptr, size_t uid_len=0)
USB 描述符字符串管理器构造函数 USB descriptor string manager constructor.
const uint8_t * serial_uid_
序列号后缀 UID (原始字节) / Serial number suffix UID (original bytes)
Index
描述符字符串索引 / USB descriptor string index
@ LANGUAGE_ID
语言ID描述符 / LangID descriptor
@ SERIAL_NUMBER_STRING
序列号字符串索引 / Serial number string
const LanguagePack ** string_list_
多语言包指针表 / LanguagePack pointer table
uint16_t * land_id_
语言ID数组 / LangID array
uint16_t * header_
语言ID描述符头部 / LangID descriptor header
单语言描述符包(用于注册静态多语言字符串) Single language USB string descriptor pack for registration
size_t string_lens[STRING_LIST_SIZE]
StringData strings[STRING_LIST_SIZE]
size_t max_string_length
最大字符串长度 / Maximum string length