Author: winesync Date: Wed Mar 14 15:48:32 2007 New Revision: 26076
URL: http://svn.reactos.org/svn/reactos?rev=26076&view=rev Log: Autosyncing with Wine HEAD
Added: trunk/reactos/dll/win32/odbccp32/odbccp32.c (with props) trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild (with props) trunk/reactos/dll/win32/odbccp32/odbccp32.spec (with props) Modified: trunk/reactos/baseaddress.rbuild
Modified: trunk/reactos/baseaddress.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/baseaddress.rbuild?rev=2607... ============================================================================== --- trunk/reactos/baseaddress.rbuild (original) +++ trunk/reactos/baseaddress.rbuild Wed Mar 14 15:48:32 2007 @@ -94,6 +94,7 @@ <property name="BASEADDRESS_LSASRV" value="0x76540000" /> <property name="BASEADDRESS_MIDIMAP" value="0x76600000" /> <property name="BASEADDRESS_ODBC32" value="0x76660000" /> + <property name="BASEADDRESS_ODBCCP32" value="0x76380000" /> <property name="BASEADDRESS_WAVEMAP" value="0x76610000" /> <property name="BASEADDRESS_MPR" value="0x76620000" /> <property name="BASEADDRESS_SETUPAPI" value="0x76660000" />
Added: trunk/reactos/dll/win32/odbccp32/odbccp32.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/odbccp32/odbccp32... ============================================================================== --- trunk/reactos/dll/win32/odbccp32/odbccp32.c (added) +++ trunk/reactos/dll/win32/odbccp32/odbccp32.c Wed Mar 14 15:48:32 2007 @@ -1,0 +1,974 @@ +/* + * Implementation of the ODBC driver installer + * + * Copyright 2005 Mike McCormack for CodeWeavers + * Copyright 2005 Hans Leidekker + * Copyright 2007 Bill Medland + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <assert.h> +#include <stdarg.h> + +#define COBJMACROS +#define NONAMELESSUNION + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winnls.h" +#include "wine/debug.h" + +#include "odbcinst.h" + +WINE_DEFAULT_DEBUG_CHANNEL(odbc); + +/* Registry key names */ +static const WCHAR drivers_key[] = {'S','o','f','t','w','a','r','e','\','O','D','B','C','\','O','D','B','C','I','N','S','T','.','I','N','I','\','O','D','B','C',' ','D','r','i','v','e','r','s',0}; + +/* This config mode is known to be process-wide. + * MSDN documentation suggests that the value is hidden somewhere in the registry but I haven't found it yet. + * Although both the registry and the ODBC.ini files appear to be maintained together they are not maintained automatically through the registry's IniFileMapping. + */ +static UWORD config_mode = ODBC_BOTH_DSN; + +/* MSDN documentation suggests that the error subsystem handles errors 1 to 8 + * only and experimentation (Windows 2000) shows that the errors are process- + * wide so go for the simple solution; static arrays. + */ +static int num_errors; +static int error_code[8]; +static const WCHAR *error_msg[8]; +static const WCHAR odbc_error_general_err[] = {'G','e','n','e','r','a','l',' ','e','r','r','o','r',0}; +static const WCHAR odbc_error_invalid_buff_len[] = {'I','n','v','a','l','i','d',' ','b','u','f','f','e','r',' ','l','e','n','g','t','h',0}; +static const WCHAR odbc_error_component_not_found[] = {'C','o','m','p','o','n','e','n','t',' ','n','o','t',' ','f','o','u','n','d',0}; +static const WCHAR odbc_error_out_of_mem[] = {'O','u','t',' ','o','f',' ','m','e','m','o','r','y',0}; +static const WCHAR odbc_error_invalid_param_sequence[] = {'I','n','v','a','l','i','d',' ','p','a','r','a','m','e','t','e','r',' ','s','e','q','u','e','n','c','e',0}; + +/* Push an error onto the error stack, taking care of ranges etc. */ +static void push_error(int code, LPCWSTR msg) +{ + if (num_errors < sizeof error_code/sizeof error_code[0]) + { + error_code[num_errors] = code; + error_msg[num_errors] = msg; + num_errors++; + } +} + +/* Clear the error stack */ +static void clear_errors(void) +{ + num_errors = 0; +} + +BOOL WINAPI ODBCCPlApplet( LONG i, LONG j, LONG * p1, LONG * p2) +{ + clear_errors(); + FIXME( "( %d %d %p %p) : stub!\n", i, j, p1, p2); + return FALSE; +} + +static LPWSTR SQLInstall_strdup_multi(LPCSTR str) +{ + LPCSTR p; + LPWSTR ret = NULL; + DWORD len; + + if (!str) + return ret; + + for (p = str; *p; p += lstrlenA(p) + 1) + ; + + len = MultiByteToWideChar(CP_ACP, 0, str, p - str, NULL, 0 ); + ret = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, str, p - str, ret, len ); + ret[len] = 0; + + return ret; +} + +static LPWSTR SQLInstall_strdup(LPCSTR str) +{ + DWORD len; + LPWSTR ret = NULL; + + if (!str) + return ret; + + len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0 ); + ret = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len ); + + return ret; +} + +/* Convert the wide string or zero-length-terminated list of wide strings to a + * narrow string or zero-length-terminated list of narrow strings. + * Do not try to emulate windows undocumented excesses (e.g. adding a third \0 + * to a list) + * Arguments + * mode Indicates the sort of string. + * 1 denotes that the buffers contain strings terminated by a single nul + * character + * 2 denotes that the buffers contain zero-length-terminated lists + * (frequently erroneously referred to as double-null-terminated) + * buffer The narrow-character buffer into which to place the result. This + * must be a non-null pointer to the first element of a buffer whose + * length is passed in buffer_length. + * str The wide-character buffer containing the string or list of strings to + * be converted. str_length defines how many wide characters in the + * buffer are to be converted, including all desired terminating nul + * characters. + * str_length Effective length of str + * buffer_length Length of buffer + * returned_length A pointer to a variable that will receive the number of + * narrow characters placed into the buffer. This pointer + * may be NULL. + */ +static BOOL SQLInstall_narrow(int mode, LPSTR buffer, LPCWSTR str, WORD str_length, WORD buffer_length, WORD *returned_length) +{ + LPSTR pbuf; /* allows us to allocate a temporary buffer only if needed */ + int len; /* Length of the converted list */ + BOOL success = FALSE; + assert(mode == 1 || mode == 2); + assert(buffer_length); + len = WideCharToMultiByte(CP_ACP, 0, str, str_length, 0, 0, NULL, NULL); + if (len > 0) + { + if (len > buffer_length) + { + pbuf = HeapAlloc(GetProcessHeap(), 0, len); + } + else + { + pbuf = buffer; + } + len = WideCharToMultiByte(CP_ACP, 0, str, str_length, pbuf, len, NULL, NULL); + if (len > 0) + { + if (pbuf != buffer) + { + if (buffer_length > (mode - 1)) + { + memcpy (buffer, pbuf, buffer_length-mode); + *(buffer+buffer_length-mode) = '\0'; + } + *(buffer+buffer_length-1) = '\0'; + } + if (returned_length) + { + *returned_length = pbuf == buffer ? len : buffer_length; + } + success = TRUE; + } + else + { + ERR("transferring wide to narrow\n"); + } + if (pbuf != buffer) + { + HeapFree(GetProcessHeap(), 0, pbuf); + } + } + else + { + ERR("measuring wide to narrow\n"); + } + return success; +} + +BOOL WINAPI SQLConfigDataSourceW(HWND hwndParent, WORD fRequest, + LPCWSTR lpszDriver, LPCWSTR lpszAttributes) +{ + LPCWSTR p; + + clear_errors(); + FIXME("%p %d %s %s\n", hwndParent, fRequest, debugstr_w(lpszDriver), + debugstr_w(lpszAttributes)); + + for (p = lpszAttributes; *p; p += lstrlenW(p) + 1) + FIXME("%s\n", debugstr_w(p)); + + return TRUE; +} + +BOOL WINAPI SQLConfigDataSource(HWND hwndParent, WORD fRequest, + LPCSTR lpszDriver, LPCSTR lpszAttributes) +{ + FIXME("%p %d %s %s\n", hwndParent, fRequest, debugstr_a(lpszDriver), + debugstr_a(lpszAttributes)); + clear_errors(); + return TRUE; +} + +BOOL WINAPI SQLConfigDriverW(HWND hwndParent, WORD fRequest, LPCWSTR lpszDriver, + LPCWSTR lpszArgs, LPWSTR lpszMsg, WORD cbMsgMax, WORD *pcbMsgOut) +{ + clear_errors(); + FIXME("(%p %d %s %s %p %d %p)\n", hwndParent, fRequest, debugstr_w(lpszDriver), + debugstr_w(lpszArgs), lpszMsg, cbMsgMax, pcbMsgOut); + return TRUE; +} + +BOOL WINAPI SQLConfigDriver(HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, + LPCSTR lpszArgs, LPSTR lpszMsg, WORD cbMsgMax, WORD *pcbMsgOut) +{ + clear_errors(); + FIXME("(%p %d %s %s %p %d %p)\n", hwndParent, fRequest, debugstr_a(lpszDriver), + debugstr_a(lpszArgs), lpszMsg, cbMsgMax, pcbMsgOut); + return TRUE; +} + +BOOL WINAPI SQLCreateDataSourceW(HWND hwnd, LPCWSTR lpszDS) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLCreateDataSource(HWND hwnd, LPCSTR lpszDS) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLGetAvailableDriversW(LPCWSTR lpszInfFile, LPWSTR lpszBuf, + WORD cbBufMax, WORD *pcbBufOut) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLGetAvailableDrivers(LPCSTR lpszInfFile, LPSTR lpszBuf, + WORD cbBufMax, WORD *pcbBufOut) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLGetConfigMode(UWORD *pwConfigMode) +{ + clear_errors(); + if (pwConfigMode) + *pwConfigMode = config_mode; + return TRUE; +} + +/* This is implemented sensibly rather than according to exact conformance to Microsoft's buggy implementations + * e.g. The Microsoft one occasionally actually adds a third nul character (possibly beyond the buffer). + * e.g. If the key has no drivers then version 3.525.1117.0 does not modify the buffer at all, not even a nul character. + */ +BOOL WINAPI SQLGetInstalledDriversW(LPWSTR lpszBuf, WORD cbBufMax, + WORD *pcbBufOut) +{ + HKEY hDrivers; /* Registry handle to the Drivers key */ + LONG reg_ret; /* Return code from registry functions */ + BOOL success = FALSE; /* The value we will return */ + + clear_errors(); + if (!lpszBuf || cbBufMax == 0) + { + push_error(ODBC_ERROR_INVALID_BUFF_LEN, odbc_error_invalid_buff_len); + } + else if ((reg_ret = RegOpenKeyExW (HKEY_LOCAL_MACHINE /* The drivers does not depend on the config mode */, + drivers_key, 0, KEY_READ /* Maybe overkill */, + &hDrivers)) == ERROR_SUCCESS) + { + DWORD index = 0; + cbBufMax--; + success = TRUE; + while (cbBufMax > 0) + { + DWORD size_name; + size_name = cbBufMax; + if ((reg_ret = RegEnumValueW(hDrivers, index, lpszBuf, &size_name, NULL, NULL, NULL, NULL)) == ERROR_SUCCESS) + { + index++; + assert (size_name < cbBufMax && *(lpszBuf + size_name) == 0); + size_name++; + cbBufMax-= size_name; + lpszBuf+=size_name; + } + else + { + if (reg_ret != ERROR_NO_MORE_ITEMS) + { + success = FALSE; + push_error(ODBC_ERROR_GENERAL_ERR, odbc_error_general_err); + } + break; + } + } + *lpszBuf = 0; + if ((reg_ret = RegCloseKey (hDrivers)) != ERROR_SUCCESS) + TRACE ("Error %d closing ODBC Drivers key\n", reg_ret); + } + else + { + /* MSDN states that it returns failure with COMPONENT_NOT_FOUND in this case. + * Version 3.525.1117.0 (Windows 2000) does not; it actually returns success. + * I doubt if it will actually be an issue. + */ + push_error(ODBC_ERROR_COMPONENT_NOT_FOUND, odbc_error_component_not_found); + } + return success; +} + +BOOL WINAPI SQLGetInstalledDrivers(LPSTR lpszBuf, WORD cbBufMax, + WORD *pcbBufOut) +{ + BOOL ret; + int size_wbuf = cbBufMax; + LPWSTR wbuf; + WORD size_used; + wbuf = HeapAlloc(GetProcessHeap(), 0, size_wbuf*sizeof(WCHAR)); + if (wbuf) + { + ret = SQLGetInstalledDriversW(wbuf, size_wbuf, &size_used); + if (ret) + { + if (!(ret = SQLInstall_narrow(2, lpszBuf, wbuf, size_used, cbBufMax, pcbBufOut))) + { + push_error(ODBC_ERROR_GENERAL_ERR, odbc_error_general_err); + } + } + HeapFree(GetProcessHeap(), 0, wbuf); + /* ignore failure; we have achieved the aim */ + } + else + { + push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); + ret = FALSE; + } + return ret; +} + +int WINAPI SQLGetPrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry, + LPCWSTR lpszDefault, LPCWSTR RetBuffer, int cbRetBuffer, + LPCWSTR lpszFilename) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +int WINAPI SQLGetPrivateProfileString(LPCSTR lpszSection, LPCSTR lpszEntry, + LPCSTR lpszDefault, LPCSTR RetBuffer, int cbRetBuffer, + LPCSTR lpszFilename) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLGetTranslatorW(HWND hwndParent, LPWSTR lpszName, WORD cbNameMax, + WORD *pcbNameOut, LPWSTR lpszPath, WORD cbPathMax, + WORD *pcbPathOut, DWORD *pvOption) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLGetTranslator(HWND hwndParent, LPSTR lpszName, WORD cbNameMax, + WORD *pcbNameOut, LPSTR lpszPath, WORD cbPathMax, + WORD *pcbPathOut, DWORD *pvOption) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLInstallDriverW(LPCWSTR lpszInfFile, LPCWSTR lpszDriver, + LPWSTR lpszPath, WORD cbPathMax, WORD * pcbPathOut) +{ + DWORD usage; + + clear_errors(); + TRACE("%s %s %p %d %p\n", debugstr_w(lpszInfFile), + debugstr_w(lpszDriver), lpszPath, cbPathMax, pcbPathOut); + + if (lpszInfFile) + return FALSE; + + return SQLInstallDriverExW(lpszDriver, NULL, lpszPath, cbPathMax, + pcbPathOut, ODBC_INSTALL_COMPLETE, &usage); +} + +BOOL WINAPI SQLInstallDriver(LPCSTR lpszInfFile, LPCSTR lpszDriver, + LPSTR lpszPath, WORD cbPathMax, WORD * pcbPathOut) +{ + DWORD usage; + + clear_errors(); + TRACE("%s %s %p %d %p\n", debugstr_a(lpszInfFile), + debugstr_a(lpszDriver), lpszPath, cbPathMax, pcbPathOut); + + if (lpszInfFile) + return FALSE; + + return SQLInstallDriverEx(lpszDriver, NULL, lpszPath, cbPathMax, + pcbPathOut, ODBC_INSTALL_COMPLETE, &usage); +} + +BOOL WINAPI SQLInstallDriverExW(LPCWSTR lpszDriver, LPCWSTR lpszPathIn, + LPWSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut, + WORD fRequest, LPDWORD lpdwUsageCount) +{ + UINT len; + LPCWSTR p; + WCHAR path[MAX_PATH]; + + clear_errors(); + TRACE("%s %s %p %d %p %d %p\n", debugstr_w(lpszDriver), + debugstr_w(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut, + fRequest, lpdwUsageCount); + + for (p = lpszDriver; *p; p += lstrlenW(p) + 1) + TRACE("%s\n", debugstr_w(p)); + + len = GetSystemDirectoryW(path, MAX_PATH); + + if (pcbPathOut) + *pcbPathOut = len; + + len = GetSystemDirectoryW(path, MAX_PATH); + + if (lpszPathOut && cbPathOutMax > len) + { + lstrcpyW(lpszPathOut, path); + return TRUE; + } + return FALSE; +} + +BOOL WINAPI SQLInstallDriverEx(LPCSTR lpszDriver, LPCSTR lpszPathIn, + LPSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut, + WORD fRequest, LPDWORD lpdwUsageCount) +{ + LPCSTR p; + LPWSTR driver, pathin; + WCHAR pathout[MAX_PATH]; + BOOL ret; + WORD cbOut = 0; + + clear_errors(); + TRACE("%s %s %p %d %p %d %p\n", debugstr_a(lpszDriver), + debugstr_a(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut, + fRequest, lpdwUsageCount); + + for (p = lpszDriver; *p; p += lstrlenA(p) + 1) + TRACE("%s\n", debugstr_a(p)); + + driver = SQLInstall_strdup_multi(lpszDriver); + pathin = SQLInstall_strdup(lpszPathIn); + + ret = SQLInstallDriverExW(driver, pathin, pathout, MAX_PATH, &cbOut, + fRequest, lpdwUsageCount); + if (ret) + { + int len = WideCharToMultiByte(CP_ACP, 0, pathout, -1, lpszPathOut, + 0, NULL, NULL); + if (len) + { + if (pcbPathOut) + *pcbPathOut = len - 1; + + if (!lpszPathOut || cbPathOutMax < len) + { + ret = FALSE; + goto out; + } + len = WideCharToMultiByte(CP_ACP, 0, pathout, -1, lpszPathOut, + cbPathOutMax, NULL, NULL); + } + } + +out: + HeapFree(GetProcessHeap(), 0, driver); + HeapFree(GetProcessHeap(), 0, pathin); + return ret; +} + +BOOL WINAPI SQLInstallDriverManagerW(LPWSTR lpszPath, WORD cbPathMax, + WORD *pcbPathOut) +{ + UINT len; + WCHAR path[MAX_PATH]; + + clear_errors(); + TRACE("(%p %d %d)\n", lpszPath, cbPathMax, *pcbPathOut); + + len = GetSystemDirectoryW(path, MAX_PATH); + + if (pcbPathOut) + *pcbPathOut = len; + + if (lpszPath && cbPathMax > len) + { + lstrcpyW(lpszPath, path); + return TRUE; + } + return FALSE; +} + +BOOL WINAPI SQLInstallDriverManager(LPSTR lpszPath, WORD cbPathMax, + WORD *pcbPathOut) +{ + BOOL ret; + WORD len, cbOut = 0; + WCHAR path[MAX_PATH]; + + clear_errors(); + TRACE("(%p %d %d)\n", lpszPath, cbPathMax, *pcbPathOut); + + ret = SQLInstallDriverManagerW(path, MAX_PATH, &cbOut); + if (ret) + { + len = WideCharToMultiByte(CP_ACP, 0, path, -1, lpszPath, 0, + NULL, NULL); + if (len) + { + if (pcbPathOut) + *pcbPathOut = len - 1; + + if (!lpszPath || cbPathMax < len) + return FALSE; + + len = WideCharToMultiByte(CP_ACP, 0, path, -1, lpszPath, + cbPathMax, NULL, NULL); + } + } + return ret; +} + +BOOL WINAPI SQLInstallODBCW(HWND hwndParent, LPCWSTR lpszInfFile, + LPCWSTR lpszSrcPath, LPCWSTR lpszDrivers) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLInstallODBC(HWND hwndParent, LPCSTR lpszInfFile, + LPCSTR lpszSrcPath, LPCSTR lpszDrivers) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +SQLRETURN WINAPI SQLInstallerErrorW(WORD iError, DWORD *pfErrorCode, + LPWSTR lpszErrorMsg, WORD cbErrorMsgMax, WORD *pcbErrorMsg) +{ + TRACE("%d %p %p %d %p\n", iError, pfErrorCode, lpszErrorMsg, + cbErrorMsgMax, pcbErrorMsg); + + if (iError == 0) + { + return SQL_ERROR; + } + else if (iError <= num_errors) + { + BOOL truncated = FALSE; + WORD len; + LPCWSTR msg; + iError--; + if (pfErrorCode) + *pfErrorCode = error_code[iError]; + msg = error_msg[iError]; + len = msg ? lstrlenW(msg) : 0; + if (pcbErrorMsg) + *pcbErrorMsg = len; + len++; + if (cbErrorMsgMax < len) + { + len = cbErrorMsgMax; + truncated = TRUE; + } + if (lpszErrorMsg && len) + { + if (msg) + { + memcpy (lpszErrorMsg, msg, len * sizeof(WCHAR)); + } + else + { + assert(len==1); + *lpszErrorMsg = 0; + } + } + else + { + /* Yes. If you pass a null pointer and a large length it is not an error! */ + truncated = TRUE; + } + + return truncated ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS; + } + + /* At least on Windows 2000 , the buffers are not altered in this case. However that is a little too dangerous a test for just now */ + if (pcbErrorMsg) + *pcbErrorMsg = 0; + + if (lpszErrorMsg && cbErrorMsgMax > 0) + *lpszErrorMsg = '\0'; + + return SQL_NO_DATA; +} + +SQLRETURN WINAPI SQLInstallerError(WORD iError, DWORD *pfErrorCode, + LPSTR lpszErrorMsg, WORD cbErrorMsgMax, WORD *pcbErrorMsg) +{ + SQLRETURN ret; + LPWSTR wbuf; + WORD cbwbuf; + TRACE("%d %p %p %d %p\n", iError, pfErrorCode, lpszErrorMsg, + cbErrorMsgMax, pcbErrorMsg); + + wbuf = 0; + if (lpszErrorMsg && cbErrorMsgMax) + { + wbuf = HeapAlloc(GetProcessHeap(), 0, cbErrorMsgMax*sizeof(WCHAR)); + if (!wbuf) + return SQL_ERROR; + } + ret = SQLInstallerErrorW(iError, pfErrorCode, wbuf, cbErrorMsgMax, &cbwbuf); + if (wbuf) + { + WORD cbBuf = 0; + SQLInstall_narrow(1, lpszErrorMsg, wbuf, cbwbuf+1, cbErrorMsgMax, &cbBuf); + HeapFree(GetProcessHeap(), 0, wbuf); + if (pcbErrorMsg) + *pcbErrorMsg = cbBuf-1; + } + return ret; +} + +BOOL WINAPI SQLInstallTranslatorExW(LPCWSTR lpszTranslator, LPCWSTR lpszPathIn, + LPWSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut, + WORD fRequest, LPDWORD lpdwUsageCount) +{ + UINT len; + LPCWSTR p; + WCHAR path[MAX_PATH]; + + clear_errors(); + TRACE("%s %s %p %d %p %d %p\n", debugstr_w(lpszTranslator), + debugstr_w(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut, + fRequest, lpdwUsageCount); + + for (p = lpszTranslator; *p; p += lstrlenW(p) + 1) + TRACE("%s\n", debugstr_w(p)); + + len = GetSystemDirectoryW(path, MAX_PATH); + + if (pcbPathOut) + *pcbPathOut = len; + + if (lpszPathOut && cbPathOutMax > len) + { + lstrcpyW(lpszPathOut, path); + return TRUE; + } + return FALSE; +} + +BOOL WINAPI SQLInstallTranslatorEx(LPCSTR lpszTranslator, LPCSTR lpszPathIn, + LPSTR lpszPathOut, WORD cbPathOutMax, WORD *pcbPathOut, + WORD fRequest, LPDWORD lpdwUsageCount) +{ + LPCSTR p; + LPWSTR translator, pathin; + WCHAR pathout[MAX_PATH]; + BOOL ret; + WORD cbOut = 0; + + clear_errors(); + TRACE("%s %s %p %d %p %d %p\n", debugstr_a(lpszTranslator), + debugstr_a(lpszPathIn), lpszPathOut, cbPathOutMax, pcbPathOut, + fRequest, lpdwUsageCount); + + for (p = lpszTranslator; *p; p += lstrlenA(p) + 1) + TRACE("%s\n", debugstr_a(p)); + + translator = SQLInstall_strdup_multi(lpszTranslator); + pathin = SQLInstall_strdup(lpszPathIn); + + ret = SQLInstallTranslatorExW(translator, pathin, pathout, MAX_PATH, + &cbOut, fRequest, lpdwUsageCount); + if (ret) + { + int len = WideCharToMultiByte(CP_ACP, 0, pathout, -1, lpszPathOut, + 0, NULL, NULL); + if (len) + { + if (pcbPathOut) + *pcbPathOut = len - 1; + + if (!lpszPathOut || cbPathOutMax < len) + { + ret = FALSE; + goto out; + } + len = WideCharToMultiByte(CP_ACP, 0, pathout, -1, lpszPathOut, + cbPathOutMax, NULL, NULL); + } + } + +out: + HeapFree(GetProcessHeap(), 0, translator); + HeapFree(GetProcessHeap(), 0, pathin); + return ret; +} + +BOOL WINAPI SQLInstallTranslator(LPCSTR lpszInfFile, LPCSTR lpszTranslator, + LPCSTR lpszPathIn, LPSTR lpszPathOut, WORD cbPathOutMax, + WORD *pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount) +{ + clear_errors(); + TRACE("%s %s %s %p %d %p %d %p\n", debugstr_a(lpszInfFile), + debugstr_a(lpszTranslator), debugstr_a(lpszPathIn), lpszPathOut, + cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount); + + if (lpszInfFile) + return FALSE; + + return SQLInstallTranslatorEx(lpszTranslator, lpszPathIn, lpszPathOut, + cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount); +} + +BOOL WINAPI SQLInstallTranslatorW(LPCWSTR lpszInfFile, LPCWSTR lpszTranslator, + LPCWSTR lpszPathIn, LPWSTR lpszPathOut, WORD cbPathOutMax, + WORD *pcbPathOut, WORD fRequest, LPDWORD lpdwUsageCount) +{ + clear_errors(); + TRACE("%s %s %s %p %d %p %d %p\n", debugstr_w(lpszInfFile), + debugstr_w(lpszTranslator), debugstr_w(lpszPathIn), lpszPathOut, + cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount); + + if (lpszInfFile) + return FALSE; + + return SQLInstallTranslatorExW(lpszTranslator, lpszPathIn, lpszPathOut, + cbPathOutMax, pcbPathOut, fRequest, lpdwUsageCount); +} + +BOOL WINAPI SQLManageDataSources(HWND hwnd) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +SQLRETURN WINAPI SQLPostInstallerErrorW(DWORD fErrorCode, LPCWSTR szErrorMsg) +{ + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +SQLRETURN WINAPI SQLPostInstallerError(DWORD fErrorCode, LPCSTR szErrorMsg) +{ + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLReadFileDSNW(LPCWSTR lpszFileName, LPCWSTR lpszAppName, + LPCWSTR lpszKeyName, LPWSTR lpszString, WORD cbString, + WORD *pcbString) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLReadFileDSN(LPCSTR lpszFileName, LPCSTR lpszAppName, + LPCSTR lpszKeyName, LPSTR lpszString, WORD cbString, + WORD *pcbString) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLRemoveDefaultDataSource(void) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLRemoveDriverW(LPCWSTR lpszDriver, BOOL fRemoveDSN, + LPDWORD lpdwUsageCount) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLRemoveDriver(LPCSTR lpszDriver, BOOL fRemoveDSN, + LPDWORD lpdwUsageCount) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLRemoveDriverManager(LPDWORD pdwUsageCount) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLRemoveDSNFromIniW(LPCWSTR lpszDSN) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLRemoveDSNFromIni(LPCSTR lpszDSN) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLRemoveTranslatorW(LPCWSTR lpszTranslator, LPDWORD lpdwUsageCount) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLRemoveTranslator(LPCSTR lpszTranslator, LPDWORD lpdwUsageCount) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLSetConfigMode(UWORD wConfigMode) +{ + clear_errors(); + if (wConfigMode > ODBC_SYSTEM_DSN) + { + push_error(ODBC_ERROR_INVALID_PARAM_SEQUENCE, odbc_error_invalid_param_sequence); + return FALSE; + } + else + { + config_mode = wConfigMode; + return TRUE; + } +} + +BOOL WINAPI SQLValidDSNW(LPCWSTR lpszDSN) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLValidDSN(LPCSTR lpszDSN) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLWriteDSNToIniW(LPCWSTR lpszDSN, LPCWSTR lpszDriver) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLWriteDSNToIni(LPCSTR lpszDSN, LPCSTR lpszDriver) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLWriteFileDSNW(LPCWSTR lpszFileName, LPCWSTR lpszAppName, + LPCWSTR lpszKeyName, LPCWSTR lpszString) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLWriteFileDSN(LPCSTR lpszFileName, LPCSTR lpszAppName, + LPCSTR lpszKeyName, LPCSTR lpszString) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry, + LPCWSTR lpszString, LPCWSTR lpszFilename) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +BOOL WINAPI SQLWritePrivateProfileString(LPCSTR lpszSection, LPCSTR lpszEntry, + LPCSTR lpszString, LPCSTR lpszFilename) +{ + clear_errors(); + FIXME("\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +}
Propchange: trunk/reactos/dll/win32/odbccp32/odbccp32.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/odbccp32/odbccp32... ============================================================================== --- trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild (added) +++ trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild Wed Mar 14 15:48:32 2007 @@ -1,0 +1,19 @@ +<module name="odbccp32" type="win32dll" baseaddress="${BASEADDRESS_ODBCCP32}" installbase="system32" installname="odbccp32.dll" allowwarnings="true"> + <importlibrary definition="odbccp32.spec.def" /> + <include base="odbccp32">.</include> + <include base="ReactOS">include/reactos/wine</include> + <define name="__REACTOS__" /> + <define name="__WINESRC__" /> + <define name="__USE_W32API" /> + <define name="_WIN32_IE">0x600</define> + <define name="_WIN32_WINNT">0x501</define> + <define name="WINVER">0x501</define> + <library>wine</library> + <library>ole32</library> + <library>advapi32</library> + <library>kernel32</library> + <library>uuid</library> + <library>ntdll</library> + <file>odbccp32.c</file> + <file>odbccp32.spec</file> +</module>
Propchange: trunk/reactos/dll/win32/odbccp32/odbccp32.rbuild ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/reactos/dll/win32/odbccp32/odbccp32.spec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/odbccp32/odbccp32... ============================================================================== --- trunk/reactos/dll/win32/odbccp32/odbccp32.spec (added) +++ trunk/reactos/dll/win32/odbccp32/odbccp32.spec Wed Mar 14 15:48:32 2007 @@ -1,0 +1,57 @@ +@ stdcall ODBCCPlApplet( long long ptr ptr) +@ stdcall SQLConfigDataSource(ptr long wstr wstr) +@ stdcall SQLConfigDataSourceW(ptr long str str) +@ stdcall SQLConfigDriver(ptr long str str ptr long ptr) +@ stdcall SQLConfigDriverW(ptr long wstr wstr ptr long ptr) +@ stdcall SQLCreateDataSource(ptr str) +@ stub SQLCreateDataSourceEx +@ stub SQLCreateDataSourceExW +@ stdcall SQLCreateDataSourceW(ptr wstr) +@ stdcall SQLGetAvailableDrivers(str ptr long ptr) +@ stdcall SQLGetAvailableDriversW(wstr ptr long ptr) +@ stdcall SQLGetConfigMode(ptr) +@ stdcall SQLGetInstalledDrivers(str long ptr) +@ stdcall SQLGetInstalledDriversW(wstr long ptr) +@ stdcall SQLGetPrivateProfileString(str str str str long str) +@ stdcall SQLGetPrivateProfileStringW(wstr wstr wstr wstr long wstr) +@ stdcall SQLGetTranslator(ptr str long ptr ptr long ptr ptr) +@ stdcall SQLGetTranslatorW(ptr wstr long ptr ptr long ptr ptr) +@ stdcall SQLInstallDriver(str str str long ptr) +@ stdcall SQLInstallDriverEx(str str str long ptr long ptr) +@ stdcall SQLInstallDriverExW(wstr wstr wstr long ptr long ptr) +@ stdcall SQLInstallDriverManager(ptr long ptr) +@ stdcall SQLInstallDriverManagerW(ptr long ptr) +@ stdcall SQLInstallDriverW(wstr wstr wstr long ptr) +@ stdcall SQLInstallODBC(ptr str str str) +@ stdcall SQLInstallODBCW(ptr wstr wstr wstr) +@ stdcall SQLInstallTranslator(str str str ptr long ptr long ptr) +@ stdcall SQLInstallTranslatorEx(str str ptr long ptr long ptr) +@ stdcall SQLInstallTranslatorExW(wstr wstr ptr long ptr long ptr) +@ stdcall SQLInstallTranslatorW(wstr wstr wstr ptr long ptr long ptr) +@ stdcall SQLInstallerError(long ptr ptr long ptr) +@ stdcall SQLInstallerErrorW(long ptr ptr long ptr) +@ stub SQLLoadDataSourcesListBox +@ stub SQLLoadDriverListBox +@ stdcall SQLManageDataSources(ptr) +@ stdcall SQLPostInstallerError(long ptr) +@ stdcall SQLPostInstallerErrorW(long ptr) +@ stdcall SQLReadFileDSN(str str str ptr long ptr) +@ stdcall SQLReadFileDSNW(wstr wstr wstr ptr long ptr) +@ stdcall SQLRemoveDSNFromIni(str) +@ stdcall SQLRemoveDSNFromIniW(wstr) +@ stdcall SQLRemoveDefaultDataSource() +@ stdcall SQLRemoveDriver(str long ptr) +@ stdcall SQLRemoveDriverManager(ptr) +@ stdcall SQLRemoveDriverW(wstr long ptr) +@ stdcall SQLRemoveTranslator(str ptr) +@ stdcall SQLRemoveTranslatorW(wstr ptr) +@ stdcall SQLSetConfigMode(long) +@ stdcall SQLValidDSN(str) +@ stdcall SQLValidDSNW(wstr) +@ stdcall SQLWriteDSNToIni(str str) +@ stdcall SQLWriteDSNToIniW(wstr wstr) +@ stdcall SQLWriteFileDSN(str str str str) +@ stdcall SQLWriteFileDSNW(wstr wstr wstr wstr) +@ stdcall SQLWritePrivateProfileString(str str str str) +@ stdcall SQLWritePrivateProfileStringW(wstr wstr wstr wstr) +@ stub SelectTransDlg
Propchange: trunk/reactos/dll/win32/odbccp32/odbccp32.spec ------------------------------------------------------------------------------ svn:eol-style = native