windows-nt/Source/XPSP1/NT/shell/browseui/iethread.cpp
2020-09-26 16:20:57 +08:00

260 lines
6.8 KiB
C++

#include "priv.h"
#include <iethread.h>
#include "hnfblock.h"
#ifdef UNIX
#include "unixstuff.h"
#endif
BOOL _GetToken(LPCWSTR *ppszCmdLine, LPWSTR szToken, UINT cchMax)
{
LPCWSTR pszCmdLine = *ppszCmdLine;
WCHAR chTerm = L' ';
if (*pszCmdLine == L'"') {
chTerm = L'"';
pszCmdLine++;
}
UINT ichToken = 0;
WCHAR ch;
while((ch=*pszCmdLine) && (ch != chTerm)) {
if (ichToken < cchMax-1) {
szToken[ichToken++] = ch;
}
pszCmdLine++;
}
szToken[ichToken] = L'\0';
if (chTerm == L'"' && ch == L'"') {
pszCmdLine++;
}
// skip trailing spaces
while(*pszCmdLine == L' ')
pszCmdLine++;
*ppszCmdLine = pszCmdLine;
TraceMsgW(TF_SHDAUTO, "_GetToken returning %s (+%s)", szToken, pszCmdLine);
return szToken[0];
}
BOOL _CheckForOptionOnCmdLine(LPCWSTR *ppszCmdLine, LPCWSTR pszOption)
{
LPCWSTR pszCmdLine = *ppszCmdLine;
int cch = lstrlenW(pszOption);
if (0 == StrCmpNIW(pszCmdLine, pszOption, cch))
{
pszCmdLine+= cch;
while(*pszCmdLine == L' ')
pszCmdLine++;
*ppszCmdLine = pszCmdLine;
return TRUE;
}
return FALSE;
}
BOOL IsCalleeIEAK()
{
// APPCOMPAT: this is hack so as to allow IEAK CD install to continue without
// any security restrictions. If the IEAK CD install window name changes
// the name change should also reflect here.
return (FindWindow(TEXT("IECD"), NULL) != NULL);
}
BOOL SHParseIECommandLine(LPCWSTR *ppwszCmdLine, IETHREADPARAM * piei)
{
ASSERT(ppwszCmdLine);
ASSERT(*ppwszCmdLine);
LPCWSTR pszCmdLine = *ppwszCmdLine;
#ifdef UNIX
if( CheckForInvalidOptions( *ppwszCmdLine ) == FALSE )
{
piei->fShouldStart = FALSE;
return FALSE;
}
// Options valid.
piei->fShouldStart = TRUE;
#endif
TraceMsg(TF_SHDAUTO, "SHParseIECommandLine called with %s", pszCmdLine);
BOOL fDontLookForPidl = FALSE; // A flag option is set, so don't go looking for an open window
// with the same pidl
// FEATURE: (dli) what if there is a window opened with the same flags?
while (*pszCmdLine == L'-')
{
fDontLookForPidl = TRUE;
//Note: (dli)These flags are supposed to be set to FALSE at initialization
// check if -nohome was passed in!
//
if (_CheckForOptionOnCmdLine(&pszCmdLine, L"-slf") && !IsOS(OS_WIN2000ORGREATER) && IsCalleeIEAK())
piei->fNoLocalFileWarning = TRUE;
else if (_CheckForOptionOnCmdLine(&pszCmdLine, L"-nohome"))
piei->fDontUseHomePage = TRUE;
else if (_CheckForOptionOnCmdLine(&pszCmdLine, L"-k"))
{
piei->fFullScreen = TRUE;
piei->fNoDragDrop = TRUE;
}
else if (_CheckForOptionOnCmdLine(&pszCmdLine, L"-embedding"))
{
piei->fAutomation = TRUE;
// if we're started as an embedding, we don't want to go to our start page
piei->fDontUseHomePage = TRUE;
}
#ifndef UNIX
else if (_CheckForOptionOnCmdLine(&pszCmdLine, L"-channelband"))
{
piei->fDesktopChannel = TRUE;
}
else if (_CheckForOptionOnCmdLine(&pszCmdLine, L"-e"))
{
piei->uFlags |= COF_EXPLORE;
}
#else
else if (_CheckForOptionOnCmdLine(&pszCmdLine, L"-help"))
{
piei->fShouldStart = FALSE;
PrintIEHelp();
break;
}
else if (_CheckForOptionOnCmdLine(&pszCmdLine, L"-v") ||
_CheckForOptionOnCmdLine(&pszCmdLine, L"-version"))
{
piei->fShouldStart = FALSE;
PrintIEVersion();
break;
}
#endif
else if (_CheckForOptionOnCmdLine(&pszCmdLine, L"-root"))
{
ASSERT(piei->pidlRoot==NULL);
WCHAR szRoot[MAX_PATH];
if (_GetToken(&pszCmdLine, szRoot, ARRAYSIZE(szRoot)))
{
CLSID clsid, *pclsid = NULL;
TraceMsgW(TF_SHDAUTO, "SHParseIECommandLine got token for /root %s", szRoot);
if (GUIDFromString(szRoot, &clsid))
{
pclsid = &clsid;
_GetToken(&pszCmdLine, szRoot, ARRAYSIZE(szRoot));
}
if (szRoot[0])
{
LPITEMIDLIST pidlRoot = ILCreateFromPathW(szRoot);
if (pidlRoot)
{
piei->pidl = ILRootedCreateIDList(pclsid, pidlRoot);
ILFree(pidlRoot);
}
}
}
}
else
{
#ifdef UNIX
piei->fShouldStart = FALSE;
#endif
// unknown option..
fDontLookForPidl = FALSE;
break;
}
}
*ppwszCmdLine = pszCmdLine;
return fDontLookForPidl;
}
IETHREADPARAM* SHCreateIETHREADPARAM(LPCWSTR pszCmdLineIn, int nCmdShowIn, ITravelLog *ptlIn, IEFreeThreadedHandShake* piehsIn)
{
IETHREADPARAM *piei = (IETHREADPARAM *)LocalAlloc(LPTR, sizeof(IETHREADPARAM));
if (piei)
{
piei->pszCmdLine = pszCmdLineIn; // careful, aliased pointer
piei->nCmdShow = nCmdShowIn;
piei->ptl = ptlIn;
piei->piehs = piehsIn;
if (piehsIn)
piehsIn->AddRef();
if (ptlIn)
ptlIn->AddRef();
#ifdef UNIX
piei->fShouldStart = TRUE;
#endif
#ifdef NO_MARSHALLING
piei->fOnIEThread = TRUE;
#endif
}
return piei;
}
IETHREADPARAM* SHCloneIETHREADPARAM(IETHREADPARAM* pieiIn)
{
IETHREADPARAM *piei = (IETHREADPARAM *)LocalAlloc(LPTR, sizeof(IETHREADPARAM));
if (piei)
{
*piei = *pieiIn;
// convert aliased pointers into refs
if (piei->pidl)
piei->pidl = ILClone(piei->pidl);
if (piei->pidlSelect)
piei->pidlSelect = ILClone(piei->pidlSelect);
if (piei->pidlRoot)
piei->pidlRoot = ILClone(piei->pidlRoot);
if (piei->psbCaller)
piei->psbCaller->AddRef();
if (piei->ptl)
piei->ptl->Clone(&piei->ptl);
}
return piei;
}
void SHDestroyIETHREADPARAM(IETHREADPARAM* piei)
{
if (piei)
{
if (piei->pidl)
ILFree(piei->pidl);
if (piei->pidlSelect)
ILFree(piei->pidlSelect);
if (((piei->uFlags & COF_HASHMONITOR) == 0) && piei->pidlRoot)
ILFree(piei->pidlRoot);
if (piei->piehs)
piei->piehs->Release(); // note, this is not a COM object, don't ATOMICRELEASE();
ATOMICRELEASE(piei->psbCaller);
ATOMICRELEASE(piei->pSplash);
ATOMICRELEASE(piei->ptl);
ATOMICRELEASE(piei->punkRefProcess);
LocalFree(piei);
}
}