|
|
#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); } }
|