Esempio n. 1
0
// 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;
}
Esempio n. 2
0
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;
}