|
|
#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
|