home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / mfc / ole / tstcon / scrmngr.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-03-27  |  5.1 KB  |  247 lines

  1. #include "StdAfx.H"
  2. #include "TestCon.H"
  3.  
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9.  
  10.  
  11. IMPLEMENT_DYNAMIC( CScriptManager, CObject );
  12.  
  13. CScriptManager::CScriptManager( CTestContainer98Doc* pDoc ) :
  14.    m_pDoc( pDoc )
  15. {
  16.    ASSERT( m_pDoc != NULL );
  17. }
  18.  
  19. CScriptManager::~CScriptManager()
  20. {
  21.    CScript* pScript;
  22.    IDispatch* pDispatch;
  23.    POSITION posNamedItem;
  24.    CString strItemName;
  25.  
  26.    while( !m_lpScripts.IsEmpty() )
  27.    {
  28.       pScript = m_lpScripts.RemoveHead();
  29.       delete pScript;
  30.    }
  31.  
  32.    posNamedItem = m_mapNamedItems.GetStartPosition();
  33.    while( posNamedItem != NULL )
  34.    {
  35.       m_mapNamedItems.GetNextAssoc( posNamedItem, strItemName, pDispatch );
  36.       pDispatch->Release();
  37.    }
  38. }
  39.  
  40. HRESULT CScriptManager::AddNamedItem( LPCTSTR pszItemName,
  41.    IDispatch* pDispatch )
  42. {
  43.    USES_CONVERSION;
  44.    POSITION posScript;
  45.    CScript* pScript;
  46.    HRESULT hResult;
  47.    LPCOLESTR pszItemNameO;
  48.  
  49.    m_mapNamedItems.SetAt( pszItemName, pDispatch );
  50.    pDispatch->AddRef();
  51.  
  52.    pszItemNameO = T2COLE( pszItemName );
  53.    posScript = GetFirstScriptPosition();
  54.    while( posScript != NULL )
  55.    {
  56.       pScript = GetNextScript( posScript );
  57.       ASSERT( pScript != NULL );
  58.       hResult = pScript->AddNamedItem( pszItemName );
  59.       if( FAILED( hResult ) )
  60.       {
  61.          return( hResult );
  62.       }
  63.    }
  64.  
  65.    return( S_OK );
  66. }
  67.  
  68. HRESULT CScriptManager::AddNamedItems( IActiveScript* pScript )
  69. {
  70.    HRESULT hResult;
  71.    POSITION posNamedItem;
  72.    IDispatch* pDispatch;
  73.    CString strItemName;
  74.    BSTR bstrItemName;
  75.  
  76.    ASSERT( pScript != NULL );
  77.  
  78.    hResult = pScript->AddNamedItem( L"TCForm", SCRIPTITEM_ISVISIBLE|
  79.       SCRIPTITEM_ISSOURCE );
  80.    if( FAILED( hResult ) )
  81.    {
  82.       return( hResult );
  83.    }
  84.  
  85.    posNamedItem = m_mapNamedItems.GetStartPosition();
  86.    while( posNamedItem != NULL )
  87.    {
  88.       m_mapNamedItems.GetNextAssoc( posNamedItem, strItemName, pDispatch );
  89.       bstrItemName = strItemName.AllocSysString();
  90.       hResult = pScript->AddNamedItem( bstrItemName, SCRIPTITEM_ISVISIBLE|
  91.          SCRIPTITEM_ISSOURCE );
  92.       SysFreeString( bstrItemName );
  93.       if( FAILED( hResult ) )
  94.       {
  95.          return( hResult );
  96.       }
  97.    }
  98.  
  99.    return( S_OK );
  100. }
  101.  
  102. CScript* CScriptManager::FindMacro( LPCTSTR pszMacroName )
  103. {
  104.    POSITION posScript;
  105.    CScript* pScript;
  106.  
  107.    ASSERT( pszMacroName != NULL );
  108.  
  109.    posScript = GetFirstScriptPosition();
  110.    while( posScript != NULL )
  111.    {
  112.       pScript = GetNextScript( posScript );
  113.       if( pScript->FindMacro( pszMacroName ) )
  114.       {
  115.          return( pScript );
  116.       }
  117.    }
  118.  
  119.    return( NULL );
  120. }
  121.  
  122. POSITION CScriptManager::GetFirstScriptPosition() const
  123. {
  124.    return( m_lpScripts.GetHeadPosition() );
  125. }
  126.  
  127. HRESULT CScriptManager::GetItemDispatch( LPCTSTR pszItemName,
  128.    IUnknown** ppDispatch )
  129. {
  130.    IDispatch* pDispatch;
  131.    BOOL tFound;
  132.  
  133.    ASSERT( pszItemName != NULL );
  134.    ASSERT( ppDispatch != NULL );
  135.  
  136.    *ppDispatch = NULL;
  137.  
  138.    if( strcmp( pszItemName, "TCForm" ) == 0 )
  139.    {
  140.       *ppDispatch = m_pDoc->GetIDispatch( TRUE );
  141.       return( S_OK );
  142.    }
  143.    else
  144.    {
  145.       tFound = m_mapNamedItems.Lookup( pszItemName, pDispatch );
  146.       if( tFound )
  147.       {
  148.          *ppDispatch = pDispatch;
  149.          (*ppDispatch)->AddRef();
  150.          return( S_OK );
  151.       }
  152.    }
  153.  
  154.    return( TYPE_E_ELEMENTNOTFOUND );
  155. }
  156.  
  157. HRESULT CScriptManager::GetItemTypeInfo( LPCTSTR pszItemName,
  158.    ITypeInfo** ppTypeInfo )
  159. {
  160.    IProvideClassInfoPtr pProvideClassInfo;
  161.    IDispatch* pDispatch;
  162.    HRESULT hResult;
  163.    BOOL tFound;
  164.  
  165.    ASSERT( pszItemName != NULL );
  166.    ASSERT( ppTypeInfo != NULL );
  167.  
  168.    *ppTypeInfo = NULL;
  169.  
  170.    if( strcmp( pszItemName, "TCForm" ) == 0 )
  171.    {
  172.       hResult = m_pDoc->GetTypeInfoOfGuid( GetUserDefaultLCID(),
  173.          __uuidof( Document ), ppTypeInfo );
  174.       if( SUCCEEDED( hResult ) )
  175.       {
  176.          return( S_OK );
  177.       }
  178.    }
  179.    else
  180.    {
  181.       tFound = m_mapNamedItems.Lookup( pszItemName, pDispatch );
  182.       if( tFound )
  183.       {
  184.          pProvideClassInfo = pDispatch;
  185.          if( pProvideClassInfo != NULL )
  186.          {
  187.             hResult = pProvideClassInfo->GetClassInfo( ppTypeInfo );
  188.             if( SUCCEEDED( hResult ) )
  189.             {
  190.                return( S_OK );
  191.             }
  192.          }
  193.       }
  194.    }
  195.  
  196.    return( TYPE_E_ELEMENTNOTFOUND );
  197. }
  198.  
  199. CScript* CScriptManager::GetNextScript( POSITION& posScript )
  200. {
  201.    return( m_lpScripts.GetNext( posScript ) );
  202. }
  203.  
  204. int CScriptManager::GetNumScripts() const
  205. {
  206.    return( m_lpScripts.GetCount() );
  207. }
  208.  
  209. HRESULT CScriptManager::LoadScript( LPCTSTR pszFileName,
  210.    LPCTSTR pszScriptName, CScript** ppScript )
  211. {
  212.    CScript* pScript;
  213.    HRESULT hResult;
  214.    POSITION posScript;
  215.  
  216.    ASSERT( pszFileName != NULL );
  217.    ASSERT( pszScriptName != NULL );
  218.  
  219.    if( ppScript != NULL )
  220.    {
  221.       *ppScript = NULL;
  222.    }
  223.  
  224.    pScript = new CScript( this );
  225.    if( pScript == NULL )
  226.    {
  227.       return( E_OUTOFMEMORY );
  228.    }
  229.  
  230.    posScript = m_lpScripts.AddHead( pScript );
  231.  
  232.    hResult = pScript->LoadScript( pszFileName, pszScriptName );
  233.    if( FAILED( hResult ) )
  234.    {
  235.       m_lpScripts.RemoveAt( posScript );
  236.       delete pScript;
  237.       return( hResult );
  238.    }
  239.  
  240.    if( ppScript != NULL )
  241.    {
  242.       *ppScript = pScript;
  243.    }
  244.  
  245.    return( S_OK );
  246. }
  247.