chromium - get value from base:Value

前言

chromium工程中,base::Value是一个数据的容器, 可以装double, string类型数据,数据的存取为key-value。
在chromium工程中, 对base:Value设置值,是原有框架的事情。接口上经常有base::Value的值作为入参。
为了解送进接口的base::Value数据是啥内容(一般会记录日志),对base::Value取值是要做的。

实验

找了一段现有的chromium代码,入参有base::Value, 尝试读取base::Value入参的内容。

Z:\chromium\src\chrome\browser\ui\webui\download_internals\download_internals_ui_message_handler.cc

bool DownloadInternalsUIMessageHandler::get_double_value_by_key_from_value(const base::Value& value, const char* psz_key, double& f_value)
{
	bool b_rc = false;
	const base::Value* p_bv_find_key = NULL;

	do {
		f_value = 0.0f;

		if (NULL == psz_key) {
			break;
		}

		p_bv_find_key = value.FindKey(psz_key);
		if (NULL == p_bv_find_key) {
			break;
		}

		if (!p_bv_find_key->is_double()) {
			break;
		}

		f_value = p_bv_find_key->GetDouble();
		b_rc = true;
	} while (0);

	return b_rc;
}

bool DownloadInternalsUIMessageHandler::get_string_value_by_key_from_value(const base::Value& value, const char* psz_key, std::string& str_value)
{
	bool b_rc = false;
	const base::Value* p_bv_find_key = NULL;

	do {
		str_value = "";

		if (NULL == psz_key) {
			break;
		}

		p_bv_find_key = value.FindKey(psz_key);
		if (NULL == p_bv_find_key) {
			break;
		}

		if (!p_bv_find_key->is_string()) {
			break;
		}

		str_value = p_bv_find_key->GetString();
		b_rc = true;
	} while (0);

	return b_rc;
}

void DownloadInternalsUIMessageHandler::OnServiceDownloadChanged(
    const base::Value& service_download) {

	double f_bytes_downloaded = 0.0f;
	std::string str_client = "";
	std::string str_state = "";
	std::string str_file_path = "";
	std::string str_guid = "";
	std::string str_url = "";

  if (!IsJavascriptAllowed())
    return;

  FireWebUIListener("service-download-changed", service_download);

	/*
+		[0]	("bytes_downloaded", unique_ptr DOUBLE 0.00000000000000000)	std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::unique_ptr<base::Value,std::default_delete<base::Value> > >
+		[1]	("client", unique_ptr STRING "Debugging")	std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::unique_ptr<base::Value,std::default_delete<base::Value> > >
+		[2]	("file_path", unique_ptr STRING "C:\\Users\\LostSpeed\\AppData\\Local\\Chromium\\User Data\\Default\\Download Service\\Files\\205d0b7a-b28e-4594-943c-ec8e5180eda6")	std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::unique_ptr<base::Value,std::default_delete<base::Value> > >
+		[3]	("guid", unique_ptr STRING "205d0b7a-b28e-4594-943c-ec8e5180eda6")	std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::unique_ptr<base::Value,std::default_delete<base::Value> > >
+		[4]	("state", unique_ptr STRING "ACTIVE")	std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::unique_ptr<base::Value,std::default_delete<base::Value> > >
+		[5]	("url", unique_ptr STRING "https://download.csdn.net/download/lostspeed/10834374")	std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::unique_ptr<base::Value,std::default_delete<base::Value> > >
	*/

	do {
		if (!get_double_value_by_key_from_value(service_download, "bytes_downloaded", f_bytes_downloaded)) {
			break;
		}

		if (!get_string_value_by_key_from_value(service_download, "client", str_client)) {
			break;
		}

		if (!get_string_value_by_key_from_value(service_download, "file_path", str_file_path)) {
			break;
		}

		if (!get_string_value_by_key_from_value(service_download, "guid", str_guid)) {
			break;
		}

		if (!get_string_value_by_key_from_value(service_download, "state", str_state)) {
			break;
		}

		if (!get_string_value_by_key_from_value(service_download, "url", str_url)) {
			break;
		}

		// COMPLETE

		DLOG(INFO) << "service_download info :"
			<< "bytes_downloaded = " << f_bytes_downloaded
			<< ", client = " << str_client
			<< ", file_path = " << str_file_path
			<< ", guid = " << str_guid
			<< ", down_state = " << str_state
			<< ", url = " << str_url;
	} while (0);
}

记录的日志效果

[223200:240192:1218/130225.050:INFO:download_internals_ui_message_handler.cc(172)] service_download info :bytes_downloaded = 0, client = Debugging, file_path = C:\Users\LostSpeed\AppData\Local\Chromium\User Data\Default\Download Service\Files\b345452c-992c-47db-83ad-43606b7632ac, guid = b345452c-992c-47db-83ad-43606b7632ac, down_state = ACTIVE, url = https://download.csdn.net/download/lostspeed/10834374

猜你喜欢

转载自blog.csdn.net/LostSpeed/article/details/85063350