blob: 2675810b4e92a360a40d56e927fd88d4aacdd356 [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.
*/
#pragma once
#include <map>
#include <set>
#include "HostChannel.h"
#include "JavaObject.h"
#include "mshtml.h"
#include "oophm_i.h"
#include "SessionData.h"
#include "SessionHandler.h"
class IESessionHandler :
public SessionData,
public SessionHandler
{
public:
IESessionHandler(HostChannel* channel, IHTMLWindow2* window);
~IESessionHandler(void);
virtual void freeJavaObject(unsigned int objId);
virtual void makeValue(Value& value, const _variant_t& in);
virtual void makeValueRef(_variant_t& value, const Value& in);
protected:
virtual void disconnectDetectedImpl();
virtual void fatalError(HostChannel& channel, const std::string& messsage);
virtual void freeValue(HostChannel& channel, int idCount, const int* ids);
virtual void loadJsni(HostChannel& channel, const std::string& js);
virtual bool invoke(HostChannel& channel, const Value& thisObj, const std::string& methodName,
int numArgs, const Value* const args, Value* returnValue);
virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
const Value* const args, Value* returnValue);
virtual void sendFreeValues(HostChannel& channel);
private:
int jsObjectId;
/*
* This must be IUnknown and not IDispatch because the IUnknown
* interface is the only COM interface guaranteed to be stable for
* any particular instance of an object. It appears as though
* Event objects exhibit the multiple-interface behavior.
*
* Furthermore, this map is not a CComPtr map because we don't
* to artificially add to the retain count of the Java objects.
*/
std::map<int, IUnknown*> javaObjectsById;
std::set<int> javaObjectsToFree;
// Same as above; only one map needs to increment reference count.
std::map<int, CComPtr<IUnknown>> jsObjectsById;
std::map<IUnknown*, int> jsIdsByObject;
/*
* Create a JavaScript Error object with the given message.
*/
void makeException(_variant_t& value, const char* message);
/*
* Create a exception Value that contains the given message.
*/
void makeExceptionValue(Value& value, const char* message);
};