static PmDeviceID pm_get_default_device_id(int is_input, char *key) { HKEY hkey; #define PATTERN_MAX 256 char pattern[PATTERN_MAX]; long pattern_max = PATTERN_MAX; DWORD dwType; /* Find first input or device -- this is the default. */ PmDeviceID id = pmNoDevice; int i, j; Pm_Initialize(); /* make sure descriptors exist! */ for (i = 0; i < pm_descriptor_index; i++) { if (descriptors[i].pub.input == is_input) { id = i; break; } } /* Look in registry for a default device name pattern. */ if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey) != ERROR_SUCCESS) { return id; } if (RegOpenKeyEx(hkey, "JavaSoft", 0, KEY_READ, &hkey) != ERROR_SUCCESS) { return id; } if (RegOpenKeyEx(hkey, "Prefs", 0, KEY_READ, &hkey) != ERROR_SUCCESS) { return id; } if (RegOpenKeyEx(hkey, "/Port/Midi", 0, KEY_READ, &hkey) != ERROR_SUCCESS) { return id; } if (RegQueryValueEx(hkey, key, NULL, &dwType, (BYTE *) pattern, (DWORD *) &pattern_max) != ERROR_SUCCESS) { return id; } /* decode pattern: upper case encoded with "/" prefix */ i = j = 0; while (pattern[i]) { if (pattern[i] == '/' && pattern[i + 1]) { pattern[j++] = toupper(pattern[++i]); } else { pattern[j++] = tolower(pattern[i]); } i++; } pattern[j] = 0; /* end of string */ /* now pattern is the string from the registry; search for match */ i = pm_find_default_device(pattern, is_input); if (i != pmNoDevice) { id = i; } return id; }
/* Parse preference files, find default device, search devices -- This parses the preference file(s) once for input and once for output, which is inefficient but much simpler to manage. Note that using the readbinaryplist.c module, you cannot keep two plist files (user and system) open at once (due to a simple memory management scheme). */ PmDeviceID find_default_device(char *path, int input, PmDeviceID id) /* path -- the name of the preference we are searching for input -- true iff this is an input device id -- current default device id returns matching device id if found, otherwise id */ { static char *pref_file = "com.apple.java.util.prefs.plist"; char *pref_str = NULL; // read device preferences value_ptr prefs = bplist_read_user_pref(pref_file); if (prefs) { value_ptr pref_val = value_dict_lookup_using_path(prefs, path); if (pref_val) { pref_str = value_get_asciistring(pref_val); } } if (!pref_str) { bplist_free_data(); /* look elsewhere */ prefs = bplist_read_system_pref(pref_file); if (prefs) { value_ptr pref_val = value_dict_lookup_using_path(prefs, path); if (pref_val) { pref_str = value_get_asciistring(pref_val); } } } if (pref_str) { /* search devices for match */ int i = pm_find_default_device(pref_str, input); if (i != pmNoDevice) { id = i; } } if (prefs) { bplist_free_data(); } return id; }
/* Parse preference files, find default device, search devices -- */ PmDeviceID find_default_device(char *path, int input, PmDeviceID id) /* path -- the name of the preference we are searching for input -- true iff this is an input device id -- current default device id returns matching device id if found, otherwise id */ { static char *pref_2 = "/.java/.userPrefs/"; static char *pref_3 = "prefs.xml"; char *pref_1 = getenv("HOME"); char *full_name, *path_ptr; FILE *inf; int c, i; if (!pref_1) goto nopref; // cannot find preference file // full_name will be larger than necessary full_name = malloc(strlen(pref_1) + strlen(pref_2) + strlen(pref_3) + strlen(path) + 2); strcpy(full_name, pref_1); strcat(full_name, pref_2); // copy all but last path segment to full_name if (*path == '/') path++; // skip initial slash in path path_ptr = strrchr(path, '/'); if (path_ptr) { // copy up to slash after full_name path_ptr++; int offset = strlen(full_name); memcpy(full_name + offset, path, path_ptr - path); full_name[offset + path_ptr - path] = 0; // end of string } else { path_ptr = path; } strcat(full_name, pref_3); inf = fopen(full_name, "r"); if (!inf) goto nopref; // cannot open preference file // We're not going to build or link in a full XML parser. // Instead, find the path string and quoute. Then, look for // "value", "=", quote. Then get string up to quote. while ((c = getc(inf)) != EOF) { char pref_str[STRING_MAX]; if (c != '"') continue; // scan up to quote // look for quote string quote if (!match_string(inf, path_ptr)) continue; // path not found if (getc(inf) != '"') continue; // path not found, keep scanning if (!match_string(inf, "value")) goto nopref; // value not found if (!match_string(inf, "=")) goto nopref; // = not found if (!match_string(inf, "\"")) goto nopref; // quote not found // now read the value up to the close quote for (i = 0; i < STRING_MAX; i++) { if ((c = getc(inf)) == '"') break; pref_str[i] = c; } if (i == STRING_MAX) continue; // value too long, ignore pref_str[i] = 0; i = pm_find_default_device(pref_str, input); if (i != pmNoDevice) { id = i; } break; } nopref: return id; }