defprop.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 30k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. //-------------------------------------------------------------------------//
  2. //  defprop.cpp
  3. //-------------------------------------------------------------------------//
  4. #include "pch.h"
  5. #include "resource.h" //  resource symbols
  6. #include "defprop.h"
  7. #include "propvar.h"
  8. #include "dictbase.h"
  9. #include "imageprop.h"
  10. //-------------------------------------------------------------------------//
  11. static HRESULT LoadItemTags( UINT, BSTR&, BSTR&, BSTR& );
  12. //-------------------------------------------------------------------------//
  13. BEGIN_DEFFOLDER_MAP( def_folder_items )
  14.     
  15.     DEFFOLDER_ENTRY( PFID_FaxProperties, IDS_FOLDER_FAX, 
  16.                      PST_IMAGEFILE, PTFI_ALL, PTIA_READONLY )
  17.     DEFFOLDER_ENTRY( PFID_ImageProperties, IDS_FOLDER_IMAGE, 
  18.                      PST_IMAGEFILE, PTFI_ALL, PTIA_READONLY )
  19.     DEFFOLDER_ENTRY( PFID_Description, IDS_FOLDER_DESCRIPTION, 
  20.                      PST_NOSTG|PST_OLESS|PST_NSS|PST_DOCFILE|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC, 
  21.                      PTFI_ALL, PTIA_READWRITE )
  22.     
  23.     DEFFOLDER_ENTRY( PFID_Origin,  IDS_FOLDER_SOURCE,  
  24.                      PST_OLESS|PST_NSS|PST_DOCFILE|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC, PTFI_ALL, PTIA_READWRITE )
  25.     
  26. END_DEFFOLDER_MAP()
  27. //-------------------------------------------------------------------------//
  28. #pragma warning( disable : 310 ) // cast truncates constant value
  29. BEGIN_DEFVALLIST( BoolTrueFalse )
  30.     DEFVALLIST_BOOL_ENTRY( VARIANT_FALSE, TRUE, IDS_BOOLVAL_FALSE )
  31.     DEFVALLIST_BOOL_ENTRY( VARIANT_TRUE,  TRUE, IDS_BOOLVAL_TRUE )
  32. END_DEFVALLIST()
  33. BEGIN_DEFVALLIST( BoolYesNo )
  34.     DEFVALLIST_BOOL_ENTRY( VARIANT_TRUE,  TRUE, IDS_BOOLVAL_NO )
  35.     DEFVALLIST_BOOL_ENTRY( VARIANT_FALSE, TRUE, IDS_BOOLVAL_YES )
  36. END_DEFVALLIST()
  37. //  Do not change the order of any of the existing values in the following table!!!; append new values.
  38. BEGIN_DEFVALLIST( MediaStatusVals )
  39.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_NORMAL, VT_UI4, FALSE, TRUE, IDS_STATUSVAL_NORMAL )
  40.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_NEW,    VT_UI4, FALSE, TRUE, IDS_STATUSVAL_NEW )
  41.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_PRELIM, VT_UI4, FALSE, TRUE, IDS_STATUSVAL_PRELIM )
  42.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_DRAFT,  VT_UI4, FALSE, TRUE, IDS_STATUSVAL_DRAFT )
  43.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_INPROGRESS, VT_UI4, FALSE, TRUE, IDS_STATUSVAL_INPROGRESS )
  44.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_EDIT,   VT_UI4, FALSE, TRUE, IDS_STATUSVAL_EDIT )
  45.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_REVIEW, VT_UI4, FALSE, TRUE, IDS_STATUSVAL_REVIEW )
  46.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_PROOF,  VT_UI4, FALSE, TRUE, IDS_STATUSVAL_PROOF )
  47.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_FINAL,  VT_UI4, FALSE, TRUE, IDS_STATUSVAL_FINAL )
  48.     DEFVALLIST_STRING_ENTRY( (ULONG)PIDMSI_STATUS_OTHER,  VT_UI4, FALSE, TRUE, IDS_STATUSVAL_OTHER )
  49. END_DEFVALLIST()
  50. #pragma warning( default : 310 ) // cast truncates constant value
  51. //-------------------------------------------------------------------------//
  52. BEGIN_DEFPROP_MAP( def_property_items )
  53.     //  Properties in the 'General' folder
  54.     DEFPROP_ENTRY( L"Title", FMTID_SummaryInformation, PIDSI_TITLE, IDS_PIDSI_TITLE, VT_LPSTR, 
  55.         PST_OLESS|PST_DOCFILE | PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC | PST_SHELLCOLUMN,
  56.         PFID_Description, PTPI_ALL, PTIA_READWRITE,
  57.         PTPIF_MRU, 
  58.         PTCTLID_DROPDOWN_COMBO, NULL )
  59.     DEFPROP_ENTRY( L"Subject", FMTID_SummaryInformation, PIDSI_SUBJECT, IDS_PIDSI_SUBJECT, VT_LPSTR,
  60.         PST_OLESS|PST_DOCFILE | PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC | PST_SHELLCOLUMN,
  61.         PFID_Description, PTPI_ALL, PTIA_READWRITE,
  62.         PTPIF_MRU, 
  63.         PTCTLID_DROPDOWN_COMBO, NULL )
  64.     DEFPROP_ENTRY( L"Category", FMTID_DocSummaryInformation, PIDDSI_CATEGORY, IDS_PIDDSI_CATEGORY, VT_LPSTR, 
  65.         PST_OLESS|PST_DOCFILE | PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC | PST_SHELLCOLUMN,
  66.         PFID_Description, PTPI_ALL, PTIA_READWRITE,
  67.         PTPIF_MRU, 
  68.         PTCTLID_DROPDOWN_COMBO, NULL )
  69.     DEFPROP_ENTRY( L"Keywords", FMTID_SummaryInformation, PIDSI_KEYWORDS, IDS_PIDSI_KEYWORDS, VT_LPSTR,
  70.         PST_OLESS|PST_DOCFILE | PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC,
  71.         PFID_Description, PTPI_ALL, PTIA_READWRITE,
  72.         PTPIF_BASIC, 
  73.         PTCTLID_MULTILINE_EDIT, NULL )
  74.     DEFPROP_ENTRY( L"Rating", FMTID_MediaFileSummaryInformation, PIDMSI_RATING, IDS_PIDMSI_RATING, VT_LPWSTR,
  75.         PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE,
  76.         PFID_Description, PTPI_ALL, PTIA_READWRITE,
  77.         PTPIF_MRU, 
  78.         PTCTLID_DROPDOWN_COMBO, NULL )
  79.     DEFPROP_ENTRY( L"Template", FMTID_SummaryInformation, PIDSI_TEMPLATE, IDS_PIDSI_TEMPLATE, VT_LPSTR,
  80.         PST_OLESS|PST_DOCFILE,
  81.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  82.         PTPIF_BASIC|PTPIF_INNATE, 
  83.         PTCTLID_DROPDOWN_COMBO, NULL )
  84.     DEFPROP_ENTRY( L"PageCount", FMTID_SummaryInformation, PIDSI_PAGECOUNT, IDS_PIDSI_PAGECOUNT, VT_I4,
  85.         PST_OLESS|PST_DOCFILE,
  86.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  87.         PTPIF_BASIC|PTPIF_INNATE, 
  88.         PTCTLID_DROPDOWN_COMBO, NULL )
  89.     DEFPROP_ENTRY( L"WordCount", FMTID_SummaryInformation, PIDSI_WORDCOUNT, IDS_PIDSI_WORDCOUNT, VT_I4,
  90.         PST_OLESS|PST_DOCFILE,
  91.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  92.         PTPIF_BASIC|PTPIF_INNATE, 
  93.         PTCTLID_DROPDOWN_COMBO, NULL )
  94.     DEFPROP_ENTRY( L"CharCount", FMTID_SummaryInformation, PIDSI_CHARCOUNT, IDS_PIDSI_CHARCOUNT, VT_I4,
  95.         PST_OLESS|PST_DOCFILE,
  96.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  97.         PTPIF_BASIC|PTPIF_INNATE, 
  98.         PTCTLID_DROPDOWN_COMBO, NULL )
  99.     DEFPROP_ENTRY( L"ByteCount", FMTID_DocSummaryInformation, PIDDSI_BYTECOUNT, IDS_PIDDSI_BYTECOUNT, VT_I4,
  100.         PST_OLESS|PST_DOCFILE,
  101.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  102.         PTPIF_BASIC|PTPIF_INNATE, 
  103.         PTCTLID_DROPDOWN_COMBO, NULL )
  104.     DEFPROP_ENTRY( L"LineCount", FMTID_DocSummaryInformation, PIDDSI_LINECOUNT, IDS_PIDDSI_LINECOUNT, VT_I4,
  105.         PST_OLESS|PST_DOCFILE,
  106.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  107.         PTPIF_BASIC|PTPIF_INNATE, 
  108.         PTCTLID_DROPDOWN_COMBO, NULL )
  109.     DEFPROP_ENTRY( L"ParCount", FMTID_DocSummaryInformation, PIDDSI_PARCOUNT, IDS_PIDDSI_PARCOUNT, VT_I4,
  110.         PST_OLESS|PST_DOCFILE,
  111.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  112.         PTPIF_BASIC|PTPIF_INNATE, 
  113.         PTCTLID_DROPDOWN_COMBO, NULL )
  114.     DEFPROP_ENTRY( L"SlideCount", FMTID_DocSummaryInformation, PIDDSI_SLIDECOUNT, IDS_PIDDSI_SLIDECOUNT, VT_I4,
  115.         PST_OLESS|PST_DOCFILE,
  116.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  117.         PTPIF_BASIC|PTPIF_INNATE, 
  118.         PTCTLID_DROPDOWN_COMBO, NULL )
  119.     DEFPROP_ENTRY( L"NoteCount", FMTID_DocSummaryInformation, PIDDSI_NOTECOUNT, IDS_PIDDSI_NOTECOUNT, VT_I4,
  120.         PST_OLESS|PST_DOCFILE,
  121.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  122.         PTPIF_BASIC|PTPIF_INNATE, 
  123.         PTCTLID_DROPDOWN_COMBO, NULL )
  124.     DEFPROP_ENTRY( L"HiddenCount", FMTID_DocSummaryInformation, PIDDSI_HIDDENCOUNT, IDS_PIDDSI_HIDDENCOUNT, VT_I4,
  125.         PST_OLESS|PST_DOCFILE,
  126.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  127.         PTPIF_BASIC|PTPIF_INNATE, 
  128.         PTCTLID_DROPDOWN_COMBO, NULL )
  129.     DEFPROP_ENTRY( L"MMClipCount", FMTID_DocSummaryInformation, PIDDSI_MMCLIPCOUNT, IDS_PIDDSI_MMCLIPCOUNT, VT_I4,
  130.         PST_OLESS|PST_DOCFILE,
  131.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  132.         PTPIF_BASIC|PTPIF_INNATE, 
  133.         PTCTLID_DROPDOWN_COMBO, NULL )
  134.     DEFPROP_ENUM_ENTRY( L"Scale", FMTID_DocSummaryInformation, PIDDSI_SCALE, IDS_PIDDSI_SCALE, VT_BOOL,
  135.         PST_OLESS|PST_DOCFILE,
  136.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  137.         PTPIF_ENUM|PTPIF_INNATE, 
  138.         PTCTLID_DROPLIST_COMBO, NULL,
  139.         DEFVALLIST_COUNT( BoolYesNo ), BoolYesNo )
  140. #if 0   // Can't deal with these vector types.
  141.     DEFPROP_ENTRY( L"HeadingPair", FMTID_DocSummaryInformation, PIDDSI_HEADINGPAIR, IDS_PIDDSI_HEADINGPAIR, VT_VARIANT|VT_VECTOR,
  142.         PST_OLESS|PST_DOCFILE,
  143.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  144.         PTPIF_BASIC|PTPIF_INNATE, 
  145.         PTCTLID_DROPDOWN_COMBO, NULL )
  146.     DEFPROP_ENTRY( L"DocParts", FMTID_DocSummaryInformation, PIDDSI_DOCPARTS, IDS_PIDDSI_DOCPARTS, VT_LPSTR|VT_VECTOR,
  147.         PST_OLESS|PST_DOCFILE,
  148.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  149.         PTPIF_BASIC|PTPIF_INNATE, 
  150.         PTCTLID_DROPDOWN_COMBO, NULL )
  151. #endif
  152.     DEFPROP_ENTRY( L"LinksUpToDate", FMTID_DocSummaryInformation, PIDDSI_LINKSDIRTY, IDS_PIDDSI_LINKSDIRTY, VT_BOOL,
  153.         PST_OLESS|PST_DOCFILE,
  154.         PFID_Description, PTPI_ALL, PTIA_READONLY,
  155.         PTPIF_BASIC|PTPIF_INNATE, 
  156.         PTCTLID_DROPLIST_COMBO, NULL )
  157.     DEFPROP_ENTRY( L"Comments", FMTID_SummaryInformation, PIDSI_COMMENTS, IDS_PIDSI_COMMENTS, VT_LPSTR,
  158.         PST_OLESS|PST_DOCFILE | PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC,
  159.         PFID_Description, PTPI_ALL, PTIA_READWRITE,
  160.         PTPIF_BASIC, 
  161.         PTCTLID_MULTILINE_EDIT, NULL )
  162.     DEFPROP_ENTRY( L"FileType", FMTID_ImageSummaryInformation, PIDISI_FILETYPE, IDS_PIDISG_FILETYPE, VT_LPWSTR,
  163.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  164.         PFID_ImageProperties, PTPI_ALL, PTIA_READONLY,
  165.         PTPIF_BASIC|PTPIF_INNATE, 
  166.         PTCTLID_DROPDOWN_COMBO, NULL )
  167.     DEFPROP_ENTRY( L"Width", FMTID_ImageSummaryInformation, PIDISI_CX, IDS_PIDISG_CX, VT_UI4,
  168.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  169.         PFID_ImageProperties, PTPI_ALL, PTIA_READONLY,
  170.         PTPIF_BASIC|PTPIF_INNATE, 
  171.         PTCTLID_DROPDOWN_COMBO, NULL )
  172.     DEFPROP_ENTRY( L"Height", FMTID_ImageSummaryInformation, PIDISI_CY, IDS_PIDISG_CY, VT_UI4,
  173.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  174.         PFID_ImageProperties, PTPI_ALL, PTIA_READONLY,
  175.         PTPIF_BASIC|PTPIF_INNATE, 
  176.         PTCTLID_DROPDOWN_COMBO, NULL )
  177.     DEFPROP_ENTRY( L"ResolutionX", FMTID_ImageSummaryInformation, PIDISI_RESOLUTIONX, IDS_PIDISG_RESOLUTIONX, VT_UI4,
  178.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  179.         PFID_ImageProperties, PTPI_ALL, PTIA_READONLY,
  180.         PTPIF_BASIC|PTPIF_INNATE, 
  181.         PTCTLID_DROPDOWN_COMBO, NULL )
  182.     DEFPROP_ENTRY( L"ResolutionY", FMTID_ImageSummaryInformation, PIDISI_RESOLUTIONY, IDS_PIDISG_RESOLUTIONY, VT_UI4,
  183.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  184.         PFID_ImageProperties, PTPI_ALL, PTIA_READONLY,
  185.         PTPIF_BASIC|PTPIF_INNATE, 
  186.         PTCTLID_DROPDOWN_COMBO, NULL )
  187.     
  188.     DEFPROP_ENTRY( L"BitDepth", FMTID_ImageSummaryInformation, PIDISI_BITDEPTH, IDS_PIDISG_BITDEPTH, VT_UI4,
  189.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  190.         PFID_ImageProperties, PTPI_ALL, PTIA_READONLY,
  191.         PTPIF_BASIC|PTPIF_INNATE, 
  192.         PTCTLID_DROPDOWN_COMBO, NULL )
  193.     DEFPROP_ENTRY( L"Colorspace", FMTID_ImageSummaryInformation, PIDISI_COLORSPACE, IDS_PIDISG_COLORSPACE, VT_LPWSTR,
  194.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  195.         PFID_ImageProperties, PTPI_ALL, PTIA_READONLY,
  196.         PTPIF_BASIC|PTPIF_INNATE, 
  197.         PTCTLID_DROPDOWN_COMBO, NULL )
  198.     DEFPROP_ENTRY( L"Gamma", FMTID_ImageSummaryInformation, PIDISI_GAMMAVALUE, IDS_PIDISG_GAMMAVALUE, VT_UI4,
  199.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  200.         PFID_ImageProperties, PTPI_ALL, PTIA_READONLY,
  201.         PTPIF_BASIC|PTPIF_INNATE, 
  202.         PTCTLID_DROPDOWN_COMBO, NULL )
  203.     DEFPROP_ENTRY( L"Compression", FMTID_ImageSummaryInformation, PIDISI_COMPRESSION, IDS_PIDISG_COMPRESSION, VT_LPWSTR,
  204.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  205.         PFID_ImageProperties, PTPI_ALL, PTIA_READONLY,
  206.         PTPIF_BASIC|PTPIF_INNATE, 
  207.         PTCTLID_DROPDOWN_COMBO, NULL )
  208.     //  Properties in the 'Fax' folder
  209.     DEFPROP_ENTRY( L"FaxTime", FMTID_FaxSummaryInformation, PIDFSI_TIME, IDS_PIDFSI_TIME, VT_FILETIME,
  210.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  211.         PFID_FaxProperties, PTPI_ALL, PTIA_READONLY,
  212.         PTPIF_BASIC|PTPIF_INNATE, 
  213.         PTCTLID_CALENDARTIME, NULL )
  214.     DEFPROP_ENTRY( L"FaxSenderName", FMTID_FaxSummaryInformation, PIDFSI_SENDERNAME, IDS_PIDFSI_SENDERNAME, VT_LPWSTR,
  215.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  216.         PFID_FaxProperties, PTPI_ALL, PTIA_READONLY,
  217.         PTPIF_BASIC|PTPIF_INNATE, 
  218.         PTCTLID_DROPDOWN_COMBO, NULL )
  219.     DEFPROP_ENTRY( L"FaxTSID", FMTID_FaxSummaryInformation, PIDFSI_TSID, IDS_PIDFSI_TSID, VT_LPWSTR,
  220.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  221.         PFID_FaxProperties, PTPI_ALL, PTIA_READONLY,
  222.         PTPIF_BASIC|PTPIF_INNATE, 
  223.         PTCTLID_DROPDOWN_COMBO, NULL )
  224.     DEFPROP_ENTRY( L"FaxCallerID", FMTID_FaxSummaryInformation, PIDFSI_CALLERID, IDS_PIDFSI_CALLERID, VT_LPWSTR,
  225.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  226.         PFID_FaxProperties, PTPI_ALL, PTIA_READONLY,
  227.         PTPIF_BASIC|PTPIF_INNATE, 
  228.         PTCTLID_DROPDOWN_COMBO, NULL )
  229.     DEFPROP_ENTRY( L"FaxRecipientName", FMTID_FaxSummaryInformation, PIDFSI_RECIPIENTNAME, IDS_PIDFSI_RECIPIENTNAME, VT_LPWSTR,
  230.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  231.         PFID_FaxProperties, PTPI_ALL, PTIA_READONLY,
  232.         PTPIF_BASIC|PTPIF_INNATE, 
  233.         PTCTLID_DROPDOWN_COMBO, NULL )
  234.     DEFPROP_ENTRY( L"FaxRecipientNumber", FMTID_FaxSummaryInformation, PIDFSI_RECIPIENTNUMBER, IDS_PIDFSI_RECIPIENTNUMBER, VT_LPWSTR,
  235.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  236.         PFID_FaxProperties, PTPI_ALL, PTIA_READONLY,
  237.         PTPIF_BASIC|PTPIF_INNATE, 
  238.         PTCTLID_DROPDOWN_COMBO, NULL )
  239.     DEFPROP_ENTRY( L"FaxCSID", FMTID_FaxSummaryInformation, PIDFSI_CSID, IDS_PIDFSI_CSID, VT_LPWSTR,
  240.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  241.         PFID_FaxProperties, PTPI_ALL, PTIA_READONLY,
  242.         PTPIF_BASIC|PTPIF_INNATE, 
  243.         PTCTLID_DROPDOWN_COMBO, NULL )
  244.     DEFPROP_ENTRY( L"FaxRouting", FMTID_FaxSummaryInformation, PIDFSI_ROUTING, IDS_PIDFSI_ROUTING, VT_LPWSTR,
  245.         PST_NOSTG|PST_NSS|PST_IMAGEFILE,
  246.         PFID_FaxProperties, PTPI_ALL, PTIA_READONLY,
  247.         PTPIF_BASIC|PTPIF_INNATE, 
  248.         PTCTLID_DROPDOWN_COMBO, NULL )
  249.     //  Properties in the 'Source' folder
  250.     DEFPROP_ENTRY( L"SequenceNo", FMTID_MediaFileSummaryInformation, PIDMSI_SEQUENCE_NO, IDS_PIDMSI_SEQUENCE_NO, VT_LPWSTR,
  251.         PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE,
  252.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  253.         PTPIF_MRU, 
  254.         PTCTLID_DROPDOWN_COMBO, NULL )
  255.     DEFPROP_ENTRY( L"Owner", FMTID_MediaFileSummaryInformation, PIDMSI_OWNER, IDS_PIDMSI_OWNER, VT_LPWSTR,
  256.         PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE,
  257.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  258.         PTPIF_MRU, 
  259.         PTCTLID_DROPDOWN_COMBO, NULL )
  260.     DEFPROP_ENTRY( L"Editor", FMTID_MediaFileSummaryInformation, PIDMSI_EDITOR, IDS_PIDMSI_EDITOR, VT_LPWSTR,
  261.         PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE,
  262.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  263.         PTPIF_MRU, 
  264.         PTCTLID_DROPDOWN_COMBO, NULL )
  265.     DEFPROP_ENTRY( L"Supplier", FMTID_MediaFileSummaryInformation, PIDMSI_SUPPLIER, IDS_PIDMSI_SUPPLIER, VT_LPWSTR,
  266.         PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE,
  267.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  268.         PTPIF_MRU, 
  269.         PTCTLID_DROPDOWN_COMBO, NULL )
  270.     DEFPROP_ENTRY( L"Source", FMTID_MediaFileSummaryInformation, PIDMSI_SOURCE, IDS_PIDMSI_SOURCE, VT_LPWSTR,
  271.         PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC,
  272.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  273.         PTPIF_MRU, 
  274.         PTCTLID_DROPDOWN_COMBO, NULL )
  275.     DEFPROP_ENTRY( L"Copyright", FMTID_MediaFileSummaryInformation, PIDMSI_COPYRIGHT, IDS_PIDMSI_COPYRIGHT, VT_LPSTR,
  276.         PST_NSS | PST_IMAGEFILE|PST_MEDIAFILE | PST_SHELLCOLUMN,
  277.         PFID_Origin, PTPI_ALL, PTIA_READONLY,
  278.         PTPIF_BASIC|PTPIF_INNATE, 
  279.         PTCTLID_DROPDOWN_COMBO, NULL )
  280.     DEFPROP_ENTRY( L"Project", FMTID_MediaFileSummaryInformation, PIDMSI_PROJECT, IDS_PIDMSI_PROJECT, VT_LPWSTR,
  281.         PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE,
  282.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  283.         PTPIF_MRU, 
  284.         PTCTLID_DROPDOWN_COMBO, NULL )
  285.     DEFPROP_ENUM_ENTRY( L"Status", FMTID_MediaFileSummaryInformation, PIDMSI_STATUS, IDS_PIDMSI_STATUS, VT_UI4,
  286.         PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE,
  287.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  288.         PTPIF_ENUM, 
  289.         PTCTLID_DROPLIST_COMBO, NULL,
  290.         DEFVALLIST_COUNT( MediaStatusVals ), MediaStatusVals )
  291.     DEFPROP_ENTRY( L"Author", FMTID_SummaryInformation, PIDSI_AUTHOR, IDS_PIDSI_AUTHOR, VT_LPSTR,
  292.         PST_OLESS|PST_DOCFILE | PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC | PST_SHELLCOLUMN,
  293.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  294.         PTPIF_MRU, 
  295.         PTCTLID_DROPDOWN_COMBO, NULL )
  296.     DEFPROP_ENTRY( L"LastAuthor", FMTID_SummaryInformation, PIDSI_LASTAUTHOR, IDS_PIDSI_LASTAUTHOR, VT_LPSTR,
  297.         PST_OLESS|PST_DOCFILE,
  298.         PFID_Origin, PTPI_ALL, PTIA_READONLY,
  299.         PTPIF_BASIC|PTPIF_INNATE, 
  300.         PTCTLID_DROPDOWN_COMBO, NULL )
  301.         
  302.     DEFPROP_ENTRY( L"RevNumber", FMTID_SummaryInformation, PIDSI_REVNUMBER, IDS_PIDSI_REVNUMBER, VT_LPSTR,
  303.         PST_OLESS|PST_DOCFILE | PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE|PST_UNKNOWNDOC,
  304.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  305.         PTPIF_MRU, 
  306.         PTCTLID_DROPDOWN_COMBO, NULL )
  307.     DEFPROP_ENTRY( L"AppName", FMTID_SummaryInformation, PIDSI_APPNAME,      IDS_PIDSI_APPNAME,        VT_LPSTR,
  308.         PST_OLESS|PST_DOCFILE,
  309.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  310.         PTPIF_MRU, 
  311.         PTCTLID_DROPDOWN_COMBO, NULL )
  312.     DEFPROP_ENTRY( L"PresentationTarget", FMTID_DocSummaryInformation, PIDDSI_PRESFORMAT,  IDS_PIDDSI_PRESFORMAT,  VT_LPSTR,
  313.         PST_OLESS|PST_DOCFILE,
  314.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  315.         PTPIF_MRU, 
  316.         PTCTLID_DROPDOWN_COMBO, NULL )
  317.     DEFPROP_ENTRY( L"Company", FMTID_DocSummaryInformation, PIDDSI_COMPANY,     IDS_PIDDSI_COMPANY,     VT_LPSTR,
  318.         PST_OLESS|PST_DOCFILE | PST_SHELLCOLUMN,
  319.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  320.         PTPIF_MRU, 
  321.         PTCTLID_DROPDOWN_COMBO, NULL )
  322.     DEFPROP_ENTRY( L"Manager", FMTID_DocSummaryInformation, PIDDSI_MANAGER,     IDS_PIDDSI_MANAGER,     VT_LPSTR,
  323.         PST_OLESS|PST_DOCFILE,
  324.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  325.         PTPIF_MRU, 
  326.         PTCTLID_DROPDOWN_COMBO, NULL )
  327.     DEFPROP_ENTRY( L"CreateDTM", FMTID_SummaryInformation, PIDSI_CREATE_DTM,   IDS_PIDSI_CREATE_DTM,     VT_FILETIME /*(UTC)*/,
  328.         PST_OLESS|PST_DOCFILE,
  329.         PFID_Origin, PTPI_ALL, PTIA_READONLY,
  330.         PTPIF_BASIC,
  331.         PTCTLID_CALENDARTIME, NULL )
  332.     DEFPROP_ENTRY( L"Production", FMTID_MediaFileSummaryInformation, PIDMSI_PRODUCTION, IDS_PIDMSI_PRODUCTION_DTM, VT_FILETIME /*(UTC)*/,
  333.         PST_NSS|PST_IMAGEFILE|PST_MEDIAFILE,
  334.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  335.         PTPIF_BASIC,
  336.         PTCTLID_CALENDARTIME, NULL )
  337.     DEFPROP_ENTRY( L"LastSaveDTM", FMTID_SummaryInformation, PIDSI_LASTSAVE_DTM, IDS_PIDSI_LASTSAVE_DTM,   VT_FILETIME /*(UTC)*/,
  338.         PST_OLESS|PST_DOCFILE,
  339.         PFID_Origin, PTPI_ALL, PTIA_READWRITE,
  340.         PTPIF_BASIC,
  341.         PTCTLID_CALENDARTIME, NULL )
  342.     DEFPROP_ENTRY( L"LastPrinted", FMTID_SummaryInformation, PIDSI_LASTPRINTED,  IDS_PIDSI_LASTPRINTED,    VT_FILETIME /*(UTC)*/,
  343.         PST_OLESS|PST_DOCFILE ,
  344.         PFID_Origin, PTPI_ALL, PTIA_READONLY,
  345.         PTPIF_BASIC|PTPIF_INNATE, 
  346.         PTCTLID_CALENDARTIME, NULL )
  347.     DEFPROP_ENTRY( L"EditTime", FMTID_SummaryInformation, PIDSI_EDITTIME,     IDS_PIDSI_EDITTIME,       VT_FILETIME /*(UTC)*/,
  348.         PST_OLESS|PST_DOCFILE,
  349.         PFID_Origin, PTPI_ALL, PTIA_READONLY,
  350.         PTPIF_BASIC|PTPIF_INNATE, 
  351.         PTCTLID_TIME, NULL )
  352. #if 0
  353.     DEFPROP_ENTRY( L"Security", FMTID_SummaryInformation, PIDSI_DOC_SECURITY, IDS_PIDSI_DOC_SECURITY,   VT_I4,
  354.         PST_OLESS|PST_DOCFILE,
  355.         PFID_Origin, PTPI_ALL, PTIA_READONLY,
  356.         PTPIF_BASIC|PTPIF_INNATE, 
  357.         PTCTLID_DROPDOWN_COMBO, NULL )
  358. #endif
  359. };
  360. //-------------------------------------------------------------------------//
  361. int DefFolderCount()
  362. {
  363.     return DEFFOLDER_ENTRY_COUNT( def_folder_items );
  364. }
  365. //-------------------------------------------------------------------------//
  366. EXTERN_C HRESULT MakeDefFolderItem( long iDefFolder, PROPFOLDERITEM* pItem, LPARAM lParam )
  367. {
  368.     ASSERT( iDefFolder < DEFFOLDER_ENTRY_COUNT( def_folder_items ) );
  369.     if( !pItem ) return E_POINTER ;
  370.     memset( pItem, 0, sizeof(PROPFOLDERITEM) );
  371.     const DEFFOLDERITEM* pDFI = &def_folder_items[iDefFolder];
  372.     pItem->cbStruct   = sizeof(PROPFOLDERITEM);
  373.     pItem->mask       = pDFI->mask ;
  374.     pItem->dwAccess   = pDFI->dwAccess ;
  375.     pItem->iOrder     = iDefFolder + 0xFFFF ;
  376.     pItem->lParam     = lParam ;
  377.     pItem->pfid       = *pDFI->ppfid ;
  378.     
  379.     LoadItemTags( pDFI->nIDStringRes, 
  380.                   pItem->bstrName, 
  381.                   pItem->bstrDisplayName, 
  382.                   pItem->bstrQtip );
  383.        
  384.     return S_OK ;
  385. }
  386. //-------------------------------------------------------------------------//
  387. BOOL IsDefFolderPFID( long iDefFolder, REFPFID refpfid )
  388. {
  389.     ASSERT( iDefFolder < DEFFOLDER_ENTRY_COUNT( def_folder_items ) );
  390.     return IsEqualGUID( *def_folder_items[iDefFolder].ppfid, refpfid );
  391. }
  392. //-------------------------------------------------------------------------//
  393. BOOL IsDefFolderStgType( long iDefFolder, ULONG dwSrcType )
  394. {
  395.     ASSERT( iDefFolder >= 0 && iDefFolder < DEFFOLDER_ENTRY_COUNT( def_folder_items ) );
  396.     return (GETSTGTYPE( dwSrcType ) & GETSTGTYPE( def_folder_items[iDefFolder].dwSrcType )) !=0 ;
  397. }
  398. //-------------------------------------------------------------------------//
  399. BOOL IsDefFolderDocType( long iDefFolder, ULONG dwSrcType )
  400. {
  401.     ASSERT( iDefFolder >= 0 && iDefFolder < DEFFOLDER_ENTRY_COUNT( def_folder_items ) );
  402.     return (GETDOCTYPE( dwSrcType ) & GETDOCTYPE( def_folder_items[iDefFolder].dwSrcType )) !=0 ;
  403. }
  404. //-------------------------------------------------------------------------//
  405. BOOL IsDefFolderSrcType( long iDefFolder, ULONG dwSrcType )
  406. {
  407.     ASSERT( iDefFolder >= 0 && iDefFolder < DEFFOLDER_ENTRY_COUNT( def_folder_items ) );
  408.     return IsDefFolderStgType( iDefFolder, dwSrcType ) &&
  409.            IsDefFolderDocType( iDefFolder, dwSrcType );
  410. }
  411. //-------------------------------------------------------------------------//
  412. //  Maps property identifier to defprop array index for fast indirection.
  413. class CDefPropMap : public TDictionaryBase< CPropertyUID, int >
  414. //-------------------------------------------------------------------------//
  415. {
  416. public:
  417.     CDefPropMap() : m_fInit( FALSE )    {  /*TRACE( TEXT("CDefPropMap::CDefPropMap()n") );*/ }
  418.     ~CDefPropMap()                      {  /*TRACE( TEXT("CDefPropMap::~CDefPropMap()n") );*/ }
  419.     
  420.     BOOL Initialize();
  421. protected:
  422.     virtual ULONG HashKey( const CPropertyUID& key ) const  { 
  423.         //TRACE( TEXT("CDefPropMap::HashKey()n") );
  424.         //TRACE( TEXT("CDefPropMap->this: 0x%08lX (__vfptr: 0x%08lX) n"), (ULONG)this, ((ULONG*)this)[0] );
  425.         return key.Hash();
  426.     }
  427. private:
  428.     BOOL m_fInit ;
  429. };
  430. static CDefPropMap  _DefPropMap ; // the one and only.
  431. //-------------------------------------------------------------------------//
  432. //  Stuffs default property map map with associations.
  433. BOOL CDefPropMap::Initialize()
  434. {
  435.     if( !m_fInit )
  436.     {
  437.         TRACE( TEXT("CDefPropMap::Initialize()n") );
  438.         CPropertyUID puid ;
  439.         int          i = -1 ;
  440.         // Initialize.
  441.         for( i=0; i<DEFPROP_ENTRY_COUNT( def_property_items ); i++ )
  442.         {
  443.             puid.Set( *def_property_items[i].pFmtID,
  444.                       def_property_items[i].propID,
  445.                       def_property_items[i].vt );
  446.             (*this)[puid] = i ;
  447.         }
  448.         
  449.         m_fInit = TRUE ;
  450.     }
  451.     return m_fInit ;
  452. }
  453. //-------------------------------------------------------------------------//
  454. long DefPropCount()
  455. {
  456.     return DEFPROP_ENTRY_COUNT( def_property_items );
  457. }
  458. //-------------------------------------------------------------------------//
  459. BOOL IsDefPropStgType( long iDefProp, ULONG dwSrcType )
  460. {
  461.     ASSERT( iDefProp >= 0 && iDefProp < DEFPROP_ENTRY_COUNT( def_property_items ) );
  462.     ULONG dwStgType = GETSTGTYPE( dwSrcType );
  463.     return (dwStgType & GETSTGTYPE( def_property_items[iDefProp].dwSrcType ))!=0 ;
  464. }
  465. //-------------------------------------------------------------------------//
  466. BOOL IsDefPropDocType( long iDefProp, ULONG dwSrcType )
  467. {
  468.     ASSERT( iDefProp >= 0 && iDefProp < DEFPROP_ENTRY_COUNT( def_property_items ) );
  469.     ULONG dwDocType = GETDOCTYPE( dwSrcType );
  470.     return (dwDocType & GETDOCTYPE( def_property_items[iDefProp].dwSrcType ))!=0 ;
  471. }
  472. //-------------------------------------------------------------------------//
  473. BOOL IsDefPropCxtType( long iDefProp, ULONG dwSrcType )
  474. {
  475.     ASSERT( iDefProp >= 0 && iDefProp < DEFPROP_ENTRY_COUNT( def_property_items ) );
  476.     ULONG dwCxtType = GETCXTTYPE( dwSrcType );
  477.     return (dwCxtType & GETCXTTYPE( def_property_items[iDefProp].dwSrcType ))!=0 ;
  478. }
  479. //-------------------------------------------------------------------------//
  480. BOOL IsDefPropSrcType( long iDefProp, ULONG dwSrcType )
  481. {
  482.     return IsDefPropStgType( iDefProp, dwSrcType ) &&
  483.            IsDefPropDocType( iDefProp, dwSrcType );
  484. }
  485. //-------------------------------------------------------------------------//
  486. BOOL DefPropHasFlags( long iDefProp, ULONG dwFlags )
  487. {
  488.     if( iDefProp<0 || iDefProp>= DEFPROP_ENTRY_COUNT( def_property_items ) )
  489.     {
  490.         ASSERT( FALSE );
  491.         return FALSE ;
  492.     }
  493.     return (def_property_items[iDefProp].dwFlags & dwFlags) != 0 ;
  494. }
  495.  
  496. //-------------------------------------------------------------------------//
  497. long FindDefPropertyItem( IN REFFMTID fmtID, IN PROPID propID, IN VARTYPE vt )
  498. {
  499.     CPropertyUID puid ;
  500.     int          i = -1 ;
  501.     //  If we haven't initialize our dictionary, do it now.
  502.     if( !_DefPropMap.Initialize() )
  503.         return i ;
  504.     //  Do a dictionary lookup:
  505.     puid.Set( fmtID, propID, vt );
  506.     if( !_DefPropMap.Lookup( puid, i ) )
  507.         return -1 ;
  508.     return i ;
  509. }
  510. //-------------------------------------------------------------------------//
  511. long FindDefPropertyItemLite( IN REFFMTID fmtID, IN PROPID propID )
  512. {
  513.     for( int i = 0; i < DefPropCount(); i++ )
  514.     {
  515.         if( propID == def_property_items[i].propID &&
  516.             IsEqualGUID( fmtID, *def_property_items[i].pFmtID ) )
  517.             return i ;
  518.     }
  519.     return -1 ;
  520. }
  521. //-------------------------------------------------------------------------//
  522. HRESULT GetDefPropertyItem( 
  523.     IN long iDefProp, 
  524.     OUT DEFPROPERTYITEM* pDefProp )
  525. {
  526.     if( iDefProp<0 || iDefProp>= DEFPROP_ENTRY_COUNT( def_property_items ) )
  527.         return E_INVALIDARG ;
  528.     if( !pDefProp )
  529.         return E_POINTER ;
  530.     *pDefProp = def_property_items[ iDefProp ];
  531.     return S_OK ;
  532. }
  533. //-------------------------------------------------------------------------//
  534. EXTERN_C HRESULT MakeDefPropertyItem(
  535.     long iDefProp,
  536.     PROPERTYITEM* pItem,
  537.     IN LPARAM lParam )
  538. {
  539.     if( iDefProp<0 || iDefProp>= DEFPROP_ENTRY_COUNT( def_property_items ) )
  540.         return E_INVALIDARG ;
  541.     pItem->cbStruct     = sizeof(*pItem);
  542.     pItem->mask         = def_property_items[iDefProp].mask ;
  543.     pItem->dwAccess     = def_property_items[iDefProp].dwAccess ;
  544.     pItem->iOrder       = iDefProp ;
  545.     pItem->puid.fmtid   = *def_property_items[iDefProp].pFmtID ;
  546.     pItem->puid.propid  = def_property_items[iDefProp].propID ;
  547.     pItem->puid.vt      = 
  548.     pItem->val.vt       = def_property_items[iDefProp].vt ;
  549.     pItem->pfid         = *def_property_items[iDefProp].ppfid ;
  550.     pItem->dwFlags      = def_property_items[iDefProp].dwFlags ;
  551.     pItem->ctlID        = def_property_items[iDefProp].ctlID ;
  552.     pItem->lParam       = lParam ;
  553.     pItem->val.vt       = pItem->puid.vt ;
  554.     LoadItemTags( def_property_items[iDefProp].nIDStringRes,
  555.                   pItem->bstrName, 
  556.                   pItem->bstrDisplayName, 
  557.                   pItem->bstrQtip );
  558.     return S_OK ;
  559. }
  560. //-------------------------------------------------------------------------//
  561. EXTERN_C HRESULT MakeDefPropertyItemEx( IN REFFMTID fmtID, IN PROPID propID, IN VARTYPE vt, OUT PROPERTYITEM* pItem, IN LPARAM lParam )
  562. {
  563.     long iDefProp ;
  564.     if( (iDefProp = FindDefPropertyItem( fmtID, propID, vt )) >= 0 )
  565.         return MakeDefPropertyItem( iDefProp, pItem, lParam );
  566.     return E_ABORT ;
  567. }
  568. //-------------------------------------------------------------------------//
  569. HRESULT GetDefPropItemID( IN long iDefProp, OUT const FMTID** pFmtID, OUT PROPID* pPropID, OUT VARTYPE* pVt )
  570. {
  571.     if( !VALID_DEFPROP_ENTRY( iDefProp, def_property_items ) )
  572.         return E_INVALIDARG ;
  573.     if( pFmtID )
  574.         *pFmtID = def_property_items[iDefProp].pFmtID ;
  575.     if( pPropID )
  576.         *pPropID = def_property_items[iDefProp].propID ;
  577.     if( pVt )
  578.         *pVt = def_property_items[iDefProp].vt ;
  579.     return S_OK ;
  580. }
  581. //-------------------------------------------------------------------------//
  582. //  Helper function to load and parse folder and property item display and Qtip tags.
  583. HRESULT LoadItemTags( UINT nIDS, BSTR& bstrName, BSTR& bstrDisplayName, BSTR& bstrQtip )
  584. {
  585.     TCHAR   szBuf[MAX_STRINGRES+1];
  586.     HRESULT hr = E_FAIL ;
  587.     if( LoadString( _Module.GetResourceInstance(), nIDS,
  588.                     szBuf, MAX_STRINGRES )>0 )
  589.     {
  590.         PSTRTOK pTokenList = NULL, pTok ;
  591.         USES_CONVERSION ;
  592.         VERIFY( GetTokens( szBuf, TEXT("|"), &pTokenList ) > 0 );
  593.         pTok = pTokenList ;
  594.         
  595.         //  Programmatic name
  596.         if( pTok != NULL && pTok->cchTok > 0 )
  597.         {
  598.             bstrName = SysAllocString( T2W( (LPTSTR)pTok->pszTok ) );
  599.             pTok = pTok->pNext ;
  600.         }
  601.         //  Display name
  602.         if( pTok != NULL && pTok->cchTok > 0 )
  603.         {
  604.             bstrDisplayName = SysAllocString( T2W( (LPTSTR)pTok->pszTok ) );
  605.             pTok = pTok->pNext ;
  606.         }
  607.         //  Quick tip text
  608.         if( pTok != NULL && pTok->cchTok > 0 )
  609.         {
  610.             bstrQtip = SysAllocString( T2W( (LPTSTR)pTok->pszTok ) );
  611.             pTok = pTok->pNext ;
  612.         }
  613.         FreeTokens( &pTokenList );
  614.         hr = S_OK ;
  615.     }
  616.     return hr ;
  617. }
  618. //-------------------------------------------------------------------------//
  619. HRESULT GetDefPropItemValues( IN long iDefProp, OUT DEFVAL const** paDefVals, OUT ULONG* pcDefVals )
  620. {
  621.     if( !VALID_DEFPROP_ENTRY( iDefProp, def_property_items ) )
  622.         return E_INVALIDARG ;
  623.     if( paDefVals ) *paDefVals = def_property_items[iDefProp].pDefVals ;
  624.     if( pcDefVals ) *pcDefVals = def_property_items[iDefProp].cDefVals ;
  625.     return S_OK ;
  626. }