gecko-dev/cmd/winfe/talk.cpp

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