//=============================================================================
//    (c) Copyright Wang Laboratories, Inc. 1995  All rights reserved.
//-----------------------------------------------------------------------------
//  Project:    Norway - Image Editor
//  File:               ERROR.CPP
//      Description:error functions
//
//  The basic operation of the error bins is controlled by the 'lock'
//  variables.  Codes cannot be written unless 'lock' is FALSE. (not Locked)
//  Once written, 'lock' becomes TRUE.  Data cannot be displayed unless
//  'lock' is TRUE.  Bin2 cannot be written unless bin1 is locked first.
//  To clear the bins, all we have to do is unlock them.
//
//
//  Date         Who Why
//      05/05/95 LDM Created from ABERR.CPP
//
//-----------------------------------------------------------------------------
//  Maintenance Log:
/*
$Header:   S:\products\msprods\norway\iedit95\error.cpv   1.26   17 Jun 1996 13:43:06   GMP  $
$Log:   S:\products\msprods\norway\iedit95\error.cpv  $
   
      Rev 1.26   17 Jun 1996 13:43:06   GMP
   file access error returns file already open string now instead of invalid
   format string.
   
      Rev 1.25   14 Jun 1996 15:37:52   GMP
   added handling of file access error in verifying image error.
   
      Rev 1.24   05 Feb 1996 13:37:18   GMP
   nt changes.

      Rev 1.23   29 Nov 1995 11:38:36   MMB
   move PATHFILEACCESSERROR to new string in HandleOpenFileError

      Rev 1.22   10 Nov 1995 16:28:50   GMP
   check for invalid display scale in HandlePageMovementError.

      Rev 1.21   06 Nov 1995 18:20:10   GMP
   use ! instead of X HandleSavingError.

      Rev 1.20   17 Oct 1995 15:14:24   GMP
   check for invalid file format in handle saving error

      Rev 1.19   03 Oct 1995 12:07:38   MMB
   handle WICTL_E_PAGEINUSE error code from Admin

      Rev 1.18   27 Sep 1995 14:51:18   GMP
   Added HandleZoomError().

      Rev 1.17   26 Sep 1995 14:56:34   MMB
   added error handling for fns. for disk full situation

      Rev 1.16   22 Sep 1995 17:04:36   GMP
   test for file path access error in HandleSaveError.

      Rev 1.15   20 Sep 1995 18:41:30   MMB
   handler for invalid comp type

      Rev 1.14   15 Sep 1995 14:32:10   MMB
   added more error codes to Insert & Append

      Rev 1.13   13 Sep 1995 14:15:48   LMACLENNAN
   useless default in GetActualError

      Rev 1.12   01 Sep 1995 23:35:24   MMB
   added errors on saving

      Rev 1.11   01 Sep 1995 17:54:48   MMB
   added save error

      Rev 1.10   28 Aug 1995 13:55:32   LMACLENNAN
   supress error codes from DispErr (the orig function)

      Rev 1.9   25 Aug 1995 10:25:56   MMB
   move to document model

      Rev 1.8   16 Aug 1995 17:32:58   MMB
   added VerifyImageError

      Rev 1.7   11 Aug 1995 13:45:20   MMB
   fix bug 3398

      Rev 1.6   11 Aug 1995 09:06:42   MMB
   new error handling

      Rev 1.5   10 Aug 1995 14:49:26   MMB
   added Save error handling

      Rev 1.4   02 Aug 1995 11:23:34   MMB
   added new functions to process the error's

      Rev 1.3   01 Aug 1995 16:13:00   MMB
   added HandleOpenError fn to be in line with how we are going to handle
   errors from now on

      Rev 1.2   12 Jul 1995 11:14:20   MMB
   add DispErr call to take an additional COleDispatchException parm

      Rev 1.1   19 Jun 1995 10:48:50   LMACLENNAN
   remove errorrc.h, use resource.h

      Rev 1.0   31 May 1995 09:28:08   MMB
   Initial entry
.*/
//=============================================================================


// ----------------------------> Includes <-------------------------------
#include "stdafx.h"
#include <stdlib.h>     // itoa
#define E_ALLCODES
#include "error.h"
#include "iedit.h"
#include "resource.h"
#include "ieditetc.h"

#include "items.h"
#include "wangiocx.h"

// ----------------------------> Globals <-------------------------------
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

// works with definition in ieditetc.h
#ifdef _DEBUG
#define MYTRCENTRY(str)     TRACE1("In CIeERR::%s\r\n", str);
#endif

//=============================================================================
//  Function:   CIeditError()
//  constructor for this class
//-----------------------------------------------------------------------------
CIeditError::CIeditError()
{
    MYTRC0("In IeditErr's Constructor ++ERR \r\n");
    m_init = FALSE;
    m_lock1 = FALSE;
    m_lock2 = FALSE;
    m_err1 = (DWORD)0;
    m_err2 = (DWORD)0;
    m_errtext[0] = '\0';
    m_szLocationStr = (LPCTSTR) NULL;
    return;
}

//=============================================================================
//  Function:   ~CIeditError
//  Destructor
//-----------------------------------------------------------------------------
CIeditError::~CIeditError(void)
{
    MYTRC0("In IeditErr's Destructor --ERR \r\n");
    return;
}

//=============================================================================
//  Function:   SetInstance(HINSTANCE hInst)
//  Initialize
//-----------------------------------------------------------------------------
void CIeditError::SetInstance(HINSTANCE hInst)
{
    m_ApphInst = hInst; // must pass the instance where RC data can be loaded from
    return;
}

//=============================================================================
//  Function:   PutErr(DWORD error)
//  Save error & lock bin
//-----------------------------------------------------------------------------
void CIeditError::PutErr(DWORD error)
{
/* Only write error if not locked & error not 0 */
    if (!m_lock1 && (error != (DWORD)0) )
    {
        m_err1 = error;
        m_lock1   = TRUE;
        m_errtext[0] = '\0';
    }
    return;
}

//=============================================================================
//  Function:   PutErr(DWORD error, DWORD error2)
//  OVERRIDDEN Save both errors & lock bin
//-----------------------------------------------------------------------------
void CIeditError::PutErr(DWORD error, DWORD error2)
{
    PutErr(error);
    PutErr2(error2);
    return;
}

//=============================================================================
//  Function:   PutErr2(DWORD error)
//  PutErr2 - Save error & lock bin
//-----------------------------------------------------------------------------
void CIeditError::PutErr2(DWORD error)
{
    /* Only write error if bin 1 locked, bin2 NOT LOCKED */
    if (m_lock1)
    if (!m_lock2 && (error >= (DWORD)0) )
    {
        m_err2 = error;
        m_lock2   = TRUE;
    }
    return;
}

//=============================================================================
//  Function:   PutErr2Hr(DWORD error)
// Save OLE Hr error & lock bin. We translate the HRESULT into an SCODE
//-----------------------------------------------------------------------------
void CIeditError::PutErr2Hr(DWORD error)
{
    /* Only write error if bin 1 locked, bin2 NOT LOCKED */
    if (m_lock1)
    if (!m_lock2 && (error >= (DWORD)0) )
    {
        /* translate into SCODE from HRESULT */
        m_err2 = (DWORD)GetScode((HRESULT)error);
        m_lock2 = TRUE;
    }
    return;
}

//=============================================================================
//  Function:   PutErr2Hr(DWORD error, DWORD error2)
//  OVERRIDDEN Save primary and second OLE Hr error & lock bin
//-----------------------------------------------------------------------------
void CIeditError::PutErr2Hr(DWORD error, DWORD error2)
{
    PutErr(error);
    PutErr2Hr(error2);
    return;
}

//=============================================================================
//  Function:   PutErrText(LPSTR txt)
//  save text associated with bin1
//-----------------------------------------------------------------------------
void CIeditError::PutErrText(LPSTR txt)
{
    /* Only save if bin 1 locked */
    if (m_lock1)
    {
            for (int i=0; i<ERMSG_LEN-1 && txt[i]; i++)
                m_errtext[i] = txt[i];
        m_errtext[i] = '\0';
    }
    return;
}

//=============================================================================
//  Function:   GetErr(int bin, DWORD FAR* erval)
//  Retrieve error and unlock bin
//-----------------------------------------------------------------------------
BOOL CIeditError::GetErr(int bin, DWORD FAR* erval)
{
    if ((bin == 1) && (m_lock1))     /* Only return error if it is locked */
    {
        *erval = m_err1;
        return (TRUE);
    }
    if ((bin == 2) && (m_lock2))     /* Only return error if it is locked */
    {
        *erval = m_err2;
        return (TRUE);
    }

    return (FALSE);
}

//=============================================================================
//  Function:   IsErr ()
//  Tell if error here - nondestructive
//-----------------------------------------------------------------------------
BOOL CIeditError::IsErr()
{
    return ((BOOL)m_lock1);
}

//=============================================================================
//  Function:   ClearErr
//  Unlock both bins
//-----------------------------------------------------------------------------
void CIeditError::ClearErr()
{
    m_lock1 = m_lock2 = FALSE;
    m_szLocationStr = (LPCTSTR) NULL;
    return;
}

//=============================================================================
//  Function:   DispErr(DWORD code)
//  Put and display error
//-----------------------------------------------------------------------------
void CIeditError::DispErr(DWORD code)
{
    PutErr(code);
    DispErr();
    return;
}

//=============================================================================
//  Function:   DispErr(DWORD code, DWORD code2)
//  OVERRIDDEN - Put & Display both error codes
//-----------------------------------------------------------------------------
void CIeditError::DispErr(DWORD code, DWORD code2)
{
    PutErr(code);
    PutErr2(code2);
    DispErr();
    return;
}

#if(0)
//=============================================================================
//  Function:   DispErr(DWORD code, DWORD code2)
//  OVERRIDDEN - Put & Display both error codes
//-----------------------------------------------------------------------------
void CIeditError::DispErr(DWORD code, DWORD code2, COleDispatchException* e)
{
    if (code2)
        DispErr(code, (DWORD)code2);
    else
        DispErr(code+1, e->m_wCode);
    return;
}
#endif

//=============================================================================
//  Function:   DispErrHr(DWORD code, DWORD code2)
// Put & Display Both Error Codes (OLE Hr as second).We translate the HRESULT into an SCODE
//-----------------------------------------------------------------------------
void CIeditError::DispErrHr(DWORD code, DWORD code2)
{
    PutErr(code);
    PutErr2Hr(code2);
    DispErr();
    return;
}

//=============================================================================
//  Function:   DispErr ()
//  Display Error - BASE version
//-----------------------------------------------------------------------------
void CIeditError::DispErr()
{
    // FARPROC  lpDlgProc;
    SHOWENTRY("DispErr");
    DWORD err;

        WORD  i;
    char  boxtitle[35];
    char dispmsg1[256];     /* Primary message */
    char ermsg1[ERMSG_LEN];     /* Primary code */
    char ermsg2[ERMSG_LEN];     /* Secondary Code */
    char tmpmsg[8];

    // Start by setting & getting secondary message (if any)
    dispmsg1[0] = 0;        // always clear this out
    ermsg1[0] = 0;
    ermsg2[0] = 0;

    // check secondary error
    // this is the real error code
        // For RELEASE of PRODUCT, avoid putting error codes on screen
        // Only show code if special flag is on...
        if (theApp.m_bShowDbgErrCodes)
        {
            if (GetErr(2, &err))
            {
                // string = 'Detail Code was 0x'
                LoadString (m_ApphInst, IDS_2NDCODE, (LPSTR)ermsg2, ERMSG_LEN);
                //itoa(err, tmpmsg, 10);
                //lstrcat ( (LPSTR)ermsg2, (LPSTR)tmpmsg);      // build it

                i = HIWORD(err);
                _itoa(i, tmpmsg, 16);
                _strupr(tmpmsg);

                PadErr(tmpmsg);         // get leading 0's

                lstrcat ( (LPSTR)ermsg2, (LPSTR)tmpmsg);                // get hi half
                lstrcat ( (LPSTR)ermsg2, (LPSTR)"  0x");                // setup lo half

                i = LOWORD(err);
                _itoa(i, tmpmsg, 16);
                _strupr(tmpmsg);

                PadErr(tmpmsg);         // get leading 0's

                lstrcat ( (LPSTR)ermsg2, (LPSTR)tmpmsg);                // build lo

                // now get some human-readable message in secondary buffer
                // if the error is OMT/NETBIOS or Print Server error
                // or other SII error that we decode.
                // deciphomt(err, (LPSTR)dispmsg2);
            }
        }

    /* Then get Primary message */
    if (GetErr(1, &err))
    {
        // string = 'ABOLE -'
        LoadString (m_ApphInst, IDS_1STCODE, (LPSTR)ermsg1, ERMSG_LEN);

        // for now, lets default to OUR PRIVATE CODES being just ints
        _itoa((int)err, tmpmsg, 10);
        lstrcat ( (LPSTR)ermsg1, (LPSTR)tmpmsg);  // completes error code

        // now get some human-readable message in buffer.
        // start with default, then decode for specific error message
        // LoadString (m_ApphInst, IDS_NOMSG, (LPSTR)dispmsg1, ERMSG_LEN);
        decipher(err, (LPSTR)dispmsg1);
        lstrcat (dispmsg1, "\r\n\n");

        // stick in any extra text supplied now
        if (m_errtext[0])
        {
            lstrcat (dispmsg1, m_errtext);
            lstrcat (dispmsg1, "\r\n\n");
        }

        // this is the real error code
                // For RELEASE of PRODUCT, avoid putting error codes on screen
        // Only show code if special flag is on...
        if (theApp.m_bShowDbgErrCodes)
                {
                lstrcat (dispmsg1, ermsg1);

                // this is tne extra code (if any)
                if (ermsg2[0])
                {
                        lstrcat (dispmsg1, "\r\n");
                        lstrcat (dispmsg1, ermsg2);
                }
                }

        LoadString(m_ApphInst, IDS_ERRTITLE, (LPSTR)boxtitle, sizeof(boxtitle));
        MessageBox((HWND)0, dispmsg1, boxtitle, MB_ICONEXCLAMATION|MB_OK);
        // MessageBox(GetActiveWindow(), dispmsg1, boxtitle, MB_ICONEXCLAMATION|MB_OK);
    }
    return;
}

//=============================================================================
//  Function:   PadErr(LPSTR hexstr)
//  be sure hex codes are 4 wide
//-----------------------------------------------------------------------------
void CIeditError::PadErr(LPSTR hexstr)
{
    int c, x, n;

    // make sure ro pad up to four places take length, see how far from 4 it is,
    // then shift that amount of 0's in
    c = lstrlen(hexstr);
    x = 4-c;
    if (x)
    {
        // c = char to move (starts at offset len-1)
        // n = new posit in string for char
        for (--c,n=3; c >= 0;  )
            hexstr[n--] = hexstr[c--];
        // go refill the leading '0's
        for (n=0; x>0; x--)
            hexstr[n++] = '0';
        hexstr[4] = '\0';
    }
    return;
}


//=============================================================================
//  Function:   DisplayError(UINT nID, UINT nType)
//-----------------------------------------------------------------------------
void CIeditError::DisplayError(UINT nID, LONG lErr, UINT nType)
{
    if (theApp.m_bShowDbgErrCodes)
    {
        CString szErrStr;
        char tmp[10];

        szErrStr.LoadString (nID);

        if (!m_szLocationStr.IsEmpty())
            szErrStr += "\r\n"; szErrStr += m_szLocationStr;

        if (lErr != 0)
        {
            szErrStr += "\r\n"; szErrStr += "Detail code was : 0x";
            _itoa (HIWORD (lErr), tmp, 16); szErrStr += tmp;
            szErrStr += " : 0x";
            _itoa (LOWORD (lErr), tmp, 16); szErrStr += tmp;
        }

        AfxMessageBox (szErrStr, nType);
    }
    else
        AfxMessageBox (nID, nType);
}

//=============================================================================
//  Function:   DisplayError(UINT nID, UINT nType, LPCTSTR lpStr1)
//-----------------------------------------------------------------------------
void CIeditError::DisplayError(UINT nID, UINT nType, LPCTSTR lpStr1, LONG lErr)
{
    CString szErrStr;

    if (theApp.m_bShowDbgErrCodes)
    {
        char tmp[10];

        AfxFormatString1 (szErrStr, nID, lpStr1);

        if (!m_szLocationStr.IsEmpty())
            szErrStr += "\r\n"; szErrStr += m_szLocationStr;

        if (lErr != 0)
        {
            szErrStr += "\r\n"; szErrStr += "Detail code was : 0x";
            _itoa (HIWORD (lErr), tmp, 16); szErrStr += tmp;
            szErrStr += " : 0x";
            _itoa (LOWORD (lErr), tmp, 16); szErrStr += tmp;
        }
    }
    else
        AfxFormatString1 (szErrStr, nID, lpStr1);

    AfxMessageBox (szErrStr, nType);
}

//=============================================================================
//  Function:   DisplayError(UINT nID, UINT nType, LPCTSTR lpStr1, LPCTSTR lpStr2)
//-----------------------------------------------------------------------------
void CIeditError::DisplayError(UINT nID, UINT nType, LPCTSTR lpStr1, LPCTSTR lpStr2, LONG lErr)
{
    CString szTmp;
    AfxFormatString2 (szTmp, nID, lpStr1, lpStr2);
    AfxMessageBox (szTmp, nType);
}

//=============================================================================
//  Function:   GetActualError ()
//-----------------------------------------------------------------------------
long CIeditError::GetActualError (DWORD force)  // defaulted to '0'
{
        _DImagedit* pIedit;
        _DThumb*        pThumb;
        _DNrwyad*       pAdmin;

        DWORD  choice = m_err1; // default to setting in m_err1
        if (0 != force)
                choice = force;

    switch (choice)
    {
        case ErrorInImageEdit   :
            pIedit = g_pAppOcxs->GetIeditDispatch();
                return (pIedit->GetStatusCode ());
        break;
        case ErrorInAdmin               :
            pAdmin = g_pAppOcxs->GetAdminDispatch();
                return (pAdmin->GetStatusCode ());
        break;
        case ErrorInThumbnail   :
            pThumb = g_pAppOcxs->GetThumbDispatch();
                return (pThumb->GetStatusCode ());
        break;

        case ErrorInApplication :
                return (m_err2);
        break;
    }
    return (0);
}

//=============================================================================
//  Function:   HandleOpenError ()
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleOpenError ()
{
    UINT        nID;
        long            lErr = GetActualError ();

    if (m_err1 != ErrorInApplication)
    {
        switch (lErr)
        {
            case CTL_E_OUTOFMEMORY :
                nID = IDS_E_OPEN_OUTOFMEMORY;
            break;

            case CTL_E_DISKFULL :
            case CTL_E_BADFILENAME :
            case CTL_E_PATHNOTFOUND :
            case CTL_E_FILENOTFOUND :
            case CTL_E_BADFILENAMEORNUMBER :
                nID = IDS_E_OPEN_INVALIDFILENAME;
            break;

            case CTL_E_PATHFILEACCESSERROR :
            case CTL_E_FILEALREADYOPEN :
                nID = IDS_E_OPEN_FILEALREADYOPEN;
            break;

            case CTL_E_INVALIDFILEFORMAT :
            case WICTL_E_INVALIDFILETYPE :
                nID = IDS_E_OPEN_INVALIDFILEFORMAT;
            break;

            case WICTL_E_INVALIDCOMPRESSIONTYPE :
            case WICTL_E_INVALIDCOMPRESSIONINFO :
                nID = IDS_E_OPEN_INVALIDCOMPFORMAT;
            break;

            case CTL_E_INVALIDPROPERTYVALUE :
            case CTL_E_FILEALREADYEXISTS :
            case CTL_E_ILLEGALFUNCTIONCALL :
            case CTL_E_INVALIDCLIPBOARDFORMAT :
            case CTL_E_INVALIDPICTURE :
            case CTL_E_PRINTERERROR :
            case CTL_E_GETNOTSUPPORTEDATRUNTIME :
            case CTL_E_INVALIDPROPERTYARRAYINDEX :
            case CTL_E_SETNOTSUPPORTEDATRUNTIME :
            case CTL_E_NEEDPROPERTYARRAYINDEX :
            case CTL_E_GETNOTSUPPORTED :
            case CTL_E_SETNOTSUPPORTED :
                nID = IDS_E_HOWDIDWEGETHERE;
            break;

            default :
                nID = IDS_E_NOTCATEGORIZEDOCXERROR;
            break;
        }
    }
    else
        {
        switch (lErr)
        {
            case E_02_BADPAGENO :
                nID = IDS_E_OPEN_INVALIDPAGENUMBER;
            break;

            case E_15_NOCVIEWFOUND :
            default :
                nID = IDS_E_INTERNALERROR;
            break;
        }
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandlePrintPageError ()
//  We are assuming that the only OCX that is involved in performing this menu
//  functionality is the Image Edit OCX. ***** If we add other OCX's to do this
//  stuff then the following error handler will have to be modified appropriately
//-----------------------------------------------------------------------------
BOOL CIeditError::HandlePrintPageError ()
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

        switch (lErr)
    {
        case CTL_E_OUTOFMEMORY :
            nID = IDS_E_PRINTPAGE_OUTOFMEMORY;
        break;

        case CTL_E_DISKFULL :
        break;

        case CTL_E_INVALIDFILEFORMAT :
        case WICTL_E_INVALIDFILETYPE :
        case WICTL_E_INVALIDCOMPRESSIONTYPE :
        case WICTL_E_INVALIDCOMPRESSIONINFO :
            nID = IDS_E_PRINTPAGE_INVALIDFILEFORMAT;
        break;

        case CTL_E_PRINTERERROR :
            nID = IDS_E_PRINTPAGE_PRINTERERROR;
        break;
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandleDeletePageError ()
//  There are three distinct OCX's involved in this process :
//  1) Admin - this actually does the delete from the file
//  2) ImageEdit - to redisplay the file
//  3) Thumbnail - to redisplay the file
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleDeletePageError ()
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

    if (m_err1 == ErrorInAdmin)
    {
        // the pages MAY not have been deleted yet!!
        switch (lErr)
            {
            case WICTL_E_PAGEINUSE :
                nID = IDS_E_OPEN_FILEALREADYOPEN;
            break;

                case CTL_E_OUTOFMEMORY :
                nID = IDS_E_DELETEPAGE_ADMIN_OUTOFMEMORY;
            break;
        }
    }
    else
    {
        // the pages are GONZO!! - either the Thumbnail or ImageEdit OCX croaked
        switch (lErr)
        {
            case CTL_E_OUTOFMEMORY :
                nID = IDS_E_DELETEPAGE_THMIMG_OUTOFMEMORY;
            break;
        }
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandlePageAppendExistingError ()
//  There are three distinct OCX's involved in this process :
//  1) Admin - this actually does the append from the file
//  2) ImageEdit - to redisplay the file
//  3) Thumbnail - to redisplay the file
//-----------------------------------------------------------------------------
BOOL CIeditError::HandlePageAppendExistingError ()
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

    if (m_err1 == ErrorInAdmin)
    {
        // the pages MAY not have been appended yet!!
        switch (lErr)
            {
                case CTL_E_OUTOFMEMORY :
                nID = IDS_E_APPENDPAGE_ADMIN_OUTOFMEMORY;
            break;
                case CTL_E_INVALIDFILEFORMAT :
                case WICTL_E_INVALIDPAGETYPE :
                case WICTL_E_INVALIDFILETYPE :
                case WICTL_E_INVALIDCOMPRESSIONTYPE :
                case WICTL_E_INVALIDCOMPRESSIONINFO :
                nID = IDS_E_INVALIDFILEFORMAT;
            break;
            case CTL_E_DISKFULL :
                nID = IDS_E_DISK_FULL;
            break;
        }
    }
    else
    {
        // the pages are appended - either the Thumbnail or ImageEdit OCX croaked
        switch (lErr)
        {
            case CTL_E_OUTOFMEMORY :
                nID = IDS_E_APPENDPAGE_THMIMG_OUTOFMEMORY;
            break;
        }
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandlePageInsertExistingError ()
//  There are three distinct OCX's involved in this process :
//  1) Admin - this actually does the insert from the file
//  2) ImageEdit - to redisplay the file
//  3) Thumbnail - to redisplay the file
//-----------------------------------------------------------------------------
BOOL CIeditError::HandlePageInsertExistingError ()
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

    if (m_err1 == ErrorInAdmin)
    {
        // the pages MAY not have been deleted yet!!
        switch (lErr)
            {
                case CTL_E_OUTOFMEMORY :
                nID = IDS_E_INSERTPAGE_ADMIN_OUTOFMEMORY;
            break;
                case CTL_E_INVALIDFILEFORMAT :
                case WICTL_E_INVALIDPAGETYPE :
                case WICTL_E_INVALIDFILETYPE :
                case WICTL_E_INVALIDCOMPRESSIONTYPE :
                case WICTL_E_INVALIDCOMPRESSIONINFO :
                nID = IDS_E_INVALIDFILEFORMAT;
            break;
            case CTL_E_DISKFULL :
                nID = IDS_E_DISK_FULL;
            break;
        }
    }
    else
    {
        // the pages are GONZO!! - either the Thumbnail or ImageEdit OCX croaked
        switch (lErr)
        {
            case CTL_E_OUTOFMEMORY :
                nID = IDS_E_INSERTPAGE_THMIMG_OUTOFMEMORY;
            break;
        }
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandleFilePickError ()
//  Only the Admin OCX is involved in this error situation. We have tried to
//  pick a file to either insert, append etc. but it has failed!
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleFilePickError ()
{
    UINT        nID;
        long            lErr = GetActualError ();

    switch (lErr)
    {
        case CTL_E_OUTOFMEMORY :
            nID = IDS_E_FILEPICK_OUTOFMEMORY;
        break;
        case CTL_E_FILEALREADYOPEN :
            nID = IDS_E_OPEN_FILEALREADYOPEN;
        break;
        case CTL_E_INVALIDFILEFORMAT :
        case WICTL_E_INVALIDCOMPRESSIONTYPE :
        case WICTL_E_INVALIDCOMPRESSIONINFO :
            nID = IDS_E_INVALIDFILEFORMAT;
        break;
        default :
            nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        break;
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandlePageMovementError ()
//-----------------------------------------------------------------------------
BOOL CIeditError::HandlePageMovementError ()
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

    switch (lErr)
    {
        case CTL_E_OUTOFMEMORY :
            nID = IDS_E_PGMVMT_OUTOFMEMORY;
        break;
        case CTL_E_INVALIDFILEFORMAT :
        case WICTL_E_INVALIDFILETYPE :
        case WICTL_E_INVALIDCOMPRESSIONTYPE :
        case WICTL_E_INVALIDCOMPRESSIONINFO :
            nID = IDS_E_PGMVMT_INVALIDFILEFORMAT;
        break;
                case WICTL_E_INVALIDDISPLAYSCALE:
            nID = IDS_E_INVALIDDISPLAYSCALE;
        break;
        default :
        break;
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandlePageConvertError ()
//-----------------------------------------------------------------------------
BOOL CIeditError::HandlePageConvertError ()
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

    switch (lErr)
    {
        case CTL_E_OUTOFMEMORY :
            nID = IDS_E_CONVERT_OUTOFMEMORY;
        break;
        case CTL_E_DISKFULL :
            nID = IDS_E_DISK_FULL;
        break;
        default :
        break;
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandleImageEditOcxInitError ()
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleImageEditOcxInitError ()
{
    UINT nID;

    switch (m_err2)
    {
        case E_08_CLSID      :
        case E_08_CREATEITEM :
        case E_08_QUERYIDISP :
        case E_08_FINDCONNPT :
        case E_08_QUERYICPC  :
        case E_08_GETEVENTSIID :
            nID = IDS_E_IMAGEEDITOCX_INIT;
        break;
    }

    DisplayError (nID, m_err2);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandleThumbnailOcxInitError ()
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleThumbnailOcxInitError ()
{
    UINT nID;

    switch (m_err2)
    {
        case E_08_CLSID      :
        case E_08_CREATEITEM :
        case E_08_QUERYIDISP :
        case E_08_FINDCONNPT :
        case E_08_QUERYICPC  :
        case E_08_GETEVENTSIID :
            nID = IDS_E_THUMBNAILOCX_INIT;
        break;
    }

    DisplayError (nID, m_err2);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandleAdminOcxInitError ()
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleAdminOcxInitError ()
{
    UINT nID;

    switch (m_err2)
    {
        case E_08_CLSID      :
        case E_08_CREATEITEM :
        case E_08_QUERYIDISP :
        case E_08_FINDCONNPT :
        case E_08_QUERYICPC  :
        case E_08_GETEVENTSIID :
            nID = IDS_E_ADMINOCX_INIT;
        break;
    }

    DisplayError (nID, m_err2);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandleScanOcxInitError ()
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleScanOcxInitError ()
{
    UINT nID;

    switch (m_err2)
    {
        case E_08_CLSID      :
        case E_08_CREATEITEM :
        case E_08_QUERYIDISP :
        case E_08_FINDCONNPT :
        case E_08_QUERYICPC  :
        case E_08_GETEVENTSIID :
            nID = IDS_E_SCANOCX_INIT;
        break;
    }

    DisplayError (nID, m_err2);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandleSavingError ()
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleSavingError ()
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

    if (m_err1 == ErrorInImageEdit)
    {
        // error happened on save !
        switch (lErr)
            {
                case CTL_E_PATHFILEACCESSERROR :
                nID = IDS_E_PATHFILEACCESSERROR;
            break;
                case CTL_E_OUTOFMEMORY :
                nID = IDS_E_SAVE_IEDIT_OUTOFMEMORY;
            break;
                case CTL_E_DISKFULL :
                nID = IDS_E_SAVE_IEDIT_DISKFULL;
            break;

            //added error handling for invalid file format, i.e. trying
            //to write a 4 bit image.
            case CTL_E_INVALIDFILEFORMAT :
            case WICTL_E_INVALIDFILETYPE :
            case WICTL_E_INVALIDPAGETYPE :
                nID = IDS_E_OPEN_INVALIDFILEFORMAT;
            break;
                        default :
                nID = IDS_E_SAVE_SAVEERROR;
            break;
        }
    }
    else
    {
        // the Save is done - but the thumbnail control barfed !!
        switch (lErr)
        {
            case CTL_E_OUTOFMEMORY :
                nID = IDS_E_SAVE_THUMB_OUTOFMEMORY;
            break;
            case CTL_E_DISKFULL :
                nID = IDS_E_SAVE_THUMB_DISKFULL;
            break;
            default :
                nID = IDS_E_SAVE_SAVEERROR;
            break;
        }
    }

    DisplayError (nID, lErr, MB_ICONEXCLAMATION|MB_OK);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   SpecifyLocation (LPCTSTR szfile, int linenum)
//-----------------------------------------------------------------------------
void CIeditError::SpecifyLocation (LPCTSTR szfile, int linenum)
{
    m_szLocationStr = szfile;

    char szTmp[10];
    _itoa (linenum, szTmp, 10);
    m_szLocationStr += szTmp;
}

//=============================================================================
//  Function:   HandleVerifyImageError (LPCTSTR szFileName)
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleVerifyImageError (LPCTSTR szFileName)
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

    switch (lErr)
    {
        case CTL_E_OUTOFMEMORY :
            nID = IDS_E_FILEPICK_OUTOFMEMORY;
        break;
        case CTL_E_INVALIDFILEFORMAT :
        case WICTL_E_INVALIDCOMPRESSIONTYPE :
        case WICTL_E_INVALIDCOMPRESSIONINFO :
            nID = IDS_E_INVALIDFILEFORMAT;
        break;
		  case CTL_E_PATHFILEACCESSERROR :
            nID = IDS_E_OPEN_FILEALREADYOPEN;
        break;
        case CTL_E_FILENOTFOUND :
            nID = IDS_FILEDOESNOTEXIST;
            DisplayError (nID, MB_OK | MB_ICONSTOP, szFileName, lErr);
            ClearErr ();
        return (TRUE);
        default :
            nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        break;
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandleVerifyImageError (LPCTSTR szFileName)
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleNewDocumentError ()
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

    switch (lErr)
    {
        case CTL_E_OUTOFMEMORY :
            nID = IDS_E_NEWDOC_OUTOFMEMORY;
        break;
        case CTL_E_DISKFULL :
            nID = IDS_E_DISK_FULL;
        break;
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

//=============================================================================
//  Function:   HandleZoomError ()
//-----------------------------------------------------------------------------
BOOL CIeditError::HandleZoomError ()
{
    UINT        nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        long            lErr = GetActualError ();

    switch (lErr)
    {
        case CTL_E_OUTOFMEMORY :
            nID = IDS_E_ZOOM_CANNOTZOOM;
        break;
        case WICTL_E_INVALIDDISPLAYSCALE:
            nID = IDS_E_INVALIDDISPLAYSCALE;
        break;
        default :
            nID = IDS_E_NOTCATEGORIZEDOCXERROR;
        break;
    }

    DisplayError (nID, lErr);
    ClearErr ();
    return (TRUE);
}

/*
        case CTL_E_OUTOFMEMORY :
        case CTL_E_FILENOTFOUND :
        case CTL_E_FILEALREADYOPEN :
        case CTL_E_FILEALREADYEXISTS :
        case CTL_E_DISKFULL :
        case CTL_E_BADFILENAME :
        case CTL_E_PATHFILEACCESSERROR :
        case CTL_E_PATHNOTFOUND :
        case CTL_E_INVALIDFILEFORMAT :
        case CTL_E_INVALIDPROPERTYVALUE :
        case CTL_E_BADFILENAMEORNUMBER :
        case WICTL_E_INVALIDFILETYPE :
        case WICTL_E_INVALIDCOMPRESSIONTYPE :
        case WICTL_E_INVALIDCOMPRESSIONINFO :
        case CTL_E_ILLEGALFUNCTIONCALL :
        case CTL_E_INVALIDCLIPBOARDFORMAT :
        case CTL_E_INVALIDPICTURE :
        case CTL_E_PRINTERERROR :
        case CTL_E_GETNOTSUPPORTEDATRUNTIME :
        case CTL_E_INVALIDPROPERTYARRAYINDEX :
        case CTL_E_SETNOTSUPPORTEDATRUNTIME :
        case CTL_E_NEEDPROPERTYARRAYINDEX :
        case CTL_E_GETNOTSUPPORTED :
        case CTL_E_SETNOTSUPPORTED :
*/