3using namespace LibXR::USB;
6 const std::initializer_list<const LanguagePack*>& lang_list)
7 : LANG_NUM(lang_list.size()),
8 header_(new uint16_t[LANG_NUM + 1]),
13 auto lang = lang_list.begin();
14 size_t max_str_len = 0;
15 for (
size_t i = 0; i <
LANG_NUM; i++)
17 land_id_[i] =
static_cast<uint16_t
>((*lang)->lang_id);
19 if (max_str_len < (*lang)->max_string_length)
21 max_str_len = (*lang)->max_string_length;
36 return ErrorCode::NOT_SUPPORT;
40 for (
size_t i = 0; i <
LANG_NUM; ++i)
44 ans =
static_cast<int>(i);
50 return ErrorCode::NOT_FOUND;
53 uint8_t* buffer =
reinterpret_cast<uint8_t*
>(
buffer_.
addr_);
59 ToUTF16LE(str, buffer + 2);
66 uint8_t* buffer =
reinterpret_cast<uint8_t*
>(
buffer_.
addr_);
75void DescriptorStrings::ToUTF16LE(
const char* str, uint8_t* buffer)
78 const unsigned char* s =
reinterpret_cast<const unsigned char*
>(str);
82 uint32_t codepoint = 0;
88 else if ((*s & 0xE0) == 0xC0)
90 codepoint = (*s & 0x1F) << 6;
92 codepoint |= (*s & 0x3F);
95 else if ((*s & 0xF0) == 0xE0)
97 codepoint = (*s & 0x0F) << 12;
99 codepoint |= (*s & 0x3F) << 6;
101 codepoint |= (*s & 0x3F);
104 else if ((*s & 0xF8) == 0xF0)
128 buffer[len++] = codepoint & 0xFF;
129 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
DescriptorStrings(const std::initializer_list< const LanguagePack * > &lang_list)
USB 描述符字符串管理器构造函数 USB descriptor string manager constructor.
RawData buffer_
临时描述符缓冲区 / Temp descriptor buffer
RawData GetLangIDData()
获取语言ID描述符内容 Get LangID descriptor data
Index
描述符字符串索引 / USB descriptor string index
@ LANGUAGE_ID
语言ID描述符 / LangID descriptor
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]