1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_shell.hxx" 26 27 //+------------------------------------------------------------------------- 28 // 29 // File: propspec.cxx 30 // 31 // Contents: C++ wrappers for FULLPROPSPEC 32 // 33 //-------------------------------------------------------------------------- 34 #if defined _MSC_VER 35 #pragma warning(push, 1) 36 #endif 37 #include <windows.h> 38 #ifdef _MSC_VER 39 #pragma warning(disable: 4512) 40 #endif 41 #include <filter.h> 42 #if defined _MSC_VER 43 #pragma warning(pop) 44 #endif 45 46 #include "propspec.hxx" 47 48 //GUID CLSID_Storage = PSGUID_STORAGE; 49 // 50 // 51 //refer to ms-help://MS.VSCC/MS.MSDNVS.2052/com/stgasstg_7agk.htm 52 //FMTID_SummaryInformation 53 // 54 //GUID CLSID_SummaryInforation = { 55 // 0xF29F85E0, 56 // 0x4FF9, 57 // 0x1068, 58 // { 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9 } 59 //}; 60 //+------------------------------------------------------------------------- 61 // 62 // Member: CFullPropSpec::CFullPropSpec, public 63 // 64 // Synopsis: Default constructor 65 // 66 // Effects: Defines property with null guid and propid 0 67 // 68 //-------------------------------------------------------------------------- 69 70 CFullPropSpec::CFullPropSpec() 71 { 72 memset( &_guidPropSet, 0, sizeof( _guidPropSet ) ); 73 _psProperty.ulKind = PRSPEC_PROPID; 74 _psProperty.propid = 0; 75 } 76 //+------------------------------------------------------------------------- 77 // 78 // Member: CFullPropSpec::CFullPropSpec, public 79 // 80 // Synopsis: Construct propid based propspec 81 // 82 // Arguments: [guidPropSet] -- Property set 83 // [pidProperty] -- Property 84 // 85 //-------------------------------------------------------------------------- 86 CFullPropSpec::CFullPropSpec( GUID const & guidPropSet, PROPID pidProperty ) : 87 _guidPropSet( guidPropSet ) 88 { 89 _psProperty.ulKind = PRSPEC_PROPID; 90 _psProperty.propid = pidProperty; 91 } 92 //+------------------------------------------------------------------------- 93 // 94 // Member: CFullPropSpec::CFullPropSpec, public 95 // 96 // Synopsis: Construct name based propspec 97 // 98 // Arguments: [guidPropSet] -- Property set 99 // [wcsProperty] -- Property 100 // 101 //-------------------------------------------------------------------------- 102 CFullPropSpec::CFullPropSpec( GUID const & guidPropSet, 103 WCHAR const * wcsProperty ) : 104 _guidPropSet( guidPropSet ) 105 { 106 _psProperty.ulKind = PRSPEC_PROPID; 107 SetProperty( wcsProperty ); 108 } 109 //+------------------------------------------------------------------------- 110 // 111 // Member: CFullPropSpec::CFullPropSpec, public 112 // 113 // Synopsis: Copy constructor 114 // 115 // Arguments: [src] -- Source property spec 116 // 117 //-------------------------------------------------------------------------- 118 CFullPropSpec::CFullPropSpec( CFullPropSpec const & src ) : 119 _guidPropSet( src._guidPropSet ) 120 { 121 _psProperty.ulKind = src._psProperty.ulKind; 122 if ( _psProperty.ulKind == PRSPEC_LPWSTR ) 123 { 124 if ( src._psProperty.lpwstr ) 125 { 126 _psProperty.ulKind = PRSPEC_PROPID; 127 SetProperty( src._psProperty.lpwstr ); 128 } 129 else 130 _psProperty.lpwstr = 0; 131 } 132 else 133 { 134 _psProperty.propid = src._psProperty.propid; 135 } 136 } 137 inline void * operator new( size_t /*size*/, void * p ) 138 { 139 return( p ); 140 } 141 //+------------------------------------------------------------------------- 142 // 143 // Member: CFullPropSpec::operator=, public 144 // 145 // Synopsis: Assignment operator 146 // 147 // Arguments: [Property] -- Source property 148 // 149 //-------------------------------------------------------------------------- 150 CFullPropSpec & CFullPropSpec::operator=( CFullPropSpec const & Property ) 151 { 152 // Clean up. 153 this->CFullPropSpec::~CFullPropSpec(); 154 155 #ifdef _MSC_VER 156 #pragma warning( disable : 4291 ) // unmatched operator new 157 #endif 158 new (this) CFullPropSpec( Property ); 159 #ifdef _MSC_VER 160 #pragma warning( default : 4291 ) 161 #endif 162 return *this; 163 } 164 CFullPropSpec::~CFullPropSpec() 165 { 166 if ( _psProperty.ulKind == PRSPEC_LPWSTR && 167 _psProperty.lpwstr ) 168 { 169 CoTaskMemFree( _psProperty.lpwstr ); 170 } 171 } 172 void CFullPropSpec::SetProperty( PROPID pidProperty ) 173 { 174 if ( _psProperty.ulKind == PRSPEC_LPWSTR && 175 0 != _psProperty.lpwstr ) 176 { 177 CoTaskMemFree( _psProperty.lpwstr ); 178 } 179 _psProperty.ulKind = PRSPEC_PROPID; 180 _psProperty.propid = pidProperty; 181 } 182 BOOL CFullPropSpec::SetProperty( WCHAR const * wcsProperty ) 183 { 184 if ( _psProperty.ulKind == PRSPEC_LPWSTR && 185 0 != _psProperty.lpwstr ) 186 { 187 CoTaskMemFree( _psProperty.lpwstr ); 188 } 189 _psProperty.ulKind = PRSPEC_LPWSTR; 190 int len = (int) ( (wcslen( wcsProperty ) + 1) * sizeof( WCHAR ) ); 191 _psProperty.lpwstr = (WCHAR *)CoTaskMemAlloc( len ); 192 if ( 0 != _psProperty.lpwstr ) 193 { 194 memcpy( _psProperty.lpwstr, 195 wcsProperty, 196 len ); 197 return( TRUE ); 198 } 199 else 200 { 201 _psProperty.lpwstr = 0; 202 return( FALSE ); 203 } 204 } 205 int CFullPropSpec::operator==( CFullPropSpec const & prop ) const 206 { 207 if ( memcmp( &prop._guidPropSet, 208 &_guidPropSet, 209 sizeof( _guidPropSet ) ) != 0 || 210 prop._psProperty.ulKind != _psProperty.ulKind ) 211 { 212 return( 0 ); 213 } 214 switch( _psProperty.ulKind ) 215 { 216 case PRSPEC_LPWSTR: 217 return( _wcsicmp( GetPropertyName(), prop.GetPropertyName() ) == 0 ); 218 break; 219 case PRSPEC_PROPID: 220 return( GetPropertyPropid() == prop.GetPropertyPropid() ); 221 break; 222 default: 223 return( 0 ); 224 break; 225 } 226 } 227 int CFullPropSpec::operator!=( CFullPropSpec const & prop ) const 228 { 229 if (*this == prop) 230 return( 0 ); 231 else 232 return( 1 ); 233 } 234 235