📄 view.cpp
字号:
if (EVAL(SUCCEEDED(FtpPidl_GetUserName(m_pff->GetPrivatePidlReference(), szUserName, ARRAYSIZE(szUserName)))))
{
*pbstr = TCharSysAllocString((0 != szUserName[0]) ? szUserName : SZ_ANONYMOUS);
if (*pbstr)
hr = S_OK;
}
}
}
else
hr = E_INVALIDARG;
ASSERT_POINTER_MATCHES_HRESULT(*pbstr, hr);
return hr;
}
/*****************************************************************************\
FUNCTION: IFtpWebView::get_PasswordLength
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::get_PasswordLength(long * plLength)
{
HRESULT hr = S_FALSE;
if (EVAL(plLength))
{
TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH];
*plLength = 0;
if (SUCCEEDED(FtpPidl_GetPassword(m_pff->GetPrivatePidlReference(), szPassword, ARRAYSIZE(szPassword), FALSE)))
{
*plLength = lstrlen(szPassword);
hr = S_OK;
}
}
else
hr = E_INVALIDARG;
ASSERT_POINTER_MATCHES_HRESULT(*plLength, hr);
return hr;
}
/*****************************************************************************\
FUNCTION: IFtpWebView::get_EmailAddress
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::get_EmailAddress(BSTR * pbstr)
{
HRESULT hr = S_OK;
if (EVAL(pbstr))
{
TCHAR szEmailName[MAX_PATH];
DWORD dwType = REG_SZ;
DWORD cbSize = sizeof(szEmailName);
if (ERROR_SUCCESS == SHGetValue(HKEY_CURRENT_USER, SZ_REGKEY_INTERNET_SETTINGS, SZ_REGKEY_EMAIL_NAME, &dwType, szEmailName, &cbSize))
*pbstr = TCharSysAllocString(szEmailName);
else
{
hr = S_FALSE;
*pbstr = NULL;
}
}
else
hr = E_INVALIDARG;
return hr;
}
/*****************************************************************************\
FUNCTION: IFtpWebView::put_EmailAddress
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::put_EmailAddress(BSTR bstr)
{
HRESULT hr = S_OK;
if (EVAL(bstr))
{
TCHAR szEmailName[MAX_PATH];
SHUnicodeToTChar(bstr, szEmailName, ARRAYSIZE(szEmailName));
if (ERROR_SUCCESS != SHSetValue(HKEY_CURRENT_USER, SZ_REGKEY_INTERNET_SETTINGS, SZ_REGKEY_EMAIL_NAME, REG_SZ, szEmailName, sizeof(szEmailName)))
hr = S_FALSE;
}
else
hr = E_INVALIDARG;
return hr;
}
/*****************************************************************************\
FUNCTION: IFtpWebView::get_CurrentLoginAnonymous
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::get_CurrentLoginAnonymous(VARIANT_BOOL * pfAnonymousLogin)
{
HRESULT hr = S_OK;
if (EVAL(pfAnonymousLogin))
{
TCHAR szUserName[INTERNET_MAX_USER_NAME_LENGTH];
if (EVAL(m_pff) &&
SUCCEEDED(FtpPidl_GetUserName(m_pff->GetPrivatePidlReference(), szUserName, ARRAYSIZE(szUserName))) &&
szUserName[0] && (0 != StrCmpI(szUserName, TEXT("anonymous"))))
{
*pfAnonymousLogin = VARIANT_FALSE;
}
else
*pfAnonymousLogin = VARIANT_TRUE;
}
else
hr = E_INVALIDARG;
return hr;
}
/*****************************************************************************\
FUNCTION: IFtpWebView::LoginAnonymously
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::LoginAnonymously(void)
{
return _LoginWithPassword(NULL, NULL);
}
/*****************************************************************************\
FUNCTION: IFtpWebView::LoginWithPassword
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::LoginWithPassword(BSTR bUserName, BSTR bPassword)
{
HRESULT hr = S_OK;
TCHAR szUserName[INTERNET_MAX_USER_NAME_LENGTH];
TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH];
SHUnicodeToTChar(bUserName, szUserName, ARRAYSIZE(szUserName));
SHUnicodeToTChar(bPassword, szPassword, ARRAYSIZE(szPassword));
return _LoginWithPassword(szUserName, szPassword);
}
/*****************************************************************************\
FUNCTION: IFtpWebView::LoginWithoutPassword
DESCRIPTION:
\*****************************************************************************/
HRESULT CFtpView::LoginWithoutPassword(BSTR bUserName)
{
HRESULT hr = S_FALSE;
TCHAR szUserName[INTERNET_MAX_USER_NAME_LENGTH];
TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH];
SHUnicodeToTChar(bUserName, szUserName, ARRAYSIZE(szUserName));
if (SUCCEEDED(FtpPidl_GetPassword(m_pff->GetPrivatePidlReference(), szPassword, ARRAYSIZE(szPassword), TRUE)))
hr = _LoginWithPassword(szUserName, szPassword);
return hr;
}
HRESULT CFtpView::_LoginWithPassword(LPCTSTR pszUserName, LPCTSTR pszPassword)
{
HRESULT hr = S_OK;
LPITEMIDLIST pidlUser;
hr = PidlReplaceUserPassword(m_pff->GetPrivatePidlReference(), &pidlUser, m_pff->GetItemAllocatorDirect(), pszUserName, pszPassword);
if (EVAL(SUCCEEDED(hr)))
{
LPITEMIDLIST pidlFull = m_pff->CreateFullPublicPidl(pidlUser);
if (pidlFull)
{
hr = IUnknown_PidlNavigate(m_psfv, pidlFull, TRUE);
ASSERT(SUCCEEDED(hr));
ILFree(pidlFull);
}
ILFree(pidlUser);
}
if (FAILED(hr))
hr = S_FALSE; // Automation interfaces don't like failure returns.
return hr;
}
//===========================
// *** IDispatch Interface ***
//===========================
// BUGBUG: Cane we nuke this?
STDMETHODIMP CFtpView::GetTypeInfoCount(UINT * pctinfo)
{
return CImpIDispatch::GetTypeInfoCount(pctinfo);
}
STDMETHODIMP CFtpView::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo * * pptinfo)
{
return CImpIDispatch::GetTypeInfo(itinfo, lcid, pptinfo);
}
STDMETHODIMP CFtpView::GetIDsOfNames(REFIID riid, OLECHAR * * rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid)
{
return CImpIDispatch::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
}
STDMETHODIMP CFtpView::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr)
{
return CImpIDispatch::Invoke(dispidMember, riid, lcid, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
}
/*****************************************************************************
*
* CFtpView_Create
*
* Creates a brand new enumerator based on an ftp site.
*
*****************************************************************************/
HRESULT CFtpView_Create(CFtpFolder * pff, HWND hwndOwner, REFIID riid, LPVOID * ppv)
{
HRESULT hr = E_OUTOFMEMORY;
CFtpView * pfv = new CFtpView(pff, hwndOwner);
if (EVAL(pfv))
{
hr = pfv->QueryInterface(riid, ppv);
pfv->Release();
}
ASSERT_POINTER_MATCHES_HRESULT(*ppv, hr);
return hr;
}
/****************************************************\
Constructor
\****************************************************/
CFtpView::CFtpView(CFtpFolder * pff, HWND hwndOwner) : CImpIDispatch(&LIBID_MSIEFTPLib)
{
DllAddRef();
// This needs to be allocated in Zero Inited Memory.
// Assert that all Member Variables are inited to Zero.
ASSERT(!m_hwndOwner);
ASSERT(!m_hwndStatusBar);
ASSERT(!m_pff);
ASSERT(!m_hgtiWelcome);
m_nThreadID = GetCurrentThreadId();
if (hwndOwner)
{
m_hwndOwner = hwndOwner;
m_hwndStatusBar = Misc_FindStatusBar(hwndOwner);
m_psb = CStatusBar_Create(m_hwndStatusBar);
_InitStatusBar();
}
m_rcPrev.top = m_rcPrev.bottom = m_rcPrev.right = m_rcPrev.left = -1;
IUnknown_Set(&m_pff, pff);
LEAK_ADDREF(LEAK_CFtpView);
g_cRef_CFtpView++; // Needed to determine when to purge cache.
}
/****************************************************\
Destructor
\****************************************************/
/*****************************************************************************
*
* FtpView_OnRelease (from shell32.IShellView)
*
* When the view is released, clean up various stuff.
*
* BUGBUG -- (Note that there is a race here, because this->hwndOwner
* doesn't get zero'd out on the OnWindowDestroy because the shell
* doesn't give us a pdvsci...)
*
* We release the psf before triggering the timeout, which is a
* signal to the trigger not to do anything.
*
* _UNDOCUMENTED_: This callback and its parameters are not documented.
*
*****************************************************************************/
CFtpView::~CFtpView()
{
IUnknown_Set(&m_pff, NULL);
// BUGBUG -- should be a cancel, not a trigger
TriggerDelayedAction(&m_hgtiWelcome); /* Kick out the old one */
SetRedirectPidl(NULL);
if (m_psb)
delete m_psb;
if (m_hinstInetCpl)
FreeLibrary(m_hinstInetCpl);
DllRelease();
LEAK_DELREF(LEAK_CFtpView);
g_cRef_CFtpView--; // Needed to determine when to purge cache.
}
//===========================
// *** IUnknown Interface ***
//===========================
HRESULT CFtpView::QueryInterface(REFIID riid, void **ppvObj)
{
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IDispatch))
{
*ppvObj = SAFECAST(this, IDispatch *);
}
else if (IsEqualIID(riid, IID_IFtpWebView))
{
*ppvObj = SAFECAST(this, IFtpWebView *);
}
else if (IsEqualIID(riid, IID_CFtpViewPrivThis))
{
*ppvObj = (void *)this;
}
else
return CBaseFolderViewCB::QueryInterface(riid, ppvObj);
AddRef();
return S_OK;
}
CFtpView * GetCFtpViewFromDefViewSite(IUnknown * punkSite)
{
CFtpView * pfv = NULL;
IShellFolderViewCB * psfvcb = NULL;
// This fails on Browser Only
IUnknown_QueryService(punkSite, SID_ShellFolderViewCB, IID_IShellFolderViewCB, (LPVOID *) &psfvcb);
if (psfvcb)
{
psfvcb->QueryInterface(IID_CFtpViewPrivThis, (void **) &pfv);
psfvcb->Release();
}
return pfv;
}
CStatusBar * GetCStatusBarFromDefViewSite(IUnknown * punkSite)
{
CStatusBar * psb = NULL;
CFtpView * pfv = GetCFtpViewFromDefViewSite(punkSite);
if (pfv)
{
psb = pfv->GetStatusBar();
pfv->Release();
}
return psb;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -