blob: c0a640e35f9d6cec25d3d8acd3ff7a75467e400f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
#include "stdafx.h"
#include "PendingScriptLoad.h"
PendingScriptLoad::PendingScriptLoad() {
m_applicationNode = NULL;
m_context = NULL;
m_cookie = 0;
}
PendingScriptLoad::~PendingScriptLoad() {
detach();
}
IDebugApplicationNode* PendingScriptLoad::getApplicationNode() {
return m_applicationNode;
}
/* IDebugDocumentTextEvents */
STDMETHODIMP PendingScriptLoad::onDestroy() {
return S_OK;
}
STDMETHODIMP PendingScriptLoad::onInsertText(ULONG cCharacterPosition, ULONG cNumToInsert) {
if (m_context) {
m_context->scriptLoaded(m_applicationNode, cNumToInsert != 0);
}
return S_OK;
}
STDMETHODIMP PendingScriptLoad::onRemoveText(ULONG cCharacterPosition, ULONG cNumToRemove) {
return S_OK;
}
STDMETHODIMP PendingScriptLoad::onReplaceText(ULONG cCharacterPosition, ULONG cNumToReplace) {
return S_OK;
}
STDMETHODIMP PendingScriptLoad::onUpdateTextAttributes(ULONG cCharacterPosition, ULONG cNumToUpdate) {
return S_OK;
}
STDMETHODIMP PendingScriptLoad::onUpdateDocumentAttributes(TEXT_DOC_ATTR textdocattr) {
return S_OK;
}
/* PendingScriptLoad */
bool PendingScriptLoad::attach(IDebugApplicationNode* applicationNode, CrossfireContext* context) {
CComPtr<IDebugDocument> document = NULL;
HRESULT hr = applicationNode->GetDocument(&document);
if (FAILED(hr)) {
Logger::error("PendingScriptLoad.attach(): GetDocument() failed", hr);
return false;
}
CComPtr<IConnectionPointContainer> connectionPointContainer = NULL;
hr = document->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
if (FAILED(hr)) {
/*
* It is expected that this will fail for nodes that represent code evaluations
* (eg.- anonymous code, eval code, script blocks).
*/
if (hr != E_NOINTERFACE) {
Logger::error("PendingScriptLoad.attach(): QI(IConnectionPointContainer) failed", hr);
}
return false;
}
CComPtr<IConnectionPoint> connectionPoint = NULL;
hr = connectionPointContainer->FindConnectionPoint(IID_IDebugDocumentTextEvents, &connectionPoint);
if (FAILED(hr)) {
Logger::error("PendingScriptLoad.attach(): FindConnectionPoint() failed", hr);
return false;
}
hr = connectionPoint->Advise(static_cast<IPendingScriptLoad*>(this), &m_cookie);
if (FAILED(hr)) {
Logger::error("PendingScriptLoad.attach(): Advise() failed", hr);
return false;
}
applicationNode->AddRef();
m_applicationNode = applicationNode;
m_context = context;
return true;
}
bool PendingScriptLoad::detach() {
if (!m_cookie) {
return true;
}
CComPtr<IDebugDocument> document = NULL;
HRESULT hr = m_applicationNode->GetDocument(&document);
if (FAILED(hr)) {
/* The node is already destroyed, so nothing to unadvise on */
} else {
CComPtr<IConnectionPointContainer> connectionPointContainer = NULL;
hr = document->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
if (FAILED(hr)) {
Logger::error("PendingScriptLoad.detach(): QI(IID_IConnectionPointContainer) failed", hr);
} else {
CComPtr<IConnectionPoint> connectionPoint = NULL;
hr = connectionPointContainer->FindConnectionPoint(IID_IDebugDocumentTextEvents,&connectionPoint);
if (FAILED(hr)) {
Logger::error("PendingScriptLoad.detach(): FindConnectionPoint() failed", hr);
} else {
hr = connectionPoint->Unadvise(m_cookie);
if (FAILED(hr)) {
Logger::error("PendingScriptLoad.detach(): Unadvise() failed", hr);
}
}
}
}
if (m_applicationNode) {
m_applicationNode->Release();
m_applicationNode = NULL;
}
m_context = NULL;
m_cookie = 0;
return true;
}