Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

178 lines
5.5 KiB

#include "iexplore.h"
#include "unixstuff.h"
//
// BOOL ConnectRemoteIE(LPTSTR pszCommandLine)
//
// This function will be called when -remote parameter is specified during the
// invokation of IE. That's the same format as Netscape uses, see
// http://home.netscape.com/newsref/std/x-remote.html.
// For now, the only special action supported is openURL(URL), because we need
// it for the NetShow. We just put it as the URL was specified as iexplorer
// param. To be done - connection to the existent browser.
// Returns TRUE if succeed to connect to the existent browser.
//
#define c_szSpace TEXT(' ')
static BOOL IsOpenURL(LPCTSTR pszBeginCommand, LPCTSTR pszEndCommand, LPTSTR pszURL)
{
const TCHAR c_szOpenURL[] = TEXT("openURL");
const TCHAR c_szLBracket = TEXT('(');
const TCHAR c_szRBracket = TEXT(')');
const TCHAR c_szSQuote = TEXT('\'');
const TCHAR c_szDQuote = TEXT('\"');
LPCTSTR pszBeginURL, pszEndURL;
BOOL bRet = TRUE;
// Skip the leading/trailing spaces.
while (*pszBeginCommand == c_szSpace) pszBeginCommand++;
while ((*pszEndCommand == c_szSpace) && (pszBeginCommand <= pszEndCommand))
pszEndCommand--;
// Now, parse the value and replace in the cmd line,
// if there is openURL there. More formats later...
if (StrCmpNI(pszBeginCommand, c_szOpenURL, lstrlen(c_szOpenURL)) ||
(*pszEndCommand != c_szRBracket)) {
pszBeginURL = pszBeginCommand;
bRet = FALSE;
pszEndURL = pszEndCommand;
}
else{
pszBeginURL = pszBeginCommand+lstrlen(c_szOpenURL);
while (*pszBeginURL == c_szSpace) pszBeginURL++;
if ((*pszBeginURL != c_szLBracket) ||
(pszBeginURL == pszEndCommand-1)) {
pszURL[0] = '\0';
return FALSE;
}
pszBeginURL++;
pszEndURL = pszEndCommand-1;
}
// Skip the leading/trailing spaces.
while (*pszBeginURL == c_szSpace) pszBeginURL++;
while (*pszEndURL == c_szSpace) pszEndURL--;
// Take off quotes.
if (((*pszBeginURL == c_szSQuote) && (*pszEndURL == c_szSQuote)) ||
((*pszBeginURL == c_szDQuote) && (*pszEndURL == c_szDQuote))) {
while (*pszBeginURL == c_szSpace) pszBeginURL++;
while (*pszEndURL == c_szSpace) pszEndURL--;
if (pszBeginURL >= pszEndURL) {
pszURL[0] = '\0';
return FALSE;
}
}
StrCpyN(pszURL, pszBeginURL, (pszEndURL-pszBeginURL)/sizeof(TCHAR) +2);
if (bRet)
bRet = pszURL[0];
return bRet;
}
static BOOL ConnectExistentIE(LPCTSTR pszURL, HINSTANCE hInstance)
{
HWND hwnd;
if (hwnd = FindWindow(IEREMOTECLASS, NULL))
{
COPYDATASTRUCT cds;
cds.dwData = IEREMOTE_CMDLINE;
cds.cbData = pszURL ? (lstrlen(pszURL)+1)*sizeof(TCHAR) : 0;
cds.lpData = pszURL;
SetForegroundWindow(hwnd);
SendMessage(hwnd, WM_COPYDATA, (WPARAM)WMC_DISPATCH, (LPARAM)&cds);
ExitProcess(0);
}
return FALSE;
}
BOOL ConnectRemoteIE(LPTSTR pszCmdLine, HINSTANCE hInstance)
{
const TCHAR c_szDblQuote = TEXT('"');
const TCHAR c_szQuote = TEXT('\'');
LPTSTR pszBeginRemote, pszEndRemote;
LPTSTR pszBeginCommand, pszEndCommand;
TCHAR szURL[INTERNET_MAX_URL_LENGTH];
TCHAR szRestCmdLine[INTERNET_MAX_URL_LENGTH * 2];
// If we start with a quote, finish with a quote.
// If we start with something else, finish 1 symbol before space
// or end of string.
pszBeginRemote = pszBeginCommand = pszCmdLine;
if (*pszBeginCommand == c_szQuote || *pszBeginCommand == c_szDblQuote) {
pszEndRemote = pszEndCommand = StrChr(pszBeginCommand+1, (WORD)(*pszBeginCommand));
pszBeginCommand++;
}
else {
pszEndCommand = StrChr(pszBeginCommand, (WORD)c_szSpace);
if (pszEndCommand == NULL)
pszEndCommand = pszBeginCommand+lstrlen(pszBeginCommand);
pszEndRemote = pszEndCommand-1;
}
if ((pszEndCommand == NULL) || (lstrlen(pszBeginCommand) <= 1))
return FALSE;
pszEndCommand--;
//
// Now, check the remote command and execute.
// For now, we just replace the URL in the cmd line,
// if there is openURL there. More formats later...
IsOpenURL(pszBeginCommand, pszEndCommand, szURL);
if (ConnectExistentIE(szURL, hInstance))
return TRUE;
StrCpyN(szRestCmdLine, pszEndRemote+1, ARRAYSIZE(szRestCmdLine));
*pszBeginRemote = '\0';
StrCat(pszCmdLine, szURL);
StrCat(pszCmdLine, szRestCmdLine);
// No connection with an existent IE was done.
return FALSE;
}
#if 0
#define WMC_UNIX_NEWWINDOW (WM_USER + 0x0400)
BOOL RemoteIENewWindow(LPTSTR pszCmdLine)
{
HWND hwnd;
LPTSTR pszCurrent = pszCmdLine;
while (*pszCurrent == TEXT(' '))
pszCurrent++;
if (*pszCurrent == TEXT('-'))
return FALSE;
if (hwnd = FindWindow(IEREMOTECLASS, NULL))
{
COPYDATASTRUCT cds;
cds.dwData = IEREMOTE_CMDLINE;
cds.cbData = pszCmdLine ? (lstrlen(pszCmdLine)+1)*sizeof(TCHAR) : 0;
cds.lpData = pszCmdLine;
SetForegroundWindow(hwnd);
SendMessage(hwnd, WM_COPYDATA, (WPARAM)WMC_UNIX_NEWWINDOW, (LPARAM)&cds);
printf("Opening a new window in the currently running Internet Explorer.\n");
printf("To start a new instance of Internet Explorer, type \"iexplorer -new\".\n");
return TRUE;
}
return FALSE;
}
#endif
// Entry point for Mainwin is WinMain so create this function and call
// ModuleEntry() from here.
#if defined(MAINWIN)
EXTERN_C int _stdcall ModuleEntry(void);
EXTERN_C int WINAPI WinMain( HINSTANCE hinst, HINSTANCE hprev, LPSTR lpcmdline, int cmd )
{
return ModuleEntry ();
}
#endif