Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389/* * PROJECT: ReactOS api tests * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory * PURPOSE: Test for SHLimitInputEdit * PROGRAMMER: Katayama Hirofumi MZ */
#include "shelltest.h"#include <shobjidl.h>#include <shlwapi.h>
class CShellFolder : public IShellFolder , public IItemNameLimits{public: LONG m_cRefs;
CShellFolder(INT iMaxNameLen = 0, BOOL bDisabled = FALSE) : m_cRefs(1) , m_iMaxNameLen(iMaxNameLen) , m_bDisabled(bDisabled) { trace("CShellFolder\n"); }
virtual ~CShellFolder() { trace("~CShellFolder\n"); }
/*** IUnknown methods ***/
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release();
/*** IShellFolder methods ***/
STDMETHODIMP ParseDisplayName( HWND hwnd, IBindCtx *pbc, LPWSTR pszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) { trace("ParseDisplayName\n"); return E_NOTIMPL; }
STDMETHODIMP EnumObjects( HWND hwnd, SHCONTF grfFlags, IEnumIDList **ppenumIDList) { trace("EnumObjects\n"); return E_NOTIMPL; }
STDMETHODIMP BindToObject( PCUIDLIST_RELATIVE pidl, IBindCtx *pbc, REFIID riid, void **ppv) { trace("BindToObject\n"); return E_NOTIMPL; }
STDMETHODIMP BindToStorage( PCUIDLIST_RELATIVE pidl, IBindCtx *pbc, REFIID riid, void **ppv) { trace("BindToStorage\n"); return E_NOTIMPL; }
STDMETHODIMP CompareIDs( LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { trace("CompareIDs\n"); return E_NOTIMPL; }
STDMETHODIMP CreateViewObject( HWND hwndOwner, REFIID riid, void **ppv) { trace("CreateViewObject\n"); return E_NOTIMPL; }
STDMETHODIMP GetAttributesOf( UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut) { trace("GetAttributesOf\n"); return E_NOTIMPL; }
STDMETHODIMP GetUIObjectOf( HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *rgfReserved, void **ppv) { trace("GetUIObjectOf\n"); return E_NOTIMPL; }
STDMETHODIMP GetDisplayNameOf( PCUITEMID_CHILD pidl, SHGDNF uFlags, STRRET *pName) { trace("GetDisplayNameOf\n"); return E_NOTIMPL; }
STDMETHODIMP SetNameOf( HWND hwnd, PCUITEMID_CHILD pidl, LPCWSTR pszName, SHGDNF uFlags, PITEMID_CHILD *ppidlOut) { trace("SetNameOf\n"); return E_NOTIMPL; }
/*** IItemNameLimits methods ***/
STDMETHODIMP GetMaxLength( LPCWSTR pszName, int *piMaxNameLen);
STDMETHODIMP GetValidCharacters( LPWSTR *ppwszValidChars, LPWSTR *ppwszInvalidChars);
protected: INT m_iMaxNameLen; BOOL m_bDisabled;};
STDMETHODIMP CShellFolder::QueryInterface(REFIID riid, void **ppvObject){ trace("QueryInterface\n");
if (!ppvObject) return E_POINTER;
if (IsEqualIID(riid, IID_IShellFolder) || IsEqualIID(riid, IID_IUnknown)) { trace("IID_IShellFolder\n"); *ppvObject = static_cast<IShellFolder *>(this); AddRef(); return S_OK; } if (IsEqualIID(riid, IID_IItemNameLimits)) { trace("IID_IItemNameLimits\n"); *ppvObject = static_cast<IItemNameLimits *>(this); AddRef(); return S_OK; }
return E_NOINTERFACE;}
STDMETHODIMP_(ULONG) CShellFolder::AddRef(){ trace("AddRef\n"); return ++m_cRefs;}
STDMETHODIMP_(ULONG) CShellFolder::Release(){ trace("Release\n");
if (--m_cRefs == 0) { //delete this; return 0; } return m_cRefs;}
STDMETHODIMP CShellFolder::GetMaxLength( LPCWSTR pszName, int *piMaxNameLen){ trace("GetMaxLength('%S', %p (%d))\n", pszName, piMaxNameLen, *piMaxNameLen);
if (!piMaxNameLen) return E_POINTER;
*piMaxNameLen = m_iMaxNameLen; return S_OK;}
STDMETHODIMP CShellFolder::GetValidCharacters( LPWSTR *ppwszValidChars, LPWSTR *ppwszInvalidChars){ trace("GetValidCharacters(%p, %p)\n", ppwszValidChars, ppwszInvalidChars);
if (m_bDisabled) return E_NOTIMPL;
if (ppwszInvalidChars) { SHStrDupW(L"/:*?\"<>|", ppwszInvalidChars); } if (ppwszValidChars) { *ppwszValidChars = NULL; } return S_OK;}
static BOOL CALLBACKPropEnumProc( HWND hwnd, LPCWSTR lpszString, HANDLE hData){ trace("PropEnumProc: '%S' --> %p\n", lpszString, hData); return TRUE;}
static voidDoNullFolderTest(HWND hEdt1){ HRESULT hr;
_SEH2_TRY { hr = SHLimitInputEdit(hEdt1, NULL); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { hr = 0xDEAD; } _SEH2_END;
ok_int(hr, 0xDEAD);}
static INT_PTR CALLBACKDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ if (uMsg != WM_INITDIALOG) return FALSE;
HWND hEdt1 = GetDlgItem(hwnd, edt1); INT n; HRESULT hr; WCHAR szText[64];
DoNullFolderTest(hEdt1);
{ CShellFolder sf(123, FALSE);
ok_long(sf.m_cRefs, 1);
SendMessageW(hEdt1, EM_LIMITTEXT, 234, 0);
trace("GWLP_WNDPROC: %p\n", (void *)GetWindowLongPtr(hEdt1, GWLP_WNDPROC));
hr = SHLimitInputEdit(hEdt1, &sf); ok_int(hr, S_OK);
ok_long(sf.m_cRefs, 1);
trace("GWLP_WNDPROC: %p\n", (void *)GetWindowLongPtr(hEdt1, GWLP_WNDPROC));
EnumPropsW(hEdt1, PropEnumProc);
n = (INT)SendMessageW(hEdt1, EM_GETLIMITTEXT, 0, 0); ok_int(n, 234); }
{ CShellFolder sf(345, TRUE);
hr = SHLimitInputEdit(hEdt1, &sf); ok_int(hr, E_NOTIMPL);
n = (INT)SendMessageW(hEdt1, EM_GETLIMITTEXT, 0, 0); ok_int(n, 234); }
{ CShellFolder sf(999, FALSE);
ok_long(sf.m_cRefs, 1);
SetWindowTextW(hEdt1, L"TEST/TEST"); hr = SHLimitInputEdit(hEdt1, &sf); ok_int(hr, S_OK); GetWindowTextW(hEdt1, szText, _countof(szText)); ok_wstr(szText, L"TEST/TEST");
ok_long(sf.m_cRefs, 1);
n = (INT)SendMessageW(hEdt1, EM_GETLIMITTEXT, 0, 0); ok_int(n, 234);
SetWindowTextW(hEdt1, L""); SendMessageW(hEdt1, WM_CHAR, L'A', 1); GetWindowTextW(hEdt1, szText, _countof(szText)); ok_wstr(szText, L"A");
SendMessageW(hEdt1, WM_CHAR, L'/', 1); GetWindowTextW(hEdt1, szText, _countof(szText)); ok_wstr(szText, L"A");
SendMessageW(hEdt1, WM_CHAR, L'/', 1); GetWindowTextW(hEdt1, szText, _countof(szText)); ok_wstr(szText, L"A");
SendMessageW(hEdt1, WM_CHAR, L'A', 1); GetWindowTextW(hEdt1, szText, _countof(szText)); ok_wstr(szText, L"AA"); }
{ CShellFolder sf(4, FALSE);
ok_long(sf.m_cRefs, 1);
SetWindowTextW(hEdt1, L"ABC"); hr = SHLimitInputEdit(hEdt1, &sf);
SendMessageW(hEdt1, WM_CHAR, L'D', 1); GetWindowTextW(hEdt1, szText, _countof(szText)); ok_wstr(szText, L"DABC");
SendMessageW(hEdt1, WM_CHAR, L'E', 1); GetWindowTextW(hEdt1, szText, _countof(szText)); ok_wstr(szText, L"DEABC");
ok_long(sf.m_cRefs, 1); }
EndDialog(hwnd, IDABORT); return TRUE;}
START_TEST(SHLimitInputEdit){ HRESULT hr;
_SEH2_TRY { hr = SHLimitInputEdit(NULL, NULL); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { hr = 0xDEAD; } _SEH2_END; ok_int(hr, 0xDEAD);
_SEH2_TRY { hr = SHLimitInputEdit((HWND)0xDEAD, NULL); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { hr = 0xDEAD; } _SEH2_END; ok_int(hr, 0xDEAD);
DialogBoxW(GetModuleHandleW(NULL), L"SHLIMIT", NULL, DialogProc);}