зеркало из https://github.com/mozilla/gecko-dev.git
321 строка
11 KiB
C++
Executable File
321 строка
11 KiB
C++
Executable File
/* -*- 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.
|
|
*/
|
|
|
|
// oleregis.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "oleregis.h"
|
|
|
|
#include "regproto.h"
|
|
#include "olectc.h"
|
|
#include "presentm.h"
|
|
#include "olestart.h"
|
|
#include "oleshut.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COleRegistry
|
|
|
|
#ifndef _AFXDLL
|
|
#undef new
|
|
#endif
|
|
IMPLEMENT_DYNCREATE(COleRegistry, CCmdTarget)
|
|
#ifndef _AFXDLL
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
COleRegistry::COleRegistry()
|
|
{
|
|
EnableAutomation();
|
|
|
|
// To keep the application running as long as an OLE automation
|
|
// object is active, the constructor calls AfxOleLockApp.
|
|
|
|
AfxOleLockApp();
|
|
}
|
|
|
|
COleRegistry::~COleRegistry()
|
|
{
|
|
// To terminate the application when all objects created with
|
|
// with OLE automation, the destructor calls AfxOleUnlockApp.
|
|
|
|
AfxOleUnlockApp();
|
|
}
|
|
|
|
void COleRegistry::OnFinalRelease()
|
|
{
|
|
// When the last reference for an automation object is released
|
|
// OnFinalRelease is called. This implementation deletes the
|
|
// object. Add additional cleanup required for your object before
|
|
// deleting it from memory.
|
|
|
|
delete this;
|
|
}
|
|
|
|
void COleRegistry::RegisterIniProtocolHandlers() {
|
|
// Purpose: Read in the INI entries, and register them as valid automated handlers.
|
|
// Arguments: void
|
|
// Returns: void
|
|
|
|
// Over 2K is a nightmare.
|
|
char *aBuffer = new char[4096];
|
|
theApp.GetPrivateProfileString("Automation Protocols", NULL, "", aBuffer, 4096, AfxGetApp()->m_pszProfileName);
|
|
|
|
// We have a double null terminated list of mime types here.
|
|
// Go ahead and go through each one, and then obtain the value for each.
|
|
char *pTraverse = aBuffer;
|
|
CString csServerName;
|
|
while(*pTraverse != '\0') {
|
|
// Get the entry for this mime type.
|
|
csServerName = theApp.GetProfileString("Automation Protocols", pTraverse);
|
|
if(csServerName.IsEmpty() != TRUE) {
|
|
// Have a valid entry. Cause it to be registered.
|
|
CString csProtocol = pTraverse;
|
|
COLEProtocolItem::OLERegister(csProtocol, csServerName);
|
|
}
|
|
|
|
// Go on to the next entry.
|
|
while(*pTraverse != '\0') {
|
|
pTraverse++;
|
|
}
|
|
pTraverse++;
|
|
}
|
|
|
|
delete[] aBuffer;
|
|
}
|
|
|
|
void COleRegistry::RegisterIniViewers() {
|
|
// Purpose: Read in the INI entries, and register them as valid automated viewers.
|
|
// Arguments: void
|
|
// Returns: void
|
|
// Comments: This should really only be called after all other normal viewers are registered.
|
|
|
|
// Over 2K is a nightmare.
|
|
char *aBuffer = new char[4096];
|
|
theApp.GetPrivateProfileString("Automation Viewers", NULL, "", aBuffer, 4096, AfxGetApp()->m_pszProfileName);
|
|
|
|
// We have a double null terminated list of mime types here.
|
|
// Go ahead and go through each one, and then obtain the value for each.
|
|
char *pTraverse = aBuffer;
|
|
CString csServerName;
|
|
while(*pTraverse != '\0') {
|
|
// Get the entry for this mime type.
|
|
csServerName = theApp.GetProfileString("Automation Viewers", pTraverse);
|
|
if(csServerName.IsEmpty() != TRUE) {
|
|
// Have a valid entry. Cause it to be registered.
|
|
COLEStreamData *pOData = new COLEStreamData(csServerName, pTraverse);
|
|
if(FALSE == WPM_RegisterContentTypeConverter(pTraverse, FO_PRESENT, (void *)pOData, ole_stream, TRUE)) {
|
|
// Couldn't do it.
|
|
delete pOData;
|
|
}
|
|
}
|
|
|
|
// Go on to the next entry.
|
|
while(*pTraverse != '\0') {
|
|
pTraverse++;
|
|
}
|
|
pTraverse++;
|
|
}
|
|
|
|
delete[] aBuffer;
|
|
}
|
|
|
|
// Cause all startup watchers to be fired.
|
|
// Depending on the number, this could decrease startup time significantly.
|
|
// Be sure to always have the splash screen say what's going on, so the user
|
|
// knows it's the fault of another application.
|
|
void COleRegistry::Startup()
|
|
{
|
|
// Go through all entries under "Automation Startup"
|
|
char *aBuffer = new char[4096];
|
|
theApp.GetPrivateProfileString("Automation Startup", NULL, "", aBuffer, 4096, AfxGetApp()->m_pszProfileName);
|
|
|
|
// We have a double null terminated list of OLE objects here.
|
|
// Go ahead and go through each one.
|
|
char *pTraverse = aBuffer;
|
|
CString csServerName;
|
|
while(*pTraverse != '\0') {
|
|
// Get the entry for this object.
|
|
csServerName = pTraverse;
|
|
if(csServerName.IsEmpty() != TRUE) {
|
|
// Update the splash screen if present.
|
|
if(theApp.m_splash.m_hWnd && theApp.m_splash.IsWindowVisible()) {
|
|
theApp.m_splash.DisplayStatus((LPCSTR)csServerName);
|
|
}
|
|
|
|
// start up a conversation with out startup wannabe.
|
|
IStartup isNotify;
|
|
TRY {
|
|
isNotify.CreateDispatch(csServerName);
|
|
isNotify.Initialize((long)theApp.m_hInstance);
|
|
}
|
|
CATCH(CException, e) {
|
|
// Couldn't inform/create the object.
|
|
TRACE("Couldn't notify startup object %s\n", (const char *)csServerName);
|
|
}
|
|
END_CATCH
|
|
}
|
|
|
|
// Go on to the next entry.
|
|
while(*pTraverse != '\0') {
|
|
pTraverse++;
|
|
}
|
|
pTraverse++;
|
|
}
|
|
|
|
delete[] aBuffer;
|
|
}
|
|
|
|
// Cause all startup watchers to be fired.
|
|
// Depending on the number, this could decrease shutup time significantly.
|
|
void COleRegistry::Shutdown()
|
|
{
|
|
// Go through all entries under "Automation Shutdown"
|
|
char *aBuffer = new char[4096];
|
|
theApp.GetPrivateProfileString("Automation Shutdown", NULL, "", aBuffer, 4096, AfxGetApp()->m_pszProfileName);
|
|
|
|
// We have a double null terminated list of OLE objects here.
|
|
// Go ahead and go through each one.
|
|
char *pTraverse = aBuffer;
|
|
CString csServerName;
|
|
while(*pTraverse != '\0') {
|
|
// Get the entry for this object.
|
|
csServerName = pTraverse;
|
|
if(csServerName.IsEmpty() != TRUE) {
|
|
// start up a conversation with out startup wannabe.
|
|
IShutdown isNotify;
|
|
TRY {
|
|
isNotify.CreateDispatch(csServerName);
|
|
isNotify.Initialize((long)theApp.m_hInstance);
|
|
}
|
|
CATCH(CException, e) {
|
|
// Couldn't inform/create the object.
|
|
TRACE("Couldn't notify shutdown object %s\n", (const char *)csServerName);
|
|
}
|
|
END_CATCH
|
|
}
|
|
|
|
// Go on to the next entry.
|
|
while(*pTraverse != '\0') {
|
|
pTraverse++;
|
|
}
|
|
pTraverse++;
|
|
}
|
|
|
|
delete[] aBuffer;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(COleRegistry, CCmdTarget)
|
|
//{{AFX_MSG_MAP(COleRegistry)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BEGIN_DISPATCH_MAP(COleRegistry, CCmdTarget)
|
|
//{{AFX_DISPATCH_MAP(COleRegistry)
|
|
DISP_FUNCTION(COleRegistry, "RegisterViewer", RegisterViewer, VT_BOOL, VTS_BSTR VTS_BSTR)
|
|
DISP_FUNCTION(COleRegistry, "RegisterProtocol", RegisterProtocol, VT_BOOL, VTS_BSTR VTS_BSTR)
|
|
DISP_FUNCTION(COleRegistry, "RegisterStartup", RegisterStartup, VT_BOOL, VTS_BSTR)
|
|
DISP_FUNCTION(COleRegistry, "RegisterShutdown", RegisterShutdown, VT_BOOL, VTS_BSTR)
|
|
//}}AFX_DISPATCH_MAP
|
|
END_DISPATCH_MAP()
|
|
|
|
IMPLEMENT_OLECREATE(COleRegistry, "Netscape.Registry.1", 0xe67d6a10, 0x4438, 0x11ce, 0x8c, 0xe4, 0x0, 0x20, 0xaf, 0x18, 0xf9, 0x5)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COleRegistry message handlers
|
|
|
|
BOOL COleRegistry::RegisterViewer(LPCTSTR pMimeType, LPCTSTR pRegistryName) {
|
|
// Purpose: Register a particular autmation server as an External Viewer.
|
|
// Arguments: pMimeType The mime type they'd like to handle.
|
|
// pRegistryName The name of the registered automation server, as known to the system registry.
|
|
// Returns: BOOL TRUE The registration was a success.
|
|
// FALSE The registration failed, another OLE automation server is already registered for said
|
|
// MimeType.
|
|
// Comments: One way registration; is probably wrong, but future revisions will address this problem.
|
|
|
|
TRACE("RegisterViewer(%s, %s)\n", pMimeType, pRegistryName);
|
|
|
|
// If it's not a valid request, reject it right now.
|
|
if(pMimeType == NULL || pRegistryName == NULL) {
|
|
return(FALSE);
|
|
}
|
|
|
|
// Allright, create a new item to attempt to add to the list of registered viewers.
|
|
COLEStreamData *pOData = new COLEStreamData(pRegistryName, pMimeType);
|
|
if(FALSE == WPM_RegisterContentTypeConverter((char *)pMimeType, FO_PRESENT, (void *)pOData, ole_stream, TRUE)) {
|
|
// Couldn't do it.
|
|
// Tell them that a converter is already registered, be it DDE or OLE.
|
|
delete pOData;
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
// Add the string to the INI file for retrieval on startup.
|
|
theApp.WriteProfileString("Automation Viewers", pMimeType, pRegistryName);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
BOOL COleRegistry::RegisterProtocol(LPCTSTR pProtocol, LPCTSTR pRegistryName) {
|
|
// Purpose: Register a particular autmation server as an External Protocol handler.
|
|
// Arguments: pProtocol The protocol they'd like to handle.
|
|
// pRegistryName The name of the registered automation server, as known to the system registry.
|
|
// Returns: BOOL TRUE The registration was a success.
|
|
// FALSE The registration failed, another OLE automation server is already registered for said
|
|
// Protocol.
|
|
// Comments: One way registration; is probably wrong, but future revisions will address this problem.
|
|
|
|
TRACE("RegisterProtocol(%s, %s)\n", pProtocol, pRegistryName);
|
|
|
|
// First, return failure on any stupid cases.
|
|
if(pProtocol == NULL || pRegistryName == NULL) {
|
|
return(FALSE);
|
|
}
|
|
|
|
CString csProtocol = pProtocol;
|
|
CString csServiceName = pRegistryName;
|
|
return(COLEProtocolItem::OLERegister(csProtocol, csServiceName));
|
|
}
|
|
|
|
// New startup object being registered.
|
|
// Save to Registry/INI.
|
|
BOOL COleRegistry::RegisterStartup(LPCTSTR pRegistryName)
|
|
{
|
|
theApp.WriteProfileString("Automation Startup", pRegistryName, "");
|
|
|
|
// Always succeed for now.
|
|
return (TRUE);
|
|
}
|
|
|
|
// New shutdown object being registered.
|
|
// Save to Registry/INI.
|
|
BOOL COleRegistry::RegisterShutdown(LPCTSTR pRegistryName)
|
|
{
|
|
theApp.WriteProfileString("Automation Shutdown", pRegistryName, "");
|
|
|
|
// Always succeed for now.
|
|
return (TRUE);
|
|
}
|