You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
7.8 KiB
312 lines
7.8 KiB
// IEInstallCtrl.cpp : Implementation of CIEInstallCtrl
|
|
#include "stdafx.h"
|
|
#include "ieinst.h"
|
|
#include "IEInstallCtrl.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CIEInstallCtrl
|
|
|
|
|
|
HRESULT CIEInstallCtrl::OnDraw(ATL_DRAWINFO& di)
|
|
{
|
|
RECT& rc = *(RECT*)di.prcBounds;
|
|
Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);
|
|
DrawText(di.hdcDraw, _T("ATL 2.0"), -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
|
|
return S_OK;
|
|
}
|
|
|
|
BOOL ChrCmpA_inline(WORD w1, WORD wMatch)
|
|
{
|
|
/* Most of the time this won't match, so test it first for speed.
|
|
*/
|
|
if (LOBYTE(w1) == LOBYTE(wMatch))
|
|
{
|
|
if (IsDBCSLeadByte(LOBYTE(w1)))
|
|
{
|
|
return(w1 != wMatch);
|
|
}
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
LPSTR FAR ANSIStrChr(LPCSTR lpStart, WORD wMatch)
|
|
{
|
|
for ( ; *lpStart; lpStart = CharNext(lpStart))
|
|
{
|
|
// (ChrCmp returns FALSE when characters match)
|
|
|
|
if (!ChrCmpA_inline(*(UNALIGNED WORD FAR *)lpStart, wMatch))
|
|
return((LPSTR)lpStart);
|
|
}
|
|
return (NULL);
|
|
}
|
|
|
|
LPSTR FAR ANSIStrRChr(LPCSTR lpStart, WORD wMatch)
|
|
{
|
|
LPCSTR lpFound = NULL;
|
|
|
|
for ( ; *lpStart; lpStart = CharNext(lpStart))
|
|
{
|
|
// (ChrCmp returns FALSE when characters match)
|
|
|
|
if (!ChrCmpA_inline(*(UNALIGNED WORD FAR *)lpStart, wMatch))
|
|
lpFound = lpStart;
|
|
}
|
|
return ((LPSTR)lpFound);
|
|
}
|
|
|
|
PathRemoveFileSpec(
|
|
LPSTR pFile)
|
|
{
|
|
LPSTR pT;
|
|
LPSTR pT2 = pFile;
|
|
|
|
for (pT = pT2; *pT2; pT2 = CharNext(pT2)) {
|
|
if (*pT2 == '\\')
|
|
pT = pT2; // last "\" found, (we will strip here)
|
|
else if (*pT2 == ':') { // skip ":\" so we don't
|
|
if (pT2[1] =='\\') // strip the "\" from "C:\"
|
|
pT2++;
|
|
pT = pT2 + 1;
|
|
}
|
|
}
|
|
if (*pT == 0)
|
|
return FALSE; // didn't strip anything
|
|
|
|
//
|
|
// handle the \foo case
|
|
//
|
|
else if ((pT == pFile) && (*pT == '\\')) {
|
|
// Is it just a '\'?
|
|
if (*(pT+1) != '\0') {
|
|
// Nope.
|
|
*(pT+1) = '\0';
|
|
return TRUE; // stripped something
|
|
}
|
|
else {
|
|
// Yep.
|
|
return FALSE;
|
|
}
|
|
}
|
|
else {
|
|
*pT = 0;
|
|
return TRUE; // stripped something
|
|
}
|
|
}
|
|
|
|
void Strip(LPSTR pszUrl)
|
|
{
|
|
char szTemp[MAX_PATH] ;
|
|
int tempPtr=0, pathPtr=0 ;
|
|
|
|
while (pszUrl[pathPtr])
|
|
{
|
|
if (pszUrl[pathPtr] == '%')
|
|
{
|
|
int value = 0 ;
|
|
pathPtr++ ;
|
|
while (pszUrl[pathPtr] && ((pszUrl[pathPtr] >= '0') && (pszUrl[pathPtr] <= '9')))
|
|
{
|
|
value = (value * 0x10) + (pszUrl[pathPtr] - '0') ;
|
|
pathPtr++ ;
|
|
}
|
|
szTemp[tempPtr++] = (char)value;
|
|
}
|
|
else
|
|
{
|
|
szTemp[tempPtr++] = pszUrl[pathPtr++] ;
|
|
}
|
|
}
|
|
szTemp[tempPtr] = pszUrl[pathPtr] ;
|
|
|
|
lstrcpy(pszUrl, szTemp) ;
|
|
}
|
|
|
|
BOOL CompareDirs(LPCSTR pcszDir1, LPCSTR pcszDir2)
|
|
{
|
|
char szDir1[MAX_PATH];
|
|
char szDir2[MAX_PATH];
|
|
|
|
if (GetShortPathName(pcszDir1, szDir1, sizeof(szDir1)) && GetShortPathName(pcszDir2, szDir2, sizeof(szDir2))
|
|
&& (lstrcmpi(szDir1, szDir2) == 0))
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CheckSignupDir(LPCSTR pcszFile)
|
|
{
|
|
char szIEPath[MAX_PATH];
|
|
char szFilePath[MAX_PATH];
|
|
DWORD dwSize;
|
|
HKEY hkAppPaths;
|
|
|
|
dwSize = sizeof(szIEPath);
|
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\iexplore.exe",
|
|
0, KEY_READ, &hkAppPaths) != ERROR_SUCCESS)
|
|
return FALSE;
|
|
|
|
if (RegQueryValueEx(hkAppPaths, "Path", 0, NULL, (LPBYTE)&szIEPath, &dwSize) != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hkAppPaths);
|
|
return FALSE;
|
|
}
|
|
|
|
RegCloseKey(hkAppPaths);
|
|
|
|
if (szIEPath[lstrlen(szIEPath)-1] == ';')
|
|
szIEPath[lstrlen(szIEPath)-1] = '\0';
|
|
|
|
if (szIEPath[lstrlen(szIEPath)-1] == '\\')
|
|
szIEPath[lstrlen(szIEPath)-1] = '\0';
|
|
|
|
lstrcat(szIEPath, "\\signup");
|
|
|
|
lstrcpy(szFilePath, pcszFile);
|
|
PathRemoveFileSpec(szFilePath);
|
|
|
|
// check that we are writing to a file in the signup dir
|
|
|
|
if (!CompareDirs(szIEPath, szFilePath))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
STDMETHODIMP CIEInstallCtrl::SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions)
|
|
{
|
|
CComBSTR strURL;
|
|
char szURL[INTERNET_MAX_URL_LENGTH];
|
|
char cBack;
|
|
LPSTR pPtr, pSlash;
|
|
ATLTRACE(_T("IObjectSafetyImpl::SetInterfaceSafetyOptions\n"));
|
|
|
|
USES_CONVERSION;
|
|
|
|
// check to make sure it's a file://<drive letter> URL that we're being hosted on
|
|
CComPtr<IOleContainer> spContainer;
|
|
m_spClientSite->GetContainer(&spContainer);
|
|
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spDoc(spContainer);
|
|
|
|
if (spDoc)
|
|
spDoc->get_URL(&strURL);
|
|
else
|
|
return E_NOINTERFACE;
|
|
|
|
lstrcpy(szURL, OLE2A(strURL));
|
|
Strip(szURL);
|
|
|
|
cBack = szURL[7];
|
|
szURL[7] = '\0';
|
|
if (lstrcmpi(szURL, "file://") != 0)
|
|
return E_NOINTERFACE;
|
|
|
|
szURL[7] = cBack;
|
|
pPtr = &szURL[7];
|
|
|
|
while (*pPtr == '/')
|
|
pPtr++;
|
|
|
|
pSlash = pPtr;
|
|
while (pSlash = ANSIStrChr(pSlash, '/'))
|
|
*pSlash = '\\';
|
|
if (!CheckSignupDir(pPtr))
|
|
return E_FAIL;
|
|
|
|
// If we're being asked to set our safe for scripting option then oblige
|
|
|
|
if (riid == IID_IDispatch )
|
|
{
|
|
// Store our current safety level to return in GetInterfaceSafetyOptions
|
|
m_dwSafety = dwEnabledOptions & dwOptionSetMask;
|
|
return S_OK;
|
|
}
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP CIEInstallCtrl::Insert(BSTR Header, BSTR Name, BSTR Value, BSTR InsFilename, long *lRet)
|
|
{
|
|
char szFile[MAX_PATH];
|
|
char szHeader[128];
|
|
char szValueName[128];
|
|
char szValue[256];
|
|
LPSTR pszPtr;
|
|
|
|
USES_CONVERSION;
|
|
|
|
lstrcpyn(szFile, OLE2A(InsFilename), MAX_PATH);
|
|
|
|
// check for .ins extension
|
|
|
|
if (!(pszPtr = ANSIStrRChr(szFile, '.')) || lstrcmpi(pszPtr, ".ins"))
|
|
return E_FAIL;
|
|
|
|
for (pszPtr = szFile; *pszPtr; pszPtr++)
|
|
{
|
|
if (*pszPtr == '/')
|
|
*pszPtr = '\\';
|
|
}
|
|
|
|
if (!CheckSignupDir(szFile))
|
|
return E_FAIL;
|
|
|
|
lstrcpyn(szFile, OLE2A(InsFilename), MAX_PATH);
|
|
|
|
// only write to existing ins files
|
|
|
|
if (GetFileAttributes(szFile) == 0xFFFFFFFF)
|
|
return E_FAIL;
|
|
|
|
for (pszPtr = szFile; *pszPtr; pszPtr++)
|
|
{
|
|
if (*pszPtr == '/')
|
|
*pszPtr = '\\';
|
|
}
|
|
|
|
lstrcpyn(szHeader, OLE2A(Header), 128);
|
|
lstrcpyn(szValueName, OLE2A(Name), 128);
|
|
lstrcpyn(szValue, OLE2A(Value), 256 - lstrlen(szValueName));
|
|
|
|
*lRet = WritePrivateProfileString(szHeader, szValueName, szValue, szFile);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CIEInstallCtrl::WorkingDir(BSTR bstrPath, BSTR *bstrDir)
|
|
{
|
|
char cBack;
|
|
char szPath[MAX_PATH];
|
|
char szURL[MAX_PATH*2];
|
|
LPSTR pPath, pSlash, pUrl;
|
|
|
|
USES_CONVERSION;
|
|
|
|
lstrcpyn(szURL, OLE2A(bstrPath), MAX_PATH);
|
|
Strip(szURL);
|
|
cBack = szURL[7];
|
|
szURL[7] = '\0';
|
|
|
|
if (lstrcmpi(szURL, "file://") != 0)
|
|
szPath[0] = '\0';
|
|
else
|
|
{
|
|
szURL[7] = cBack;
|
|
pUrl = &szURL[7];
|
|
while (*pUrl == '/')
|
|
pUrl++;
|
|
if (ANSIStrChr(pUrl, ':') || (pUrl[0] == '\\'))
|
|
lstrcpyn(szPath, pUrl, MAX_PATH);
|
|
else
|
|
{
|
|
lstrcpy(szPath, "\\\\");
|
|
pPath = &szPath[2];
|
|
lstrcpyn(pPath, pUrl, MAX_PATH - 2);
|
|
}
|
|
pSlash = szPath;
|
|
while (pSlash = ANSIStrChr(pSlash, '/'))
|
|
*pSlash = '\\';
|
|
PathRemoveFileSpec(szPath);
|
|
}
|
|
|
|
*bstrDir = A2BSTR(szPath);
|
|
return S_OK;
|
|
}
|