Annotation of mstools/mfc/src/olesvr.cpp, revision 1.1

1.1     ! root        1: // This is a part of the Microsoft Foundation Classes C++ library. 
        !             2: // Copyright (C) 1992 Microsoft Corporation 
        !             3: // All rights reserved. 
        !             4: //  
        !             5: // This source code is only intended as a supplement to the 
        !             6: // Microsoft Foundation Classes Reference and Microsoft 
        !             7: // QuickHelp documentation provided with the library. 
        !             8: // See these sources for detailed information regarding the 
        !             9: // Microsoft Foundation Classes product. 
        !            10: 
        !            11: #include "afxole.h"
        !            12: #pragma hdrstop
        !            13: 
        !            14: #include "oleptr_.h"
        !            15: #include <limits.h>
        !            16: 
        !            17: #include "shellapi.h"
        !            18: 
        !            19: #ifdef AFX_OLE_SEG
        !            20: #pragma code_seg(AFX_OLE_SEG)
        !            21: #endif
        !            22: 
        !            23: #ifdef _DEBUG
        !            24: #undef THIS_FILE
        !            25: static char BASED_CODE THIS_FILE[] = __FILE__;
        !            26: #endif
        !            27: 
        !            28: #define OLEEXPORT FAR PASCAL _export
        !            29: 
        !            30: /////////////////////////////////////////////////////////////////////////////
        !            31: // Helper class for locking out main message pump during callbacks
        !            32: 
        !            33: class LOCK_PUMP
        !            34: {
        !            35: public:
        !            36:        LOCK_PUMP()
        !            37:        {
        !            38: #ifdef _DEBUG
        !            39:                AfxGetApp()->EnablePump(FALSE);
        !            40: #endif
        !            41:        }
        !            42: 
        !            43:        ~LOCK_PUMP()
        !            44:        {
        !            45: #ifdef _DEBUG
        !            46:                AfxGetApp()->EnablePump(TRUE);
        !            47: #endif
        !            48:        }
        !            49: };
        !            50: 
        !            51: #define OLE_TRACE(string)   \
        !            52:        if (afxTraceFlags & 0x10)   \
        !            53:                TRACE(string)
        !            54: 
        !            55: /////////////////////////////////////////////////////////////////////////////
        !            56: // OLEOBJECT callbacks mapping to COleServerItem virtual functions
        !            57: 
        !            58: inline COleServerItem * COleServerItem::FromLp(LPOLEOBJECT lpObject)
        !            59: {
        !            60:        ASSERT(lpObject != NULL);
        !            61:        COleServerItem* pItem;
        !            62:        pItem = (COleServerItem*) GetPtrFromFarPtr(lpObject, sizeof(CObject));
        !            63:        ASSERT(lpObject == &pItem->m_oleObject);
        !            64:        return pItem;
        !            65: }
        !            66: 
        !            67: // friend class to get access to COleServerItem protected implementations
        !            68: struct _afxOleServerItemImplementation
        !            69: {
        !            70: 
        !            71:        static LPVOID OLEEXPORT
        !            72:        QueryProtocol(LPOLEOBJECT lpObject, OLE_LPCSTR lpszProtocol)
        !            73:        {
        !            74:                LOCK_PUMP lock;
        !            75:                OLE_TRACE("COleServerItem::OnQueryProtocol()\n");
        !            76:                return COleServerItem::FromLp(lpObject)->OnQueryProtocol(lpszProtocol);
        !            77:        }
        !            78: 
        !            79:        static OLESTATUS OLEEXPORT
        !            80:        Release(LPOLEOBJECT lpObject)
        !            81:        {
        !            82:                LOCK_PUMP lock;
        !            83:                OLE_TRACE("COleServerItem::OnRelease()\n");
        !            84:                return COleServerItem::FromLp(lpObject)->OnRelease();
        !            85:        }
        !            86: 
        !            87:        static OLESTATUS OLEEXPORT
        !            88:        Show(LPOLEOBJECT lpObject, BOOL bTakeFocus)
        !            89:        {
        !            90:                LOCK_PUMP lock;
        !            91:                OLE_TRACE("COleServerItem::OnShow()\n");
        !            92:                return COleServerItem::FromLp(lpObject)->OnShow(bTakeFocus);
        !            93:        }
        !            94: 
        !            95:        static OLESTATUS OLEEXPORT
        !            96:        DoVerb(LPOLEOBJECT lpObject, UINT nVerb, BOOL bShow, BOOL bTakeFocus)
        !            97:        {
        !            98:                LOCK_PUMP lock;
        !            99:                OLE_TRACE("COleServerItem::OnDoVerb()\n");
        !           100: 
        !           101:                OLESTATUS status;
        !           102:                status = COleServerItem::FromLp(lpObject)->OnDoVerb(nVerb, bShow,
        !           103:                        bTakeFocus);
        !           104: #ifdef _DEBUG
        !           105:                if ((afxTraceFlags & 0x10) && status != OLE_OK)
        !           106:                        TRACE("COleServerItem::OnDoVerb(%d) failed\n", nVerb);
        !           107: #endif
        !           108:                return status;
        !           109:        }
        !           110: 
        !           111:        static OLESTATUS OLEEXPORT
        !           112:        GetData(LPOLEOBJECT lpObject, OLECLIPFORMAT nFormat,
        !           113:                LPHANDLE lphDataReturn)
        !           114:        {
        !           115:                LOCK_PUMP lock;
        !           116:                OLE_TRACE("COleServerItem::OnGetData()\n");
        !           117:                OLESTATUS status;
        !           118:                status = COleServerItem::FromLp(lpObject)->OnGetData(nFormat, lphDataReturn);
        !           119: #ifdef _DEBUG
        !           120:                if ((afxTraceFlags & 0x10) && status != OLE_OK)
        !           121:                        TRACE("COleServerItem::OnGetData() failed to get format 0x%x\n",
        !           122:                                        nFormat);
        !           123: #endif
        !           124:                return status;
        !           125:        }
        !           126: 
        !           127:        static OLESTATUS OLEEXPORT
        !           128:        SetData(LPOLEOBJECT lpObject, OLECLIPFORMAT nFormat, HANDLE hData)
        !           129:        {
        !           130:                LOCK_PUMP lock;
        !           131:                OLE_TRACE("COleServerItem::OnSetData()\n");
        !           132:                return COleServerItem::FromLp(lpObject)->OnSetData(nFormat, hData);
        !           133:        }
        !           134: 
        !           135:        static OLESTATUS OLEEXPORT
        !           136:        SetTargetDevice(LPOLEOBJECT lpObject, HANDLE hData)
        !           137:        {
        !           138:                LOCK_PUMP lock;
        !           139:                OLE_TRACE("COleServerItem::OnSetTargetDevice()\n");
        !           140: 
        !           141:                OLESTATUS status;
        !           142:                status = COleServerItem::FromLp(lpObject)->OnSetTargetDevice(
        !           143:                        (LPOLETARGETDEVICE)((hData == NULL) ? NULL : ::GlobalLock(hData)));
        !           144: 
        !           145:                if (hData != NULL)
        !           146:                {
        !           147:                        ::GlobalUnlock(hData);
        !           148:                        ::GlobalFree(hData);
        !           149:                }
        !           150:                return status;
        !           151:        }
        !           152: 
        !           153:        static OLESTATUS OLEEXPORT
        !           154:        SetBounds(LPOLEOBJECT lpObject, OLE_CONST RECT FAR* lpRect)
        !           155:        {
        !           156:                LOCK_PUMP lock;
        !           157:                OLE_TRACE("COleServerItem::SetBounds()\n");
        !           158:                return COleServerItem::FromLp(lpObject)->OnSetBounds((LPRECT)lpRect);
        !           159:        }
        !           160: 
        !           161:        static OLECLIPFORMAT OLEEXPORT
        !           162:        EnumFormats(LPOLEOBJECT lpObject, OLECLIPFORMAT nFormat)
        !           163:        {
        !           164:                OLECLIPFORMAT wNext;
        !           165:                LOCK_PUMP lock;
        !           166:                wNext = COleServerItem::FromLp(lpObject)->OnEnumFormats(nFormat);
        !           167: #ifdef _DEBUG
        !           168:                if (afxTraceFlags & 0x10)
        !           169:                        TRACE("COleServerItem::OnEnumFormats(0x%x) returns 0x%x\n",
        !           170:                                nFormat, wNext);
        !           171: #endif
        !           172:                return wNext;
        !           173:        }
        !           174: 
        !           175:        static OLESTATUS OLEEXPORT
        !           176:        SetColorScheme(LPOLEOBJECT lpObject, OLE_CONST LOGPALETTE FAR* lpLogPalette)
        !           177:        {
        !           178:                LOCK_PUMP lock;
        !           179:                OLE_TRACE("COleServerItem::SetColorScheme()\n");
        !           180:                return COleServerItem::FromLp(lpObject)->
        !           181:                                OnSetColorScheme((LPLOGPALETTE)lpLogPalette);
        !           182:        }
        !           183: 
        !           184: };
        !           185: 
        !           186: static struct _OLEOBJECTVTBL NEAR objectVtbl =
        !           187: {
        !           188:        &_afxOleServerItemImplementation::QueryProtocol,
        !           189:        &_afxOleServerItemImplementation::Release,
        !           190:        &_afxOleServerItemImplementation::Show,
        !           191:        &_afxOleServerItemImplementation::DoVerb,
        !           192:        &_afxOleServerItemImplementation::GetData,
        !           193:        &_afxOleServerItemImplementation::SetData,
        !           194:        &_afxOleServerItemImplementation::SetTargetDevice,
        !           195:        &_afxOleServerItemImplementation::SetBounds,
        !           196:        &_afxOleServerItemImplementation::EnumFormats,
        !           197:        &_afxOleServerItemImplementation::SetColorScheme,
        !           198: };
        !           199: 
        !           200: //////////////////////////////////////////////////////////////////////////////
        !           201: // Server view of embedded OLEOBJECT (includes back pointer to OLECLIENT)
        !           202: 
        !           203: IMPLEMENT_DYNAMIC(COleServerItem, CObject)
        !           204: 
        !           205: COleServerItem::COleServerItem()
        !           206: {
        !           207:        m_oleObject.lpvtbl = &objectVtbl;
        !           208:        m_pDocument = NULL;
        !           209:        m_hPalette = NULL;
        !           210:        m_lpClient = NULL;  // will be set later
        !           211:        m_rectBounds.SetRectEmpty();
        !           212: }
        !           213: 
        !           214: COleServerItem::~COleServerItem()
        !           215: {
        !           216:        ASSERT(m_lpClient == NULL);     // must be released first
        !           217:        if (m_hPalette != NULL)
        !           218:                ::DeleteObject(m_hPalette);
        !           219: }
        !           220: 
        !           221: void
        !           222: COleServerItem::BeginRevoke()   // Start revoking the client connection
        !           223: {
        !           224:        ASSERT(m_lpClient != NULL);
        !           225: 
        !           226:        OLESTATUS status = ::OleRevokeObject(m_lpClient);
        !           227:        ASSERT(status == OLE_OK || status == OLE_WAIT_FOR_RELEASE);
        !           228:        // revoke will not be finished until OnRelease called
        !           229: }
        !           230: 
        !           231: 
        !           232: int
        !           233: COleServerItem::NotifyClient(OLE_NOTIFICATION wNotify)
        !           234: {
        !           235:        ASSERT(m_lpClient != NULL);
        !           236:        ASSERT(wNotify <= OLE_QUERY_RETRY); // last valid notification code
        !           237: 
        !           238: #ifdef _DEBUG
        !           239:        if (afxTraceFlags & 0x10)
        !           240:                TRACE("Notifying client item (wNotification = %d)\n", wNotify);
        !           241: #endif
        !           242:        return (*m_lpClient->lpvtbl->CallBack)(m_lpClient, wNotify, &m_oleObject);
        !           243: }
        !           244: 
        !           245: //////////////////////////////////////////////////////////////////////////////
        !           246: // Default implementations
        !           247: 
        !           248: OLESTATUS
        !           249: COleServerItem::OnRelease()
        !           250: {
        !           251:        ASSERT(m_lpClient != NULL);
        !           252:        m_lpClient = NULL;
        !           253: 
        !           254:        return OLE_OK;
        !           255: }
        !           256: 
        !           257: 
        !           258: OLESTATUS
        !           259: COleServerItem::OnSetTargetDevice(LPOLETARGETDEVICE /*lpTargetDevice*/)
        !           260: {
        !           261:        // default to ignore request
        !           262:        return OLE_OK;
        !           263: }
        !           264: 
        !           265: 
        !           266: BOOL
        !           267: COleServerItem::OnGetTextData(CString& /*rStringReturn*/)
        !           268: {
        !           269:        // default to not supported
        !           270:        return FALSE;
        !           271: }
        !           272: 
        !           273: 
        !           274: OLESTATUS
        !           275: COleServerItem::OnExtraVerb(UINT /*nVerb*/)
        !           276: {
        !           277:        return OLE_ERROR_DOVERB;    // Error in sending do verb, or invalid
        !           278: }
        !           279: 
        !           280: 
        !           281: // Overridables you do not have to override
        !           282: LPVOID
        !           283: COleServerItem::OnQueryProtocol(LPCSTR lpszProtocol) const
        !           284: {
        !           285:        if (_fstrcmp(lpszProtocol, "StdFileEditing") == 0)
        !           286:                return (LPVOID) &m_oleObject;
        !           287: 
        !           288:        return NULL;        // not supported
        !           289: }
        !           290: 
        !           291: 
        !           292: OLESTATUS
        !           293: COleServerItem::OnSetColorScheme(LPLOGPALETTE lpLogPalette)
        !           294: {
        !           295:        // save in item palette
        !           296:        HPALETTE hNewPal = ::CreatePalette(lpLogPalette);
        !           297: 
        !           298:        if (hNewPal == NULL)
        !           299:                return OLE_ERROR_PALETTE;
        !           300: 
        !           301:        if (m_hPalette != NULL)
        !           302:                ::DeleteObject(m_hPalette);
        !           303:        m_hPalette = hNewPal;
        !           304:        return OLE_OK;
        !           305: }
        !           306: 
        !           307: OLESTATUS
        !           308: COleServerItem::OnSetBounds(LPRECT lpRect)
        !           309: {
        !           310:        m_rectBounds = lpRect;
        !           311:        return OLE_OK;
        !           312: }
        !           313: 
        !           314: 
        !           315: OLESTATUS
        !           316: COleServerItem::OnDoVerb(UINT nVerb, BOOL bShow, BOOL bTakeFocus)
        !           317: {
        !           318:        OLESTATUS status;
        !           319:        if (nVerb == OLEVERB_PRIMARY)
        !           320:        {
        !           321:                status = OLE_OK;
        !           322:        }
        !           323:        else
        !           324:        {
        !           325:                status = OnExtraVerb(nVerb);
        !           326:        }
        !           327: 
        !           328:        if ((status == OLE_OK) && bShow)
        !           329:                status = OnShow(bTakeFocus);
        !           330:        return status;
        !           331: }
        !           332: 
        !           333: 
        !           334: // Clipboard formats
        !           335: 
        !           336: static UINT cfNative = ::RegisterClipboardFormat("Native");
        !           337: static UINT cfOwnerLink = ::RegisterClipboardFormat("OwnerLink");
        !           338: static UINT cfObjectLink = ::RegisterClipboardFormat("ObjectLink");
        !           339: 
        !           340: static UINT formats[] =
        !           341: {
        !           342:        cfNative,           // native data format
        !           343:        CF_METAFILEPICT,    // item rendered as a metafile
        !           344:        CF_TEXT,            // optionally supported if OnGetTextData implemented
        !           345:        NULL
        !           346: };
        !           347: 
        !           348: OLECLIPFORMAT
        !           349: COleServerItem::OnEnumFormats(OLECLIPFORMAT nFormat) const
        !           350: {
        !           351:        int index = 0;
        !           352:        if (nFormat != 0)
        !           353:        {
        !           354:                // find the last element
        !           355:                while (formats[index++] != nFormat)
        !           356:                        ;
        !           357:        }
        !           358:        return (OLECLIPFORMAT)formats[index];
        !           359: }
        !           360: 
        !           361: HANDLE
        !           362: COleServerItem::GetNativeData()
        !           363: {
        !           364:        // get native data via serialization
        !           365:        CSharedFile memFile;
        !           366: 
        !           367:        TRY
        !           368:        {
        !           369:                CArchive    getArchive(&memFile, CArchive::store);
        !           370:                this->Serialize(getArchive);        // store to archive
        !           371:        }
        !           372:        CATCH (CNotSupportedException, e)
        !           373:        {
        !           374:                memFile.Close();
        !           375:                return NULL;        // not supported
        !           376:        }
        !           377:        AND_CATCH (CException, e)
        !           378:        {
        !           379:                memFile.Close();
        !           380:                THROW_LAST();       // will be caught in GetData
        !           381:        }
        !           382:        END_CATCH
        !           383:        return memFile.Detach();
        !           384: }
        !           385: 
        !           386: HANDLE
        !           387: COleServerItem::GetMetafileData()
        !           388: {
        !           389:        CMetaFileDC dc;
        !           390:        if (!dc.Create())
        !           391:                return NULL;
        !           392: 
        !           393:        if (m_hPalette)
        !           394:        {
        !           395:                ::SelectPalette(dc.m_hDC, m_hPalette, TRUE);
        !           396:                dc.RealizePalette();
        !           397:        }
        !           398: 
        !           399:        // Paint directly into the metafile.
        !           400:        if (!OnDraw(&dc))
        !           401:        {
        !           402:                OLE_TRACE("calling COleServerItem::OnDraw() failed\n");
        !           403:                return NULL;    // will destroy DC
        !           404:        }
        !           405: 
        !           406:        HMETAFILE hMF = (HMETAFILE)dc.Close();
        !           407:        if (hMF == NULL)
        !           408:                return NULL;
        !           409: 
        !           410:        HANDLE hPict;
        !           411:        if ((hPict = ::GlobalAlloc(GMEM_DDESHARE, sizeof(METAFILEPICT))) == NULL)
        !           412:        {
        !           413:                DeleteMetaFile(hMF);
        !           414:                return NULL;
        !           415:        }
        !           416: 
        !           417:        LPMETAFILEPICT lpPict;
        !           418:        if ((lpPict = (LPMETAFILEPICT)::GlobalLock(hPict)) == NULL)
        !           419:        {
        !           420:                DeleteMetaFile(hMF);
        !           421:                ::GlobalFree(hPict);
        !           422:                return NULL;
        !           423:        }
        !           424: 
        !           425:        lpPict->mm = MM_ANISOTROPIC;
        !           426:        lpPict->hMF = hMF;
        !           427:        lpPict->xExt = m_rectBounds.Width();
        !           428:        lpPict->yExt = m_rectBounds.Height();   // will be negative for HiMetric
        !           429:        ::GlobalUnlock(hPict);
        !           430:        return hPict;
        !           431: }
        !           432: 
        !           433: 
        !           434: OLESTATUS
        !           435: COleServerItem::OnGetData(OLECLIPFORMAT nFormat, LPHANDLE lphReturn)
        !           436: {
        !           437:        HANDLE hData = NULL;    // default to not supported
        !           438: 
        !           439:        TRY
        !           440:        {
        !           441:                if (nFormat == cfNative)
        !           442:                {
        !           443:                        hData = GetNativeData();
        !           444:                }
        !           445:                else if (nFormat == CF_METAFILEPICT)
        !           446:                {
        !           447:                        hData = GetMetafileData();
        !           448:                }
        !           449:                else if (nFormat == CF_TEXT) 
        !           450:                {
        !           451:                        CString text;
        !           452:                        if (OnGetTextData(text))
        !           453:                        {
        !           454:                                // allocate a global block for the string
        !           455:                                hData = ::GlobalAlloc(GMEM_DDESHARE, text.GetLength() + 1);
        !           456:                                if (hData == NULL)
        !           457:                                        AfxThrowMemoryException();
        !           458: 
        !           459:                                LPSTR  lpszText = (LPSTR)::GlobalLock(hData);
        !           460:                                ASSERT(lpszText != NULL);
        !           461:                                _fstrcpy(lpszText, (const char*) text);
        !           462:                                ::GlobalUnlock(hData);
        !           463:                        }
        !           464:                }
        !           465:                else
        !           466:                {
        !           467:                        TRACE("Warning: OLE get data, unknown format %d\n", nFormat);
        !           468:                }
        !           469:        }
        !           470:        CATCH (COleException, e)
        !           471:        {
        !           472:                return e->m_status;
        !           473:        }
        !           474:        AND_CATCH (CException, e)
        !           475:        {
        !           476:                // other exceptions
        !           477:                return OLE_ERROR_MEMORY;
        !           478:        }
        !           479:        END_CATCH
        !           480: 
        !           481:        if (hData == NULL)
        !           482:                return OLE_ERROR_FORMAT;        // not supported
        !           483: 
        !           484:        // return the data
        !           485:        *lphReturn = hData;
        !           486:        return OLE_OK;
        !           487: }
        !           488: 
        !           489: 
        !           490: OLESTATUS
        !           491: COleServerItem::OnSetData(OLECLIPFORMAT nFormat, HANDLE hData)
        !           492: {
        !           493:        if (nFormat != cfNative)
        !           494:        {
        !           495:                ::GlobalFree(hData);
        !           496:                return OLE_ERROR_FORMAT;    // Requested format is not available
        !           497:        }
        !           498: 
        !           499:        // set native data via serialization
        !           500:        CSharedFile memFile;
        !           501:        memFile.SetHandle(hData);
        !           502: 
        !           503:        TRY
        !           504:        {
        !           505:                CArchive    setArchive(&memFile, CArchive::load);
        !           506:                this->Serialize(setArchive);        // load me
        !           507:        }
        !           508:        CATCH (CException, e)
        !           509:        {
        !           510:                memFile.Close();
        !           511:                return OLE_ERROR_GENERIC;
        !           512:        }
        !           513:        END_CATCH
        !           514: 
        !           515:        return OLE_OK;
        !           516: }
        !           517: 
        !           518: 
        !           519: /////////////////////////////////////////////////////////////////////////////
        !           520: /////////////////////////////////////////////////////////////////////////////
        !           521: // COleServerDoc
        !           522: 
        !           523: inline COleServerDoc * COleServerDoc::FromLp(LPOLESERVERDOC lpServerDoc)
        !           524: {
        !           525:        COleServerDoc* pDoc;
        !           526:        pDoc = (COleServerDoc*) GetPtrFromFarPtr(lpServerDoc, sizeof(CObject));
        !           527:        ASSERT(lpServerDoc == &pDoc->m_oleServerDoc);
        !           528:        return pDoc;
        !           529: }
        !           530: 
        !           531: // friend class to get access to COleServerDoc protected implementations
        !           532: struct _afxOleServerDocImplementation
        !           533: {
        !           534: 
        !           535:        static OLESTATUS OLEEXPORT
        !           536:        Save(LPOLESERVERDOC lpServerDoc)
        !           537:        {
        !           538:                LOCK_PUMP lock;
        !           539:                OLE_TRACE("COleServerDoc::OnSave()\n");
        !           540:                return COleServerDoc::FromLp(lpServerDoc)->OnSave();
        !           541:        }
        !           542: 
        !           543:        static OLESTATUS OLEEXPORT
        !           544:        Close(LPOLESERVERDOC lpServerDoc)
        !           545:        {
        !           546:                LOCK_PUMP lock;
        !           547:                OLE_TRACE("COleServerDoc::OnClose()\n");
        !           548:                return COleServerDoc::FromLp(lpServerDoc)->OnClose();
        !           549:        }
        !           550: 
        !           551:        static OLESTATUS OLEEXPORT
        !           552:        SetHostNames(LPOLESERVERDOC lpServerDoc,
        !           553:                OLE_LPCSTR lpszClient, OLE_LPCSTR lpszDoc)
        !           554:        {
        !           555:                LOCK_PUMP lock;
        !           556:                OLE_TRACE("COleServerDoc::OnSetHostNames()\n");
        !           557:                OLESTATUS status = COleServerDoc::FromLp(lpServerDoc)->OnSetHostNames(
        !           558:                        lpszClient, lpszDoc);
        !           559:                return status;
        !           560:        }
        !           561: 
        !           562:        static OLESTATUS OLEEXPORT
        !           563:        SetDocDimensions(LPOLESERVERDOC lpServerDoc, OLE_CONST RECT FAR* lpRect)
        !           564:        {
        !           565:                LOCK_PUMP lock;
        !           566:                OLE_TRACE("COleServerDoc::OnSetDocDimensions()\n");
        !           567:                return COleServerDoc::FromLp(lpServerDoc)->OnSetDocDimensions((LPRECT)lpRect);
        !           568:        }
        !           569: 
        !           570:        static OLESTATUS OLEEXPORT
        !           571:        Release(LPOLESERVERDOC lpServerDoc)
        !           572:        {
        !           573:                LOCK_PUMP lock;
        !           574:                OLE_TRACE("COleServerDoc::OnRelease()\n");
        !           575:                return COleServerDoc::FromLp(lpServerDoc)->OnRelease();
        !           576:        }
        !           577: 
        !           578:        static OLESTATUS OLEEXPORT
        !           579:        SetColorScheme(LPOLESERVERDOC lpServerDoc,
        !           580:                OLE_CONST LOGPALETTE FAR* lpLogPalette)
        !           581:        {
        !           582:                LOCK_PUMP lock;
        !           583:                OLE_TRACE("COleServerDoc::OnSetColorScheme()\n");
        !           584:                OLESTATUS status = COleServerDoc::FromLp(lpServerDoc)->OnSetColorScheme(
        !           585:                        (LPLOGPALETTE)lpLogPalette);
        !           586:                return status;
        !           587:        }
        !           588: 
        !           589:        static OLESTATUS OLEEXPORT
        !           590:        Execute(LPOLESERVERDOC lpServerDoc, HANDLE hCommands)
        !           591:        {
        !           592:                LOCK_PUMP lock;
        !           593:                OLE_TRACE("COleServerDoc::OnExecute()\n");
        !           594:                LPVOID  lpCommands = ::GlobalLock(hCommands);
        !           595:                ASSERT(lpCommands != NULL);
        !           596:                OLESTATUS status;
        !           597:                status = COleServerDoc::FromLp(lpServerDoc)->OnExecute(lpCommands);
        !           598:                ::GlobalUnlock(hCommands);
        !           599:                return status;
        !           600:        }
        !           601: 
        !           602:        static OLESTATUS OLEEXPORT
        !           603:        GetObject(LPOLESERVERDOC lpServerDoc, OLE_LPCSTR lpszObjname,
        !           604:                LPOLEOBJECT FAR * lplpObject, LPOLECLIENT lpClient)
        !           605:        {
        !           606:                COleServerDoc* pDoc = COleServerDoc::FromLp(lpServerDoc);
        !           607:                COleServerItem* pItem;
        !           608:                LOCK_PUMP lock;
        !           609: 
        !           610:                TRY
        !           611:                {
        !           612:                        if (lpszObjname == NULL || *lpszObjname == '\0')
        !           613:                        {
        !           614:                                OLE_TRACE("calling COleServerDoc::OnGetDocument\n");
        !           615:                                pItem = pDoc->OnGetDocument();
        !           616:                        }
        !           617:                        else
        !           618:                        {
        !           619: #ifdef _DEBUG
        !           620:                                if (afxTraceFlags & 0x10)
        !           621:                                        TRACE("calling COleServerDoc::GetItem(%Fs)\n", lpszObjname);
        !           622: #endif
        !           623:                                pItem = pDoc->OnGetItem(lpszObjname);
        !           624:                        }
        !           625:                }
        !           626:                CATCH (CException, e)
        !           627:                {
        !           628:                        return COleException::Process(e);
        !           629:                }
        !           630:                END_CATCH
        !           631: 
        !           632:                if (pItem == NULL)
        !           633:                        return OLE_ERROR_GENERIC;
        !           634: 
        !           635:                pDoc->AddItem(pItem, lpClient);     // attaches everything
        !           636:                *lplpObject = &pItem->m_oleObject;
        !           637:                return OLE_OK;
        !           638:        }
        !           639: };
        !           640: 
        !           641: static struct _OLESERVERDOCVTBL NEAR serverDocVtbl =
        !           642: {
        !           643:        &_afxOleServerDocImplementation::Save,
        !           644:        &_afxOleServerDocImplementation::Close,
        !           645:        &_afxOleServerDocImplementation::SetHostNames,
        !           646:        &_afxOleServerDocImplementation::SetDocDimensions,
        !           647:        &_afxOleServerDocImplementation::GetObject,
        !           648:        &_afxOleServerDocImplementation::Release,
        !           649:        &_afxOleServerDocImplementation::SetColorScheme,
        !           650:        &_afxOleServerDocImplementation::Execute,
        !           651: };
        !           652: 
        !           653: /////////////////////////////////////////////////////////////////////////////
        !           654: // COleServerDoc construction and other operations
        !           655: 
        !           656: COleServerDoc::COleServerDoc()
        !           657: {
        !           658:        m_oleServerDoc.lpvtbl = &serverDocVtbl;
        !           659:        m_pServer = NULL;
        !           660:        m_lhServerDoc = NULL;
        !           661:        m_hPalette = NULL;
        !           662:        m_bWaiting = FALSE;
        !           663: }
        !           664: 
        !           665: IMPLEMENT_DYNAMIC(COleServerDoc, CObject)
        !           666: 
        !           667: COleServerDoc::~COleServerDoc()
        !           668: {
        !           669:        if (IsOpen())
        !           670:                BeginRevoke();
        !           671:        if (m_hPalette != NULL)
        !           672:                ::DeleteObject(m_hPalette);
        !           673: }
        !           674: 
        !           675: void
        !           676: COleServerDoc::CheckAsync(OLESTATUS status)
        !           677:        // throw exception if not ok to continue
        !           678: {
        !           679:        ASSERT(!m_bWaiting);
        !           680: 
        !           681:        if (status == OLE_WAIT_FOR_RELEASE)
        !           682:        {
        !           683:                m_bWaiting = TRUE;
        !           684:                while (m_bWaiting)
        !           685:                {
        !           686:                        OLE_TRACE("OLE Server Doc waiting for release\n");
        !           687:                        AfxGetApp()->PumpMessage();
        !           688:                }
        !           689:                m_bWaiting = FALSE;
        !           690: 
        !           691:                return;     // assume it worked
        !           692:        }
        !           693: 
        !           694:        if (status == OLE_OK || status > OLE_WARN_DELETE_DATA)
        !           695:        {
        !           696:                // ok, or just a warning
        !           697:                return;
        !           698:        }
        !           699: 
        !           700:        // otherwise this error wasn't expected, so throw an exception
        !           701:        TRACE("Warning: COleServerDoc operation failed %d, throwing exception\n", status);
        !           702:        AfxThrowOleException(status);
        !           703: }
        !           704: 
        !           705: OLESTATUS
        !           706: COleServerDoc::BeginRevoke()
        !           707:        // do not wait for async completion
        !           708: {
        !           709:        ASSERT(IsOpen());
        !           710:        LHCLIENTDOC lh = m_lhServerDoc;
        !           711:        ASSERT(lh != NULL);
        !           712:        if (m_pServer != NULL)
        !           713:                m_pServer->RemoveDocument(this);
        !           714:        m_lhServerDoc = NULL;
        !           715:        OLESTATUS status = ::OleRevokeServerDoc(lh);
        !           716:        ASSERT(status == OLE_OK || status == OLE_WAIT_FOR_RELEASE);
        !           717:        // revoke will not be finished until OnRelease called
        !           718:        return status;
        !           719: }
        !           720: 
        !           721: void
        !           722: COleServerDoc::Revoke()
        !           723:        // wait for async completion
        !           724: {
        !           725:        ASSERT(IsOpen());
        !           726:        CheckAsync(BeginRevoke());
        !           727: }
        !           728: 
        !           729: /////////////////////////////////////////////////////////////////////////////
        !           730: // Interesting operations
        !           731: 
        !           732: BOOL
        !           733: COleServerDoc::Register(COleServer* pServer, LPCSTR lpszDoc)
        !           734: {
        !           735:        ASSERT(m_lhServerDoc == NULL);      // one time only
        !           736:        ASSERT(pServer != NULL);
        !           737:        ASSERT(pServer->IsOpen());
        !           738: 
        !           739:        LHSERVERDOC lhDoc;
        !           740:        if (::OleRegisterServerDoc(pServer->m_lhServer, lpszDoc,
        !           741:                &m_oleServerDoc, &lhDoc) != OLE_OK)
        !           742:        {
        !           743:                return FALSE;
        !           744:        }
        !           745: 
        !           746:        pServer->AddDocument(this, lhDoc);
        !           747:        ASSERT(m_lhServerDoc == lhDoc); // make sure it connected it
        !           748:        return TRUE;
        !           749: }
        !           750: 
        !           751: void
        !           752: COleServerDoc::NotifyRename(LPCSTR lpszNewName)
        !           753: {
        !           754:        ASSERT(IsOpen());
        !           755:        ASSERT(lpszNewName != NULL);
        !           756:        CheckAsync(::OleRenameServerDoc(m_lhServerDoc, lpszNewName));
        !           757: }
        !           758: 
        !           759: void
        !           760: COleServerDoc::NotifyRevert()
        !           761: {
        !           762:        ASSERT(IsOpen());
        !           763:        CheckAsync(::OleRevertServerDoc(m_lhServerDoc));
        !           764: }
        !           765: 
        !           766: void
        !           767: COleServerDoc::NotifySaved()
        !           768: {
        !           769:        ASSERT(IsOpen());
        !           770:        CheckAsync(::OleSavedServerDoc(m_lhServerDoc));
        !           771: }
        !           772: 
        !           773: void
        !           774: COleServerDoc::NotifyAllClients(OLE_NOTIFICATION wNotify)
        !           775: {
        !           776:        POSITION pos = GetStartPosition();
        !           777:        COleServerItem* pItem;
        !           778: 
        !           779:        while ((pItem = GetNextItem(pos)) != NULL)
        !           780:        {
        !           781:                pItem->NotifyClient(wNotify);
        !           782:        }
        !           783: }
        !           784: 
        !           785: void
        !           786: COleServerDoc::AddItem(COleServerItem* pItem, LPOLECLIENT lpClient)
        !           787: {
        !           788:        ASSERT_VALID(pItem);
        !           789: 
        !           790:        // Attach handle to un-attached item
        !           791:        ASSERT(pItem->m_lpClient == NULL);  // must be unattached !
        !           792:        ASSERT(pItem->m_pDocument == NULL); // must be unconnected !
        !           793:        pItem->m_lpClient = lpClient;
        !           794:        pItem->m_pDocument = this;
        !           795: }
        !           796: 
        !           797: /////////////////////////////////////////////////////////////////////////////
        !           798: // COleServerDoc standard implementation of overridables
        !           799: 
        !           800: OLESTATUS
        !           801: COleServerDoc::OnRelease()
        !           802: {
        !           803:        OLE_TRACE("COleServerDoc::OnRelease\n");
        !           804:        m_bWaiting = FALSE;
        !           805:        // close connection to OLE server doc
        !           806:        m_lhServerDoc = NULL;
        !           807:        return OLE_OK;
        !           808: }
        !           809: 
        !           810: 
        !           811: OLESTATUS
        !           812: COleServerDoc::OnSave()
        !           813: {
        !           814:        return OLE_OK;
        !           815: }
        !           816: 
        !           817: 
        !           818: OLESTATUS
        !           819: COleServerDoc::OnClose()
        !           820: {
        !           821:        ASSERT(IsOpen());
        !           822:        BeginRevoke();
        !           823:        return OLE_OK;
        !           824: }
        !           825: 
        !           826: 
        !           827: OLESTATUS
        !           828: COleServerDoc::OnExecute(LPVOID /*lpCommands*/) // DDE commands
        !           829: {
        !           830:        return OLE_ERROR_COMMAND;
        !           831: }
        !           832: 
        !           833: 
        !           834: OLESTATUS
        !           835: COleServerDoc::OnSetDocDimensions(LPRECT /*lpRect*/)
        !           836: {
        !           837:        return OLE_OK;      // default to ignore it
        !           838: }
        !           839: 
        !           840: 
        !           841: // Overridables you do not have to override
        !           842: OLESTATUS
        !           843: COleServerDoc::OnSetHostNames(LPCSTR /*lpszHost*/, LPCSTR /*lpszHostObj*/)
        !           844: {
        !           845:        return OLE_OK;
        !           846: }
        !           847: 
        !           848: 
        !           849: OLESTATUS
        !           850: COleServerDoc::OnSetColorScheme(LPLOGPALETTE lpLogPalette)
        !           851: {
        !           852:        // save in global document palette
        !           853:        HPALETTE hNewPal = ::CreatePalette(lpLogPalette);
        !           854: 
        !           855:        if (hNewPal == NULL)
        !           856:                return OLE_ERROR_PALETTE;
        !           857: 
        !           858:        if (m_hPalette != NULL)
        !           859:                ::DeleteObject(m_hPalette);
        !           860:        m_hPalette = hNewPal;
        !           861:        return OLE_OK;
        !           862: }
        !           863: 
        !           864: /////////////////////////////////////////////////////////////////////////////
        !           865: /////////////////////////////////////////////////////////////////////////////
        !           866: // COleServer
        !           867: 
        !           868: inline COleServer * COleServer::FromLp(LPOLESERVER lpServer)
        !           869: {
        !           870:        COleServer* pOleServer;
        !           871:        pOleServer = (COleServer*) GetPtrFromFarPtr(lpServer, sizeof(CObject));
        !           872:        ASSERT(lpServer == &pOleServer->m_oleServer);
        !           873:        return pOleServer;
        !           874: }
        !           875: 
        !           876: // friend class to get access to COleServer protected implementations
        !           877: struct _afxOleServerImplementation
        !           878: {
        !           879:        static OLESTATUS OLEEXPORT
        !           880:        Exit(LPOLESERVER lpServer)
        !           881:        {
        !           882:                LOCK_PUMP lock;
        !           883:                OLE_TRACE("COleServer::OnExit()\n");
        !           884:                return COleServer::FromLp(lpServer)->OnExit();
        !           885:        }
        !           886: 
        !           887:        static OLESTATUS OLEEXPORT
        !           888:        Release(LPOLESERVER lpServer)
        !           889:        {
        !           890:                LOCK_PUMP lock;
        !           891:                OLE_TRACE("COleServer::OnRelease()\n");
        !           892:                return COleServer::FromLp(lpServer)->OnRelease();
        !           893:        }
        !           894: 
        !           895:        static OLESTATUS OLEEXPORT
        !           896:        Execute(LPOLESERVER lpServer, HANDLE hCommands)
        !           897:        {
        !           898:                LOCK_PUMP lock;
        !           899:                OLE_TRACE("COleServer::Execute()\n");
        !           900: 
        !           901:                LPVOID  lpCommands = ::GlobalLock(hCommands);
        !           902:                ASSERT(lpCommands != NULL);
        !           903:                OLESTATUS status;
        !           904:                status = COleServer::FromLp(lpServer)->OnExecute(lpCommands);
        !           905:                ::GlobalUnlock(hCommands);
        !           906:                return status;
        !           907:        }
        !           908: 
        !           909:        static OLESTATUS OLEEXPORT
        !           910:        Open(LPOLESERVER lpServer, LHSERVERDOC lhServerDoc,
        !           911:                OLE_LPCSTR lpszDoc, LPOLESERVERDOC FAR * lplpServerDoc)
        !           912:        {
        !           913:                LOCK_PUMP lock;
        !           914:                OLE_TRACE("COleServer::OnOpenDoc()\n");
        !           915: 
        !           916:                COleServer* pServer = COleServer::FromLp(lpServer);
        !           917:                COleServerDoc* pDoc;
        !           918: 
        !           919:                TRY
        !           920:                        pDoc = pServer->OnOpenDoc(lpszDoc);
        !           921:                CATCH (CException, e)
        !           922:                        return COleException::Process(e);
        !           923:                END_CATCH
        !           924: 
        !           925:                if (pDoc == NULL)
        !           926:                        return OLE_ERROR_GENERIC;
        !           927:                pServer->AddDocument(pDoc, lhServerDoc);
        !           928:                *lplpServerDoc = &pDoc->m_oleServerDoc;
        !           929:                return OLE_OK;
        !           930:        }
        !           931: 
        !           932:        static OLESTATUS OLEEXPORT
        !           933:        Create(LPOLESERVER lpServer, LHSERVERDOC lhServerDoc,
        !           934:                OLE_LPCSTR lpszClass, OLE_LPCSTR lpszDoc, LPOLESERVERDOC FAR * lplpServerDoc)
        !           935:        {
        !           936:                LOCK_PUMP lock;
        !           937:                OLE_TRACE("COleServer::OnCreateDoc()\n");
        !           938: 
        !           939:                COleServer* pServer = COleServer::FromLp(lpServer);
        !           940:                COleServerDoc* pDoc;
        !           941: 
        !           942:                TRY
        !           943:                        pDoc = pServer->OnCreateDoc(lpszClass, lpszDoc);
        !           944:                CATCH (CException, e)
        !           945:                        return COleException::Process(e);
        !           946:                END_CATCH
        !           947: 
        !           948:                if (pDoc == NULL)
        !           949:                        return OLE_ERROR_GENERIC;
        !           950: 
        !           951:                pServer->AddDocument(pDoc, lhServerDoc);
        !           952:                *lplpServerDoc = &pDoc->m_oleServerDoc;
        !           953:                return OLE_OK;
        !           954:        }
        !           955: 
        !           956:        static OLESTATUS OLEEXPORT
        !           957:        CreateFromTemplate(LPOLESERVER lpServer, LHSERVERDOC lhServerDoc,
        !           958:                OLE_LPCSTR lpszClass, OLE_LPCSTR lpszDoc, OLE_LPCSTR lpszTemplate,
        !           959:                LPOLESERVERDOC FAR * lplpServerDoc)
        !           960:        {
        !           961:                LOCK_PUMP lock;
        !           962:                OLE_TRACE("COleServer::OnCreateDocFromTemplate()\n");
        !           963: 
        !           964:                COleServer* pServer = COleServer::FromLp(lpServer);
        !           965:                COleServerDoc* pDoc;
        !           966: 
        !           967:                TRY
        !           968:                        pDoc = pServer->OnCreateDocFromTemplate(lpszClass,
        !           969:                          lpszDoc, lpszTemplate);
        !           970:                CATCH (CException, e)
        !           971:                        return COleException::Process(e);
        !           972:                END_CATCH
        !           973: 
        !           974:                if (pDoc == NULL)
        !           975:                        return OLE_ERROR_GENERIC;
        !           976:                pServer->AddDocument(pDoc, lhServerDoc);
        !           977:                *lplpServerDoc = &pDoc->m_oleServerDoc;
        !           978:                return OLE_OK;
        !           979:        }
        !           980: 
        !           981:        static OLESTATUS OLEEXPORT
        !           982:        Edit(LPOLESERVER lpServer, LHSERVERDOC lhServerDoc,
        !           983:                OLE_LPCSTR lpszClass, OLE_LPCSTR lpszDoc, LPOLESERVERDOC FAR * lplpServerDoc)
        !           984:        {
        !           985:                LOCK_PUMP lock;
        !           986:                OLE_TRACE("COleServer::OnEditDoc()\n");
        !           987: 
        !           988:                COleServer* pServer = COleServer::FromLp(lpServer);
        !           989:                COleServerDoc* pDoc;
        !           990: 
        !           991:                TRY
        !           992:                        pDoc = pServer->OnEditDoc(lpszClass, lpszDoc);
        !           993:                CATCH (CException, e)
        !           994:                        return COleException::Process(e);
        !           995:                END_CATCH
        !           996: 
        !           997:                if (pDoc == NULL)
        !           998:                        return OLE_ERROR_GENERIC;
        !           999:                pServer->AddDocument(pDoc, lhServerDoc);
        !          1000:                *lplpServerDoc = &pDoc->m_oleServerDoc;
        !          1001:                return OLE_OK;
        !          1002:        }
        !          1003: };
        !          1004: 
        !          1005: static struct _OLESERVERVTBL NEAR serverVtbl =
        !          1006: {
        !          1007:        &_afxOleServerImplementation::Open,
        !          1008:        &_afxOleServerImplementation::Create,
        !          1009:        &_afxOleServerImplementation::CreateFromTemplate,
        !          1010:        &_afxOleServerImplementation::Edit,
        !          1011:        &_afxOleServerImplementation::Exit,
        !          1012:        &_afxOleServerImplementation::Release,
        !          1013:        &_afxOleServerImplementation::Execute,
        !          1014: };
        !          1015: 
        !          1016: //////////////////////////////////////////////////////////////////////////////
        !          1017: // COleServer construction etc
        !          1018: 
        !          1019: COleServer::COleServer(BOOL bLaunchEmbedded)
        !          1020: {
        !          1021:        m_oleServer.lpvtbl = &serverVtbl;
        !          1022:        m_lhServer = NULL;
        !          1023: 
        !          1024:        m_cOpenDocuments = 0;
        !          1025:        m_bLaunchEmbedded = bLaunchEmbedded;
        !          1026: }
        !          1027: 
        !          1028: IMPLEMENT_DYNAMIC(COleServer, CObject)
        !          1029: 
        !          1030: COleServer::~COleServer()
        !          1031: {
        !          1032:        if (IsOpen())
        !          1033:                BeginRevoke();          // server death
        !          1034: }
        !          1035: 
        !          1036: void
        !          1037: COleServer::BeginRevoke()
        !          1038: {
        !          1039:        ASSERT(IsOpen());
        !          1040:        LHSERVER lhServer = m_lhServer;
        !          1041: 
        !          1042:        if (lhServer != NULL)
        !          1043:        {
        !          1044:                m_lhServer = NULL;      // closed for all intensive purposes
        !          1045:                OLESTATUS status = ::OleRevokeServer(lhServer);
        !          1046:                ASSERT(status == OLE_OK || status == OLE_WAIT_FOR_RELEASE);
        !          1047:        }
        !          1048:        // NOTE: will return before the Revoke is acknowledged
        !          1049: }
        !          1050: 
        !          1051: BOOL
        !          1052: COleServer::Register(LPCSTR lpszClass, BOOL bMultiInstance)
        !          1053: {
        !          1054:        ASSERT(m_lhServer == NULL);     // one time only
        !          1055:        ASSERT(lpszClass != NULL);
        !          1056: 
        !          1057:        OLE_SERVER_USE use = bMultiInstance ? OLE_SERVER_MULTI : OLE_SERVER_SINGLE;
        !          1058:        return ::OleRegisterServer(lpszClass, &m_oleServer, &m_lhServer,
        !          1059:                AfxGetInstanceHandle(), use) == OLE_OK;
        !          1060: }
        !          1061: 
        !          1062: //////////////////////////////////////////////////////////////////////////////
        !          1063: // COleServer manages COleServerDocs
        !          1064: 
        !          1065: void COleServer::AddDocument(COleServerDoc* pDoc, LHSERVERDOC lhServerDoc)
        !          1066: {
        !          1067:        // Attach handle to un-open server document
        !          1068:        ASSERT_VALID(pDoc);
        !          1069:        ASSERT(pDoc->m_lhServerDoc == NULL);    // must be unregistered !
        !          1070:        ASSERT(pDoc->m_pServer == NULL);        // must be dis-connected
        !          1071:        ASSERT(lhServerDoc != NULL);
        !          1072: 
        !          1073:        // connect to server
        !          1074:        pDoc->m_lhServerDoc = lhServerDoc;
        !          1075:        pDoc->m_pServer = this;
        !          1076:        m_cOpenDocuments++;
        !          1077: }
        !          1078: 
        !          1079: void COleServer::RemoveDocument(COleServerDoc* pDoc)
        !          1080: {
        !          1081:        ASSERT(pDoc != NULL);
        !          1082:        ASSERT(pDoc->m_pServer == this);
        !          1083:        ASSERT(m_cOpenDocuments > 0);
        !          1084: 
        !          1085:        pDoc->m_pServer = NULL;
        !          1086:        m_cOpenDocuments--;
        !          1087: }
        !          1088: 
        !          1089: //////////////////////////////////////////////////////////////////////////////
        !          1090: // COleServer default implementation of overridables
        !          1091: 
        !          1092: COleServerDoc* COleServer::OnOpenDoc(LPCSTR /*lpszDoc*/)
        !          1093: {
        !          1094:        return NULL;
        !          1095: }
        !          1096: 
        !          1097: COleServerDoc* COleServer::OnCreateDocFromTemplate(LPCSTR /*lpszClass*/,
        !          1098:        LPCSTR /*lpszDoc*/, LPCSTR /*lpszTemplate*/)
        !          1099: {
        !          1100:        return NULL;
        !          1101: }
        !          1102: 
        !          1103: OLESTATUS COleServer::OnExecute(LPVOID /*lpCommands*/)  // DDE commands
        !          1104: {
        !          1105:        return OLE_ERROR_COMMAND;
        !          1106: }
        !          1107: 
        !          1108: OLESTATUS COleServer::OnExit()
        !          1109: {
        !          1110:        if (IsOpen())
        !          1111:        {
        !          1112:                OLE_TRACE("COleServer::OnExit() Revoking server\n");
        !          1113:                BeginRevoke();
        !          1114:        }
        !          1115:        return OLE_OK;
        !          1116: }
        !          1117: 
        !          1118: OLESTATUS COleServer::OnRelease()
        !          1119: {
        !          1120:        CWnd* pMainWnd = AfxGetApp()->m_pMainWnd;
        !          1121: 
        !          1122:        if (IsOpen() && m_bLaunchEmbedded)
        !          1123:        {
        !          1124:                // there is a chance we should be shutting down
        !          1125:                // shut down if no open documents, or if main window is invisible
        !          1126:                if (m_cOpenDocuments == 0 || 
        !          1127:                        (pMainWnd != NULL && !pMainWnd->IsWindowVisible()))
        !          1128:                {
        !          1129:                        OLE_TRACE("COleServer::OnRelease() Revoking server\n");
        !          1130:                        BeginRevoke();
        !          1131:                }
        !          1132:        }
        !          1133: 
        !          1134:        // if someone has already revoked us
        !          1135:        if (!IsOpen())
        !          1136:        {
        !          1137:                TRACE("COleServer::OnRelease() terminating server app\n");
        !          1138:                OLE_TRACE("\tcalling ::PostQuitMessage\n");
        !          1139:                ::PostQuitMessage(0);
        !          1140:        }
        !          1141: 
        !          1142:        return OLE_OK;
        !          1143: }
        !          1144: 
        !          1145: //////////////////////////////////////////////////////////////////////////////
        !          1146: // Special register for server in case user does not run REGLOAD
        !          1147: 
        !          1148: BOOL AfxOleRegisterServerName(LPCSTR lpszClass, LPCSTR lpszLocalClassName)
        !          1149: {
        !          1150:        ASSERT(lpszClass != NULL && *lpszClass != '\0');
        !          1151:        LONG    lSize;
        !          1152:        char    szBuffer[OLE_MAXNAMESIZE];
        !          1153: 
        !          1154:        if (lpszLocalClassName == NULL || *lpszLocalClassName == '\0')
        !          1155:        {
        !          1156:                TRACE("Warning: no localized class name provided for server,"
        !          1157:                        " using %Fs\n", lpszClass);
        !          1158:                lpszLocalClassName = lpszClass;
        !          1159:        }
        !          1160: 
        !          1161:        lSize = OLE_MAXNAMESIZE;
        !          1162:        if (::RegQueryValue(HKEY_CLASSES_ROOT, lpszClass, szBuffer,
        !          1163:                &lSize) == ERROR_SUCCESS)
        !          1164:        {
        !          1165:                // don't replace an existing localized name
        !          1166:                TRACE("Server already has localized class name (%s)\n", szBuffer);
        !          1167:        }
        !          1168:        else
        !          1169:        {
        !          1170:                // set localized (user visible) class name
        !          1171:                if (::RegSetValue(HKEY_CLASSES_ROOT, lpszClass, REG_SZ,
        !          1172:                  lpszLocalClassName, _fstrlen(lpszLocalClassName)) != ERROR_SUCCESS)
        !          1173:                        return FALSE;
        !          1174:        }
        !          1175: 
        !          1176:        // set the path name for the server for "StdFileEditing" to this app
        !          1177: 
        !          1178:        // get name/path of executable
        !          1179:        char szPathName[256];
        !          1180:        ::GetModuleFileName(AfxGetInstanceHandle(), szPathName,
        !          1181:                sizeof(szPathName)-1);
        !          1182: 
        !          1183:        wsprintf(szBuffer, "%s\\protocol\\StdFileEditing\\server",
        !          1184:                (LPCSTR)lpszClass);
        !          1185:        if (::RegSetValue(HKEY_CLASSES_ROOT, szBuffer, REG_SZ,
        !          1186:          szPathName, strlen(szPathName)) != ERROR_SUCCESS)
        !          1187:                return FALSE;
        !          1188: 
        !          1189:        // if there are no verbs, throw in the default "Edit" verb
        !          1190:        // (Note: we hard code the English "Edit" so you should have
        !          1191:        //   a .REG file for localized verb names)
        !          1192: 
        !          1193:        char szOldVerb[256];
        !          1194:        wsprintf(szBuffer, "%s\\protocol\\StdFileEditing\\verb",
        !          1195:                (LPCSTR)lpszClass);
        !          1196:        lSize = OLE_MAXNAMESIZE;
        !          1197:        if (::RegQueryValue(HKEY_CLASSES_ROOT, szBuffer, szOldVerb,
        !          1198:                &lSize) != ERROR_SUCCESS)
        !          1199:        {
        !          1200:                // no verbs, add "Edit"
        !          1201:                if (::RegSetValue(HKEY_CLASSES_ROOT, szBuffer, REG_SZ,
        !          1202:                  "", 0) != ERROR_SUCCESS)
        !          1203:                        return FALSE;
        !          1204: 
        !          1205:                strcat(szBuffer, "\\0");    // backslash + zero
        !          1206:                if (::RegSetValue(HKEY_CLASSES_ROOT, szBuffer, REG_SZ,
        !          1207:                  "Edit", 4) != ERROR_SUCCESS)
        !          1208:                        return FALSE;
        !          1209:        }
        !          1210: 
        !          1211:        // all set
        !          1212:        return TRUE;
        !          1213: }
        !          1214: 
        !          1215: //////////////////////////////////////////////////////////////////////////////
        !          1216: // Diagnostics
        !          1217: 
        !          1218: #ifdef _DEBUG
        !          1219: void COleServerItem::AssertValid() const
        !          1220: {
        !          1221:        CObject::AssertValid();
        !          1222: 
        !          1223:        // must be completely detached or completely attached
        !          1224:        ASSERT((m_pDocument == NULL && m_lpClient == NULL) ||
        !          1225:                (m_pDocument != NULL && m_lpClient != NULL));
        !          1226: }
        !          1227: 
        !          1228: void COleServerItem::Dump(CDumpContext& dc) const
        !          1229: {
        !          1230:        CObject::Dump(dc);
        !          1231: 
        !          1232:        // shallow dump
        !          1233:        dc << "\n\tm_pDocument = " << (void*)m_pDocument;
        !          1234:        dc << "\n\tm_lpClient = " << m_lpClient;
        !          1235:        dc << "\n\tm_hPalette = " << m_hPalette;
        !          1236:        dc << "\n\tm_rectBounds (HIMETRIC) = " << m_rectBounds;
        !          1237: }
        !          1238: 
        !          1239: 
        !          1240: void COleServerDoc::AssertValid() const
        !          1241: {
        !          1242:        CObject::AssertValid();
        !          1243:        ASSERT(!m_bWaiting);    // waiting is an internal state
        !          1244: }
        !          1245: 
        !          1246: void COleServerDoc::Dump(CDumpContext& dc) const
        !          1247: {
        !          1248:        CObject::Dump(dc);
        !          1249:        dc << "\n\tm_pServer = " << (void*)m_pServer;
        !          1250:        dc << "\n\tm_lhServerDoc = " << m_lhServerDoc;
        !          1251:        dc << "\n\tm_bWaiting = " << m_bWaiting;
        !          1252: }
        !          1253: 
        !          1254: void COleServer::AssertValid() const
        !          1255: {
        !          1256:        CObject::AssertValid();
        !          1257:        ASSERT(m_cOpenDocuments >= 0);
        !          1258: }
        !          1259: 
        !          1260: void COleServer::Dump(CDumpContext& dc) const
        !          1261: {
        !          1262:        CObject::Dump(dc);
        !          1263:        dc << "\n\tm_lhServer = " << m_lhServer;
        !          1264:        dc << "\n\tm_bLaunchEmbedded = " << m_bLaunchEmbedded;
        !          1265:        dc << "\n\tm_cOpenDocuments = " << m_cOpenDocuments;
        !          1266: }
        !          1267: 
        !          1268: #endif //_DEBUG
        !          1269: 
        !          1270: 
        !          1271: //////////////////////////////////////////////////////////////////////////////

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.