зеркало из https://github.com/mozilla/gecko-dev.git
271 строка
6.3 KiB
C++
271 строка
6.3 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
// CTalkSiteMgr and CTalkNav: implementation file
|
|
//
|
|
#include "stdafx.h"
|
|
|
|
#ifdef EDITOR
|
|
#ifdef _WIN32
|
|
|
|
#include "Talk.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
// Callback to find an instance of SiteManager
|
|
//
|
|
BOOL CALLBACK EXPORT FindSiteMgr( HWND hwnd, LPARAM lParam )
|
|
{
|
|
if ( 0x015DEAD0 == ::SendMessage( hwnd, WM_SITE_MANAGER, SM_QUERY_WINDOW, 0 ) )
|
|
{
|
|
// We found it quit enumerating
|
|
*((BOOL*)lParam) = TRUE;
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
// Called at app startup during InitInstance().
|
|
// Return TRUE if we found sitemanager running
|
|
BOOL FE_FindSiteMgr()
|
|
{
|
|
BOOL bRetVal = 0;
|
|
EnumWindows( FindSiteMgr, LPARAM(&bRetVal) );
|
|
return bRetVal;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTalkNav OLE Automation Server so SiteManager can invoke us
|
|
|
|
IMPLEMENT_DYNCREATE(CTalkNav, CCmdTarget)
|
|
|
|
CTalkNav::CTalkNav()
|
|
{
|
|
EnableAutomation();
|
|
|
|
// To keep the application running as long as an OLE automation
|
|
// object is active, the constructor calls AfxOleLockApp.
|
|
AfxOleLockApp();
|
|
}
|
|
|
|
CTalkNav::~CTalkNav()
|
|
{
|
|
// To terminate the application when all objects created with
|
|
// with OLE automation, the destructor calls AfxOleUnlockApp.
|
|
|
|
AfxOleUnlockApp();
|
|
}
|
|
|
|
|
|
void CTalkNav::OnFinalRelease()
|
|
{
|
|
// When the last reference for an automation object is released
|
|
// OnFinalRelease is called. The base class will automatically
|
|
// deletes the object. Add additional cleanup required for your
|
|
// object before calling the base class.
|
|
|
|
CCmdTarget::OnFinalRelease();
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CTalkNav, CCmdTarget)
|
|
//{{AFX_MSG_MAP(CTalkNav)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BEGIN_DISPATCH_MAP(CTalkNav, CCmdTarget)
|
|
//{{AFX_DISPATCH_MAP(CTalkNav)
|
|
DISP_FUNCTION(CTalkNav, "BrowseURL", BrowseURL, VT_I4, VTS_BSTR)
|
|
DISP_FUNCTION(CTalkNav, "EditURL", EditURL, VT_I4, VTS_BSTR)
|
|
//}}AFX_DISPATCH_MAP
|
|
END_DISPATCH_MAP()
|
|
|
|
// Note: we add support for IID_ITalkNav to support typesafe binding
|
|
// from VBA. This IID must match the GUID that is attached to the
|
|
// dispinterface in the .ODL file.
|
|
|
|
// {E328732B-9DC9-11CF-92D0-004095E27A10}
|
|
static const IID IID_ITalkNav =
|
|
{ 0xe328732b, 0x9dc9, 0x11cf, { 0x92, 0xd0, 0x0, 0x40, 0x95, 0xe2, 0x7a, 0x10 } };
|
|
|
|
BEGIN_INTERFACE_MAP(CTalkNav, CCmdTarget)
|
|
INTERFACE_PART(CTalkNav, IID_ITalkNav, Dispatch)
|
|
END_INTERFACE_MAP()
|
|
|
|
// {E328732C-9DC9-11CF-92D0-004095E27A10}
|
|
IMPLEMENT_OLECREATE(CTalkNav, "Netscape.TalkNav.1", 0xe328732c, 0x9dc9, 0x11cf, 0x92, 0xd0, 0x0, 0x40, 0x95, 0xe2, 0x7a, 0x10)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CTalkNav message handlers
|
|
|
|
long CTalkNav::BrowseURL(LPCTSTR url)
|
|
{
|
|
FE_LoadUrl( (char*)url, LOAD_URL_NAVIGATOR);
|
|
return 1;
|
|
}
|
|
|
|
long CTalkNav::EditURL(LPCTSTR url)
|
|
{
|
|
FE_LoadUrl( (char*)url, LOAD_URL_COMPOSER);
|
|
return 1;
|
|
}
|
|
////////////////////////////////////////////////////////////
|
|
//
|
|
// Sitemanager has an OLE automation server that responds to this
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ITalkSMClient operations
|
|
|
|
ITalkSMClient::ITalkSMClient(void) :
|
|
m_alive(FALSE),
|
|
m_connected(FALSE),
|
|
m_retried(FALSE)
|
|
{
|
|
CLSID clsid;
|
|
m_registered = 0;
|
|
#if defined(MSVC4)
|
|
USES_CONVERSION;
|
|
LPCOLESTR pOleStr = A2CW("Netscape.TalkSiteMgr.1");
|
|
#else
|
|
const char * pOleStr[] = "Netscape.TalkSiteMgr.1";
|
|
#endif
|
|
|
|
if (S_OK == CLSIDFromProgID(pOleStr, &clsid))
|
|
m_registered = 1;
|
|
}
|
|
|
|
ITalkSMClient::~ITalkSMClient(void)
|
|
{
|
|
Disconnect();
|
|
}
|
|
|
|
BOOL ITalkSMClient::Connect(void)
|
|
{
|
|
m_connected = CreateDispatch("Netscape.TalkSiteMgr.1");
|
|
m_retried = FALSE;
|
|
m_alive = m_connected;
|
|
return m_connected;
|
|
}
|
|
|
|
void ITalkSMClient::Disconnect(void)
|
|
{
|
|
if (m_connected) ReleaseDispatch();
|
|
m_connected = FALSE;
|
|
}
|
|
|
|
BOOL ITalkSMClient::Reconnect(void)
|
|
{
|
|
if (m_retried) return FALSE;
|
|
Disconnect();
|
|
Connect();
|
|
m_retried = TRUE;
|
|
return m_connected;
|
|
}
|
|
|
|
BOOL ITalkSMClient::IsConnected(void)
|
|
{
|
|
if (!m_registered) return FALSE;
|
|
if (!m_connected) Connect();
|
|
return m_connected;
|
|
}
|
|
|
|
long ITalkSMClient::LoadingURL(LPCTSTR url)
|
|
{
|
|
if (!m_alive) return 0;
|
|
if (!IsConnected()) return 0;
|
|
|
|
BOOL failed;
|
|
|
|
Retry:
|
|
long result = 0;
|
|
static BYTE BASED_CODE parms[] = VTS_BSTR;
|
|
TRY
|
|
{
|
|
failed = FALSE;
|
|
InvokeHelper(0x1, DISPATCH_METHOD, VT_I4, (void*)&result, parms, url);
|
|
}
|
|
CATCH(CException, e)
|
|
{
|
|
failed = TRUE;
|
|
}
|
|
END_CATCH;
|
|
|
|
if (!failed) return result;
|
|
if (!Reconnect()) return 0;
|
|
goto Retry;
|
|
}
|
|
|
|
long ITalkSMClient::SavedURL(LPCTSTR url)
|
|
{
|
|
if (!m_alive) return 0;
|
|
if (!IsConnected()) return 0;
|
|
|
|
BOOL failed;
|
|
|
|
Retry:
|
|
long result = 0;
|
|
static BYTE BASED_CODE parms[] = VTS_BSTR;
|
|
TRY
|
|
{
|
|
failed = FALSE;
|
|
InvokeHelper(0x2, DISPATCH_METHOD, VT_I4, (void*)&result, parms, url);
|
|
}
|
|
CATCH(CException, e)
|
|
{
|
|
failed = TRUE;
|
|
}
|
|
END_CATCH;
|
|
|
|
if (!failed) return result;
|
|
if (!Reconnect()) return 0;
|
|
goto Retry;
|
|
}
|
|
|
|
long ITalkSMClient::BecomeActive()
|
|
{
|
|
if (!IsConnected()) return 0;
|
|
|
|
BOOL failed;
|
|
|
|
Retry:
|
|
long result = 0;
|
|
TRY
|
|
{
|
|
failed = FALSE;
|
|
InvokeHelper(0x3, DISPATCH_METHOD, VT_I4, (void*)&result, NULL);
|
|
}
|
|
CATCH(CException, e)
|
|
{
|
|
failed = TRUE;
|
|
}
|
|
END_CATCH;
|
|
|
|
if (!failed) return result;
|
|
if (!Reconnect()) return 0;
|
|
goto Retry;
|
|
}
|
|
|
|
#endif // _WIN32
|
|
#endif // EDITOR
|