text: //--------------------------------------------------------------------------
  //  Copyright (C) Microsoft Corporation, 1998 - 1999
  //
  //  progress.cpp
  //
  //  IR ProgressBar object.
  //
  //--------------------------------------------------------------------------
  
  #include <windows.h>
  #include <shlobj.h>
  #include <malloc.h>
  #include "ircamera.h"
  #include "progress.h"
  
  
  //--------------------------------------------------------------------------
  // CIrProgress::CIrProgress()
  //
  //--------------------------------------------------------------------------
  CIrProgress::CIrProgress() :
                   m_hInstance(NULL),
                   m_pPD(NULL)
      {
      }
  
  //--------------------------------------------------------------------------
  // CIrProgress::~CIrProgress()
  //
  //--------------------------------------------------------------------------
  CIrProgress::~CIrProgress()
      {
      if (m_pPD)
          {
          m_pPD->Release();
          m_pPD = NULL;
          }
      }
  
  //--------------------------------------------------------------------------
  // CIrProgress::Initialize()
  //
  //--------------------------------------------------------------------------
  HRESULT CIrProgress::Initialize( IN HINSTANCE hInstance,
                                   IN DWORD     dwIdrAnimationAvi )
      {
      HRESULT hr;
      CHAR    szStr[MAX_PATH];
      WCHAR   wszStr[MAX_PATH];
  
  
      if (!hInstance)
           {
           return E_INVALIDARG;
           }
  
      m_hInstance = hInstance;
  
      //
      // Create a shell progress object to do the work for us.
      //
      hr = CoCreateInstance( CLSID_ProgressDialog,
                             NULL,
                             CLSCTX_INPROC_SERVER,
                             IID_IProgressDialog,
                             (void**)&m_pPD );
      if (FAILED(hr))
          {
          return hr;
          }
  
      //
      // Get the title string and place it on the progress dialog:
      //
      if (::LoadStringResource(m_hInstance,
                             IDS_PROGRESS_TITLE,
                             wszStr,
                             MAX_PATH ))
          {
          hr = m_pPD->SetTitle(wszStr);
          }
      else
          {
          // Couldn't load string, default title...
          hr = m_pPD->SetTitle(L"Image Transfer Progress");
          }
  
      //
      // Setup the file transfer animation
      //
      hr = m_pPD->SetAnimation( m_hInstance, dwIdrAnimationAvi );
      if (FAILED(hr))
          {
          goto error;
          }
  
      //
      // Setup the cancel string (displayed when the cancel button
      // is pressed.
      //
      if (::LoadStringResource(m_hInstance,
                             IDS_CANCEL_MSG,
                             wszStr,
                             MAX_PATH ))
          {
          hr = m_pPD->SetCancelMsg( wszStr, NULL );
          }
      else
          {
          // Couldn't load string, use default cancel message...
          hr = m_pPD->SetCancelMsg( L"Cleaning up...", NULL );
          }
  
      return hr;
  
  error:
      m_pPD->Release();
      m_pPD = NULL;
      m_hInstance = NULL;
      return hr;
      }
  
  //--------------------------------------------------------------------------
  // CIrProgress::SetText()
  //
  //--------------------------------------------------------------------------
  HRESULT CIrProgress::SetText( IN TCHAR *pText )
      {
      HRESULT hr = S_OK;
  
      if (m_pPD)
          {
          #ifdef UNICODE
  
          hr = m_pPD->SetLine( 1, pText, FALSE, NULL );
  
          #else
  
          WCHAR wszText[MAX_PATH];
  
          if (!MultiByteToWideChar( CP_ACP,
                                    0,
                                    pText,
                                    1+strlen(pText),
                                    wszText,
                                    MAX_PATH) )
              {
              hr = HRESULT_FROM_WIN32(::GetLastError());
              return hr;
              }
  
          hr = m_pPD->SetLine( 1, wszText, FALSE, NULL );
  
          #endif
          }
  
      return hr;
      }
  
  //--------------------------------------------------------------------------
  // CIrProgress::StartProgressDialog()
  //
  //--------------------------------------------------------------------------
  HRESULT CIrProgress::StartProgressDialog()
      {
      HRESULT  hr = S_OK;
  
      if (m_pPD)
          {
          DWORD dwFlags = PROGDLG_NORMAL|PROGDLG_AUTOTIME|PROGDLG_NOMINIMIZE;
  
          HRESULT hr = m_pPD->StartProgressDialog( NULL, // hwndParent
                                                   NULL, 
                                                   dwFlags,
                                                   NULL  );
          }
  
      return hr;
      }
  
  //--------------------------------------------------------------------------
  // CIrProgress::UpdateProgressDialog()
  //
  //--------------------------------------------------------------------------
  HRESULT CIrProgress::UpdateProgressDialog( IN DWORD dwCompleted,
                                             IN DWORD dwTotal )
      {
      HRESULT hr = S_OK;
  
      if (m_pPD)
          {
          hr = m_pPD->SetProgress( dwCompleted, dwTotal );
          }
  
      return hr;
      }
  
  //--------------------------------------------------------------------------
  // CIrProgress::HasUserCancelled()
  //
  //--------------------------------------------------------------------------
  BOOL CIrProgress::HasUserCancelled()
      {
      if (m_pPD)
          {
          return m_pPD->HasUserCancelled();
          }
      else
          {
          return S_OK;
          }
      }
  
  //--------------------------------------------------------------------------
  // CIrProgress::EndProgressDialog()
  //
  //--------------------------------------------------------------------------
  HRESULT CIrProgress::EndProgressDialog()
      {
      HRESULT hr = S_OK;
  
      if (m_pPD)
          {
          hr = m_pPD->StopProgressDialog();
          }
  
      return hr;
      }
  
  