gecko-dev/cmd/winfe/oleregis.cpp

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);
}