home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / activedocument / range / download.cpp < prev    next >
C/C++ Source or Header  |  1996-06-21  |  5KB  |  198 lines

  1. // ===========================================================================
  2. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. // PARTICULAR PURPOSE.
  6. //
  7. // Copyright 1996 Microsoft Corporation.  All Rights Reserved.
  8. // ===========================================================================
  9. #include <urlmon.h>
  10. #include <wininet.h>
  11. // #include <datapath.h>
  12. #include "range.h"
  13. #include "callback.hpp"
  14.  
  15. //==============================================================================
  16. HRESULT GetAnInterface
  17. (
  18.     IUnknown  *     punk,
  19.     const IID &     riid,
  20.     void **         pout,
  21.     BOOL            bCheckServiceProvider,
  22.     const IID &     siid,
  23.     const IID &     siid_riid,
  24.     void **         sout
  25. )
  26. {
  27.     IOleObject *      oleObj    = 0;
  28.     IOleClientSite *  oleSite   = 0;
  29.     IOleContainer *   container = 0;
  30.     IUnknown *        service   = 0;
  31.  
  32.     HRESULT       hr = E_FAIL;
  33.  
  34.     // Initialize passed in interface pointers: calling code assumes NULL for failure
  35.     if(pout)
  36.         *pout = NULL;
  37.     if(sout)
  38.         *sout = NULL;
  39.  
  40.     if(punk)
  41.         hr = punk->QueryInterface( IID_IOleObject, (void **)&oleObj );
  42.  
  43.     while( SUCCEEDED(hr) && oleObj )
  44.     {
  45.         if( oleSite )
  46.         {
  47.             //oleSite->Release();
  48.             oleSite = 0;
  49.         }
  50.  
  51.         hr = oleObj->GetClientSite(&oleSite);
  52.  
  53.         if( FAILED(hr) )
  54.             break;
  55.  
  56.         if( bCheckServiceProvider )
  57.         {
  58.             IServiceProvider * servProv;
  59.  
  60.             hr = oleSite->QueryInterface( IID_IServiceProvider, (void**)&servProv);
  61.  
  62.             if( SUCCEEDED(hr) )
  63.             {
  64.                 hr = servProv->QueryService
  65.                     (siid, siid_riid, (void **) &service);
  66.                 servProv->Release();
  67.             }
  68.  
  69.             if( SUCCEEDED(hr) )
  70.             {
  71.                 bCheckServiceProvider = FALSE;
  72.  
  73.                 hr = service->QueryInterface( riid, pout );
  74.             }
  75.  
  76.             if( SUCCEEDED(hr) )
  77.                 break;
  78.  
  79.         }
  80.  
  81.         if( container )
  82.         {
  83.             container->Release();
  84.             container = 0;
  85.         }
  86.  
  87.         hr = oleSite->GetContainer( &container );
  88.  
  89.         if( FAILED(hr) )
  90.             break;
  91.  
  92.         hr = container->QueryInterface( riid, pout );
  93.  
  94.         if( SUCCEEDED(hr) )
  95.             break;
  96.  
  97.         oleObj->Release();
  98.         oleObj = 0;
  99.  
  100.         hr = container->QueryInterface( IID_IOleObject, (void**)&oleObj );
  101.  
  102.     }
  103.  
  104.     if( oleSite )
  105.     {
  106.         //oleSite->Release();
  107.     }
  108.  
  109.     if( oleObj )
  110.         oleObj->Release();
  111.  
  112.     if( container )
  113.         container->Release();
  114.  
  115.     if( service )
  116.         *sout = service;
  117.  
  118.     return( hr );
  119.  
  120. }
  121.  
  122. //==============================================================================
  123. BOOL HttpReadFromServer (PHTTP_REQUEST_PARAM pParam)
  124. {
  125.     IMoniker*            m_pmk   = NULL;
  126.     IBindStatusCallback* m_pbsc  = NULL;
  127.     HRESULT hr = S_OK;
  128.     
  129.     IBindHost *pBindHost = NULL;
  130.  
  131.     // Create a callback object.
  132.     m_pbsc = new CUrlmonCallback (pParam);
  133.     if (m_pbsc == NULL)
  134.     {
  135.         hr = E_OUTOFMEMORY;
  136.         goto err;
  137.     }
  138.  
  139.     // Look for a bind host.
  140.     if (pParam->punkOuter)
  141.     {
  142.         hr = GetAnInterface
  143.         (
  144.             (IUnknown *) pParam->punkOuter,
  145.             IID_IBindHost,           // const IID &  riid,
  146.             (void **) &pBindHost,    // void **      pout,  
  147.             TRUE,                    // BOOL         bCheckServiceProvider,
  148.             IID_IBindHost,           // const IID &  siid,
  149.             IID_IBindHost,           // const IID &  siid_riid,
  150.             (void **) &pBindHost     // void **      sout
  151.         );
  152.     }
  153.  
  154.     // Convert ANSI URL to Unicode.
  155.     WCHAR wszUrl[INTERNET_MAX_URL_LENGTH];
  156.     MultiByteToWideChar(CP_ACP, 0, pParam->pszUrl, -1, wszUrl, sizeof(wszUrl));
  157.  
  158.     // Initialize bind context, stream.
  159.     IBindCtx *pbc;
  160.     IStream *pstm;
  161.     pbc =  NULL;
  162.     pstm = NULL;
  163.  
  164.     // Call the appropriate BindToStorage.
  165.     if (pBindHost)
  166.     {
  167.          pBindHost->CreateMoniker (wszUrl, NULL, &m_pmk, 0);
  168.          pBindHost->MonikerBindToStorage
  169.              (m_pmk, NULL, m_pbsc, IID_IStream, (void **) &pstm);
  170.     }   
  171.     else
  172.     {
  173.         CreateURLMoniker(NULL, wszUrl, &m_pmk);
  174.         CreateAsyncBindCtx(0, m_pbsc, NULL, &pbc);
  175.         m_pmk->BindToStorage(pbc, NULL, IID_IStream, (void **) &pstm);
  176.     }
  177.  
  178.     // Clean up bind context, stream.
  179.     if (pbc)
  180.         pbc->Release();
  181.     if (pstm)
  182.         pstm->Release();
  183.  
  184.     return SUCCEEDED(hr);
  185.  
  186. err:
  187.     delete m_pbsc;
  188.  
  189.     if (m_pmk != NULL)
  190.     {
  191.         m_pmk->Release();
  192.         m_pmk = NULL;
  193.     }
  194.     return FALSE;
  195.  
  196. }
  197.  
  198.