diff options
| author | Burt P <pburt0@gmail.com> | 2019-08-24 11:31:54 -0500 | 
|---|---|---|
| committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2019-08-28 13:15:48 +0200 | 
| commit | 691620e2d0855ab8ea5ddedc91c65a9df6ba0cfa (patch) | |
| tree | 6df7fabf61c0791e6a9517dfb56fd02621547553 /modules | |
| parent | f52c88bdfe5ab69a1141b45b40311b172a6d8ea1 (diff) | |
monitors: add ieee_oui lookup, link for vendor name
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/devices/monitors.c | 89 | 
1 files changed, 68 insertions, 21 deletions
| 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 : ""                                  ); | 
