| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
- #include "stdafx.h"
- #ifdef AFX_OLE3_SEG
- #pragma code_seg(AFX_OLE3_SEG)
- #endif
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- #define new DEBUG_NEW
- /////////////////////////////////////////////////////////////////////////////
- // COleTemplateServer
- COleTemplateServer::COleTemplateServer()
- : COleObjectFactory(CLSID_NULL, NULL, FALSE, NULL)
- {
- m_pDocTemplate = NULL;
- }
- BOOL COleTemplateServer::Register()
- {
- return COleObjectFactory::Register();
- }
- BOOL COleTemplateServer::OnCmdMsg(UINT nID, int nCode, void* pExtra,
- AFX_CMDHANDLERINFO* pHandlerInfo)
- {
- BOOL bReturn;
- if (nCode == CN_OLE_UNREGISTER)
- bReturn = Unregister();
- else
- bReturn = COleObjectFactory::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
- return bReturn;
- }
- BOOL COleTemplateServer::Unregister()
- {
- BOOL bReturn = COleObjectFactory::Unregister();
- if (!bReturn)
- return FALSE;
- // get registration info from doc template string
- CString strServerName;
- CString strLocalServerName;
- CString strLocalShortName;
- if (!m_pDocTemplate->GetDocString(strServerName,
- CDocTemplate::regFileTypeId) || strServerName.IsEmpty())
- {
- TRACE0("Error: not enough information in DocTemplate to unregister OLE server.\n");
- return FALSE;
- }
- if (!m_pDocTemplate->GetDocString(strLocalServerName,
- CDocTemplate::regFileTypeName))
- strLocalServerName = strServerName; // use non-localized name
- if (!m_pDocTemplate->GetDocString(strLocalShortName,
- CDocTemplate::fileNewName))
- strLocalShortName = strLocalServerName; // use long name
- ASSERT(strServerName.Find(' ') == -1); // no spaces allowed
- // place entries in system registry
- if (!AfxOleUnregisterServerClass(m_clsid, strServerName,
- strLocalShortName, strLocalServerName, (OLE_APPTYPE) m_bOAT))
- {
- bReturn = FALSE;
- }
- return bReturn;
- }
- void COleTemplateServer::ConnectTemplate(
- REFCLSID clsid, CDocTemplate* pDocTemplate, BOOL bMultiInstance)
- {
- ASSERT_VALID(this);
- ASSERT_VALID(pDocTemplate);
- ASSERT(pDocTemplate->m_pAttachedFactory == NULL);
- // setup initial state of underlying COleObjectFactory
- m_clsid = clsid;
- ASSERT(m_pRuntimeClass == NULL);
- m_bMultiInstance = bMultiInstance;
- // attach the doc template to the factory
- m_pDocTemplate = pDocTemplate;
- m_pDocTemplate->m_pAttachedFactory = this;
- }
- void COleTemplateServer::UpdateRegistry(OLE_APPTYPE nAppType,
- LPCTSTR* rglpszRegister, LPCTSTR* rglpszOverwrite)
- {
- ASSERT(m_pDocTemplate != NULL);
- ASSERT(m_bOAT == (BYTE) OAT_UNKNOWN);
- m_bOAT = (BYTE) nAppType;
- // get registration info from doc template string
- CString strServerName;
- CString strLocalServerName;
- CString strLocalShortName;
- CString strLocalFilterName;
- CString strLocalFilterExt;
- if (!m_pDocTemplate->GetDocString(strServerName,
- CDocTemplate::regFileTypeId) || strServerName.IsEmpty())
- {
- TRACE0("Error: not enough information in DocTemplate to register OLE server.\n");
- return;
- }
- if (!m_pDocTemplate->GetDocString(strLocalServerName,
- CDocTemplate::regFileTypeName))
- strLocalServerName = strServerName; // use non-localized name
- if (!m_pDocTemplate->GetDocString(strLocalShortName,
- CDocTemplate::fileNewName))
- strLocalShortName = strLocalServerName; // use long name
- if (!m_pDocTemplate->GetDocString(strLocalFilterName,
- CDocTemplate::filterName))
- ASSERT(nAppType != OAT_DOC_OBJECT_SERVER);
- if (!m_pDocTemplate->GetDocString(strLocalFilterExt,
- CDocTemplate::filterExt))
- ASSERT(nAppType != OAT_DOC_OBJECT_SERVER);
- ASSERT(strServerName.Find(' ') == -1); // no spaces allowed
- int nIconIndex = 0;
- POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
- for (int nIndex = 1; pos != NULL; nIndex++)
- {
- CDocTemplate* pTemplate = AfxGetApp()->GetNextDocTemplate(pos);
- if (pTemplate == m_pDocTemplate)
- {
- nIconIndex = nIndex;
- pos = NULL; // set exit condition
- }
- }
- // place entries in system registry
- if (!AfxOleRegisterServerClass(m_clsid, strServerName,
- strLocalShortName, strLocalServerName, nAppType,
- rglpszRegister, rglpszOverwrite, nIconIndex,
- strLocalFilterName, strLocalFilterExt))
- {
- // not fatal (don't fail just warn)
- AfxMessageBox(AFX_IDP_FAILED_TO_AUTO_REGISTER);
- }
- }
- CCmdTarget* COleTemplateServer::OnCreateObject()
- {
- ASSERT_VALID(this);
- ASSERT_VALID(m_pDocTemplate);
- // save application user control status
- BOOL bUserCtrl = AfxOleGetUserCtrl();
- // create invisible doc/view/frame set
- CDocument* pDoc = m_pDocTemplate->OpenDocumentFile(NULL, FALSE);
- // restore application's user control status
- AfxOleSetUserCtrl(bUserCtrl);
- if (pDoc != NULL)
- {
- ASSERT_VALID(pDoc);
- ASSERT_KINDOF(CDocument, pDoc);
- // all new documents created by OLE start out modified
- pDoc->SetModifiedFlag();
- }
- return pDoc;
- }
- /////////////////////////////////////////////////////////////////////////////
|