From 691620e2d0855ab8ea5ddedc91c65a9df6ba0cfa Mon Sep 17 00:00:00 2001 From: Burt P Date: Sat, 24 Aug 2019 11:31:54 -0500 Subject: monitors: add ieee_oui lookup, link for vendor name Signed-off-by: Burt P --- modules/devices/monitors.c | 89 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 21 deletions(-) (limited to 'modules/devices/monitors.c') diff --git a/modules/devices/monitors.c b/modules/devices/monitors.c index 5de9e17b..7fd60bf5 100644 --- a/modules/devices/monitors.c +++ b/modules/devices/monitors.c @@ -31,6 +31,7 @@ static const char monitor_icon[] = "monitor.png"; gboolean no_monitors = FALSE; gchar *edid_ids_file = NULL; +gchar *ieee_oui_ids_file = NULL; void find_edid_ids_file() { if (edid_ids_file) return; @@ -49,6 +50,23 @@ void find_edid_ids_file() { auto_free(edid_ids_file); } +void find_ieee_oui_ids_file() { + if (ieee_oui_ids_file) return; + char *file_search_order[] = { + g_build_filename(g_get_user_config_dir(), "hardinfo", "ieee_oui.ids", NULL), + g_build_filename(params.path_data, "ieee_oui.ids", NULL), + NULL + }; + int n; + for(n = 0; file_search_order[n]; n++) { + if (!ieee_oui_ids_file && !access(file_search_order[n], R_OK)) + ieee_oui_ids_file = file_search_order[n]; + else + g_free(file_search_order[n]); + } + auto_free(ieee_oui_ids_file); +} + typedef struct { gchar *drm_path; gchar *drm_connection; @@ -89,27 +107,55 @@ void monitor_free(monitor *m) { } } -const gchar *monitor_vendor_str(monitor *m) { - if (m->_vstr) - return m->_vstr; +gchar *monitor_vendor_str(monitor *m, gboolean include_value, gboolean link_name) { + if (!m || !m->e) return NULL; edid_ven ven = m->e->ven; + gchar v[20] = "", t[4] = ""; + ids_query_result result = {}; if (ven.type == VEN_TYPE_PNP) { - ids_query_result result = {}; - - if (!edid_ids_file) - find_edid_ids_file(); + strcpy(v, ven.pnp); + strcpy(t, "PNP"); + } else if (ven.type == VEN_TYPE_OUI) { + sprintf(v, "%02x%02x%02x", + /* file lists as big endian */ + (ven.oui >> 16) & 0xff, + (ven.oui >> 8) & 0xff, + ven.oui & 0xff ); + strcpy(t, "OUI"); + } - scan_ids_file(edid_ids_file, ven.pnp, &result, -1); - if (result.results[0]) { - m->_vstr = g_strdup(result.results[0]); - return m->_vstr; + if (!m->_vstr) { + if (ven.type == VEN_TYPE_PNP) { + if (!edid_ids_file) + find_edid_ids_file(); + scan_ids_file(edid_ids_file, v, &result, -1); + if (result.results[0]) + m->_vstr = g_strdup(result.results[0]); + } else if (ven.type == VEN_TYPE_OUI) { + if (!ieee_oui_ids_file) + find_ieee_oui_ids_file(); + scan_ids_file(ieee_oui_ids_file, v, &result, -1); + if (result.results[0]) + m->_vstr = g_strdup(result.results[0]); } - return g_strdup(ven.pnp); - } else if (ven.type == VEN_TYPE_OUI) { - //TODO... } - return "..."; + + gchar *ret = NULL; + if (include_value) + ret = g_strdup_printf("[%s:%s]", t, v); + if (m->_vstr) { + if (link_name) { + gchar *lv = vendor_get_link(m->_vstr); + ret = appfsp(ret, "%s", lv); + g_free(lv); + } else + ret = appfsp(ret, "%s", m->_vstr); + } else if (!include_value && ven.type == VEN_TYPE_PNP) { + ret = appfsp(ret, "%s", ven.pnp); + } else + ret = appfsp(ret, "%s", _("(Unknown)")); + return ret; } gchar *monitor_name(monitor *m, gboolean include_vendor) { @@ -120,9 +166,11 @@ gchar *monitor_name(monitor *m, gboolean include_vendor) { return g_strdup(_("(Unknown)")); if (include_vendor) { - if (e->ven.type != VEN_TYPE_INVALID) - desc = appfsp(desc, "%s", vendor_get_shortest_name(monitor_vendor_str(m))); - else + if (e->ven.type != VEN_TYPE_INVALID) { + gchar *vstr = monitor_vendor_str(m, FALSE, FALSE); + desc = appfsp(desc, "%s", vendor_get_shortest_name(vstr)); + g_free(vstr); + } else desc = appfsp(desc, "%s", "Unknown"); } @@ -177,7 +225,7 @@ static gchar *make_edid_section(monitor *m) { int i; edid *e = m->e; if (e->len) { - const gchar *vstr = monitor_vendor_str(m); + gchar *vstr = monitor_vendor_str(m, TRUE, TRUE); gchar *dom = NULL; if (!e->dom.is_model_year && e->dom.week && e->dom.year) @@ -388,6 +436,7 @@ static gchar *make_edid_section(monitor *m) { g_free(didt_list); g_free(did_string_list); g_free(iface); + g_free(vstr); g_free(hex); //printf("ret: %s\n", ret); return ret; @@ -419,12 +468,10 @@ gchar *monitors_get_info() { gchar *details = g_strdup_printf("[%s]\n" "%s=%s\n" - //"%s=%s\n" "%s=%s %s\n" "%s\n", _("Connection"), _("DRM"), m->drm_connection, - //_("DRM Path"), m->drm_path, _("Status"), m->drm_status, m->drm_enabled, edid_section ? edid_section : "" ); -- cgit v1.2.3