home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / dbmsg / mapi / common / traces.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-11  |  86.1 KB  |  1,039 lines

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  File Name 
  4. //      TRACES.CPP
  5. //
  6. //  Description
  7. //      This file implements tracing functions for sending debug/trace strings
  8. //      to an attached debug monitor, the serial port, or a log file.
  9. //
  10. //  Author
  11. //      Irving De la Cruz
  12. //
  13. //  Revision: 1.3
  14. //
  15. // Written for Microsoft Windows Developer Support
  16. // Copyright (c) 1994-1996 Microsoft Corporation. All rights reserved.
  17. //
  18.  
  19. // These functions DO NOT support UNICODE of Multi-Byte character sets
  20. // but can be easily extended to do so
  21. #ifdef UNICODE
  22. #undef UNICODE
  23. #endif
  24. #ifdef _UNICODE
  25. #undef _UNICODE
  26. #endif
  27. #ifdef _MBCS
  28. #undef _MBCS
  29. #endif
  30.  
  31. #include <WINDOWS.H>
  32. #ifndef TRACES_NO_MAPI
  33. #include <MAPIDEFS.H>
  34. #include <MAPITAGS.H> 
  35. #include <MAPICODE.H>
  36. #endif // TRACES_NO_MAPI
  37.  
  38. #ifndef ENABLE_DEBUG_OUTPUT
  39. #define ENABLE_DEBUG_OUTPUT
  40. #endif // ENABLE_DEBUG_OUTPUT
  41. #include "TRACES.H"
  42.  
  43. ///////////////////////////////////////////////////////////////////////////////
  44. //
  45. // USER SETTINGS FOR TRACING FUNCTIONS
  46. // 
  47. //  THIS IS THE ONLY PART THAT NEEDS TO BE ALTERED FOR A DIFFERENT DESTINATION 
  48. //  OUTPUT PORT OR LOG FILE NAME
  49. //
  50.  
  51. // Change the port as necessary, depending on the COM port to which the 
  52. // debugger terminal is attached to.
  53. #define COM_PORT_STRING         "COM1"
  54. // Change the setting below to what ever is necessary. Check the Win32 
  55. // documentation on the DCB (Data communication block) structure for other 
  56. // valid values. Default: 9600, 8, N, 1
  57. #define COM_BAUD_RATE           9600
  58. #define COM_DATA_BYTE_SIZE      8
  59. #define COM_PARITY              NOPARITY
  60. #define COM_STOP_BIT            ONESTOPBIT
  61.  
  62. #define LOG_FILE_NAME           "C:\\MAPILOG.TXT"
  63.  
  64. static BOOL fFileInit   = FALSE;
  65. static BOOL fComInit = FALSE;
  66.  
  67. static HANDLE hCom      = NULL;
  68. static HANDLE hConsole  = NULL;
  69. static HANDLE hLogFile  = NULL;
  70.  
  71. DWORD gTracesFlags = 0;
  72.  
  73. // Prototypes
  74. inline void WINAPI OpenOutputHandles (void);
  75. inline void WINAPI CloseOutputHandles (void);
  76. inline void WINAPI WriteOutputString (LPSTR, DWORD);
  77.  
  78. void WINAPI InitTraces (DWORD dwFlags)
  79. {
  80.     if (dwFlags & (TRACES_CONSOLE |
  81.                    TRACES_LOG_FILE |
  82.                    TRACES_NO_COM_OUTPUT |
  83.                    TRACES_NO_ASSERT_DIALOG))
  84.     {
  85.         gTracesFlags = dwFlags;
  86.         if (gTracesFlags & TRACES_CONSOLE)
  87.         {
  88.             AllocConsole();
  89.             hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
  90.             COORD coord;
  91.             coord.X = 80;
  92.             coord.Y = 300;
  93.             SetConsoleScreenBufferSize( hConsole, coord );
  94.         }
  95.     }
  96. }
  97.  
  98. void WINAPI UnInitTraces ()
  99. {
  100.     if (gTracesFlags & TRACES_CONSOLE)
  101.     {
  102.         FreeConsole();
  103.     }
  104.     if (!hLogFile)
  105.     {
  106.         CloseHandle (hLogFile);
  107.     }
  108. }
  109.  
  110. inline void WINAPI OpenOutputHandles ()
  111. {
  112.     if (!hCom && !(gTracesFlags & TRACES_NO_COM_OUTPUT))
  113.     {   
  114.         hCom = CreateFile (COM_PORT_STRING,
  115.                            GENERIC_WRITE | GENERIC_READ,
  116.                            0,
  117.                            NULL,
  118.                            OPEN_EXISTING,
  119.                            0,
  120.                            NULL); 
  121.         if (INVALID_HANDLE_VALUE == hCom)
  122.         {
  123.             hCom = NULL;
  124.         }
  125.         else
  126.         {
  127.             DCB dcb;
  128.             GetCommState (hCom, &dcb);
  129.             dcb.BaudRate    = COM_BAUD_RATE;
  130.             dcb.ByteSize    = COM_DATA_BYTE_SIZE;
  131.             dcb.Parity      = COM_PARITY;
  132.             dcb.StopBits    = COM_STOP_BIT;
  133.             SetCommState (hCom, &dcb);
  134.             if (!fComInit)
  135.             {
  136.                 DWORD dwBytes;
  137.                 for (int i=0; i<55; i++)
  138.                 {
  139.                     WriteFile (hCom, "\r\n", 2, &dwBytes, NULL);
  140.                 }
  141.                 fComInit = TRUE;
  142.             }
  143.         }
  144.     }
  145.  
  146.     if (!hLogFile && (gTracesFlags & TRACES_LOG_FILE))
  147.     {    
  148.         hLogFile = CreateFile (LOG_FILE_NAME,
  149.                                GENERIC_WRITE,
  150.                                FILE_SHARE_READ | FILE_SHARE_WRITE,
  151.                                NULL,
  152.                                OPEN_ALWAYS,
  153.                                0,
  154.                                NULL);
  155.         if (INVALID_HANDLE_VALUE == hLogFile)
  156.         {
  157.             hLogFile = NULL;
  158.         }
  159.         if (!fFileInit)
  160.         {
  161.             DWORD dwFileSize = GetFileSize (hLogFile, NULL);
  162.             SetFilePointer (hLogFile, dwFileSize, NULL, FILE_BEGIN);
  163.  
  164.             char szTmpStr[64];
  165.             DWORD dwBytes, nChars = wsprintf (szTmpStr, 
  166.             "======================================================\r\n");
  167.             WriteFile (hLogFile, szTmpStr, nChars, &dwBytes, NULL);
  168.             SYSTEMTIME st;
  169.             GetSystemTime (&st);
  170.             nChars = wsprintf (szTmpStr, "Log Date: %d/%d/%d - %d:%d\r\n",
  171.             st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute);
  172.             WriteFile (hLogFile, szTmpStr, nChars, &dwBytes, NULL);
  173.             nChars = wsprintf (szTmpStr, 
  174.             "======================================================\r\n");
  175.             WriteFile (hLogFile, szTmpStr, nChars, &dwBytes, NULL);
  176.             fFileInit = TRUE;
  177.         }
  178.     }
  179. }
  180.  
  181. inline void WINAPI CloseOutputHandles ()
  182. {
  183.     if (gTracesFlags & TRACES_NO_COM_OUTPUT)
  184.     {
  185.         return;
  186.     }
  187.     CloseHandle (hCom);
  188.     hCom = NULL;
  189. }
  190.  
  191. inline void WINAPI WriteOutputString (LPSTR pStr, DWORD dwSize)
  192. {
  193.     DWORD dwBytes;
  194.     OpenOutputHandles ();
  195.     if (hCom && !(gTracesFlags & TRACES_NO_COM_OUTPUT))
  196.     {
  197.         WriteFile (hCom, pStr, dwSize, &dwBytes, NULL);
  198.     }
  199.  
  200.     if (hLogFile && (gTracesFlags & TRACES_LOG_FILE))
  201.     {
  202.         WriteFile (hLogFile, pStr, dwSize, &dwBytes, NULL);
  203.     }
  204.  
  205.     if (hConsole && (gTracesFlags & TRACES_CONSOLE))
  206.     {
  207.         WriteFile (hConsole, pStr, dwSize, &dwBytes, NULL);
  208.     }
  209.  
  210.     OutputDebugString (pStr);
  211.  
  212.     CloseOutputHandles();
  213. }
  214.  
  215. void WINAPI TraceFn1 (LPSTR pString)
  216. {
  217.     char string[512];
  218.     DWORD dwSize = wsprintf (string, "%s\r\n", pString);
  219.     WriteOutputString (string, dwSize);
  220. }
  221.  
  222.  
  223. void WINAPI TraceFn2 (LPSTR pString, ULONG ulError)
  224. {
  225.     TCHAR   string[512];
  226.     LPTSTR  szErr;
  227.  
  228.     switch(ulError)
  229.     {        
  230.         case E_FAIL                             : szErr = "E_FAIL";                         break;
  231.         case E_INVALIDARG                       : szErr = "E_INVALIDARG";                   break;
  232.         case E_NOINTERFACE                      : szErr = "E_NOINTERFACE";                  break;
  233.         case E_OUTOFMEMORY                      : szErr = "E_OUTOFMEMORY";                  break;
  234.         case E_ACCESSDENIED                     : szErr = "E_ACCESSDENIED";                 break;
  235.  
  236. #ifndef TRACES_NO_MAPI
  237.         case MAPI_E_NO_SUPPORT                  : szErr = "MAPI_E_NO_SUPPORT";              break;
  238.         case MAPI_E_BAD_CHARWIDTH               : szErr = "MAPI_E_BAD_CHARWIDTH";           break;
  239.         case MAPI_E_STRING_TOO_LONG             : szErr = "MAPI_E_STRING_TOO_LONG";         break;
  240.         case MAPI_E_UNKNOWN_FLAGS               : szErr = "MAPI_E_UNKNOWN_FLAGS";           break;
  241.         case MAPI_E_INVALID_ENTRYID             : szErr = "MAPI_E_INVALID_ENTRYID";         break;
  242.         case MAPI_E_INVALID_OBJECT              : szErr = "MAPI_E_INVALID_OBJECT";          break;
  243.         case MAPI_E_OBJECT_CHANGED              : szErr = "MAPI_E_OBJECT_CHANGED";          break;
  244.         case MAPI_E_OBJECT_DELETED              : szErr = "MAPI_E_OBJECT_DELETED";          break;
  245.         case MAPI_E_BUSY                        : szErr = "MAPI_E_BUSY";                    break;
  246.         case MAPI_E_NOT_ENOUGH_DISK             : szErr = "MAPI_E_NOT_ENOUGH_DISK";         break;
  247.         case MAPI_E_NOT_ENOUGH_RESOURCES        : szErr = "MAPI_E_NOT_ENOUGH_RESOURCES";    break;
  248.         case MAPI_E_NOT_FOUND                   : szErr = "MAPI_E_NOT_FOUND";               break;
  249.         case MAPI_E_VERSION                     : szErr = "MAPI_E_VERSION";                 break;
  250.         case MAPI_E_LOGON_FAILED                : szErr = "MAPI_E_LOGON_FAILED";            break;
  251.         case MAPI_E_SESSION_LIMIT               : szErr = "MAPI_E_SESSION_LIMIT";           break;
  252.         case MAPI_E_USER_CANCEL                 : szErr = "MAPI_E_USER_CANCEL";             break;
  253.         case MAPI_E_UNABLE_TO_ABORT             : szErr = "MAPI_E_UNABLE_TO_ABORT";         break;
  254.         case MAPI_E_NETWORK_ERROR               : szErr = "MAPI_E_NETWORK_ERROR";           break;
  255.         case MAPI_E_DISK_ERROR                  : szErr = "MAPI_E_DISK_ERROR";              break;
  256.         case MAPI_E_TOO_COMPLEX                 : szErr = "MAPI_E_TOO_COMPLEX";             break;
  257.         case MAPI_E_BAD_COLUMN                  : szErr = "MAPI_E_BAD_COLUMN";              break;
  258.         case MAPI_E_EXTENDED_ERROR              : szErr = "MAPI_E_EXTENDED_ERROR";          break;
  259.         case MAPI_E_COMPUTED                    : szErr = "MAPI_E_COMPUTED";                break;
  260.         case MAPI_E_CORRUPT_DATA                : szErr = "MAPI_E_CORRUPT_DATA";            break;
  261.         case MAPI_E_UNCONFIGURED                : szErr = "MAPI_E_UNCONFIGURED";            break;
  262.         case MAPI_E_FAILONEPROVIDER             : szErr = "MAPI_E_FAILONEPROVIDER";         break;
  263.         case MAPI_E_END_OF_SESSION              : szErr = "MAPI_E_END_OF_SESSION";          break;
  264.         case MAPI_E_UNKNOWN_ENTRYID             : szErr = "MAPI_E_UNKNOWN_ENTRYID";         break;
  265.         case MAPI_E_MISSING_REQUIRED_COLUMN     : szErr = "MAPI_E_MISSING_REQUIRED_COLUMN"; break;
  266.         case MAPI_W_NO_SERVICE                  : szErr = "MAPI_W_NO_SERVICE";              break;
  267.         case MAPI_E_BAD_VALUE                   : szErr = "MAPI_E_BAD_VALUE";               break;
  268.         case MAPI_E_INVALID_TYPE                : szErr = "MAPI_E_INVALID_TYPE";            break;
  269.         case MAPI_E_TYPE_NO_SUPPORT             : szErr = "MAPI_E_TYPE_NO_SUPPORT";         break;
  270.         case MAPI_E_UNEXPECTED_TYPE             : szErr = "MAPI_E_UNEXPECTED_TYPE";         break;
  271.         case MAPI_E_TOO_BIG                     : szErr = "MAPI_E_TOO_BIG";                 break;
  272.         case MAPI_E_DECLINE_COPY                : szErr = "MAPI_E_DECLINE_COPY";            break;
  273.         case MAPI_E_UNEXPECTED_ID               : szErr = "MAPI_E_UNEXPECTED_ID";           break;
  274.         case MAPI_W_ERRORS_RETURNED             : szErr = "MAPI_W_ERRORS_RETURNED";         break;
  275.         case MAPI_E_UNABLE_TO_COMPLETE          : szErr = "MAPI_E_UNABLE_TO_COMPLETE";      break;
  276.         case MAPI_E_TIMEOUT                     : szErr = "MAPI_E_TIMEOUT";                 break;
  277.         case MAPI_E_TABLE_EMPTY                 : szErr = "MAPI_E_TABLE_EMPTY";             break;
  278.         case MAPI_E_TABLE_TOO_BIG               : szErr = "MAPI_E_TABLE_TOO_BIG";           break;
  279.         case MAPI_E_INVALID_BOOKMARK            : szErr = "MAPI_E_INVALID_BOOKMARK";        break;
  280.         case MAPI_W_POSITION_CHANGED            : szErr = "MAPI_W_POSITION_CHANGED";        break;
  281.         case MAPI_W_APPROX_COUNT                : szErr = "MAPI_W_APPROX_COUNT";            break;
  282.         case MAPI_E_WAIT                        : szErr = "MAPI_E_WAIT";                    break;
  283.         case MAPI_E_CANCEL                      : szErr = "MAPI_E_CANCEL";                  break;
  284.         case MAPI_E_NOT_ME                      : szErr = "MAPI_E_NOT_ME";                  break;
  285.         case MAPI_W_CANCEL_MESSAGE              : szErr = "MAPI_W_CANCEL_MESSAGE";          break;
  286.         case MAPI_E_CORRUPT_STORE               : szErr = "MAPI_E_CORRUPT_STORE";           break;
  287.         case MAPI_E_NOT_IN_QUEUE                : szErr = "MAPI_E_NOT_IN_QUEUE";            break;
  288.         case MAPI_E_NO_SUPPRESS                 : szErr = "MAPI_E_NO_SUPPRESS";             break;
  289.         case MAPI_E_COLLISION                   : szErr = "MAPI_E_COLLISION";               break;
  290.         case MAPI_E_NOT_INITIALIZED             : szErr = "MAPI_E_NOT_INITIALIZED";         break;
  291.         case MAPI_E_NON_STANDARD                : szErr = "MAPI_E_NON_STANDARD";            break;
  292.         case MAPI_E_NO_RECIPIENTS               : szErr = "MAPI_E_NO_RECIPIENTS";           break;
  293.         case MAPI_E_SUBMITTED                   : szErr = "MAPI_E_SUBMITTED";               break;
  294.         case MAPI_E_HAS_FOLDERS                 : szErr = "MAPI_E_HAS_FOLDERS";             break;
  295.         case MAPI_E_HAS_MESSAGES                : szErr = "MAPI_E_HAS_MESSAGES";            break;
  296.         case MAPI_E_FOLDER_CYCLE                : szErr = "MAPI_E_FOLDER_CYCLE";            break;
  297.         case MAPI_W_PARTIAL_COMPLETION          : szErr = "MAPI_W_PARTIAL_COMPLETION";      break;
  298.         case MAPI_E_AMBIGUOUS_RECIP             : szErr = "MAPI_E_AMBIGUOUS_RECIP";         break;
  299.         
  300.         #ifndef MAPI_E_UNKNOWN_CPID
  301.         #define MAPI_E_UNKNOWN_CPID             MAKE_MAPI_E( 0x11E )
  302.         #define MAPI_E_UNKNOWN_LCID             MAKE_MAPI_E( 0x11F )
  303.         #endif
  304.         case MAPI_E_UNKNOWN_CPID                : szErr = "MAPI_E_UNKNOWN_CPID";            break;
  305.         case MAPI_E_UNKNOWN_LCID                : szErr = "MAPI_E_UNKNOWN_LCID";            break;
  306. #endif // TRACES_NO_MAPI
  307.  
  308.         case STG_E_INVALIDFUNCTION              : szErr = "STG_E_INVALIDFUNCTION";          break;
  309.         case STG_E_FILENOTFOUND                 : szErr = "STG_E_FILENOTFOUND";             break;
  310.         case STG_E_PATHNOTFOUND                 : szErr = "STG_E_PATHNOTFOUND";             break;
  311.         case STG_E_TOOMANYOPENFILES             : szErr = "STG_E_TOOMANYOPENFILES";         break;
  312.         case STG_E_ACCESSDENIED                 : szErr = "STG_E_ACCESSDENIED";             break;
  313.         case STG_E_INVALIDHANDLE                : szErr = "STG_E_INVALIDHANDLE";            break;
  314.         case STG_E_INSUFFICIENTMEMORY           : szErr = "STG_E_INSUFFICIENTMEMORY";       break;
  315.         case STG_E_INVALIDPOINTER               : szErr = "STG_E_INVALIDPOINTER";           break;
  316.         case STG_E_NOMOREFILES                  : szErr = "STG_E_NOMOREFILES";              break;
  317.         case STG_E_DISKISWRITEPROTECTED         : szErr = "STG_E_DISKISWRITEPROTECTED";     break;
  318.         case STG_E_SEEKERROR                    : szErr = "STG_E_SEEKERROR";                break;
  319.         case STG_E_WRITEFAULT                   : szErr = "STG_E_WRITEFAULT";               break;
  320.         case STG_E_READFAULT                    : szErr = "STG_E_READFAULT";                break;
  321.         case STG_E_SHAREVIOLATION               : szErr = "STG_E_SHAREVIOLATION";           break;
  322.         case STG_E_LOCKVIOLATION                : szErr = "STG_E_LOCKVIOLATION";            break;
  323.         case STG_E_FILEALREADYEXISTS            : szErr = "STG_E_FILEALREADYEXISTS";        break;
  324.         case STG_E_INVALIDPARAMETER             : szErr = "STG_E_INVALIDPARAMETER";         break;
  325.         case STG_E_MEDIUMFULL                   : szErr = "STG_E_MEDIUMFULL";               break;
  326.         case STG_E_ABNORMALAPIEXIT              : szErr = "STG_E_ABNORMALAPIEXIT";          break;
  327.         case STG_E_INVALIDHEADER                : szErr = "STG_E_INVALIDHEADER";            break;
  328.         case STG_E_INVALIDNAME                  : szErr = "STG_E_INVALIDNAME";              break;
  329.         case STG_E_UNKNOWN                      : szErr = "STG_E_UNKNOWN";                  break;
  330.         case STG_E_UNIMPLEMENTEDFUNCTION        : szErr = "STG_E_UNIMPLEMENTEDFUNCTION";    break;
  331.         case STG_E_INVALIDFLAG                  : szErr = "STG_E_INVALIDFLAG";              break;
  332.         case STG_E_INUSE                        : szErr = "STG_E_INUSE";                    break;
  333.         case STG_E_NOTCURRENT                   : szErr = "STG_E_NOTCURRENT";               break;
  334.         case STG_E_REVERTED                     : szErr = "STG_E_REVERTED";                 break;
  335.         case STG_E_CANTSAVE                     : szErr = "STG_E_CANTSAVE";                 break;
  336.         case STG_E_OLDFORMAT                    : szErr = "STG_E_OLDFORMAT";                break;
  337.         case STG_E_OLDDLL                       : szErr = "STG_E_OLDDLL";                   break;
  338.         case STG_E_SHAREREQUIRED                : szErr = "STG_E_SHAREREQUIRED";            break;
  339.         case STG_E_NOTFILEBASEDSTORAGE          : szErr = "STG_E_NOTFILEBASEDSTORAGE";      break;
  340.         case STG_S_CONVERTED                    : szErr = "STG_S_CONVERTED";                break;
  341.  
  342.  
  343.         case HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) :         szErr = "WIN32 - ERROR_FILE_NOT_FOUND";         break;
  344.         case HRESULT_FROM_WIN32(ERROR_INVALID_DRIVE) :          szErr = "WIN32 - ERROR_INVALID_DRIVE";          break;
  345.         case HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE) :         szErr = "WIN32 - ERROR_INVALID_HANDLE";         break;
  346.         case HRESULT_FROM_WIN32(ERROR_SEEK) :                   szErr = "WIN32 - ERROR_SEEK";                   break;
  347.         case HRESULT_FROM_WIN32(ERROR_SECTOR_NOT_FOUND) :       szErr = "WIN32 - ERROR_SECTOR_NOT_FOUND";       break;
  348.         case HRESULT_FROM_WIN32(ERROR_WRITE_FAULT) :            szErr = "WIN32 - ERROR_WRITE_FAULT";            break;
  349.         case HRESULT_FROM_WIN32(ERROR_READ_FAULT) :             szErr = "WIN32 - ERROR_READ_FAULT";             break;
  350.         case HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION) :      szErr = "WIN32 - ERROR_SHARING_VIOLATION";      break;
  351.         case HRESULT_FROM_WIN32(ERROR_LOCK_VIOLATION) :         szErr = "WIN32 - ERROR_LOCK_VIOLATION";         break;
  352.         case HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) :          szErr = "WIN32 - ERROR_NOT_SUPPORTED";          break;
  353.         case HRESULT_FROM_WIN32(ERROR_NO_SUCH_USER) :           szErr = "WIN32 - ERROR_NO_SUCH_USER";           break;
  354.         case HRESULT_FROM_WIN32(ERROR_NO_SUCH_GROUP) :          szErr = "WIN32 - ERROR_NO_SUCH_GROUP";          break;
  355.         case HRESULT_FROM_WIN32(ERROR_WRONG_PASSWORD) :         szErr = "WIN32 - ERROR_WRONG_PASSWORD";         break;
  356.         case HRESULT_FROM_WIN32(ERROR_INVALID_PASSWORD) :       szErr = "WIN32 - ERROR_INVALID_PASSWORD";       break;
  357.         case HRESULT_FROM_WIN32(ERROR_INVALID_FLAGS) :          szErr = "WIN32 - ERROR_INVALID_FLAGS";          break;
  358.         case HRESULT_FROM_WIN32(ERROR_BAD_USERNAME) :           szErr = "WIN32 - ERROR_BAD_USERNAME";           break;
  359.         case HRESULT_FROM_WIN32(ERROR_BROKEN_PIPE) :            szErr = "WIN32 - ERROR_BROKEN_PIPE";            break;
  360.         case HRESULT_FROM_WIN32(ERROR_PIPE_BUSY) :              szErr = "WIN32 - ERROR_PIPE_BUSY";              break;
  361.         case HRESULT_FROM_WIN32(ERROR_PIPE_NOT_CONNECTED):      szErr = "WIN32 - ERROR_PIPE_NOT_CONNECTED";     break;
  362.         case HRESULT_FROM_WIN32(ERROR_PIPE_CONNECTED):          szErr = "WIN32 - ERROR_PIPE_CONNECTED";         break;
  363.         case HRESULT_FROM_WIN32(ERROR_STATIC_INIT) :            szErr = "WIN32 - ERROR_STATIC_INIT";            break;
  364.         case HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION) :       szErr = "WIN32 - ERROR_INVALID_FUNCTION";       break;
  365.         case HRESULT_FROM_WIN32(ERROR_EXCEPTION_IN_SERVICE):    szErr = "WIN32 - ERROR_EXCEPTION_IN_SERVICE";   break;
  366.         case HRESULT_FROM_WIN32(ERROR_CANCELLED):               szErr = "WIN32 - ERROR_CANCELLED";              break;
  367.         case HRESULT_FROM_WIN32(ERROR_PARTIAL_COPY):            szErr = "WIN32 - ERROR_PARTIAL_COPY";           break;
  368.         case HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER):     szErr = "WIN32 - ERROR_INSUFFICIENT_BUFFER";    break;
  369.         case HRESULT_FROM_WIN32(ERROR_NO_UNICODE_TRANSLATION):  szErr = "WIN32 - ERROR_NO_UNICODE_TRANSLATION"; break;
  370.         case HRESULT_FROM_WIN32(ERROR_INVALID_ACCOUNT_NAME):    szErr = "WIN32 - ERROR_INVALID_ACCOUNT_NAME";   break;
  371.         case HRESULT_FROM_WIN32(ERROR_PRIVILEGE_NOT_HELD):      szErr = "WIN32 - ERROR_INVALID_ACCOUNT_NAME";   break;
  372.         case HRESULT_FROM_WIN32(ERROR_BAD_NET_NAME):            szErr = "WIN32 - ERROR_BAD_NET_NAME";           break;
  373.         case HRESULT_FROM_WIN32(ERROR_SERVICE_NO_THREAD):       szErr = "WIN32 - ERROR_SERVICE_NO_THREAD";      break;
  374.         case HRESULT_FROM_WIN32(ERROR_SHUTDOWN_IN_PROGRESS):    szErr = "WIN32 - ERROR_SHUTDOWN_IN_PROGRESS";   break;
  375.         case HRESULT_FROM_WIN32(ERROR_CONNECTION_INVALID):      szErr = "WIN32 - ERROR_CONNECTION_INVALID";     break;
  376.         case HRESULT_FROM_WIN32(ERROR_HANDLE_EOF):              szErr = "WIN32 - ERROR_HANDLE_EOF";             break;
  377.         case HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS):          szErr = "WIN32 - ERROR_ALREADY_EXISTS";         break;
  378.         case HRESULT_FROM_WIN32(ERROR_HOST_UNREACHABLE):        szErr = "WIN32 - ERROR_HOST_UNREACHABLE";       break;
  379.         case HRESULT_FROM_WIN32(ERROR_FILE_EXISTS):             szErr = "WIN32 - ERROR_FILE_EXISTS";            break;
  380.         case HRESULT_FROM_WIN32(ERROR_IO_PENDING):              szErr = "WIN32 - ERROR_IO_PENDING";             break;
  381.         case HRESULT_FROM_WIN32(ERROR_ILL_FORMED_PASSWORD):     szErr = "WIN32 - ERROR_ILL_FORMED_PASSWORD";    break;
  382.         case HRESULT_FROM_WIN32(ERROR_PASSWORD_RESTRICTION):    szErr = "WIN32 - ERROR_PASSWORD_RESTRICTION";   break;
  383.         case HRESULT_FROM_WIN32(ERROR_LOGON_FAILURE):           szErr = "WIN32 - ERROR_LOGON_FAILURE";          break;
  384.         case HRESULT_FROM_WIN32(ERROR_ACCOUNT_RESTRICTION):     szErr = "WIN32 - ERROR_ACCOUNT_RESTRICTION";    break;
  385.         case HRESULT_FROM_WIN32(ERROR_INVALID_LOGON_HOURS):     szErr = "WIN32 - ERROR_INVALID_LOGON_HOURS";    break;
  386.         case HRESULT_FROM_WIN32(ERROR_INVALID_WORKSTATION):     szErr = "WIN32 - ERROR_INVALID_WORKSTATION";    break;
  387.         case HRESULT_FROM_WIN32(ERROR_PASSWORD_EXPIRED):        szErr = "WIN32 - ERROR_PASSWORD_EXPIRED";       break;
  388.         case HRESULT_FROM_WIN32(ERROR_ACCOUNT_DISABLED):        szErr = "WIN32 - ERROR_ACCOUNT_DISABLED";       break;
  389.         case HRESULT_FROM_WIN32(ERROR_NONE_MAPPED):             szErr = "WIN32 - ERROR_NONE_MAPPED";            break;
  390.         case HRESULT_FROM_WIN32(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) : szErr = "WIN32 - ERROR_FAILED_SERVICE_CONTROLLER_CONNECT"; break;
  391.  
  392.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_CALL_FAILED):              szErr = "RPC Error - RPC_S_CALL_FAILED";            break;
  393.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_CALL_FAILED_DNE):          szErr = "RPC Error - RPC_S_CALL_FAILED_DNE";        break;
  394.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_PROTOCOL_ERROR):           szErr = "RPC Error - RPC_S_PROTOCOL_ERROR";         break;
  395.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_UNSUPPORTED_TRANS_SYN):    szErr = "RPC Error - RPC_S_UNSUPPORTED_TRANS_SYN";  break;
  396.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_UNSUPPORTED_TYPE):         szErr = "RPC Error - RPC_S_UNSUPPORTED_TYPE";       break;
  397.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_TAG):              szErr = "RPC Error - RPC_S_INVALID_TAG";            break;
  398.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_BOUND):            szErr = "RPC Error - RPC_S_INVALID_BOUND";          break;
  399.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_NO_ENTRY_NAME):            szErr = "RPC Error - RPC_S_NO_ENTRY_NAME";          break;
  400.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_NAME_SYNTAX):      szErr = "RPC Error - RPC_S_INVALID_NAME_SYNTAX";    break;
  401.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_UNSUPPORTED_NAME_SYNTAX):  szErr = "RPC Error - RPC_S_UNSUPPORTED_NAME_SYNTAX";break;
  402.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_DUPLICATE_ENDPOINT):       szErr = "RPC Error - RPC_S_DUPLICATE_ENDPOINT";     break;
  403.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_STRING_BINDING):   szErr = "RPC Error - RPC_S_INVALID_STRING_BINDING"; break;
  404.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_WRONG_KIND_OF_BINDING):    szErr = "RPC Error - RPC_S_WRONG_KIND_OF_BINDING";  break;
  405.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_BINDING):          szErr = "RPC Error - RPC_S_INVALID_BINDING";        break;
  406.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_PROTSEQ_NOT_SUPPORTED):    szErr = "RPC Error - RPC_S_PROTSEQ_NOT_SUPPORTED";  break;
  407.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_RPC_PROTSEQ):      szErr = "RPC Error - RPC_S_INVALID_RPC_PROTSEQ";    break;
  408.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_STRING_UUID):      szErr = "RPC Error - RPC_S_INVALID_STRING_UUID";    break;
  409.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_ENDPOINT_FORMAT):  szErr = "RPC Error - RPC_S_INVALID_ENDPOINT_FORMAT";break;
  410.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_NET_ADDR):         szErr = "RPC Error - RPC_S_NO_ENDPOINT_FOUND";      break;
  411.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_NO_ENDPOINT_FOUND):        szErr = "RPC Error - RPC_S_DUPLICATE_ENDPOINT";     break;
  412.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_INVALID_TIMEOUT):          szErr = "RPC Error - RPC_S_INVALID_TIMEOUT";        break;
  413.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_OBJECT_NOT_FOUND):         szErr = "RPC Error - RPC_S_OBJECT_NOT_FOUND";       break;
  414.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_ALREADY_REGISTERED):       szErr = "RPC Error - RPC_S_ALREADY_REGISTERED";     break;
  415.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_TYPE_ALREADY_REGISTERED):  szErr = "RPC Error - RPC_S_TYPE_ALREADY_REGISTERED";break;
  416.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_ALREADY_LISTENING):        szErr = "RPC Error - RPC_S_ALREADY_LISTENING";      break;
  417.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_NO_PROTSEQS_REGISTERED):   szErr = "RPC Error - RPC_S_NO_PROTSEQS_REGISTERED"; break;
  418.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_NOT_LISTENING):            szErr = "RPC Error - RPC_S_NOT_LISTENING";          break;
  419.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_UNKNOWN_MGR_TYPE):         szErr = "RPC Error - RPC_S_UNKNOWN_MGR_TYPE";       break;
  420.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_UNKNOWN_IF):               szErr = "RPC Error - RPC_S_UNKNOWN_IF";             break;
  421.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_NO_BINDINGS):              szErr = "RPC Error - RPC_S_NO_BINDINGS";            break;
  422.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_NO_PROTSEQS):              szErr = "RPC Error - RPC_S_NO_PROTSEQS";            break;
  423.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_CANT_CREATE_ENDPOINT):     szErr = "RPC Error - RPC_S_CANT_CREATE_ENDPOINT";   break;
  424.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_OUT_OF_RESOURCES):         szErr = "RPC Error - RPC_S_OUT_OF_RESOURCES";       break;
  425.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_SERVER_UNAVAILABLE):       szErr = "RPC Error - RPC_S_SERVER_UNAVAILABLE";     break;
  426.         case MAKE_HRESULT(1, FACILITY_RPC, RPC_S_SERVER_TOO_BUSY):          szErr = "RPC Error - RPC_S_SERVER_TOO_BUSY";        break;
  427.  
  428.         default : szErr = "UNKNOWN"; break;
  429.     }   
  430.  
  431.     DWORD dwSize = wsprintf (string, "Error in %s, %s (%#08x)\r\n", pString, szErr, ulError);
  432.     WriteOutputString(string, dwSize);
  433. }
  434.  
  435. void WINAPI TraceFn3 (LPSTR pString)
  436. {
  437.     WriteOutputString (pString, lstrlen(pString));
  438. }
  439.  
  440. void __cdecl TraceFn4 (BOOL fDebuggerOnly, LPSTR pszFormat, ...)
  441. {
  442.     char string[512];
  443.     va_list vl;
  444.     va_start(vl, pszFormat);
  445.     DWORD dwSize = wvsprintf (string, pszFormat, vl);
  446.     va_end(vl);
  447.     strcat(string, "\r\n");
  448.     if (fDebuggerOnly)
  449.     {
  450.         OutputDebugString (string);
  451.     }
  452.     else
  453.     {
  454.         dwSize += 2;
  455.         WriteOutputString (string, dwSize);
  456.     }
  457. }
  458.  
  459. void WINAPI TraceIO (ULONG hResult)
  460. {
  461.     if (!(hResult<0))
  462.     {
  463.         return;
  464.     }
  465.     char string[34];
  466.     DWORD dwSize = wsprintf (string,"I/O Function Failed: %#08x\r\n", hResult);
  467.     WriteOutputString (string, dwSize);
  468. }
  469.  
  470. void WINAPI TraceIO2 (LPSTR pszMsg, ULONG hResult)
  471. {
  472.     if (!(hResult<0))
  473.     {
  474.         return;
  475.     }
  476.     WriteOutputString (pszMsg, lstrlen(pszMsg));
  477.     char string[48];
  478.     DWORD dwSize = wsprintf (string,": I/O Function Failed: %#08x\r\n", hResult);
  479.     WriteOutputString (string, dwSize);
  480. }
  481.  
  482. void WINAPI AssertNow (LPSTR pszAssertMsg)
  483. {
  484.     HWND hWnd = GetActiveWindow();
  485.     int nResponse = MessageBox (hWnd, 
  486.                                 pszAssertMsg,
  487.                                 "WARNING",
  488.                                 MB_YESNO | MB_ICONSTOP | 
  489.                                 MB_TASKMODAL | MB_SETFOREGROUND);
  490.     if (IDYES == nResponse)
  491.     {
  492.         DebugBreak();
  493.     }
  494. }
  495.  
  496. void WINAPI AssertStatement (LPSTR pszFile, ULONG ulLine)
  497. {
  498.     if (gTracesFlags & TRACES_NO_ASSERTS)
  499.     {
  500.         return;
  501.     }
  502.     char szStr[1024];
  503.     wsprintf (szStr, "Assertion failed in File: %s, Line: %d", pszFile, ulLine);
  504.     TraceMessage (szStr);
  505.     if (gTracesFlags & TRACES_NO_ASSERT_DIALOG)
  506.     {
  507.         return;
  508.     }
  509.     wsprintf (szStr, "%s - Break into the debugger?", szStr);
  510.     AssertNow (szStr);
  511. }
  512.  
  513. void WINAPI AssertStatementWithMsg (LPSTR pszMsg, LPSTR pszFile, ULONG ulLine)
  514. {
  515.     if (gTracesFlags & TRACES_NO_ASSERTS)
  516.     {
  517.         return;
  518.     }
  519.     char szStr[2048];
  520.     wsprintf (szStr, "%s\r\nAssertion in File: %s, Line: %d", pszMsg, pszFile, ulLine);
  521.     TraceMessage (szStr);
  522.     if (gTracesFlags & TRACES_NO_ASSERT_DIALOG)
  523.     {
  524.         return;
  525.     }
  526.     wsprintf (szStr, "%s\r\nAssertion in File: %s, Line: %d\r\nBreak into the debugger?", pszMsg, pszFile, ulLine);
  527.     AssertNow (szStr);
  528. }
  529.  
  530.  
  531. #ifndef TRACES_NO_MAPI
  532.  
  533. void WINAPI TraceProp (ULONG ulPropTag)
  534. {
  535.     char * pszTag;
  536.     char message [128];
  537.     char szUnkType[32];
  538.     char szUnkTag[32];
  539.     DWORD dwSize;
  540.     switch (PROP_ID(ulPropTag))
  541.     {
  542.         // Message envelope properties
  543.         case PROP_ID(PR_ACKNOWLEDGEMENT_MODE) :                     pszTag = "PR_ACKNOWLEDGEMENT_MODE";                         break;
  544.         case PROP_ID(PR_ALTERNATE_RECIPIENT_ALLOWED) :              pszTag = "PR_ALTERNATE_RECIPIENT_ALLOWED";                  break;
  545.         case PROP_ID(PR_AUTHORIZING_USERS) :                        pszTag = "PR_AUTHORIZING_USERS";                            break;
  546.         case PROP_ID(PR_AUTO_FORWARD_COMMENT) :                     pszTag = "PR_AUTO_FORWARD_COMMENT";                         break;
  547.         case PROP_ID(PR_AUTO_FORWARDED) :                           pszTag = "PR_AUTO_FORWARDED";                               break;
  548.         case PROP_ID(PR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID) :     pszTag = "PR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID";         break;
  549.         case PROP_ID(PR_CONTENT_CORRELATOR) :                       pszTag = "PR_CONTENT_CORRELATOR";                           break;
  550.         case PROP_ID(PR_CONTENT_IDENTIFIER) :                       pszTag = "PR_CONTENT_IDENTIFIER";                           break;
  551.         case PROP_ID(PR_CONTENT_LENGTH) :                           pszTag = "PR_CONTENT_LENGTH";                               break;
  552.         case PROP_ID(PR_CONTENT_RETURN_REQUESTED) :                 pszTag = "PR_CONTENT_RETURN_REQUESTED";                     break;
  553.         case PROP_ID(PR_CONVERSATION_KEY) :                         pszTag = "PR_CONVERSATION_KEY";                             break;
  554.         case PROP_ID(PR_CONVERSION_EITS) :                          pszTag = "PR_CONVERSION_EITS";                              break;
  555.         case PROP_ID(PR_CONVERSION_WITH_LOSS_PROHIBITED) :          pszTag = "PR_CONVERSION_WITH_LOSS_PROHIBITED";              break;
  556.         case PROP_ID(PR_CONVERTED_EITS) :                           pszTag = "PR_CONVERTED_EITS";                               break;
  557.         case PROP_ID(PR_DEFERRED_DELIVERY_TIME) :                   pszTag = "PR_DEFERRED_DELIVERY_TIME";                       break;
  558.         case PROP_ID(PR_DELIVER_TIME) :                             pszTag = "PR_DELIVER_TIME";                                 break;
  559.         case PROP_ID(PR_DISCARD_REASON) :                           pszTag = "PR_DISCARD_REASON";                               break;
  560.         case PROP_ID(PR_DISCLOSURE_OF_RECIPIENTS) :                 pszTag = "PR_DISCLOSURE_OF_RECIPIENTS";                     break;
  561.         case PROP_ID(PR_DL_EXPANSION_HISTORY) :                     pszTag = "PR_DL_EXPANSION_HISTORY";                         break;
  562.         case PROP_ID(PR_DL_EXPANSION_PROHIBITED) :                  pszTag = "PR_DL_EXPANSION_PROHIBITED";                      break;
  563.         case PROP_ID(PR_EXPIRY_TIME) :                              pszTag = "PR_EXPIRY_TIME";                                  break;
  564.         case PROP_ID(PR_IMPLICIT_CONVERSION_PROHIBITED) :           pszTag = "PR_IMPLICIT_CONVERSION_PROHIBITED";               break;
  565.         case PROP_ID(PR_IMPORTANCE) :                               pszTag = "PR_IMPORTANCE";                                   break;
  566.         case PROP_ID(PR_IPM_ID) :                                   pszTag = "PR_IPM_ID";                                       break;
  567.         case PROP_ID(PR_LATEST_DELIVERY_TIME) :                     pszTag = "PR_LATEST_DELIVERY_TIME";                         break;
  568.         case PROP_ID(PR_MESSAGE_CLASS) :                            pszTag = "PR_MESSAGE_CLASS";                                break;
  569.         case PROP_ID(PR_MESSAGE_DELIVERY_ID) :                      pszTag = "PR_MESSAGE_DELIVERY_ID";                          break;   
  570.         case PROP_ID(PR_MESSAGE_SECURITY_LABEL) :                   pszTag = "PR_MESSAGE_SECURITY_LABEL";                       break;   
  571.         case PROP_ID(PR_OBSOLETED_IPMS) :                           pszTag = "PR_OBSOLETED_IPMS";                               break;   
  572.         case PROP_ID(PR_ORIGINALLY_INTENDED_RECIPIENT_NAME) :       pszTag = "PR_ORIGINALLY_INTENDED_RECIPIENT_NAME";           break;   
  573.         case PROP_ID(PR_ORIGINAL_EITS) :                            pszTag = "PR_ORIGINAL_EITS";                                break;   
  574.         case PROP_ID(PR_ORIGINATOR_CERTIFICATE) :                   pszTag = "PR_ORIGINATOR_CERTIFICATE";                       break;   
  575.         case PROP_ID(PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED) :     pszTag = "PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED";         break;   
  576.         case PROP_ID(PR_ORIGINATOR_RETURN_ADDRESS) :                pszTag = "PR_ORIGINATOR_RETURN_ADDRESS";                    break;   
  577.         case PROP_ID(PR_PARENT_KEY) :                               pszTag = "PR_PARENT_KEY";                                   break;   
  578.         case PROP_ID(PR_PRIORITY) :                                 pszTag = "PR_PRIORITY";                                     break;   
  579.         case PROP_ID(PR_ORIGIN_CHECK) :                             pszTag = "PR_ORIGIN_CHECK";                                 break;   
  580.         case PROP_ID(PR_PROOF_OF_SUBMISSION_REQUESTED) :            pszTag = "PR_PROOF_OF_SUBMISSION_REQUESTED";                break;   
  581.         case PROP_ID(PR_READ_RECEIPT_REQUESTED) :                   pszTag = "PR_READ_RECEIPT_REQUESTED";                       break;   
  582.         case PROP_ID(PR_RECEIPT_TIME) :                             pszTag = "PR_RECEIPT_TIME";                                 break;   
  583.         case PROP_ID(PR_RECIPIENT_REASSIGNMENT_PROHIBITED) :        pszTag = "PR_RECIPIENT_REASSIGNMENT_PROHIBITED";            break;   
  584.         case PROP_ID(PR_REDIRECTION_HISTORY) :                      pszTag = "PR_REDIRECTION_HISTORY";                          break;   
  585.         case PROP_ID(PR_RELATED_IPMS) :                             pszTag = "PR_RELATED_IPMS";                                 break;   
  586.  
  587.         #ifndef PR_ORIGINAL_SENSITIVITY
  588.         #define PR_ORIGINAL_SENSITIVITY                             PROP_TAG( PT_LONG,      0x002E)
  589.         #endif
  590.         case PROP_ID(PR_ORIGINAL_SENSITIVITY) :                     pszTag = "PR_ORIGINAL_SENSITIVITY";                         break;
  591.  
  592.         case PROP_ID(PR_LANGUAGES) :                                pszTag = "PR_LANGUAGES";                                    break;   
  593.         case PROP_ID(PR_REPLY_TIME) :                               pszTag = "PR_REPLY_TIME";                                   break;   
  594.         case PROP_ID(PR_REPORT_TAG) :                               pszTag = "PR_REPORT_TAG";                                   break;   
  595.         case PROP_ID(PR_REPORT_TIME) :                              pszTag = "PR_REPORT_TIME";                                  break;   
  596.         case PROP_ID(PR_RETURNED_IPM) :                             pszTag = "PR_RETURNED_IPM";                                 break;   
  597.         case PROP_ID(PR_SECURITY) :                                 pszTag = "PR_SECURITY";                                     break;   
  598.         case PROP_ID(PR_INCOMPLETE_COPY) :                          pszTag = "PR_INCOMPLETE_COPY";                              break;       
  599.         case PROP_ID(PR_SENSITIVITY) :                              pszTag = "PR_SENSITIVITY";                                  break;   
  600.         case PROP_ID(PR_SUBJECT) :                                  pszTag = "PR_SUBJECT";                                      break;   
  601.         case PROP_ID(PR_SUBJECT_IPM) :                              pszTag = "PR_SUBJECT_IPM";                                  break;   
  602.         case PROP_ID(PR_CLIENT_SUBMIT_TIME) :                       pszTag = "PR_CLIENT_SUBMIT_TIME";                           break;   
  603.         case PROP_ID(PR_REPORT_NAME) :                              pszTag = "PR_REPORT_NAME";                                  break;   
  604.         case PROP_ID(PR_SENT_REPRESENTING_SEARCH_KEY) :             pszTag = "PR_SENT_REPRESENTING_SEARCH_KEY";                 break;   
  605.         case PROP_ID(PR_X400_CONTENT_TYPE) :                        pszTag = "PR_X400_CONTENT_TYPE";                            break;   
  606.         case PROP_ID(PR_NON_RECEIPT_REASON) :                       pszTag = "PR_NON_RECEIPT_REASON";                           break;   
  607.         case PROP_ID(PR_RECEIVED_BY_ENTRYID) :                      pszTag = "PR_RECEIVED_BY_ENTRYID";                          break;   
  608.         case PROP_ID(PR_RECEIVED_BY_NAME) :                         pszTag = "PR_RECEIVED_BY_NAME";                             break;   
  609.         case PROP_ID(PR_SENT_REPRESENTING_ENTRYID) :                pszTag = "PR_SENT_REPRESENTING_ENTRYID";                    break;   
  610.         case PROP_ID(PR_SENT_REPRESENTING_NAME) :                   pszTag = "PR_SENT_REPRESENTING_NAME";                       break;   
  611.         case PROP_ID(PR_RCVD_REPRESENTING_ENTRYID) :                pszTag = "PR_RCVD_REPRESENTING_ENTRYID";                    break;   
  612.         case PROP_ID(PR_RCVD_REPRESENTING_NAME) :                   pszTag = "PR_RCVD_REPRESENTING_NAME";                       break;   
  613.         case PROP_ID(PR_REPORT_ENTRYID) :                           pszTag = "PR_REPORT_ENTRYID";                               break;   
  614.         case PROP_ID(PR_READ_RECEIPT_ENTRYID) :                     pszTag = "PR_READ_RECEIPT_ENTRYID";                         break;   
  615.         case PROP_ID(PR_MESSAGE_SUBMISSION_ID) :                    pszTag = "PR_MESSAGE_SUBMISSION_ID";                        break;   
  616.         case PROP_ID(PR_PROVIDER_SUBMIT_TIME) :                     pszTag = "PR_PROVIDER_SUBMIT_TIME";                         break;   
  617.         case PROP_ID(PR_ORIGINAL_SUBJECT) :                         pszTag = "PR_ORIGINAL_SUBJECT";                             break;   
  618.         case PROP_ID(PR_DISC_VAL) :                                 pszTag = "PR_DISC_VAL";                                     break;   
  619.         case PROP_ID(PR_ORIG_MESSAGE_CLASS) :                       pszTag = "PR_ORIG_MESSAGE_CLASS";                           break;   
  620.         case PROP_ID(PR_ORIGINAL_AUTHOR_ENTRYID) :                  pszTag = "PR_ORIGINAL_AUTHOR_ENTRYID";                      break;   
  621.         case PROP_ID(PR_ORIGINAL_AUTHOR_NAME) :                     pszTag = "PR_ORIGINAL_AUTHOR_NAME";                         break;   
  622.         case PROP_ID(PR_ORIGINAL_SUBMIT_TIME) :                     pszTag = "PR_ORIGINAL_SUBMIT_TIME";                         break;   
  623.         case PROP_ID(PR_REPLY_RECIPIENT_ENTRIES) :                  pszTag = "PR_REPLY_RECIPIENT_ENTRIES";                      break;   
  624.         case PROP_ID(PR_REPLY_RECIPIENT_NAMES) :                    pszTag = "PR_REPLY_RECIPIENT_NAMES";                        break;   
  625.         case PROP_ID(PR_RECEIVED_BY_SEARCH_KEY) :                   pszTag = "PR_RECEIVED_BY_SEARCH_KEY";                       break;   
  626.         case PROP_ID(PR_RCVD_REPRESENTING_SEARCH_KEY) :             pszTag = "PR_RCVD_REPRESENTING_SEARCH_KEY";                 break;   
  627.         case PROP_ID(PR_READ_RECEIPT_SEARCH_KEY) :                  pszTag = "PR_READ_RECEIPT_SEARCH_KEY";                      break;   
  628.         case PROP_ID(PR_REPORT_SEARCH_KEY) :                        pszTag = "PR_REPORT_SEARCH_KEY";                            break;   
  629.         case PROP_ID(PR_ORIGINAL_DELIVERY_TIME) :                   pszTag = "PR_ORIGINAL_DELIVERY_TIME";                       break;   
  630.         case PROP_ID(PR_ORIGINAL_AUTHOR_SEARCH_KEY) :               pszTag = "PR_ORIGINAL_AUTHOR_SEARCH_KEY";                   break;   
  631.         case PROP_ID(PR_MESSAGE_TO_ME) :                            pszTag = "PR_MESSAGE_TO_ME";                                break;   
  632.         case PROP_ID(PR_MESSAGE_CC_ME) :                            pszTag = "PR_MESSAGE_CC_ME";                                break;   
  633.         case PROP_ID(PR_MESSAGE_RECIP_ME) :                         pszTag = "PR_MESSAGE_RECIP_ME";                             break;   
  634.         case PROP_ID(PR_ORIGINAL_SENDER_NAME) :                     pszTag = "PR_ORIGINAL_SENDER_NAME";                         break;   
  635.         case PROP_ID(PR_ORIGINAL_SENDER_ENTRYID) :                  pszTag = "PR_ORIGINAL_SENDER_ENTRYID";                      break;   
  636.         case PROP_ID(PR_ORIGINAL_SENDER_SEARCH_KEY) :               pszTag = "PR_ORIGINAL_SENDER_SEARCH_KEY";                   break;   
  637.         case PROP_ID(PR_ORIGINAL_SENT_REPRESENTING_NAME) :          pszTag = "PR_ORIGINAL_SENT_REPRESENTING_NAME";              break;   
  638.         case PROP_ID(PR_ORIGINAL_SENT_REPRESENTING_ENTRYID) :       pszTag = "PR_ORIGINAL_SENT_REPRESENTING_ENTRYID";           break;   
  639.         case PROP_ID(PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY) :    pszTag = "PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY";        break;   
  640.         case PROP_ID(PR_START_DATE) :                               pszTag = "PR_START_DATE";                                   break;   
  641.         case PROP_ID(PR_END_DATE) :                                 pszTag = "PR_END_DATE";                                     break;   
  642.         case PROP_ID(PR_OWNER_APPT_ID) :                            pszTag = "PR_OWNER_APPT_ID";                                break;   
  643.         case PROP_ID(PR_RESPONSE_REQUESTED) :                       pszTag = "PR_RESPONSE_REQUESTED";                           break;   
  644.         case PROP_ID(PR_SENT_REPRESENTING_ADDRTYPE) :               pszTag = "PR_SENT_REPRESENTING_ADDRTYPE";                   break;   
  645.         case PROP_ID(PR_SENT_REPRESENTING_EMAIL_ADDRESS) :          pszTag = "PR_SENT_REPRESENTING_EMAIL_ADDRESS";              break;   
  646.         case PROP_ID(PR_ORIGINAL_SENDER_ADDRTYPE) :                 pszTag = "PR_ORIGINAL_SENDER_ADDRTYPE";                     break;   
  647.         case PROP_ID(PR_ORIGINAL_SENDER_EMAIL_ADDRESS) :            pszTag = "PR_ORIGINAL_SENDER_EMAIL_ADDRESS";                break;   
  648.         case PROP_ID(PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE) :      pszTag = "PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE";          break;   
  649.         case PROP_ID(PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS) : pszTag = "PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS";     break; 
  650.         case PROP_ID(PR_CONVERSATION_TOPIC) :                       pszTag = "PR_CONVERSATION_TOPIC";                           break;   
  651.         case PROP_ID(PR_CONVERSATION_INDEX) :                       pszTag = "PR_CONVERSATION_INDEX";                           break;   
  652.         case PROP_ID(PR_ORIGINAL_DISPLAY_BCC) :                     pszTag = "PR_ORIGINAL_DISPLAY_BCC";                         break;   
  653.         case PROP_ID(PR_ORIGINAL_DISPLAY_CC) :                      pszTag = "PR_ORIGINAL_DISPLAY_CC";                          break;   
  654.         case PROP_ID(PR_ORIGINAL_DISPLAY_TO) :                      pszTag = "PR_ORIGINAL_DISPLAY_TO";                          break;   
  655.         case PROP_ID(PR_RECEIVED_BY_ADDRTYPE) :                     pszTag = "PR_RECEIVED_BY_ADDRTYPE";                         break; 
  656.         case PROP_ID(PR_RECEIVED_BY_EMAIL_ADDRESS) :                pszTag = "PR_RECEIVED_BY_EMAIL_ADDRESS";                    break; 
  657.         case PROP_ID(PR_RCVD_REPRESENTING_ADDRTYPE) :               pszTag = "PR_RCVD_REPRESENTING_ADDRTYPE";                   break; 
  658.         case PROP_ID(PR_RCVD_REPRESENTING_EMAIL_ADDRESS) :          pszTag = "PR_RCVD_REPRESENTING_EMAIL_ADDRESS";              break; 
  659.         case PROP_ID(PR_ORIGINAL_AUTHOR_ADDRTYPE) :                 pszTag = "PR_ORIGINAL_AUTHOR_ADDRTYPE";                     break; 
  660.         case PROP_ID(PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS) :            pszTag = "PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS";                break; 
  661.         case PROP_ID(PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE) :       pszTag = "PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE";           break; 
  662.         case PROP_ID(PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS) :  pszTag = "PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS";      break; 
  663.         case PROP_ID(PR_TRANSPORT_MESSAGE_HEADERS) :                pszTag = "PR_TRANSPORT_MESSAGE_HEADERS";                    break; 
  664.  
  665.         #ifndef PR_DELEGATION
  666.         #define PR_DELEGATION                                       PROP_TAG(PT_BINARY,     0x007E)
  667.         #endif
  668.         case PROP_ID(PR_DELEGATION) :                               pszTag = "PR_DELEGATION";                                   break;   
  669.  
  670.         // Message content properties
  671.         case PROP_ID(PR_BODY) :                                     pszTag = "PR_BODY";                                         break;   
  672.         case PROP_ID(PR_REPORT_TEXT) :                              pszTag = "PR_REPORT_TEXT";                                  break;   
  673.         case PROP_ID(PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY) :      pszTag = "PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY";          break;   
  674.         case PROP_ID(PR_REPORTING_DL_NAME) :                        pszTag = "PR_REPORTING_DL_NAME";                            break;   
  675.         case PROP_ID(PR_REPORTING_MTA_CERTIFICATE) :                pszTag = "PR_REPORTING_MTA_CERTIFICATE";                    break;   
  676.         case PROP_ID(PR_RTF_SYNC_BODY_CRC) :                        pszTag = "PR_RTF_SYNC_BODY_CRC";                            break;   
  677.         case PROP_ID(PR_RTF_SYNC_BODY_COUNT) :                      pszTag = "PR_RTF_SYNC_BODY_COUNT";                          break;   
  678.         case PROP_ID(PR_RTF_SYNC_BODY_TAG) :                        pszTag = "PR_RTF_SYNC_BODY_TAG";                            break;   
  679.         case PROP_ID(PR_RTF_COMPRESSED) :                           pszTag = "PR_RTF_COMPRESSED";                               break;   
  680.         case PROP_ID(PR_RTF_SYNC_PREFIX_COUNT) :                    pszTag = "PR_RTF_SYNC_PREFIX_COUNT";                        break;   
  681.         case PROP_ID(PR_RTF_SYNC_TRAILING_COUNT) :                  pszTag = "PR_RTF_SYNC_TRAILING_COUNT";                      break;   
  682.         case PROP_ID(PR_ORIGINALLY_INTENDED_RECIP_ENTRYID) :        pszTag = "PR_ORIGINALLY_INTENDED_RECIP_ENTRYID";            break;   
  683.  
  684.         // Message recipient properties
  685.         case PROP_ID(PR_CONTENT_INTEGRITY_CHECK) :                  pszTag = "PR_CONTENT_INTEGRITY_CHECK";                      break;   
  686.         case PROP_ID(PR_EXPLICIT_CONVERSION) :                      pszTag = "PR_EXPLICIT_CONVERSION";                          break;   
  687.         case PROP_ID(PR_IPM_RETURN_REQUESTED) :                     pszTag = "PR_IPM_RETURN_REQUESTED";                         break;   
  688.         case PROP_ID(PR_MESSAGE_TOKEN) :                            pszTag = "PR_MESSAGE_TOKEN";                                break;   
  689.         case PROP_ID(PR_NDR_REASON_CODE) :                          pszTag = "PR_NDR_REASON_CODE";                              break;   
  690.         case PROP_ID(PR_NDR_DIAG_CODE) :                            pszTag = "PR_NDR_DIAG_CODE";                                break;   
  691.         case PROP_ID(PR_NON_RECEIPT_NOTIFICATION_REQUESTED) :       pszTag = "PR_NON_RECEIPT_NOTIFICATION_REQUESTED";           break;   
  692.  
  693.         #ifndef PR_DELIVERY_POINT
  694.         #define PR_DELIVERY_POINT                                   PROP_TAG( PT_LONG,      0x0C07)
  695.         #endif
  696.         case PROP_ID(PR_DELIVERY_POINT) :                           pszTag = "PR_DELIVERY_POINT";                               break;   
  697.  
  698.         case PROP_ID(PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED) : pszTag = "PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED";     break;   
  699.         case PROP_ID(PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT) : pszTag = "PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT";     break;   
  700.         case PROP_ID(PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY) :    pszTag = "PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY";        break;   
  701.         case PROP_ID(PR_PHYSICAL_DELIVERY_MODE) :                   pszTag = "PR_PHYSICAL_DELIVERY_MODE";                       break;   
  702.         case PROP_ID(PR_PHYSICAL_DELIVERY_REPORT_REQUEST) :         pszTag = "PR_PHYSICAL_DELIVERY_REPORT_REQUEST";             break;   
  703.         case PROP_ID(PR_PHYSICAL_FORWARDING_ADDRESS) :              pszTag = "PR_PHYSICAL_FORWARDING_ADDRESS";                  break;   
  704.         case PROP_ID(PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED) :    pszTag = "PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED";        break;   
  705.         case PROP_ID(PR_PHYSICAL_FORWARDING_PROHIBITED) :           pszTag = "PR_PHYSICAL_FORWARDING_PROHIBITED";               break;   
  706.         case PROP_ID(PR_PHYSICAL_RENDITION_ATTRIBUTES) :            pszTag = "PR_PHYSICAL_RENDITION_ATTRIBUTES";                break;   
  707.         case PROP_ID(PR_PROOF_OF_DELIVERY) :                        pszTag = "PR_PROOF_OF_DELIVERY";                            break;   
  708.         case PROP_ID(PR_PROOF_OF_DELIVERY_REQUESTED) :              pszTag = "PR_PROOF_OF_DELIVERY_REQUESTED";                  break;   
  709.         case PROP_ID(PR_RECIPIENT_CERTIFICATE) :                    pszTag = "PR_RECIPIENT_CERTIFICATE";                        break;   
  710.         case PROP_ID(PR_RECIPIENT_NUMBER_FOR_ADVICE) :              pszTag = "PR_RECIPIENT_NUMBER_FOR_ADVICE";                  break;   
  711.         case PROP_ID(PR_RECIPIENT_TYPE) :                           pszTag = "PR_RECIPIENT_TYPE";                               break;   
  712.         case PROP_ID(PR_REGISTERED_MAIL_TYPE) :                     pszTag = "PR_REGISTERED_MAIL_TYPE";                         break;   
  713.         case PROP_ID(PR_REPLY_REQUESTED) :                          pszTag = "PR_REPLY_REQUESTED";                              break;   
  714.         case PROP_ID(PR_REQUESTED_DELIVERY_METHOD) :                pszTag = "PR_REQUESTED_DELIVERY_METHOD";                    break;   
  715.         case PROP_ID(PR_SENDER_ENTRYID) :                           pszTag = "PR_SENDER_ENTRYID";                               break;   
  716.         case PROP_ID(PR_SENDER_NAME) :                              pszTag = "PR_SENDER_NAME";                                  break;   
  717.         case PROP_ID(PR_SUPPLEMENTARY_INFO) :                       pszTag = "PR_SUPPLEMENTARY_INFO";                           break;   
  718.         case PROP_ID(PR_TYPE_OF_MTS_USER) :                         pszTag = "PR_TYPE_OF_MTS_USER";                             break;   
  719.         case PROP_ID(PR_SENDER_SEARCH_KEY) :                        pszTag = "PR_SENDER_SEARCH_KEY";                            break;   
  720.         case PROP_ID(PR_SENDER_ADDRTYPE) :                          pszTag = "PR_SENDER_ADDRTYPE";                              break;   
  721.         case PROP_ID(PR_SENDER_EMAIL_ADDRESS) :                     pszTag = "PR_SENDER_EMAIL_ADDRESS";                         break;   
  722.         
  723.         // Message non-transmittable properties
  724.         case PROP_ID(PR_CURRENT_VERSION) :                          pszTag = "PR_CURRENT_VERSION";                              break;   
  725.         case PROP_ID(PR_DELETE_AFTER_SUBMIT) :                      pszTag = "PR_DELETE_AFTER_SUBMIT";                          break;   
  726.         case PROP_ID(PR_DISPLAY_BCC) :                              pszTag = "PR_DISPLAY_BCC";                                  break;   
  727.         case PROP_ID(PR_DISPLAY_CC) :                               pszTag = "PR_DISPLAY_CC";                                   break;   
  728.         case PROP_ID(PR_DISPLAY_TO) :                               pszTag = "PR_DISPLAY_TO";                                   break;   
  729.         case PROP_ID(PR_PARENT_DISPLAY) :                           pszTag = "PR_PARENT_DISPLAY";                               break;   
  730.         case PROP_ID(PR_MESSAGE_DELIVERY_TIME) :                    pszTag = "PR_MESSAGE_DELIVERY_TIME";                        break;   
  731.         case PROP_ID(PR_MESSAGE_FLAGS) :                            pszTag = "PR_MESSAGE_FLAGS";                                break;   
  732.         case PROP_ID(PR_MESSAGE_SIZE) :                             pszTag = "PR_MESSAGE_SIZE";                                 break;   
  733.         case PROP_ID(PR_PARENT_ENTRYID) :                           pszTag = "PR_PARENT_ENTRYID";                               break;   
  734.         case PROP_ID(PR_SENTMAIL_ENTRYID) :                         pszTag = "PR_SENTMAIL_ENTRYID";                             break;   
  735.         case PROP_ID(PR_CORRELATE) :                                pszTag = "PR_CORRELATE";                                    break;   
  736.         case PROP_ID(PR_CORRELATE_MTSID) :                          pszTag = "PR_CORRELATE_MTSID";                              break;   
  737.         case PROP_ID(PR_DISCRETE_VALUES) :                          pszTag = "PR_DISCRETE_VALUES";                              break;   
  738.         case PROP_ID(PR_RESPONSIBILITY) :                           pszTag = "PR_RESPONSIBILITY";                               break;   
  739.         case PROP_ID(PR_SPOOLER_STATUS) :                           pszTag = "PR_SPOOLER_STATUS";                               break;   
  740.         case PROP_ID(PR_TRANSPORT_STATUS) :                         pszTag = "PR_TRANSPORT_STATUS";                             break;   
  741.         case PROP_ID(PR_MESSAGE_RECIPIENTS) :                       pszTag = "PR_MESSAGE_RECIPIENTS";                           break;   
  742.         case PROP_ID(PR_MESSAGE_ATTACHMENTS) :                      pszTag = "PR_MESSAGE_ATTACHMENTS";                          break;   
  743.         case PROP_ID(PR_SUBMIT_FLAGS) :                             pszTag = "PR_SUBMIT_FLAGS";                                 break;   
  744.         case PROP_ID(PR_RECIPIENT_STATUS) :                         pszTag = "PR_RECIPIENT_STATUS";                             break;   
  745.         case PROP_ID(PR_TRANSPORT_KEY) :                            pszTag = "PR_TRANSPORT_KEY";                                break;   
  746.         case PROP_ID(PR_MSG_STATUS) :                               pszTag = "PR_MSG_STATUS";                                   break;   
  747.         case PROP_ID(PR_MESSAGE_DOWNLOAD_TIME) :                    pszTag = "PR_MESSAGE_DOWNLOAD_TIME";                        break;   
  748.         case PROP_ID(PR_CREATION_VERSION) :                         pszTag = "PR_CREATION_VERSION";                             break;   
  749.         case PROP_ID(PR_MODIFY_VERSION) :                           pszTag = "PR_MODIFY_VERSION";                               break;   
  750.         case PROP_ID(PR_HASATTACH) :                                pszTag = "PR_HASATTACH";                                    break;   
  751.         case PROP_ID(PR_BODY_CRC) :                                 pszTag = "PR_BODY_CRC";                                     break;   
  752.         case PROP_ID(PR_NORMALIZED_SUBJECT) :                       pszTag = "PR_NORMALIZED_SUBJECT";                           break;   
  753.         case PROP_ID(PR_RTF_IN_SYNC) :                              pszTag = "PR_RTF_IN_SYNC";                                  break;   
  754.         case PROP_ID(PR_ATTACH_SIZE) :                              pszTag = "PR_ATTACH_SIZE";                                  break;   
  755.         case PROP_ID(PR_ATTACH_NUM) :                               pszTag = "PR_ATTACH_NUM";                                   break;   
  756.         case PROP_ID(PR_PREPROCESS) :                               pszTag = "PR_PREPROCESS";                                   break;   
  757.         
  758.         case PROP_ID(PR_ORIGINATING_MTA_CERTIFICATE) :              pszTag = "PR_ORIGINATING_MTA_CERTIFICATE";                  break;   
  759.         case PROP_ID(PR_PROOF_OF_SUBMISSION) :                      pszTag = "PR_PROOF_OF_SUBMISSION";                          break;   
  760.         
  761.         // Properties common to multiple objects (including message objects)
  762.         case PROP_ID(PR_ENTRYID) :                                  pszTag = "PR_ENTRYID";                                      break;   
  763.         case PROP_ID(PR_OBJECT_TYPE) :                              pszTag = "PR_OBJECT_TYPE";                                  break;   
  764.         case PROP_ID(PR_ICON) :                                     pszTag = "PR_ICON";                                         break;   
  765.         case PROP_ID(PR_MINI_ICON) :                                pszTag = "PR_MINI_ICON";                                    break;   
  766.         case PROP_ID(PR_STORE_ENTRYID) :                            pszTag = "PR_STORE_ENTRYID";                                break;   
  767.         case PROP_ID(PR_STORE_RECORD_KEY) :                         pszTag = "PR_STORE_RECORD_KEY";                             break;   
  768.         case PROP_ID(PR_RECORD_KEY) :                               pszTag = "PR_RECORD_KEY";                                   break;   
  769.         case PROP_ID(PR_MAPPING_SIGNATURE) :                        pszTag = "PR_MAPPING_SIGNATURE";                            break;   
  770.         case PROP_ID(PR_ACCESS_LEVEL) :                             pszTag = "PR_ACCESS_LEVEL";                                 break;   
  771.         case PROP_ID(PR_INSTANCE_KEY) :                             pszTag = "PR_INSTANCE_KEY";                                 break;   
  772.         case PROP_ID(PR_ROW_TYPE) :                                 pszTag = "PR_ROW_TYPE";                                     break;   
  773.         case PROP_ID(PR_ACCESS) :                                   pszTag = "PR_ACCESS";                                       break;   
  774.         
  775.         // Properties common to multiple objects (NOT including message objects)
  776.         case PROP_ID(PR_ROWID) :                                    pszTag = "PR_ROWID";                                        break;   
  777.         case PROP_ID(PR_DISPLAY_NAME) :                             pszTag = "PR_DISPLAY_NAME";                                 break;   
  778.         case PROP_ID(PR_ADDRTYPE) :                                 pszTag = "PR_ADDRTYPE";                                     break;   
  779.         case PROP_ID(PR_EMAIL_ADDRESS) :                            pszTag = "PR_EMAIL_ADDRESS";                                break;   
  780.         case PROP_ID(PR_COMMENT) :                                  pszTag = "PR_COMMENT";                                      break;   
  781.         case PROP_ID(PR_DEPTH) :                                    pszTag = "PR_DEPTH";                                        break;   
  782.         case PROP_ID(PR_PROVIDER_DISPLAY) :                         pszTag = "PR_PROVIDER_DISPLAY";                             break;   
  783.         case PROP_ID(PR_CREATION_TIME) :                            pszTag = "PR_CREATION_TIME";                                break;   
  784.         case PROP_ID(PR_LAST_MODIFICATION_TIME) :                   pszTag = "PR_LAST_MODIFICATION_TIME";                       break;   
  785.         case PROP_ID(PR_RESOURCE_FLAGS) :                           pszTag = "PR_RESOURCE_FLAGS";                               break;   
  786.         case PROP_ID(PR_PROVIDER_DLL_NAME) :                        pszTag = "PR_PROVIDER_DLL_NAME";                            break;   
  787.         case PROP_ID(PR_SEARCH_KEY) :                               pszTag = "PR_SEARCH_KEY";                                   break;   
  788.         case PROP_ID(PR_PROVIDER_UID) :                             pszTag = "PR_PROVIDER_UID";                                 break;   
  789.         case PROP_ID(PR_PROVIDER_ORDINAL) :                         pszTag = "PR_PROVIDER_ORDINAL";                             break;   
  790.  
  791.         // MAPI Form properties
  792.         case PROP_ID(PR_FORM_VERSION) :                             pszTag = "PR_FORM_VERSION";                                 break;   
  793.         case PROP_ID(PR_FORM_CLSID) :                               pszTag = "PR_FORM_CLSID";                                   break;   
  794.         case PROP_ID(PR_FORM_CONTACT_NAME) :                        pszTag = "PR_FORM_CONTACT_NAME";                            break;   
  795.         case PROP_ID(PR_FORM_CATEGORY) :                            pszTag = "PR_FORM_CATEGORY";                                break;   
  796.         case PROP_ID(PR_FORM_CATEGORY_SUB) :                        pszTag = "PR_FORM_CATEGORY_SUB";                            break;   
  797.         case PROP_ID(PR_FORM_HOST_MAP) :                            pszTag = "PR_FORM_HOST_MAP";                                break;   
  798.         case PROP_ID(PR_FORM_HIDDEN) :                              pszTag = "PR_FORM_HIDDEN";                                  break;   
  799.         case PROP_ID(PR_FORM_DESIGNER_NAME) :                       pszTag = "PR_FORM_DESIGNER_NAME";                           break;   
  800.         case PROP_ID(PR_FORM_DESIGNER_GUID) :                       pszTag = "PR_FORM_DESIGNER_GUID";                           break;   
  801.         case PROP_ID(PR_FORM_MESSAGE_BEHAVIOR) :                    pszTag = "PR_FORM_MESSAGE_BEHAVIOR";                        break;   
  802.         
  803.         //Message store properties
  804.         case PROP_ID(PR_DEFAULT_STORE) :                            pszTag = "PR_DEFAULT_STORE";                                break;   
  805.         case PROP_ID(PR_STORE_SUPPORT_MASK) :                       pszTag = "PR_STORE_SUPPORT_MASK";                           break;
  806.         case PROP_ID(PR_STORE_STATE) :                              pszTag = "PR_STORE_STATE";                                  break;
  807.         case PROP_ID(PR_IPM_SUBTREE_SEARCH_KEY) :                   pszTag = "PR_IPM_SUBTREE_SEARCH_KEY";                       break;   
  808.         case PROP_ID(PR_IPM_OUTBOX_SEARCH_KEY) :                    pszTag = "PR_IPM_OUTBOX_SEARCH_KEY";                        break;   
  809.         case PROP_ID(PR_IPM_WASTEBASKET_SEARCH_KEY) :               pszTag = "PR_IPM_WASTEBASKET_SEARCH_KEY";                   break;   
  810.         case PROP_ID(PR_IPM_SENTMAIL_SEARCH_KEY) :                  pszTag = "PR_IPM_SENTMAIL_SEARCH_KEY";                      break;   
  811.         case PROP_ID(PR_MDB_PROVIDER) :                             pszTag = "PR_MDB_PROVIDER";                                 break;   
  812.         case PROP_ID(PR_RECEIVE_FOLDER_SETTINGS) :                  pszTag = "PR_RECEIVE_FOLDER_SETTINGS";                      break;   
  813.         case PROP_ID(PR_VALID_FOLDER_MASK) :                        pszTag = "PR_VALID_FOLDER_MASK";                            break;   
  814.         case PROP_ID(PR_IPM_SUBTREE_ENTRYID) :                      pszTag = "PR_IPM_SUBTREE_ENTRYID";                          break;   
  815.         case PROP_ID(PR_IPM_OUTBOX_ENTRYID) :                       pszTag = "PR_IPM_OUTBOX_ENTRYID";                           break;   
  816.         case PROP_ID(PR_IPM_WASTEBASKET_ENTRYID) :                  pszTag = "PR_IPM_WASTEBASKET_ENTRYID";                      break;   
  817.         case PROP_ID(PR_IPM_SENTMAIL_ENTRYID) :                     pszTag = "PR_IPM_SENTMAIL_ENTRYID";                         break;   
  818.         case PROP_ID(PR_VIEWS_ENTRYID) :                            pszTag = "PR_VIEWS_ENTRYID";                                break;   
  819.         case PROP_ID(PR_COMMON_VIEWS_ENTRYID) :                     pszTag = "PR_COMMON_VIEWS_ENTRYID";                         break;   
  820.         case PROP_ID(PR_FINDER_ENTRYID) :                           pszTag = "PR_FINDER_ENTRYID";                               break;   
  821.         
  822.         // Folder and AB Container properties
  823.         case PROP_ID(PR_CONTAINER_FLAGS) :                          pszTag = "PR_CONTAINER_FLAGS";                              break;   
  824.         case PROP_ID(PR_FOLDER_TYPE) :                              pszTag = "PR_FOLDER_TYPE";                                  break;   
  825.         case PROP_ID(PR_CONTENT_COUNT) :                            pszTag = "PR_CONTENT_COUNT";                                break;   
  826.         case PROP_ID(PR_CONTENT_UNREAD) :                           pszTag = "PR_CONTENT_UNREAD";                               break;   
  827.         case PROP_ID(PR_CREATE_TEMPLATES) :                         pszTag = "PR_CREATE_TEMPLATES";                             break;   
  828.         case PROP_ID(PR_DETAILS_TABLE) :                            pszTag = "PR_DETAILS_TABLE";                                break;   
  829.         case PROP_ID(PR_SEARCH) :                                   pszTag = "PR_SEARCH";                                       break;   
  830.         case PROP_ID(PR_SELECTABLE) :                               pszTag = "PR_SELECTABLE";                                   break;   
  831.         case PROP_ID(PR_SUBFOLDERS) :                               pszTag = "PR_SUBFOLDERS";                                   break;   
  832.         case PROP_ID(PR_STATUS) :                                   pszTag = "PR_STATUS";                                       break;   
  833.         case PROP_ID(PR_ANR) :                                      pszTag = "PR_ANR";                                          break;   
  834.         case PROP_ID(PR_CONTENTS_SORT_ORDER) :                      pszTag = "PR_CONTENTS_SORT_ORDER";                          break;   
  835.         case PROP_ID(PR_CONTAINER_HIERARCHY) :                      pszTag = "PR_CONTAINER_HIERARCHY";                          break;   
  836.         case PROP_ID(PR_CONTAINER_CONTENTS) :                       pszTag = "PR_CONTAINER_CONTENTS";                           break;   
  837.         case PROP_ID(PR_FOLDER_ASSOCIATED_CONTENTS) :               pszTag = "PR_FOLDER_ASSOCIATED_CONTENTS";                   break;   
  838.         case PROP_ID(PR_DEF_CREATE_DL) :                            pszTag = "PR_DEF_CREATE_DL";                                break;   
  839.         case PROP_ID(PR_DEF_CREATE_MAILUSER) :                      pszTag = "PR_DEF_CREATE_MAILUSER";                          break;   
  840.         case PROP_ID(PR_CONTAINER_CLASS) :                          pszTag = "PR_CONTAINER_CLASS";                              break;   
  841.         case PROP_ID(PR_CONTAINER_MODIFY_VERSION) :                 pszTag = "PR_CONTAINER_MODIFY_VERSION";                     break;   
  842.         case PROP_ID(PR_AB_PROVIDER_ID) :                           pszTag = "PR_AB_PROVIDER_ID";                               break;
  843.         case PROP_ID(PR_DEFAULT_VIEW_ENTRYID) :                     pszTag = "PR_DEFAULT_VIEW_ENTRYID";                         break;
  844.         case PROP_ID(PR_ASSOC_CONTENT_COUNT) :                      pszTag = "PR_ASSOC_CONTENT_COUNT";                          break;
  845.         
  846.         // Defined in Build 556 and above
  847.         #ifndef PR_VIEW_BINARY
  848.         #define PR_VIEW_BINARY          PROP_TAG( PT_BINARY,    0x3618)
  849.         #define PR_VIEW_STRINGS         PROP_TAG( PT_TSTRING,   0x3619)
  850.         #define PR_VIEW_FLAGS           PROP_TAG( PT_LONG,      0x361A)
  851.         #define PR_VIEW_LINK_TO         PROP_TAG( PT_BINARY,    0x361B)
  852.         #define PR_VIEW_VIEW_FOLDER     PROP_TAG( PT_BINARY,    0x361C)
  853.         #define PR_VIEW_NAME            PROP_TAG( PT_TSTRING,   0x361D)
  854.         #define PR_VIEW_VERSION         PROP_TAG( PT_LONG,      0x361E)
  855.         #define PR_VIEW_COLLAPSE_STATE  PROP_TAG( PT_BINARY,    0x361F)
  856.         #endif // PR_VIEW_BINARY
  857.  
  858.         case PROP_ID(PR_VIEW_BINARY) :                              pszTag = "PR_VIEW_BINARY";                                  break;
  859.         case PROP_ID(PR_VIEW_STRINGS) :                             pszTag = "PR_VIEW_STRINGS";                                 break;
  860.         case PROP_ID(PR_VIEW_FLAGS) :                               pszTag = "PR_VIEW_FLAGS";                                   break;
  861.         case PROP_ID(PR_VIEW_LINK_TO) :                             pszTag = "PR_VIEW_LINK_TO";                                 break;
  862.         case PROP_ID(PR_VIEW_VIEW_FOLDER) :                         pszTag = "PR_VIEW_VIEW_FOLDER";                             break;
  863.         case PROP_ID(PR_VIEW_NAME) :                                pszTag = "PR_VIEW_NAME";                                    break;
  864.         case PROP_ID(PR_VIEW_VERSION) :                             pszTag = "PR_VIEW_VERSION";                                 break;
  865.         case PROP_ID(PR_VIEW_COLLAPSE_STATE) :                      pszTag = "PR_VIEW_COLLAPSE_STATE";                          break;
  866.         
  867.         // Attachment properties
  868.         case PROP_ID(PR_ATTACHMENT_X400_PARAMETERS) :               pszTag = "PR_ATTACHMENT_X400_PARAMETERS";                   break;   
  869.         case PROP_ID(PR_ATTACH_DATA_OBJ) :                          pszTag = "PR_ATTACH_DATA_BIN or PR_ATTACH_DATA_OBJ";        break;   
  870.         case PROP_ID(PR_ATTACH_ENCODING) :                          pszTag = "PR_ATTACH_ENCODING";                              break;   
  871.         case PROP_ID(PR_ATTACH_EXTENSION) :                         pszTag = "PR_ATTACH_EXTENSION";                             break;   
  872.         case PROP_ID(PR_ATTACH_FILENAME) :                          pszTag = "PR_ATTACH_FILENAME";                              break;   
  873.         case PROP_ID(PR_ATTACH_METHOD) :                            pszTag = "PR_ATTACH_METHOD";                                break;   
  874.         case PROP_ID(PR_ATTACH_LONG_FILENAME) :                     pszTag = "PR_ATTACH_LONG_FILENAME";                         break;   
  875.         case PROP_ID(PR_ATTACH_PATHNAME) :                          pszTag = "PR_ATTACH_PATHNAME";                              break;   
  876.         case PROP_ID(PR_ATTACH_RENDERING) :                         pszTag = "PR_ATTACH_RENDERING";                             break;   
  877.         case PROP_ID(PR_ATTACH_TAG) :                               pszTag = "PR_ATTACH_TAG";                                   break;   
  878.         case PROP_ID(PR_RENDERING_POSITION) :                       pszTag = "PR_RENDERING_POSITION";                           break;   
  879.         case PROP_ID(PR_ATTACH_TRANSPORT_NAME) :                    pszTag = "PR_ATTACH_TRANSPORT_NAME";                        break;
  880.  
  881.         // Defined in Build 541 and above
  882.         #ifndef PR_ATTACH_LONG_PATHNAME
  883.         #define PR_ATTACH_LONG_PATHNAME                             PROP_TAG( PT_TSTRING,   0x370D)
  884.         #define PR_ATTACH_MIME_TAG                                  PROP_TAG( PT_TSTRING,   0x370E)
  885.         #endif
  886.         case PROP_ID(PR_ATTACH_LONG_PATHNAME) :                     pszTag = "PR_ATTACH_LONG_PATHNAME";                         break;   
  887.         case PROP_ID(PR_ATTACH_MIME_TAG) :                          pszTag = "PR_ATTACH_MIME_TAG";                              break;
  888.         
  889.         // AB Object properties
  890.         case PROP_ID(PR_DISPLAY_TYPE) :                             pszTag = "PR_DISPLAY_TYPE";                                 break;   
  891.         case PROP_ID(PR_TEMPLATEID) :                               pszTag = "PR_TEMPLATEID";                                   break;   
  892.         case PROP_ID(PR_PRIMARY_CAPABILITY) :                       pszTag = "PR_PRIMARY_CAPABILITY";                           break;   
  893.  
  894.         // Mail user properties
  895.         #ifndef PR_7BIT_DISPLAY_NAME
  896.         #define PR_7BIT_DISPLAY_NAME                                PROP_TAG( PT_STRING8,   0x39FF)
  897.         #endif
  898.         case PROP_ID(PR_7BIT_DISPLAY_NAME) :                        pszTag = "PR_7BIT_DISPLAY_NAME";                                      break;
  899.         case PROP_ID(PR_ACCOUNT) :                                  pszTag = "PR_ACCOUNT";                                      break;
  900.         case PROP_ID(PR_ALTERNATE_RECIPIENT) :                      pszTag = "PR_ALTERNATE_RECIPIENT";                          break;   
  901.         case PROP_ID(PR_CALLBACK_TELEPHONE_NUMBER) :                pszTag = "PR_CALLBACK_TELEPHONE_NUMBER";                    break;   
  902.         case PROP_ID(PR_CONVERSION_PROHIBITED) :                    pszTag = "PR_CONVERSION_PROHIBITED";                        break;   
  903.         case PROP_ID(PR_DISCLOSE_RECIPIENTS) :                      pszTag = "PR_DISCLOSE_RECIPIENTS";                          break;   
  904.         case PROP_ID(PR_GENERATION) :                               pszTag = "PR_GENERATION";                                   break;   
  905.         case PROP_ID(PR_GIVEN_NAME) :                               pszTag = "PR_GIVEN_NAME";                                   break;   
  906.         case PROP_ID(PR_GOVERNMENT_ID_NUMBER) :                     pszTag = "PR_GOVERNMENT_ID_NUMBER";                         break;   
  907.         case PROP_ID(PR_OFFICE_TELEPHONE_NUMBER) :                  pszTag = "PR_OFFICE_TELEPHONE_NUMBER";                      break;   
  908.         case PROP_ID(PR_HOME_TELEPHONE_NUMBER) :                    pszTag = "PR_HOME_TELEPHONE_NUMBER";                        break;   
  909.         case PROP_ID(PR_INITIALS) :                                 pszTag = "PR_INITIALS";                                     break;   
  910.         case PROP_ID(PR_KEYWORD) :                                  pszTag = "PR_KEYWORD";                                      break;   
  911.         case PROP_ID(PR_LANGUAGE) :                                 pszTag = "PR_LANGUAGE";                                     break;   
  912.         case PROP_ID(PR_LOCATION) :                                 pszTag = "PR_LOCATION";                                     break;   
  913.         case PROP_ID(PR_MAIL_PERMISSION) :                          pszTag = "PR_MAIL_PERMISSION";                              break;   
  914.         case PROP_ID(PR_MHS_COMMON_NAME) :                          pszTag = "PR_MHS_COMMON_NAME";                              break;   
  915.         case PROP_ID(PR_ORGANIZATIONAL_ID_NUMBER) :                 pszTag = "PR_ORGANIZATIONAL_ID_NUMBER";                     break;   
  916.         case PROP_ID(PR_SURNAME) :                                  pszTag = "PR_SURNAME";                                      break;   
  917.         case PROP_ID(PR_ORIGINAL_ENTRYID) :                         pszTag = "PR_ORIGINAL_ENTRYID";                             break;   
  918.         case PROP_ID(PR_ORIGINAL_DISPLAY_NAME) :                    pszTag = "PR_ORIGINAL_DISPLAY_NAME";                        break;   
  919.         case PROP_ID(PR_ORIGINAL_SEARCH_KEY) :                      pszTag = "PR_ORIGINAL_SEARCH_KEY";                          break;   
  920.         case PROP_ID(PR_POSTAL_ADDRESS) :                           pszTag = "PR_POSTAL_ADDRESS";                               break;   
  921.         case PROP_ID(PR_COMPANY_NAME) :                             pszTag = "PR_COMPANY_NAME";                                 break;   
  922.         case PROP_ID(PR_TITLE) :                                    pszTag = "PR_TITLE";                                        break;   
  923.         case PROP_ID(PR_DEPARTMENT_NAME) :                          pszTag = "PR_DEPARTMENT_NAME";                              break;   
  924.         case PROP_ID(PR_OFFICE_LOCATION) :                          pszTag = "PR_OFFICE_LOCATION";                              break;   
  925.         case PROP_ID(PR_PRIMARY_TELEPHONE_NUMBER) :                 pszTag = "PR_PRIMARY_TELEPHONE_NUMBER";                     break;   
  926.         case PROP_ID(PR_OFFICE2_TELEPHONE_NUMBER) :                 pszTag = "PR_OFFICE2_TELEPHONE_NUMBER";                     break;   
  927.         case PROP_ID(PR_CELLULAR_TELEPHONE_NUMBER) :                pszTag = "PR_CELLULAR_TELEPHONE_NUMBER";                    break;   
  928.         case PROP_ID(PR_RADIO_TELEPHONE_NUMBER) :                   pszTag = "PR_RADIO_TELEPHONE_NUMBER";                       break;   
  929.         case PROP_ID(PR_CAR_TELEPHONE_NUMBER) :                     pszTag = "PR_CAR_TELEPHONE_NUMBER";                         break;   
  930.         case PROP_ID(PR_OTHER_TELEPHONE_NUMBER) :                   pszTag = "PR_OTHER_TELEPHONE_NUMBER";                       break;   
  931.         case PROP_ID(PR_TRANSMITABLE_DISPLAY_NAME) :                pszTag = "PR_TRANSMITABLE_DISPLAY_NAME";                    break;   
  932.         case PROP_ID(PR_BEEPER_TELEPHONE_NUMBER) :                  pszTag = "PR_BEEPER_TELEPHONE_NUMBER";                      break;   
  933.         case PROP_ID(PR_USER_CERTIFICATE) :                         pszTag = "PR_USER_CERTIFICATE";                             break;
  934.         case PROP_ID(PR_PRIMARY_FAX_NUMBER) :                       pszTag = "PR_PRIMARY_FAX_NUMBER";                           break;
  935.         case PROP_ID(PR_BUSINESS_FAX_NUMBER) :                      pszTag = "PR_BUSINESS_FAX_NUMBER";                          break;
  936.         case PROP_ID(PR_HOME_FAX_NUMBER) :                          pszTag = "PR_HOME_FAX_NUMBER";                              break;
  937.         case PROP_ID(PR_COUNTRY) :                                  pszTag = "PR_COUNTRY";                                      break;
  938.         case PROP_ID(PR_LOCALITY) :                                 pszTag = "PR_LOCALITY";                                     break;
  939.         case PROP_ID(PR_STATE_OR_PROVINCE) :                        pszTag = "PR_STATE_OR_PROVINCE";                            break;
  940.         case PROP_ID(PR_STREET_ADDRESS) :                           pszTag = "PR_STREET_ADDRESS";                               break;
  941.         case PROP_ID(PR_POSTAL_CODE) :                              pszTag = "PR_POSTAL_CODE";                                  break;
  942.         case PROP_ID(PR_POST_OFFICE_BOX) :                          pszTag = "PR_POST_OFFICE_BOX";                              break;
  943.         case PROP_ID(PR_TELEX_NUMBER) :                             pszTag = "PR_TELEX_NUMBER";                                 break;
  944.         case PROP_ID(PR_ISDN_NUMBER) :                              pszTag = "PR_ISDN_NUMBER";                                  break;
  945.         case PROP_ID(PR_ASSISTANT_TELEPHONE_NUMBER) :               pszTag = "PR_ASSISTANT_TELEPHONE_NUMBER";                   break;
  946.         case PROP_ID(PR_HOME2_TELEPHONE_NUMBER) :                   pszTag = "PR_HOME2_TELEPHONE_NUMBER";                       break;
  947.         case PROP_ID(PR_ASSISTANT) :                                pszTag = "PR_ASSISTANT";                                    break;
  948.         case PROP_ID(PR_SEND_RICH_INFO) :                           pszTag = "PR_SEND_RICH_INFO";                               break;
  949.  
  950.         // Profile section properties
  951.         case PROP_ID(PR_STORE_PROVIDERS) :                          pszTag = "PR_STORE_PROVIDERS";                              break;   
  952.         case PROP_ID(PR_AB_PROVIDERS) :                             pszTag = "PR_AB_PROVIDERS";                                 break;   
  953.         case PROP_ID(PR_TRANSPORT_PROVIDERS) :                      pszTag = "PR_TRANSPORT_PROVIDERS";                          break;   
  954.         case PROP_ID(PR_DEFAULT_PROFILE) :                          pszTag = "PR_DEFAULT_PROFILE";                              break;   
  955.         case PROP_ID(PR_AB_SEARCH_PATH) :                           pszTag = "PR_AB_SEARCH_PATH";                               break;   
  956.         case PROP_ID(PR_AB_DEFAULT_DIR) :                           pszTag = "PR_AB_DEFAULT_DIR";                               break;   
  957.         case PROP_ID(PR_AB_DEFAULT_PAB) :                           pszTag = "PR_AB_DEFAULT_PAB";                               break;   
  958.         case PROP_ID(PR_FILTERING_HOOKS) :                          pszTag = "PR_FILTERING_HOOKS";                              break;   
  959.         case PROP_ID(PR_SERVICE_NAME) :                             pszTag = "PR_SERVICE_NAME";                                 break;   
  960.         case PROP_ID(PR_SERVICE_DLL_NAME) :                         pszTag = "PR_SERVICE_DLL_NAME";                             break;   
  961.         case PROP_ID(PR_SERVICE_ENTRY_NAME) :                       pszTag = "PR_SERVICE_ENTRY_NAME";                           break;   
  962.         case PROP_ID(PR_SERVICE_UID) :                              pszTag = "PR_SERVICE_UID";                                  break;   
  963.         case PROP_ID(PR_SERVICE_EXTRA_UIDS) :                       pszTag = "PR_SERVICE_EXTRA_UIDS";                           break;   
  964.         case PROP_ID(PR_SERVICES) :                                 pszTag = "PR_SERVICES";                                     break;   
  965.         case PROP_ID(PR_SERVICE_SUPPORT_FILES) :                    pszTag = "PR_SERVICE_SUPPORT_FILES";                        break;   
  966.         case PROP_ID(PR_SERVICE_DELETE_FILES) :                     pszTag = "PR_SERVICE_DELETE_FILES";                         break;   
  967.         case PROP_ID(PR_AB_SEARCH_PATH_UPDATE) :                    pszTag = "PR_AB_SEARCH_PATH_UPDATE";                        break;   
  968.  
  969.         // Status object properties
  970.         case PROP_ID(PR_IDENTITY_DISPLAY) :                         pszTag = "PR_IDENTITY_DISPLAY";                             break;   
  971.         case PROP_ID(PR_IDENTITY_ENTRYID) :                         pszTag = "PR_IDENTITY_ENTRYID";                             break;   
  972.         case PROP_ID(PR_RESOURCE_METHODS) :                         pszTag = "PR_RESOURCE_METHODS";                             break;   
  973.         case PROP_ID(PR_RESOURCE_TYPE) :                            pszTag = "PR_RESOURCE_TYPE";                                break;   
  974.         case PROP_ID(PR_STATUS_CODE) :                              pszTag = "PR_STATUS_CODE";                                  break;   
  975.         case PROP_ID(PR_IDENTITY_SEARCH_KEY) :                      pszTag = "PR_IDENTITY_SEARCH_KEY";                          break;   
  976.         case PROP_ID(PR_OWN_STORE_ENTRYID) :                        pszTag = "PR_OWN_STORE_ENTRYID";                            break;   
  977.         case PROP_ID(PR_RESOURCE_PATH) :                            pszTag = "PR_RESOURCE_PATH";                                break;   
  978.         case PROP_ID(PR_STATUS_STRING) :                            pszTag = "PR_STATUS_STRING";                                break;   
  979.         case PROP_ID(PR_X400_DEFERRED_DELIVERY_CANCEL) :            pszTag = "PR_X400_DEFERRED_DELIVERY_CANCEL";                break;   
  980.         case PROP_ID(PR_HEADER_FOLDER_ENTRYID) :                    pszTag = "PR_HEADER_FOLDER_ENTRYID";                        break;   
  981.         case PROP_ID(PR_REMOTE_PROGRESS) :                          pszTag = "PR_REMOTE_PROGRESS";                              break;   
  982.         case PROP_ID(PR_REMOTE_PROGRESS_TEXT) :                     pszTag = "PR_REMOTE_PROGRESS_TEXT";                         break;   
  983.         case PROP_ID(PR_REMOTE_VALIDATE_OK) :                       pszTag = "PR_REMOTE_VALIDATE_OK";                           break;   
  984.  
  985.         //Display table properties
  986.         case PROP_ID(PR_CONTROL_FLAGS) :                            pszTag = "PR_CONTROL_FLAGS";                                break;   
  987.         case PROP_ID(PR_CONTROL_STRUCTURE) :                        pszTag = "PR_CONTROL_STRUCTURE";                            break;
  988.         case PROP_ID(PR_CONTROL_TYPE) :                             pszTag = "PR_CONTROL_TYPE";                                 break;
  989.         case PROP_ID(PR_DELTAX) :                                   pszTag = "PR_DELTAX";                                       break;
  990.         case PROP_ID(PR_DELTAY) :                                   pszTag = "PR_DELTAY";                                       break;
  991.         case PROP_ID(PR_XPOS) :                                     pszTag = "PR_XPOS";                                         break;
  992.         case PROP_ID(PR_YPOS) :                                     pszTag = "PR_YPOS";                                         break;
  993.         case PROP_ID(PR_CONTROL_ID) :                               pszTag = "PR_CONTROL_ID";                                   break;
  994.         case PROP_ID(PR_INITIAL_DETAILS_PANE) :                     pszTag = "PR_INITIAL_DETAILS_PANE";                         break;
  995.  
  996.         default :
  997.             if (0x8000 >= PROP_ID(ulPropTag))
  998.             {
  999.                 wsprintf (szUnkTag, "Named Property (%x)", PROP_ID(ulPropTag));
  1000.             }
  1001.             else
  1002.             {
  1003.                 wsprintf (szUnkTag, "UNKNOWN (%x)", PROP_ID(ulPropTag));
  1004.             }
  1005.             pszTag = szUnkTag;
  1006.             break;
  1007.     }
  1008.     char * pszType;
  1009.     switch (PROP_TYPE(ulPropTag))
  1010.     {
  1011.         case PT_UNSPECIFIED :   pszType = "PT_UNSPECIFIED"; break;
  1012.         case PT_NULL :          pszType = "PT_NULL";        break;
  1013.         case PT_SHORT :         pszType = "PT_SHORT";       break;
  1014.         case PT_LONG :          pszType = "PT_LONG";        break;
  1015.         case PT_FLOAT :         pszType = "PT_FLOAT";       break;
  1016.         case PT_DOUBLE :        pszType = "PT_DOUBLE";      break;
  1017.         case PT_CURRENCY :      pszType = "PT_CURRENCY";    break;
  1018.         case PT_APPTIME :       pszType = "PT_APPTIME";     break;
  1019.         case PT_ERROR :         pszType = "PT_ERROR";       break;
  1020.         case PT_BOOLEAN :       pszType = "PT_BOOLEAN";     break;
  1021.         case PT_OBJECT :        pszType = "PT_OBJECT";      break;
  1022.         case PT_I8 :            pszType = "PT_I8";          break;
  1023.         case PT_STRING8 :       pszType = "PT_STRING8";     break;
  1024.         case PT_UNICODE :       pszType = "PT_UNICODE";     break;
  1025.         case PT_SYSTIME :       pszType = "PT_SYSTIME";     break;
  1026.         case PT_CLSID :         pszType = "PT_CLSID";       break;
  1027.         case PT_BINARY :        pszType = "PT_BINARY";      break;
  1028.         default :
  1029.             wsprintf (szUnkType, "UNKNOWN (%x)", PROP_TYPE(ulPropTag));
  1030.             pszType = szUnkType;
  1031.             break;
  1032.     }
  1033.     dwSize = wsprintf (message, "Tag: %s  Type: %s\r\n", pszTag, pszType);
  1034.     WriteOutputString (message, dwSize);
  1035. }
  1036. #endif // TRACES_NO_MAPI
  1037.  
  1038. // End of file for TRACES.CPP
  1039.