- Removed the central configuration structure, all changes are
committed instantly now. - Updated the drive handling code so it loads direct from the registry. - Removed DRIVE_DESC, drives are keyed by drive letter now. - Documented drive_available_mask. - Simplified the code somewhat.
This commit is contained in:
parent
e0b5270b4a
commit
1136408fc6
|
@ -41,45 +41,120 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
|
||||
|
||||
/*******************************************************************/
|
||||
/* the configuration properties affected by this code */
|
||||
/*******************************************************************/
|
||||
static BOOL initialized = FALSE;
|
||||
static BOOL updatingUI = FALSE;
|
||||
static char editWindowLetter; /* drive letter of the drive we are currently editing */
|
||||
|
||||
|
||||
/* returns NULL on failure. caller is responsible for freeing result */
|
||||
char *getDriveValue(char letter, char *valueName) {
|
||||
HKEY hkDrive = 0;
|
||||
char *subKeyName;
|
||||
char *result = NULL;
|
||||
HRESULT hr;
|
||||
DWORD bufferSize;
|
||||
|
||||
WINE_TRACE("letter=%c, valueName=%s\n", letter, valueName);
|
||||
|
||||
subKeyName = malloc(strlen("Drive X"));
|
||||
sprintf(subKeyName, "Drive %c", letter);
|
||||
|
||||
hr = RegOpenKeyEx(configKey, subKeyName, 0, KEY_READ, &hkDrive);
|
||||
if (hr != ERROR_SUCCESS) goto end;
|
||||
|
||||
hr = RegQueryValueEx(hkDrive, valueName, NULL, NULL, NULL, &bufferSize);
|
||||
if (hr != ERROR_SUCCESS) goto end;
|
||||
|
||||
result = malloc(bufferSize);
|
||||
hr = RegQueryValueEx(hkDrive, valueName, NULL, NULL, result, &bufferSize);
|
||||
if (hr != ERROR_SUCCESS) goto end;
|
||||
|
||||
end:
|
||||
if (hkDrive) RegCloseKey(hkDrive);
|
||||
free(subKeyName);
|
||||
return result;
|
||||
}
|
||||
|
||||
void initDriveDlg (HWND hDlg)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
char *subKeyName = malloc(MAX_NAME_LENGTH);
|
||||
int driveCount = 0;
|
||||
DWORD sizeOfSubKeyName;
|
||||
|
||||
/* Clear the listbox */
|
||||
SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_RESETCONTENT, 0, 0);
|
||||
for (i = 0; i < config.driveCount; i++) {
|
||||
int itemIndex;
|
||||
DRIVE_DESC *drive = DPA_GetPtr(config.pDrives, i);
|
||||
char *title = malloc(MAX_NAME_LENGTH);
|
||||
|
||||
WINE_TRACE("Iterating, item %d of %d, drive=%p\n", i, config.driveCount, drive);
|
||||
assert(drive);
|
||||
WINE_TRACE("\n");
|
||||
|
||||
WINE_TRACE("Adding %s (%s) to the listbox\n", drive->szName, drive->szLabel);
|
||||
updatingUI = TRUE;
|
||||
|
||||
/* the first SendMessage call adds the string and returns the index, the second associates that index with it */
|
||||
snprintf(title, MAX_NAME_LENGTH, "Drive %s (%s)", drive->szName, drive->szLabel);
|
||||
itemIndex = SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_ADDSTRING ,(WPARAM) -1, (LPARAM) title);
|
||||
SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_SETITEMDATA, itemIndex, (LPARAM) itemIndex);
|
||||
free(title);
|
||||
}
|
||||
/* Clear the listbox */
|
||||
SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_RESETCONTENT, 0, 0);
|
||||
for (i = 0;
|
||||
RegEnumKeyExA(configKey, i, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS;
|
||||
++i, sizeOfSubKeyName = 50) {
|
||||
|
||||
initialized = TRUE;
|
||||
HKEY hkDrive;
|
||||
char returnBuffer[MAX_NAME_LENGTH];
|
||||
DWORD sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
LONG r;
|
||||
|
||||
if (!strncmp("Drive ", subKeyName, 5)) {
|
||||
char driveLetter = '\0';
|
||||
char *label;
|
||||
char *title;
|
||||
int titleLen;
|
||||
const char *itemLabel = "Drive %s (%s)";
|
||||
int itemIndex;
|
||||
|
||||
if (RegOpenKeyExA (configKey, subKeyName, 0, KEY_READ, &hkDrive) != ERROR_SUCCESS) {
|
||||
WINE_ERR("unable to open drive registry key");
|
||||
RegCloseKey(configKey);
|
||||
return;
|
||||
}
|
||||
|
||||
/* extract the drive letter, force to upper case */
|
||||
driveLetter = subKeyName[strlen(subKeyName)-1];
|
||||
if(driveLetter) driveLetter = toupper(driveLetter);
|
||||
|
||||
ZeroMemory(returnBuffer, sizeof(*returnBuffer));
|
||||
sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
r = RegQueryValueExA(hkDrive, "Label", NULL, NULL, returnBuffer, &sizeOfReturnBuffer);
|
||||
if (r == ERROR_SUCCESS) {
|
||||
label = malloc(sizeOfReturnBuffer);
|
||||
strncpy(label, returnBuffer, sizeOfReturnBuffer);
|
||||
} else {
|
||||
WINE_WARN("label not loaded: %ld\n", r);
|
||||
label = NULL;
|
||||
}
|
||||
|
||||
/* We now know the label and drive letter, so we can add to the list. The list items will have the letter associated
|
||||
* with them, which acts as the key. We can then use that letter to get/set the properties of the drive. */
|
||||
WINE_TRACE("Adding %c (%s) to the listbox\n", driveLetter, label);
|
||||
|
||||
if (!label) label = "no label";
|
||||
titleLen = strlen(itemLabel) - 1 + strlen(label) - 2 + 1;
|
||||
title = malloc(titleLen);
|
||||
/* the %s in the item label will be replaced by the drive letter, so -1, then
|
||||
-2 for the second %s which will be expanded to the label, finally + 1 for terminating #0 */
|
||||
snprintf(title, titleLen, "Drive %c (%s)", driveLetter, label);
|
||||
|
||||
/* the first SendMessage call adds the string and returns the index, the second associates that index with it */
|
||||
itemIndex = SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_ADDSTRING ,(WPARAM) -1, (LPARAM) title);
|
||||
SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_SETITEMDATA, itemIndex, (LPARAM) driveLetter);
|
||||
|
||||
free(title);
|
||||
free(label);
|
||||
|
||||
driveCount++;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
WINE_TRACE("loaded %d drives\n", driveCount);
|
||||
|
||||
free(subKeyName);
|
||||
updatingUI = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void saveDriveDlgSettings (HWND hDlg)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* The Drive Editing Dialog */
|
||||
/******************************************************************************/
|
||||
|
@ -103,29 +178,11 @@ static code_desc_pair fs_pairs[] = {
|
|||
{"msdos", "MS-DOS 8 character file names"},
|
||||
{"unix", "UNIX file names"}
|
||||
};
|
||||
|
||||
#define DRIVE_FS_DEFAULT 0
|
||||
|
||||
long drive_available_mask(DRIVE_DESC *pCurrentDrive)
|
||||
{
|
||||
int i;
|
||||
DRIVE_DESC *pDrive;
|
||||
long result = 0;
|
||||
|
||||
for( i=0; i < config.pDrives->nItemCount; ++i) {
|
||||
pDrive = (DRIVE_DESC *) DPA_GetPtr( config.pDrives, i );
|
||||
if(pDrive) {
|
||||
result |= DRIVE_MASK_BIT(pDrive->szName[0]);
|
||||
}
|
||||
}
|
||||
|
||||
result = ~result; /*flag unused, not used*/
|
||||
result |= DRIVE_MASK_BIT(pCurrentDrive->szName[0]);
|
||||
WINE_TRACE( "finished drive letter loop with %ld\n", result );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void fill_drive_droplist(long mask, DRIVE_DESC *pCurrentDrive, HWND hDlg)
|
||||
void fill_drive_droplist(long mask, char currentLetter, HWND hDlg)
|
||||
{
|
||||
int i;
|
||||
int selection;
|
||||
|
@ -138,7 +195,7 @@ void fill_drive_droplist(long mask, DRIVE_DESC *pCurrentDrive, HWND hDlg)
|
|||
sName[0] = 'A' + i;
|
||||
SendDlgItemMessage( hDlg, IDC_COMBO_LETTER, CB_ADDSTRING, 0, (LPARAM) sName );
|
||||
|
||||
if( toupper(pCurrentDrive->szName[0]) == 'A' + i ) {
|
||||
if( toupper(currentLetter) == 'A' + i ) {
|
||||
selection = count;
|
||||
}
|
||||
|
||||
|
@ -157,7 +214,6 @@ void fill_drive_droplist(long mask, DRIVE_DESC *pCurrentDrive, HWND hDlg)
|
|||
SendDlgItemMessage( hDlg, IDC_COMBO_LETTER, CB_SETCURSEL, selection, 0 );
|
||||
}
|
||||
|
||||
|
||||
/* if bEnable is 1 then we are editing a CDROM, so can enable all controls, otherwise we want to disable
|
||||
* "detect from device" and "serial number", but still allow the user to manually set the path. The UI
|
||||
* for this could be somewhat better -mike
|
||||
|
@ -172,263 +228,227 @@ void enable_labelserial_box(HWND hDlg, int bEnable)
|
|||
EnableWindow( GetDlgItem( hDlg, IDC_STATIC_LABEL ), bEnable );
|
||||
}
|
||||
|
||||
|
||||
INT_PTR CALLBACK DriveEditDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
/* This function produces a mask for each drive letter that isn't currently used. Each bit of the long result
|
||||
* represents a letter, with A being the least significant bit, and Z being the most significant.
|
||||
*
|
||||
* To calculate this, we loop over each letter, and see if we can get a drive entry for it. If so, we
|
||||
* set the appropriate bit. At the end, we flip each bit, to give the desired result.
|
||||
*
|
||||
* The letter parameter is always marked as being available. This is so the edit dialog can display the
|
||||
* currently used drive letter alongside the available ones.
|
||||
*/
|
||||
long drive_available_mask(char letter)
|
||||
{
|
||||
int i;
|
||||
int selection;
|
||||
|
||||
switch (uMsg) {
|
||||
case WM_INITDIALOG: {
|
||||
DRIVE_DESC* pDrive = (DRIVE_DESC *)lParam;
|
||||
|
||||
SetProp(hDlg, "PDRIVE", pDrive);
|
||||
|
||||
/* Fill in the list boxes */
|
||||
/* Drive letters */
|
||||
fill_drive_droplist( drive_available_mask( pDrive ), pDrive, hDlg );
|
||||
|
||||
/* drive type*/
|
||||
for( i=0, selection=-1; i < sizeof(type_pairs)/sizeof(code_desc_pair); i++) {
|
||||
SendDlgItemMessage(hDlg, IDC_COMBO_TYPE, CB_ADDSTRING, 0,
|
||||
(LPARAM) type_pairs[i].sDesc);
|
||||
if(strcasecmp(type_pairs[i].sCode, pDrive->szType) == 0){
|
||||
selection = i;
|
||||
}
|
||||
}
|
||||
|
||||
if( selection == -1 ) {
|
||||
selection = DRIVE_TYPE_DEFAULT;
|
||||
}
|
||||
SendDlgItemMessage(hDlg, IDC_COMBO_TYPE, CB_SETCURSEL, selection, 0);
|
||||
|
||||
/* FileSystem name handling */
|
||||
for( i=0, selection=-1; i < sizeof(fs_pairs)/sizeof(code_desc_pair); i++) {
|
||||
SendDlgItemMessage(hDlg, IDC_COMBO_NAMES, CB_ADDSTRING, 0,
|
||||
(LPARAM) fs_pairs[i].sDesc);
|
||||
if(strcasecmp(fs_pairs[i].sCode, pDrive->szFS) == 0){
|
||||
selection = i;
|
||||
}
|
||||
}
|
||||
|
||||
if( selection == -1 ) {
|
||||
selection = DRIVE_FS_DEFAULT;
|
||||
}
|
||||
SendDlgItemMessage(hDlg, IDC_COMBO_NAMES, CB_SETCURSEL, selection, 0);
|
||||
|
||||
|
||||
/* removeable media properties */
|
||||
SendDlgItemMessage(hDlg, IDC_EDIT_SERIAL, WM_SETTEXT, 0,(LPARAM)pDrive->szSerial);
|
||||
SendDlgItemMessage(hDlg, IDC_EDIT_LABEL, WM_SETTEXT, 0,(LPARAM)pDrive->szLabel);
|
||||
SendDlgItemMessage(hDlg, IDC_EDIT_DEVICE, WM_SETTEXT, 0,(LPARAM)pDrive->szDevice);
|
||||
if( strcmp("cdrom", pDrive->szType) == 0 ||
|
||||
strcmp("floppy", pDrive->szType) == 0) {
|
||||
if( (strlen( pDrive->szDevice ) == 0) &&
|
||||
((strlen( pDrive->szSerial ) > 0) || (strlen( pDrive->szLabel ) > 0)) ) {
|
||||
selection = IDC_RADIO_ASSIGN;
|
||||
}
|
||||
else {
|
||||
selection = IDC_RADIO_AUTODETECT;
|
||||
}
|
||||
|
||||
enable_labelserial_box( hDlg, 1 );
|
||||
}
|
||||
else {
|
||||
enable_labelserial_box( hDlg, 0 );
|
||||
selection = IDC_RADIO_ASSIGN;
|
||||
}
|
||||
|
||||
CheckRadioButton( hDlg, IDC_RADIO_AUTODETECT, IDC_RADIO_ASSIGN, selection );
|
||||
SendDlgItemMessage(hDlg, IDC_EDIT_PATH, WM_SETTEXT, 0,(LPARAM)pDrive->szPath);
|
||||
break;
|
||||
}
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDC_COMBO_TYPE:
|
||||
switch( HIWORD(wParam))
|
||||
{
|
||||
case CBN_SELCHANGE:
|
||||
selection = SendDlgItemMessage( hDlg, IDC_COMBO_TYPE, CB_GETCURSEL, 0, 0);
|
||||
if( selection == 2 || selection == 3 ) { /* cdrom or floppy */
|
||||
enable_labelserial_box( hDlg, 1 );
|
||||
}
|
||||
else {
|
||||
enable_labelserial_box( hDlg, 0 );
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_BUTTON_OK:
|
||||
{
|
||||
DRIVE_DESC *pDrive = GetProp(hDlg, "PDRIVE");
|
||||
char buffer[MAX_NAME_LENGTH];
|
||||
|
||||
/* fixme: do it in a cleanup */
|
||||
RemoveProp(hDlg, "PDRIVE");
|
||||
|
||||
ZeroMemory(&buffer[0], MAX_NAME_LENGTH);
|
||||
GetWindowText(GetDlgItem(hDlg, IDC_EDIT_PATH), buffer, MAX_NAME_LENGTH);
|
||||
if (strlen(buffer) > 0) {
|
||||
strncpy(pDrive->szPath, buffer, MAX_NAME_LENGTH);
|
||||
|
||||
/* only fill in the other values if we have a path */
|
||||
selection = SendDlgItemMessage( hDlg, IDC_COMBO_TYPE, CB_GETCURSEL, 0, 0);
|
||||
strncpy(pDrive->szType, type_pairs[selection].sCode, MAX_NAME_LENGTH);
|
||||
|
||||
selection = SendDlgItemMessage( hDlg, IDC_COMBO_NAMES, CB_GETCURSEL, 0, 0);
|
||||
strncpy(pDrive->szFS, fs_pairs[selection].sCode, MAX_NAME_LENGTH);
|
||||
|
||||
selection = SendDlgItemMessage( hDlg, IDC_COMBO_LETTER, CB_GETCURSEL, 0, 0);
|
||||
SendDlgItemMessage( hDlg, IDC_COMBO_LETTER, CB_GETLBTEXT, selection, (WPARAM)buffer);
|
||||
strncpy(pDrive->szName, buffer, MAX_NAME_LENGTH);
|
||||
pDrive->szName[1] = 0; /* truncate to only the letter */
|
||||
|
||||
if( strncmp( pDrive->szType, "cdrom", MAX_NAME_LENGTH ) == 0) {
|
||||
if( IsDlgButtonChecked( hDlg, IDC_RADIO_ASSIGN ) == BST_CHECKED ) {
|
||||
GetWindowText(GetDlgItem(hDlg, IDC_EDIT_LABEL), buffer,
|
||||
MAX_NAME_LENGTH);
|
||||
strncpy(pDrive->szLabel, buffer, MAX_NAME_LENGTH);
|
||||
GetWindowText(GetDlgItem(hDlg, IDC_EDIT_SERIAL), buffer,
|
||||
MAX_NAME_LENGTH);
|
||||
strncpy(pDrive->szSerial, buffer, MAX_NAME_LENGTH);
|
||||
pDrive->szDevice[0] = 0;
|
||||
}
|
||||
else {
|
||||
GetWindowText(GetDlgItem(hDlg, IDC_EDIT_DEVICE), buffer,
|
||||
MAX_NAME_LENGTH);
|
||||
strncpy(pDrive->szDevice, buffer, MAX_NAME_LENGTH);
|
||||
pDrive->szLabel[0] = 0;
|
||||
pDrive->szSerial[0] = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
GetWindowText(GetDlgItem(hDlg, IDC_EDIT_LABEL), pDrive->szLabel, MAX_NAME_LENGTH);
|
||||
GetWindowText(GetDlgItem(hDlg, IDC_EDIT_SERIAL), pDrive->szSerial, MAX_NAME_LENGTH);
|
||||
GetWindowText(GetDlgItem(hDlg, IDC_EDIT_DEVICE), pDrive->szDevice, MAX_NAME_LENGTH);
|
||||
}
|
||||
EndDialog(hDlg, wParam);
|
||||
}
|
||||
else { /* missing a path */
|
||||
MessageBox( hDlg, "Please enter a valid path", "ERROR", MB_OK );
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Fall through. */
|
||||
|
||||
case ID_BUTTON_CANCEL:
|
||||
/* fixme: do it in a cleanup */
|
||||
RemoveProp(hDlg, "PDRIVE");
|
||||
EndDialog(hDlg, wParam);
|
||||
return TRUE;
|
||||
}
|
||||
long result = 0;
|
||||
char curLetter;
|
||||
char *slop;
|
||||
|
||||
WINE_TRACE("\n");
|
||||
|
||||
for (curLetter = 'A'; curLetter < 'Z'; curLetter++) {
|
||||
slop = getDriveValue(curLetter, "Path");
|
||||
if (slop != NULL) {
|
||||
result |= DRIVE_MASK_BIT(curLetter);
|
||||
free(slop);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
result = ~result;
|
||||
result |= DRIVE_MASK_BIT(letter);
|
||||
|
||||
WINE_TRACE( "finished drive letter loop with %lx\n", result );
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* The Actual Property Sheet Page */
|
||||
/***************************************************************************/
|
||||
void refreshDriveEditDialog(HWND hDlg) {
|
||||
char *path;
|
||||
char *type;
|
||||
char *fs;
|
||||
char *serial;
|
||||
char *label;
|
||||
char *device;
|
||||
int i, selection;
|
||||
|
||||
updatingUI = TRUE;
|
||||
|
||||
/* Drive letters */
|
||||
fill_drive_droplist( drive_available_mask( editWindowLetter ), editWindowLetter, hDlg );
|
||||
|
||||
/* path */
|
||||
path = getDriveValue(editWindowLetter, "Path");
|
||||
if (path) {
|
||||
SetWindowText(GetDlgItem(hDlg, IDC_EDIT_PATH), path);
|
||||
} else WINE_WARN("no Path field?\n");
|
||||
|
||||
/* drive type */
|
||||
type = getDriveValue(editWindowLetter, "Type");
|
||||
if (type) {
|
||||
for(i = 0, selection = -1; i < sizeof(type_pairs)/sizeof(code_desc_pair); i++) {
|
||||
SendDlgItemMessage(hDlg, IDC_COMBO_TYPE, CB_ADDSTRING, 0,
|
||||
(LPARAM) type_pairs[i].sDesc);
|
||||
if(strcasecmp(type_pairs[i].sCode, type) == 0){
|
||||
selection = i;
|
||||
}
|
||||
}
|
||||
|
||||
if( selection == -1 ) selection = DRIVE_TYPE_DEFAULT;
|
||||
SendDlgItemMessage(hDlg, IDC_COMBO_TYPE, CB_SETCURSEL, selection, 0);
|
||||
} else WINE_WARN("no Type field?\n");
|
||||
|
||||
|
||||
/* FileSystem name handling */
|
||||
fs = getDriveValue(editWindowLetter, "FileSystem");
|
||||
if (fs) {
|
||||
for( i=0, selection=-1; i < sizeof(fs_pairs)/sizeof(code_desc_pair); i++) {
|
||||
SendDlgItemMessage(hDlg, IDC_COMBO_NAMES, CB_ADDSTRING, 0,
|
||||
(LPARAM) fs_pairs[i].sDesc);
|
||||
if(strcasecmp(fs_pairs[i].sCode, fs) == 0){
|
||||
selection = i;
|
||||
}
|
||||
}
|
||||
|
||||
if( selection == -1 ) selection = DRIVE_FS_DEFAULT;
|
||||
SendDlgItemMessage(hDlg, IDC_COMBO_NAMES, CB_SETCURSEL, selection, 0);
|
||||
} else WINE_WARN("no FileSystem field?\n");
|
||||
|
||||
|
||||
/* removeable media properties */
|
||||
serial = getDriveValue(editWindowLetter, "Serial");
|
||||
if (serial) {
|
||||
SendDlgItemMessage(hDlg, IDC_EDIT_SERIAL, WM_SETTEXT, 0,(LPARAM)serial);
|
||||
} else WINE_WARN("no Serial field?\n");
|
||||
|
||||
label = getDriveValue(editWindowLetter, "Label");
|
||||
if (label) {
|
||||
SendDlgItemMessage(hDlg, IDC_EDIT_LABEL, WM_SETTEXT, 0,(LPARAM)label);
|
||||
} else WINE_WARN("no Label field?\n");
|
||||
|
||||
device = getDriveValue(editWindowLetter, "Device");
|
||||
if (device) {
|
||||
SendDlgItemMessage(hDlg, IDC_EDIT_DEVICE, WM_SETTEXT, 0,(LPARAM)device);
|
||||
} else WINE_WARN("no Device field?\n");
|
||||
|
||||
if( strcmp("cdrom", type) == 0 ||
|
||||
strcmp("floppy", type) == 0) {
|
||||
if( (strlen( device ) == 0) &&
|
||||
((strlen( serial ) > 0) || (strlen( label ) > 0)) ) {
|
||||
selection = IDC_RADIO_ASSIGN;
|
||||
}
|
||||
else {
|
||||
selection = IDC_RADIO_AUTODETECT;
|
||||
}
|
||||
|
||||
enable_labelserial_box( hDlg, 1 );
|
||||
}
|
||||
else {
|
||||
enable_labelserial_box( hDlg, 0 );
|
||||
selection = IDC_RADIO_ASSIGN;
|
||||
}
|
||||
|
||||
CheckRadioButton( hDlg, IDC_RADIO_AUTODETECT, IDC_RADIO_ASSIGN, selection );
|
||||
SendDlgItemMessage(hDlg, IDC_EDIT_PATH, WM_SETTEXT, 0,(LPARAM)path);
|
||||
|
||||
if (path) free(path);
|
||||
if (type) free(type);
|
||||
if (fs) free(fs);
|
||||
if (serial) free(serial);
|
||||
if (label) free(label);
|
||||
if (device) free(device);
|
||||
|
||||
updatingUI = FALSE;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK DriveEditDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int selection;
|
||||
|
||||
switch (uMsg) {
|
||||
case WM_INITDIALOG: {
|
||||
editWindowLetter = (char) lParam;
|
||||
refreshDriveEditDialog(hDlg);
|
||||
}
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDC_COMBO_TYPE:
|
||||
switch( HIWORD(wParam)) {
|
||||
case CBN_SELCHANGE:
|
||||
selection = SendDlgItemMessage( hDlg, IDC_COMBO_TYPE, CB_GETCURSEL, 0, 0);
|
||||
if( selection == 2 || selection == 3 ) { /* cdrom or floppy */
|
||||
enable_labelserial_box( hDlg, 1 );
|
||||
}
|
||||
else {
|
||||
enable_labelserial_box( hDlg, 0 );
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_BUTTON_OK: break;
|
||||
|
||||
/* Fall through. */
|
||||
|
||||
case ID_BUTTON_CANCEL:
|
||||
EndDialog(hDlg, wParam);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
INT_PTR CALLBACK
|
||||
DriveDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int selection = -1;
|
||||
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDC_LIST_DRIVES:
|
||||
switch( HIWORD( wParam ) )
|
||||
{
|
||||
case LBN_DBLCLK:
|
||||
selection = -1;
|
||||
switch (uMsg) {
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDC_LIST_DRIVES:
|
||||
switch(HIWORD( wParam )) {
|
||||
case LBN_DBLCLK:
|
||||
selection = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
case IDC_BUTTON_ADD:
|
||||
/* temporarily disabled, awaiting rewrite for transactional design (need to fill in defaults smartly, wizard?) */
|
||||
break;
|
||||
|
||||
case IDC_BUTTON_REMOVE:
|
||||
/* temporarily disabled, awaiting rewrite */
|
||||
break;
|
||||
}
|
||||
case IDC_BUTTON_ADD:
|
||||
if (HIWORD(wParam)==BN_CLICKED) {
|
||||
DRIVE_DESC* pDrive = malloc(sizeof(DRIVE_DESC));
|
||||
|
||||
/* adding a new drive */
|
||||
ZeroMemory(pDrive, sizeof(*pDrive));
|
||||
DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_DRIVE_EDIT2),
|
||||
NULL, (DLGPROC) DriveEditDlgProc, (LPARAM) pDrive );
|
||||
/* if pDrive is blank, free the memory, otherwise, add the pointer to HDPA and add to listbox */
|
||||
if (!(pDrive->szName[0]))
|
||||
free(pDrive);
|
||||
else {
|
||||
char DRIVE_NAME[7];
|
||||
int pos;
|
||||
|
||||
ZeroMemory(DRIVE_NAME,sizeof(DRIVE_NAME));
|
||||
strcat(DRIVE_NAME, "Drive \0");
|
||||
strncat(DRIVE_NAME, pDrive->szName, 1);
|
||||
pos = SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_ADDSTRING ,(WPARAM) -1, (LPARAM) DRIVE_NAME);
|
||||
SendMessageA(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_SETITEMDATA, pos, (LPARAM) pos);
|
||||
DPA_InsertPtr(config.pDrives, pos, pDrive);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IDC_BUTTON_EDIT:
|
||||
if (HIWORD(wParam)==BN_CLICKED) {
|
||||
int nItem = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_GETCURSEL, 0, 0);
|
||||
int i = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_GETITEMDATA, nItem, 0);
|
||||
DRIVE_DESC* pDrive = DPA_GetPtr(config.pDrives, i);
|
||||
|
||||
if (pDrive != NULL) {
|
||||
DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_DRIVE_EDIT2),
|
||||
NULL, (DLGPROC) DriveEditDlgProc, (LPARAM) pDrive );
|
||||
SetProp(hDlg, "PDRIVE", pDrive);
|
||||
WINE_TRACE("refreshing main dialog\n");
|
||||
initDriveDlg(hDlg);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IDC_BUTTON_REMOVE:
|
||||
if (HIWORD(wParam)==BN_CLICKED) {
|
||||
int nItem = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_GETCURSEL, 0, 0);
|
||||
SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_DELETESTRING, (WPARAM) nItem, (LPARAM) 0 );
|
||||
free(DPA_GetPtr(config.pDrives, nItem));
|
||||
}
|
||||
case IDC_BUTTON_EDIT:
|
||||
if (HIWORD(wParam) == BN_CLICKED) {
|
||||
int nItem = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_GETCURSEL, 0, 0);
|
||||
char letter = SendMessage(GetDlgItem(hDlg, IDC_LIST_DRIVES), LB_GETITEMDATA, nItem, 0);
|
||||
|
||||
DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_DRIVE_EDIT2), NULL, (DLGPROC) DriveEditDlgProc, (LPARAM) letter);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_NOTIFY: switch(((LPNMHDR)lParam)->code) {
|
||||
case PSN_KILLACTIVE:
|
||||
SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
|
||||
break;
|
||||
case PSN_APPLY:
|
||||
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
|
||||
break;
|
||||
case PSN_SETACTIVE:
|
||||
initDriveDlg (hDlg);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/** SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); */
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case WM_NOTIFY:
|
||||
switch(((LPNMHDR)lParam)->code)
|
||||
{
|
||||
case PSN_KILLACTIVE: {
|
||||
/* validate user info. Lets just assume everything is okay for now */
|
||||
SetWindowLong(hDlg, DWL_MSGRESULT, FALSE);
|
||||
}
|
||||
case PSN_APPLY: {
|
||||
/* should probably check everything is really all rosy :) */
|
||||
saveDriveDlgSettings (hDlg);
|
||||
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
|
||||
}
|
||||
case PSN_SETACTIVE: {
|
||||
if (!initialized)
|
||||
initDriveDlg (hDlg);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -36,8 +36,6 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
|
||||
|
||||
WINECFG_DESC config;
|
||||
|
||||
void CALLBACK
|
||||
PropSheetCallback (HWND hWnd, UINT uMsg, LPARAM lParam)
|
||||
{
|
||||
|
|
|
@ -61,17 +61,6 @@ typedef struct
|
|||
} APP_DESC;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char szName[MAX_NAME_LENGTH];
|
||||
char szPath[MAX_NAME_LENGTH];
|
||||
char szType[MAX_NAME_LENGTH];
|
||||
char szFS[MAX_NAME_LENGTH];
|
||||
char szLabel[MAX_NAME_LENGTH];
|
||||
char szDevice[MAX_NAME_LENGTH];
|
||||
char szSerial[MAX_NAME_LENGTH];
|
||||
} DRIVE_DESC;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char szX11Display[MAX_NAME_LENGTH];
|
||||
|
|
|
@ -179,157 +179,6 @@ HRESULT removeConfigValue(char *subkey, char *valueName) {
|
|||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Name : loadConfig
|
||||
* Description: Loads and populates a configuration structure
|
||||
* Parameters : pCfg
|
||||
* Returns : 0 on success, -1 otherwise
|
||||
*
|
||||
*/
|
||||
int loadConfig (WINECFG_DESC* pCfg)
|
||||
{
|
||||
const DLL_DESC *pDllDefaults;
|
||||
char buffer[MAX_PATH];
|
||||
char subKeyName[51];
|
||||
DWORD res, i, sizeOfSubKeyName = 50;
|
||||
|
||||
WINE_TRACE("\n");
|
||||
|
||||
return_if_fail( initialize() == 0 , 1 );
|
||||
|
||||
/* System Paths */
|
||||
/* getConfigValue(configKey, "Wine", "Windows", pCfg->szWinDir, MAX_PATH, "c:\\Windows");
|
||||
getConfigValue(configKey, "Wine", "System", pCfg->szWinSysDir, MAX_PATH, "c:\\Windows\\System");
|
||||
getConfigValue(configKey, "Wine", "Temp", pCfg->szWinTmpDir, MAX_PATH, "c:\\Windows\\Temp");
|
||||
getConfigValue(configKey, "Wine", "Profile", pCfg->szWinProfDir, MAX_PATH, "c:\\Windows\\Profiles\\Administrator");
|
||||
getConfigValue(configKey, "Wine", "Path", pCfg->szWinPath, MAX_PATH, "c:\\Windows;c:\\Windows\\System");
|
||||
*/
|
||||
/* Graphics driver */
|
||||
/* getConfigValue(configKey, "Wine", "GraphicsDriver", pCfg->szGraphDriver, MAX_NAME_LENGTH, "x11drv");
|
||||
*/
|
||||
/*
|
||||
* DLL defaults for all applications is built using
|
||||
* the default DLL structure
|
||||
*/
|
||||
/* for (pDllDefaults = getDLLDefaults (); *pDllDefaults->szName; pDllDefaults++)
|
||||
{
|
||||
DLL_DESC *pDll = malloc(sizeof(DLL_DESC));
|
||||
memcpy (pDll, pDllDefaults, sizeof(DLL_DESC));
|
||||
DPA_InsertPtr(pCfg->pDlls, INT_MAX, pDll);
|
||||
}
|
||||
*/
|
||||
|
||||
pCfg->sX11Drv.nTextCP = 0;
|
||||
pCfg->sX11Drv.nXVideoPort = 43;
|
||||
pCfg->sX11Drv.nDepth = 16;
|
||||
pCfg->sX11Drv.nManaged = 1;
|
||||
pCfg->sX11Drv.nDesktopSizeX = 640;
|
||||
pCfg->sX11Drv.nDesktopSizeY = 480;
|
||||
pCfg->sX11Drv.nDGA = 1;
|
||||
pCfg->sX11Drv.nXVidMode = 1;
|
||||
pCfg->sX11Drv.nTakeFocus = 1;
|
||||
pCfg->sX11Drv.nDXGrab = 0;
|
||||
pCfg->sX11Drv.nDoubleBuffered = 0;
|
||||
pCfg->sX11Drv.nSynchronous = 1;
|
||||
|
||||
|
||||
/*
|
||||
* Drive mappings
|
||||
*/
|
||||
/* pCfg->pDrives = DPA_Create(26);
|
||||
for (i = 0;
|
||||
RegEnumKeyExA(configKey, i, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS;
|
||||
++i, sizeOfSubKeyName=50) {
|
||||
HKEY hkDrive;
|
||||
DWORD returnType;
|
||||
char returnBuffer[MAX_NAME_LENGTH];
|
||||
DWORD sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
LONG r;
|
||||
|
||||
if (!strncmp("Drive ", subKeyName, 5)) {
|
||||
DRIVE_DESC *pDrive = malloc(sizeof(DRIVE_DESC));
|
||||
|
||||
WINE_TRACE("Loading %s\n", subKeyName);
|
||||
|
||||
ZeroMemory(pDrive, sizeof(*pDrive));
|
||||
sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
if (RegOpenKeyExA (configKey, subKeyName, 0, KEY_READ, &hkDrive) != ERROR_SUCCESS) {
|
||||
WINE_ERR("unable to open drive registry key");
|
||||
RegCloseKey(configKey);
|
||||
return 1;
|
||||
}
|
||||
|
||||
strncpy(pDrive->szName, &subKeyName[strlen(subKeyName)-1],1);
|
||||
if(pDrive->szName) {
|
||||
pDrive->szName[0] = toupper(pDrive->szName[0]);
|
||||
}
|
||||
|
||||
ZeroMemory(returnBuffer, sizeof(*returnBuffer));
|
||||
sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
r = RegQueryValueExA(hkDrive, "Label", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer);
|
||||
if (r == ERROR_SUCCESS) {
|
||||
strncpy(pDrive->szLabel, returnBuffer, sizeOfReturnBuffer);
|
||||
} else {
|
||||
WINE_WARN("pDrive->szLabel not loaded: %ld\n", r);
|
||||
}
|
||||
|
||||
ZeroMemory(returnBuffer, sizeof(*returnBuffer));
|
||||
sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
r = RegQueryValueExA(hkDrive, "Serial", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer);
|
||||
if (r == ERROR_SUCCESS) {
|
||||
strncpy(pDrive->szSerial, returnBuffer, sizeOfReturnBuffer);
|
||||
} else {
|
||||
WINE_WARN("pDrive->szSerial not loaded: %ld\n", r);
|
||||
}
|
||||
|
||||
|
||||
ZeroMemory(returnBuffer, sizeof(*returnBuffer));
|
||||
sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
r = RegQueryValueExA(hkDrive, "Type", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer);
|
||||
if (r == ERROR_SUCCESS) {
|
||||
strncpy(pDrive->szType, returnBuffer, sizeOfReturnBuffer);
|
||||
} else {
|
||||
WINE_WARN("pDrive->szType not loaded: %ld", r);
|
||||
}
|
||||
|
||||
ZeroMemory(returnBuffer, sizeof(*returnBuffer));
|
||||
sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
if (RegQueryValueExA(hkDrive, "Path", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer) == ERROR_SUCCESS) {
|
||||
strncpy(pDrive->szPath, returnBuffer, sizeOfReturnBuffer);
|
||||
} else {
|
||||
WINE_WARN("pDrive->szPath not loaded: %ld\n", GetLastError());
|
||||
}
|
||||
|
||||
ZeroMemory(returnBuffer, sizeof(*returnBuffer));
|
||||
sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
if (RegQueryValueExA(hkDrive, "FileSystem", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer) == ERROR_SUCCESS) {
|
||||
strncpy(pDrive->szFS, returnBuffer, sizeOfReturnBuffer);
|
||||
} else {
|
||||
WINE_WARN("pDrive->szFS not loaded: %ld\n", GetLastError());
|
||||
}
|
||||
|
||||
ZeroMemory(returnBuffer, sizeof(*returnBuffer));
|
||||
sizeOfReturnBuffer = sizeof(returnBuffer);
|
||||
if (RegQueryValueExA(hkDrive, "Device", NULL, &returnType, returnBuffer, &sizeOfReturnBuffer) == ERROR_SUCCESS) {
|
||||
strncpy(pDrive->szDevice, returnBuffer, sizeOfReturnBuffer);
|
||||
} else {
|
||||
WINE_WARN("pDrive->szDevice not found: %ld\n", GetLastError());
|
||||
}
|
||||
|
||||
if (DPA_InsertPtr(pCfg->pDrives, pCfg->driveCount, pDrive) == -1)
|
||||
WINE_ERR("Failed to insert pDrive into DPA\n");
|
||||
else
|
||||
pCfg->driveCount++;
|
||||
|
||||
}
|
||||
}
|
||||
WINE_TRACE("loaded %d drives\n", pCfg->driveCount);
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ========================================================================= */
|
||||
/* Transaction management code */
|
||||
|
||||
|
|
|
@ -79,48 +79,7 @@ void destroyTransaction(struct transaction *trans);
|
|||
|
||||
/* Initializes the transaction system */
|
||||
int initialize(void);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct structWineCfg
|
||||
{
|
||||
char szWinVer[MAX_VERSION_LENGTH];
|
||||
char szWinLook[MAX_VERSION_LENGTH];
|
||||
char szDOSVer[MAX_VERSION_LENGTH];
|
||||
|
||||
char szWinDir[MAX_PATH];
|
||||
char szWinSysDir[MAX_PATH];
|
||||
char szWinPath[MAX_PATH];
|
||||
char szWinTmpDir[MAX_PATH];
|
||||
char szWinProfDir[MAX_PATH];
|
||||
|
||||
char szGraphDriver[MAX_NAME_LENGTH];
|
||||
|
||||
HDPA pDlls;
|
||||
HDPA pApps;
|
||||
HDPA pDrives;
|
||||
|
||||
int driveCount;
|
||||
|
||||
X11DRV_DESC sX11Drv;
|
||||
} WINECFG_DESC;
|
||||
|
||||
extern WINECFG_DESC config;
|
||||
|
||||
WINECFG_DESC *allocConfig(void);
|
||||
int freeConfig(WINECFG_DESC *pCfg);
|
||||
|
||||
int loadConfig(WINECFG_DESC *pCfg);
|
||||
int saveConfig(const WINECFG_DESC *pCfg);
|
||||
extern HKEY configKey;
|
||||
|
||||
int setConfigValue (char *subkey, char *valueName, const char *value);
|
||||
char *getConfigValue (char *subkey, char *valueName, char *defaultResult);
|
||||
|
|
Loading…
Reference in New Issue