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