summaryrefslogtreecommitdiffstats
path: root/windows.c
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2012-10-29 21:48:43 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2012-10-29 13:16:46 -0700
commitab8af0bdeb09f35f0d40b455601995f833811b12 (patch)
tree7cc803ed39b7413e64f895ac428ae20bc65d8a77 /windows.c
parent2de6f796354ad029e9e786027210fcf1b02868e2 (diff)
downloadsubsurface-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.c63
1 files changed, 57 insertions, 6 deletions
diff --git a/windows.c b/windows.c
index df136085f..1189fae5a 100644
--- a/windows.c
+++ b/windows.c
@@ -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;
}