// FIXIT: 可能需要根据吓一条记录,再对上一条记录优化 // FIXIT: 函数太长了,需要再拆分下 // 根据 sqlite db 的 schema, 获取指定表的的 schema(Template) // Record 的 Types 是 Varint, // 解析变长整数后与预设的 Map 进行匹配,得到相应的 SQL_TYPE // 当连续读取数据的 SQL_TYPE 都满足 Template,则判断找到一条记录 // 再根据 Template 读取后面的 Data 区内容 // 如果完全满足当前的 RecordTmpl,则取出 Data 区的数据 // Data 区尾不能跨越到已存在数据块 // 如果仍未到达 end,则继续解析 vector<Record> parseRecordsFromFreeBlock(base::bytes_it begin, base::bytes_it end, vector<base::sql_type> tmpl) { // type 1, type 2, type 3, ..., data 1, data 2, data 3, ... // tmpl 1, tmpl 2, tmpl 3, ...| vector<Record> records; // FIXIT: 需要分析db文件提起模版 // tmpl = testTmpl(); base::bytes_it pos; for (pos = begin; pos < end;) { vector<RecordFormat> rf = matchByesForTmpl(pos, end, tmpl); if (!rf.empty()) { // 如果匹配模版 // pos += calcHeaderSize(rf); base::bytes_it tmp_pos = pos + calcHeaderSize(rf); Record record; for (vector<RecordFormat>::iterator rf_pos = rf.begin(); rf_pos != rf.end(); ++rf_pos) { // 避免取 Data 时超出 FreeBlock 边界 string content; if (tmp_pos > end) { content = "[Missed]"; } else { base::bytes_it end_it = tmp_pos + rf_pos->contentSize;; if (end_it > end) { end_it = end; } base::bytes_t bytes = base::bytes_t(tmp_pos, end_it); if (bytes.empty()) { content = "[NULL]"; } else { content = getStringFor(rf_pos->serialType, bytes); } } record.push_back(content); // 如果是 pos += rf_pos->contentSize,可能会跳过一些数据 tmp_pos += rf_pos->contentSize; } records.push_back(record); pos += calcHeaderSize(rf); } else { ++pos; } } return records; }
BString MediaString::getStringFor( const media_format &format, bool complete) { D_METHOD(("MediaString::getStringFor(media_format)\n")); BString s = getStringFor(format.type, complete); switch (format.type) { case B_MEDIA_RAW_AUDIO: { BString formatInfo = getStringFor(format.u.raw_audio, complete); if (formatInfo.Length() > 0) s << " (" << formatInfo << ")"; break; } case B_MEDIA_RAW_VIDEO: { BString formatInfo = getStringFor(format.u.raw_video, complete); if (formatInfo.Length() > 0) s << " (" << formatInfo << ")"; break; } case B_MEDIA_ENCODED_AUDIO: { BString formatInfo = getStringFor(format.u.encoded_audio, complete); if (formatInfo.Length() > 0) s << " (" << formatInfo << ")"; break; } case B_MEDIA_ENCODED_VIDEO: { BString formatInfo = getStringFor(format.u.encoded_video, complete); if (formatInfo.Length() > 0) s << " (" << formatInfo << ")"; break; } case B_MEDIA_MULTISTREAM: { BString formatInfo = getStringFor(format.u.multistream, complete); if (formatInfo.Length() > 0) s << " (" << formatInfo << ")"; break; } default: { break; } } return s; }