/* * f r a m e s . c p p * * Purpose: * Frameset helper functions * * History * * Copyright (C) Microsoft Corp. 1995, 1996. */ #include #include "frames.h" #include "htiframe.h" //ITargetFrame2 #include "htiface.h" //ITargetFramePriv ASSERTDATA typedef enum _TARGET_TYPE { TARGET_FRAMENAME, TARGET_SELF, TARGET_PARENT, TARGET_BLANK, TARGET_TOP, TARGET_MAIN } TARGET_TYPE; typedef struct _TARGETENTRY { TARGET_TYPE targetType; const WCHAR *pTargetValue; } TARGETENTRY; static const TARGETENTRY targetTable[] = { {TARGET_SELF, L"_self"}, {TARGET_PARENT, L"_parent"}, {TARGET_BLANK, L"_blank"}, {TARGET_TOP, L"_top"}, {TARGET_MAIN, L"_main"}, {TARGET_SELF, NULL} }; /******************************************************************* NAME: ParseTargetType SYNOPSIS: Maps pszTarget into a target class. IMPLEMENTATION: Treats unknown MAGIC targets as _self ********************************************************************/ TARGET_TYPE ParseTargetType(LPCOLESTR pszTarget) { const TARGETENTRY *pEntry = targetTable; if (pszTarget[0] != '_') return TARGET_FRAMENAME; while (pEntry->pTargetValue) { if (!StrCmpW(pszTarget, pEntry->pTargetValue)) return pEntry->targetType; pEntry++; } // Treat unknown MAGIC targets as regular frame name! <> return TARGET_FRAMENAME; } HRESULT DoFindFrameInContext(IUnknown *pUnkTrident, IUnknown *pUnkThis, LPCWSTR pszTargetName, IUnknown *punkContextFrame, DWORD dwFlags, IUnknown **ppunkTargetFrame) { IOleContainer *pOleContainer; LPENUMUNKNOWN penumUnknown; LPUNKNOWN punkChild, punkChildFrame; ITargetFramePriv *ptgfpChild; HRESULT hr = E_FAIL; TARGET_TYPE targetType; Assert (pUnkTrident && pUnkThis); targetType = ParseTargetType(pszTargetName); if (targetType != TARGET_FRAMENAME) { // blank frames need to open a new browser window if (targetType == TARGET_BLANK) { *ppunkTargetFrame = NULL; return S_OK; } // must be a margic target name if it's _self, _parent, _top or _main // let's just return our own target frame *ppunkTargetFrame = pUnkThis; pUnkThis->AddRef(); return S_OK; } else { if (pUnkTrident && pUnkTrident->QueryInterface(IID_IOleContainer, (LPVOID *)&pOleContainer)==S_OK) { if (pOleContainer->EnumObjects(OLECONTF_EMBEDDINGS, &penumUnknown)==S_OK) { while( hr!=S_OK && penumUnknown->Next(1, &punkChild, NULL)==S_OK) { if (punkChild->QueryInterface(IID_ITargetFramePriv, (LPVOID *)&ptgfpChild)==S_OK) { if (ptgfpChild->QueryInterface(IID_IUnknown, (LPVOID *)&punkChildFrame)==S_OK) { // to avoid recursion - if this isn't the punkContextFrame, see if embedding supports ITargetFrame if (punkChildFrame != punkContextFrame) { hr = ptgfpChild->FindFrameDownwards(pszTargetName, dwFlags, ppunkTargetFrame); } punkChildFrame->Release(); } ptgfpChild->Release(); } punkChild->Release(); } penumUnknown->Release(); } pOleContainer->Release(); } } return hr; }