diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2012-10-29 21:48:43 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2012-10-29 13:16:46 -0700 |
commit | ab8af0bdeb09f35f0d40b455601995f833811b12 (patch) | |
tree | 7cc803ed39b7413e64f895ac428ae20bc65d8a77 /windows.c | |
parent | 2de6f796354ad029e9e786027210fcf1b02868e2 (diff) | |
download | subsurface-ab8af0bdeb09f35f0d40b455601995f833811b12.tar.gz |
windows.c: added device retrieval from subsurface_fill_device_list()
subsurface_fill_device_list() now goes trough the list of registry
entries in the SERIALCOMM key and adds all present values (such as
COM1, COM2) to a GtkListStore. Once done the function compares
all logic drive label to a static list of known DC labels,
such a 'UEMISSDA', which is the only present one at the moment
and adds any matching drive letters (e.g. C:\, H:\) to the list store
as well.
If no serial ports were added or no matching logical drives were found
the function simply adds a default entry named "COM1".
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
Diffstat (limited to 'windows.c')
-rw-r--r-- | windows.c | 63 |
1 files changed, 57 insertions, 6 deletions
@@ -121,15 +121,66 @@ void subsurface_close_conf(void) int subsurface_fill_device_list(GtkListStore *store) { + const int bufdef = 512; + const char *dlabels[] = {"UEMISSDA", NULL}; + const char *devdef = "COM1"; GtkTreeIter iter; - int index = -1; + int index = -1, nentries = 0, ret, i; + char bufname[bufdef], bufval[bufdef], *p; + DWORD nvalues, bufval_len, bufname_len; + HKEY key; + /* add serial ports */ + ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", + 0, KEY_READ, &key); + if (ret == ERROR_SUCCESS) { + ret = RegQueryInfoKeyA(key, NULL, NULL, NULL, NULL, NULL, NULL, &nvalues, + NULL, NULL, NULL, NULL); + if (ret == ERROR_SUCCESS) + for (i = 0; i < nvalues; i++) { + memset(bufval, 0, bufdef); + memset(bufname, 0, bufdef); + bufname_len = bufdef; + bufval_len = bufdef; + ret = RegEnumValueA(key, i, bufname, &bufname_len, NULL, NULL, bufval, + &bufval_len); + if (ret == ERROR_SUCCESS) { + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, bufval, -1); + if (is_default_dive_computer_device(bufval)) + index = nentries; + nentries++; + } + } + } + /* add drive letters that match labels */ + memset(bufname, 0, bufdef); + bufname_len = bufdef; + if (GetLogicalDriveStringsA(bufname_len, bufname)) { + p = bufname; + while (*p) { + memset(bufval, 0, bufdef); + if (GetVolumeInformationA(p, bufval, bufdef, NULL, NULL, NULL, NULL, 0)) { + for (i = 0; dlabels[i] != NULL; i++) + if (!strcmp(bufval, dlabels[i])) { + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, p, -1); + if (is_default_dive_computer_device(p)) + index = nentries; + nentries++; + } + } + p = &p[strlen(p) + 1]; + } + } /* if we can't find anything, use the default */ - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, - 0, "COM3", -1); - if (is_default_dive_computer_device("COM3")) - index = 0; + if (!nentries) { + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, + 0, devdef, -1); + if (is_default_dive_computer_device(devdef)) + index = 0; + } return index; } |