/* * WineCfg configuration management * * Copyright 2002 Jaco Greeff * Copyright 2003 Dimitrie O. Paun * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include #include WINE_DEFAULT_DEBUG_CHANNEL(winecfg); #include "winecfg.h" /***************************************************************************** */ WINECFG_DESC* allocConfig(void) { WINECFG_DESC* pWineCfg = malloc (sizeof (WINECFG_DESC)); if (!pWineCfg) goto fail; ZeroMemory(pWineCfg, sizeof(*pWineCfg)); pWineCfg->pDlls = DPA_Create(100); if (!pWineCfg->pDlls) goto fail; pWineCfg->pApps = DPA_Create(100); if (!pWineCfg->pApps) goto fail; return pWineCfg; fail: /* FIXME: do something nice */ printf("Out of memory"); exit(1); } /***************************************************************************** */ int freeConfig (WINECFG_DESC* pCfg) { int i; for (i = 0; i < pCfg->pDlls->nItemCount; i++) free (DPA_GetPtr(pCfg->pDlls, i)); DPA_Destroy(pCfg->pDlls); for (i = 0; i < pCfg->pApps->nItemCount; i++) free (DPA_GetPtr(pCfg->pApps, i)); DPA_Destroy(pCfg->pApps); free (pCfg); return 0; } /***************************************************************************** */ int GetConfigValueSZ (HKEY hCurrent, LPSTR subkey, LPSTR valueName, LPSTR RetVal, int length, LPSTR DefRes) { CHAR *buffer=NULL; DWORD dataLength=0; HKEY hSubKey=NULL; DWORD res; if( (res=RegOpenKeyEx( hCurrent, subkey, 0, KEY_ALL_ACCESS, &hSubKey )) !=ERROR_SUCCESS ) { if( res==ERROR_FILE_NOT_FOUND ) { WINE_TRACE("Value not present - using default\n"); strncpy( RetVal,DefRes,length); res=TRUE; } else { WINE_ERR("RegOpenKey failed on wine config key (%ld)\n", res); res=FALSE; } goto end; } res = RegQueryValueExA( hSubKey, valueName, NULL, NULL, NULL, &dataLength); if( res==ERROR_FILE_NOT_FOUND ) { WINE_TRACE("Value not present - using default\n"); strncpy( RetVal,DefRes,length); res=TRUE; goto end; } if( res!=ERROR_SUCCESS ) { WINE_ERR("Couldn't query value's length (%ld)\n", res ); res=FALSE; goto end; } buffer=malloc( dataLength ); if( buffer==NULL ) { WINE_ERR("Couldn't allocate %lu bytes for the value\n", dataLength ); res=FALSE; goto end; } RegQueryValueEx( hSubKey, valueName, NULL, NULL, (LPBYTE)buffer, &dataLength); strncpy( RetVal,buffer,length); free(buffer); end: if( hSubKey!=NULL ) RegCloseKey( hSubKey ); return res; } /***************************************************************************** * Name : loadConfig * Description: Loads and populates a configuration structure * Parameters : pCfg * Returns : 0 on success, -1 otherwise * * FIXME: We are supposed to load these values from the registry. * This is not active yet, so just setup some (hopefully) * sane defaults */ int loadConfig (WINECFG_DESC* pCfg) { const DLL_DESC *pDllDefaults; HKEY hSession=NULL; DWORD res; if( (res=RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config", 0, KEY_ALL_ACCESS, &hSession )) !=ERROR_SUCCESS ) { if( res==ERROR_FILE_NOT_FOUND ) WINE_ERR("Wine config key does not exist"); else WINE_ERR("RegOpenKey failed on wine config key (%ld)\n", res); res=FALSE; return 1; } /* Windows and DOS versions */ GetConfigValueSZ(hSession,"Version","Windows",pCfg->szWinVer,MAX_VERSION_LENGTH,"win95"); GetConfigValueSZ(hSession,"Version","DOS",pCfg->szDOSVer,MAX_VERSION_LENGTH,"6.22"); GetConfigValueSZ(hSession,"Tweak.Layout","WineLook",pCfg->szWinLook,MAX_VERSION_LENGTH,"win95"); /* System Paths */ GetConfigValueSZ(hSession,"Wine","Windows",pCfg->szWinDir,MAX_PATH,"c:\\Windows"); GetConfigValueSZ(hSession,"Wine","System",pCfg->szWinSysDir,MAX_PATH,"c:\\Windows\\System"); GetConfigValueSZ(hSession,"Wine","Temp",pCfg->szWinTmpDir,MAX_PATH,"c:\\Windows\\Temp"); GetConfigValueSZ(hSession,"Wine","Profile",pCfg->szWinProfDir,MAX_PATH,"c:\\Windows\\Profiles\\Administrator"); GetConfigValueSZ(hSession,"Wine","Path",pCfg->szWinPath,MAX_PATH,"c:\\Windows;c:\\Windows\\System"); /* Graphics driver */ GetConfigValueSZ(hSession,"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); } /* * Application defaults on a per application * level (if not set, this defaults to what * is already there) */ /* FIXME: TODO */ /* * X11Drv defaults */ strcpy(pCfg->sX11Drv.szX11Display, ":0.0"); pCfg->sX11Drv.nSysColors = 100; pCfg->sX11Drv.nPrivateMap = 0; pCfg->sX11Drv.nPerfect = 0; pCfg->sX11Drv.nDepth = 16; pCfg->sX11Drv.nManaged = 1; pCfg->sX11Drv.nDesktopSizeX = 640; pCfg->sX11Drv.nDesktopSizeY = 480; pCfg->sX11Drv.nDGA = 1; pCfg->sX11Drv.nXShm = 1; pCfg->sX11Drv.nXVidMode = 1; pCfg->sX11Drv.nTakeFocus = 1; pCfg->sX11Drv.nDXGrab = 0; pCfg->sX11Drv.nDoubleBuffered = 0; pCfg->sX11Drv.nTextCP = 0; pCfg->sX11Drv.nXVideoPort = 43; pCfg->sX11Drv.nSynchronous = 1; RegCloseKey( hSession ); return 0; } /***************************************************************************** * Name: saveConfig * Description: Stores the configuration structure * Parameters : pCfg * Returns : 0 on success, -1 otherwise * * FIXME: This is where we are to write the changes to the registry. * This is not setup yet, so do nothing and say ok. */ int saveConfig (const WINECFG_DESC* pCfg) { return 0; }