Module: wine Branch: master Commit: c9c328c12202385d9405517ed6311389d2a1b9bd URL: http://source.winehq.org/git/wine.git/?a=commit;h=c9c328c12202385d9405517ed6...
Author: Rob Shearman rob@codeweavers.com Date: Fri Jan 26 19:54:19 2007 +0000
credui: Implement CredUIParseUserName.
---
dlls/credui/credui.spec | 2 +- dlls/credui/credui_main.c | 55 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletions(-)
diff --git a/dlls/credui/credui.spec b/dlls/credui/credui.spec index ce54235..20146c7 100644 --- a/dlls/credui/credui.spec +++ b/dlls/credui/credui.spec @@ -4,7 +4,7 @@ @ stdcall CredUIConfirmCredentialsW(wstr long) @ stub CredUIInitControls @ stub CredUIParseUserNameA -@ stub CredUIParseUserNameW +@ stdcall CredUIParseUserNameW(wstr ptr long ptr long) @ stub CredUIPromptForCredentialsA @ stdcall CredUIPromptForCredentialsW(ptr wstr ptr long ptr long ptr long ptr long) @ stub CredUIReadSSOCredA diff --git a/dlls/credui/credui_main.c b/dlls/credui/credui_main.c index 6bd6330..5294b21 100644 --- a/dlls/credui/credui_main.c +++ b/dlls/credui/credui_main.c @@ -29,6 +29,7 @@ #include "credui_resources.h"
#include "wine/debug.h" +#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(credui);
@@ -177,3 +178,57 @@ DWORD WINAPI CredUIConfirmCredentialsW(P bConfirm ? "TRUE" : "FALSE"); return ERROR_SUCCESS; } + +/****************************************************************************** + * CredUIParseUserNameW [CREDUI.@] + */ +DWORD WINAPI CredUIParseUserNameW(PCWSTR pszUserName, PWSTR pszUser, + ULONG ulMaxUserChars, PWSTR pszDomain, + ULONG ulMaxDomainChars) +{ + PWSTR p; + + TRACE("(%s, %p, %d, %p, %d)\n", debugstr_w(pszUserName), pszUser, + ulMaxUserChars, pszDomain, ulMaxDomainChars); + + if (!pszUserName || !pszUser || !ulMaxUserChars || !pszDomain || + !ulMaxDomainChars) + return ERROR_INVALID_PARAMETER; + + /* FIXME: handle marshaled credentials */ + + p = strchrW(pszUserName, '\'); + if (p) + { + if (p - pszUserName > ulMaxDomainChars - 1) + return ERROR_INSUFFICIENT_BUFFER; + if (strlenW(p + 1) > ulMaxUserChars - 1) + return ERROR_INSUFFICIENT_BUFFER; + strcpyW(pszUser, p + 1); + memcpy(pszDomain, pszUserName, (p - pszUserName)*sizeof(WCHAR)); + pszDomain[p - pszUserName] = '\0'; + + return ERROR_SUCCESS; + } + + p = strrchrW(pszUserName, '@'); + if (p) + { + if (p + 1 - pszUserName > ulMaxUserChars - 1) + return ERROR_INSUFFICIENT_BUFFER; + if (strlenW(p + 1) > ulMaxDomainChars - 1) + return ERROR_INSUFFICIENT_BUFFER; + strcpyW(pszDomain, p + 1); + memcpy(pszUser, pszUserName, (p - pszUserName)*sizeof(WCHAR)); + pszUser[p - pszUserName] = '\0'; + + return ERROR_SUCCESS; + } + + if (strlenW(pszUserName) > ulMaxUserChars - 1) + return ERROR_INSUFFICIENT_BUFFER; + strcpyW(pszUser, pszUserName); + pszDomain[0] = '\0'; + + return ERROR_SUCCESS; +}