mirror of https://github.com/tongzx/nt5src
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
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
|
|
|