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_SummaryInformation = {
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 
CFullPropSpec()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 //--------------------------------------------------------------------------
CFullPropSpec(GUID const & guidPropSet,PROPID pidProperty)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 //--------------------------------------------------------------------------
CFullPropSpec(GUID const & guidPropSet,WCHAR const * wcsProperty)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 //--------------------------------------------------------------------------
CFullPropSpec(CFullPropSpec const & src)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 }
operator new(size_t,void * p)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 //--------------------------------------------------------------------------
operator =(CFullPropSpec const & Property)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 }
~CFullPropSpec()164 CFullPropSpec::~CFullPropSpec()
165 {
166     if ( _psProperty.ulKind == PRSPEC_LPWSTR &&
167          _psProperty.lpwstr )
168     {
169         CoTaskMemFree( _psProperty.lpwstr );
170     }
171 }
SetProperty(PROPID pidProperty)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 }
SetProperty(WCHAR const * wcsProperty)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 }
operator ==(CFullPropSpec const & prop) const205 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 }
operator !=(CFullPropSpec const & prop) const227 int CFullPropSpec::operator!=( CFullPropSpec const & prop ) const
228 {
229     if (*this == prop)
230         return( 0 );
231     else
232         return( 1 );
233 }
234