blob: 9bc418433a53f2c573721451917d0961b6d09c15 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
// plugin.cpp : Implementation of Cplugin
#include "stdafx.h"
#include "comutil.h"
#include "plugin.h"
#include "BrowserChannel.h"
#include "JavaObject.h"
#include "HostChannel.h"
#include "IESessionHandler.h"
#include "LoadModuleMessage.h"
#include "ServerMethods.h"
#include "AllowedConnections.h"
#include "Preferences.h"
#include "AllowDialog.h"
#include "IEUtils.h"
// Cplugin
STDMETHODIMP Cplugin::connect(BSTR burl, BSTR bsessionKey, BSTR bhostedServer,
BSTR bmoduleName, BSTR bhostedHtmlVersion, VARIANT_BOOL* ret)
{
LPOLECLIENTSITE site;
IOleContainer* container = NULL;
IHTMLDocument2* doc = NULL;
IHTMLWindow2* window = NULL;
this->GetClientSite(&site);
site->GetContainer(&container);
container->QueryInterface(IID_IHTMLDocument2, (void**)&doc);
container->Release();
doc->get_parentWindow(&window);
doc->Release();
std::string url = BSTRToUTF8(burl);
Debug::log(Debug::Debugging) << "OOPHM connect(url=" << url << ")" << Debug::flush;
Preferences::loadAccessList();
bool allowed = false;
std::string webHost = AllowedConnections::getHostFromUrl(url);
std::string codeSvr = AllowedConnections::getCodeServerFromUrl(url);
if (!AllowedConnections::matchesRule(webHost, codeSvr, &allowed)) {
bool remember;
allowed = AllowDialog::askUserToAllow(&remember);
if (remember) {
Preferences::addNewRule(webHost + "/" + codeSvr, !allowed);
}
}
if (!allowed) {
*ret = false;
return S_OK;
}
std::string hostedServer = BSTRToUTF8(bhostedServer);
size_t index = hostedServer.find(':');
if (index == std::string::npos) {
*ret = false;
return S_OK;
}
std::string hostPart = hostedServer.substr(0, index);
std::string portPart = hostedServer.substr(index + 1);
HostChannel* channel = new HostChannel();
if (!channel->connectToHost(
hostPart.c_str(),
atoi(portPart.c_str()))) {
*ret = false;
DWORD errCode = ::GetLastError();
PWCHAR errMsg = IEUtils::GetSysErrorMessage(errCode);
SYSLOGERROR(L"GWT Developer Mode plugin failed to connect to code server.",
L"URL: %S\nERRORMESSAGE: %sERRORCODE: %d (0x%08X)",
url.c_str(), errMsg, errCode, errCode);
::LocalFree(errMsg);
return S_OK;
}
sessionHandler.reset(new IESessionHandler(channel, window));
std::string hostedHtmlVersion = BSTRToUTF8(bhostedHtmlVersion);
// TODO: add support for a range of protocol versions when we add them
if (!channel->init(sessionHandler.get(), BROWSERCHANNEL_PROTOCOL_VERSION,
BROWSERCHANNEL_PROTOCOL_VERSION, hostedHtmlVersion)) {
*ret = false;
return S_OK;
}
// Use the current thread ID as a proxy for tab ID.
DWORD threadId = GetCurrentThreadId();
char buf[20];
snprintf(buf, sizeof(buf), "%lu", threadId);
std::string tabKey = buf;
std::string sessionKey = BSTRToUTF8(bsessionKey);
std::string moduleName = BSTRToUTF8(bmoduleName);
IOmNavigator* navigator;
_bstr_t userAgent;
window->get_navigator(&navigator);
navigator->get_userAgent(userAgent.GetAddress());
LoadModuleMessage::send(*channel, url, tabKey, sessionKey, moduleName,
BSTRToUTF8(userAgent), sessionHandler.get());
navigator->Release();
*ret = true;
return S_OK;
}
STDMETHODIMP Cplugin::init(IDispatch* jsniContext, VARIANT_BOOL* ret) {
Debug::log(Debug::Debugging) << "OOPHM init called" << Debug::flush;
*ret = true;
return S_OK;
}
STDMETHODIMP Cplugin::testObject(IDispatch** ret)
{
IJavaObject* toRet;
CJavaObject::CreateInstance(&toRet);
*ret = toRet;
// TODO: Add your implementation code here
return S_OK;
}