1*f8e2c85aSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*f8e2c85aSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*f8e2c85aSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*f8e2c85aSAndrew Rist * distributed with this work for additional information
6*f8e2c85aSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*f8e2c85aSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*f8e2c85aSAndrew Rist * "License"); you may not use this file except in compliance
9*f8e2c85aSAndrew Rist * with the License. You may obtain a copy of the License at
10*f8e2c85aSAndrew Rist *
11*f8e2c85aSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*f8e2c85aSAndrew Rist *
13*f8e2c85aSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*f8e2c85aSAndrew Rist * software distributed under the License is distributed on an
15*f8e2c85aSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f8e2c85aSAndrew Rist * KIND, either express or implied. See the License for the
17*f8e2c85aSAndrew Rist * specific language governing permissions and limitations
18*f8e2c85aSAndrew Rist * under the License.
19*f8e2c85aSAndrew Rist *
20*f8e2c85aSAndrew Rist *************************************************************/
21*f8e2c85aSAndrew Rist
22*f8e2c85aSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_shell.hxx"
26cdf0e10cSrcweir #include "internal/global.hxx"
27cdf0e10cSrcweir #include "internal/columninfo.hxx"
28cdf0e10cSrcweir #include "internal/fileextensions.hxx"
29cdf0e10cSrcweir #include "internal/metainforeader.hxx"
30cdf0e10cSrcweir #include "internal/utilities.hxx"
31cdf0e10cSrcweir #include "internal/config.hxx"
32cdf0e10cSrcweir
33cdf0e10cSrcweir #include <malloc.h>
34cdf0e10cSrcweir
35cdf0e10cSrcweir //----------------------------
36cdf0e10cSrcweir //
37cdf0e10cSrcweir //----------------------------
38cdf0e10cSrcweir
39cdf0e10cSrcweir namespace /* private */
40cdf0e10cSrcweir {
41cdf0e10cSrcweir SHCOLUMNINFO ColumnInfoTable[] =
42cdf0e10cSrcweir {
43cdf0e10cSrcweir {{PSGUID_SUMMARYINFORMATION, PIDSI_TITLE}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Title", L"Title"},
44cdf0e10cSrcweir {{PSGUID_SUMMARYINFORMATION, PIDSI_AUTHOR}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Author", L"Author"},
45cdf0e10cSrcweir {{PSGUID_SUMMARYINFORMATION, PIDSI_SUBJECT}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Subject", L"Subject"},
46cdf0e10cSrcweir {{PSGUID_SUMMARYINFORMATION, PIDSI_KEYWORDS}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Keywords", L"Keywords"},
47cdf0e10cSrcweir {{PSGUID_SUMMARYINFORMATION, PIDSI_COMMENTS}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Comments", L"Comments"},
48cdf0e10cSrcweir {{PSGUID_SUMMARYINFORMATION, PIDSI_PAGECOUNT},VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Pagecount", L"Pagecount"}
49cdf0e10cSrcweir };
50cdf0e10cSrcweir
51cdf0e10cSrcweir size_t ColumnInfoTableSize = sizeof(ColumnInfoTable)/sizeof(ColumnInfoTable[0]);
52cdf0e10cSrcweir }
53cdf0e10cSrcweir
54cdf0e10cSrcweir //----------------------------
55cdf0e10cSrcweir //
56cdf0e10cSrcweir //----------------------------
57cdf0e10cSrcweir
CColumnInfo(long RefCnt)58cdf0e10cSrcweir CColumnInfo::CColumnInfo(long RefCnt) :
59cdf0e10cSrcweir m_RefCnt(RefCnt)
60cdf0e10cSrcweir {
61cdf0e10cSrcweir InterlockedIncrement(&g_DllRefCnt);
62cdf0e10cSrcweir }
63cdf0e10cSrcweir
64cdf0e10cSrcweir //----------------------------
65cdf0e10cSrcweir //
66cdf0e10cSrcweir //----------------------------
67cdf0e10cSrcweir
~CColumnInfo()68cdf0e10cSrcweir CColumnInfo::~CColumnInfo()
69cdf0e10cSrcweir {
70cdf0e10cSrcweir InterlockedDecrement(&g_DllRefCnt);
71cdf0e10cSrcweir }
72cdf0e10cSrcweir
73cdf0e10cSrcweir //-----------------------------
74cdf0e10cSrcweir // IUnknown methods
75cdf0e10cSrcweir //-----------------------------
76cdf0e10cSrcweir
QueryInterface(REFIID riid,void __RPC_FAR * __RPC_FAR * ppvObject)77cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CColumnInfo::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject)
78cdf0e10cSrcweir {
79cdf0e10cSrcweir *ppvObject = 0;
80cdf0e10cSrcweir
81cdf0e10cSrcweir if (IID_IUnknown == riid || IID_IColumnProvider == riid)
82cdf0e10cSrcweir {
83cdf0e10cSrcweir IUnknown* pUnk = static_cast<IColumnProvider*>(this);
84cdf0e10cSrcweir pUnk->AddRef();
85cdf0e10cSrcweir *ppvObject = pUnk;
86cdf0e10cSrcweir return S_OK;
87cdf0e10cSrcweir }
88cdf0e10cSrcweir
89cdf0e10cSrcweir return E_NOINTERFACE;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
92cdf0e10cSrcweir //----------------------------
93cdf0e10cSrcweir //
94cdf0e10cSrcweir //----------------------------
95cdf0e10cSrcweir
AddRef(void)96cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CColumnInfo::AddRef(void)
97cdf0e10cSrcweir {
98cdf0e10cSrcweir return InterlockedIncrement(&m_RefCnt);
99cdf0e10cSrcweir }
100cdf0e10cSrcweir
101cdf0e10cSrcweir //----------------------------
102cdf0e10cSrcweir //
103cdf0e10cSrcweir //----------------------------
104cdf0e10cSrcweir
Release(void)105cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CColumnInfo::Release( void)
106cdf0e10cSrcweir {
107cdf0e10cSrcweir long refcnt = InterlockedDecrement(&m_RefCnt);
108cdf0e10cSrcweir
109cdf0e10cSrcweir if (0 == m_RefCnt)
110cdf0e10cSrcweir delete this;
111cdf0e10cSrcweir
112cdf0e10cSrcweir return refcnt;
113cdf0e10cSrcweir }
114cdf0e10cSrcweir
115cdf0e10cSrcweir //-----------------------------
116cdf0e10cSrcweir // IColumnProvider
117cdf0e10cSrcweir //-----------------------------
118cdf0e10cSrcweir
Initialize(LPCSHCOLUMNINIT)119cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CColumnInfo::Initialize(LPCSHCOLUMNINIT /*psci*/)
120cdf0e10cSrcweir {
121cdf0e10cSrcweir return S_OK;
122cdf0e10cSrcweir }
123cdf0e10cSrcweir
124cdf0e10cSrcweir //-----------------------------
125cdf0e10cSrcweir // Register all columns we support
126cdf0e10cSrcweir //-----------------------------
127cdf0e10cSrcweir
GetColumnInfo(DWORD dwIndex,SHCOLUMNINFO * psci)128cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CColumnInfo::GetColumnInfo(DWORD dwIndex, SHCOLUMNINFO *psci)
129cdf0e10cSrcweir {
130cdf0e10cSrcweir if (dwIndex >= ColumnInfoTableSize)
131cdf0e10cSrcweir return S_FALSE;
132cdf0e10cSrcweir
133cdf0e10cSrcweir // Return information on each column we support. Return S_FALSE
134cdf0e10cSrcweir // to indicate that we have returned information on all our
135cdf0e10cSrcweir // columns. GetColumnInfo will be called repeatedly until S_FALSE
136cdf0e10cSrcweir // or an error is returned
137cdf0e10cSrcweir psci->scid.fmtid = ColumnInfoTable[dwIndex].scid.fmtid;
138cdf0e10cSrcweir psci->scid.pid = ColumnInfoTable[dwIndex].scid.pid;
139cdf0e10cSrcweir ZeroMemory(psci->wszTitle, sizeof(psci->wszTitle));
140cdf0e10cSrcweir wcsncpy(psci->wszTitle, ColumnInfoTable[dwIndex].wszTitle, (sizeof(psci->wszTitle) - 1));
141cdf0e10cSrcweir
142cdf0e10cSrcweir //wcscpy(psci->wszTitle, ColumnInfoTable[dwIndex].wszTitle);
143cdf0e10cSrcweir
144cdf0e10cSrcweir return S_OK;
145cdf0e10cSrcweir }
146cdf0e10cSrcweir
147cdf0e10cSrcweir //-----------------------------
148cdf0e10cSrcweir //
149cdf0e10cSrcweir //-----------------------------
150cdf0e10cSrcweir
GetItemData(LPCSHCOLUMNID pscid,LPCSHCOLUMNDATA pscd,VARIANT * pvarData)151cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CColumnInfo::GetItemData(LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT *pvarData)
152cdf0e10cSrcweir {
153cdf0e10cSrcweir if (IsOOFileExtension(pscd->pwszExt))
154cdf0e10cSrcweir {
155cdf0e10cSrcweir try
156cdf0e10cSrcweir {
157cdf0e10cSrcweir std::wstring fname = getShortPathName( std::wstring( pscd->wszFile ) );
158cdf0e10cSrcweir
159cdf0e10cSrcweir CMetaInfoReader meta_info_accessor(WStringToString(fname));
160cdf0e10cSrcweir
161cdf0e10cSrcweir VariantClear(pvarData);
162cdf0e10cSrcweir
163cdf0e10cSrcweir if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_TITLE)
164cdf0e10cSrcweir {
165cdf0e10cSrcweir pvarData->vt = VT_BSTR;
166cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagData( META_INFO_TITLE ).c_str());
167cdf0e10cSrcweir
168cdf0e10cSrcweir return S_OK;
169cdf0e10cSrcweir }
170cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_AUTHOR)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir pvarData->vt = VT_BSTR;
173cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagData( META_INFO_AUTHOR).c_str());
174cdf0e10cSrcweir
175cdf0e10cSrcweir return S_OK;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_SUBJECT)
178cdf0e10cSrcweir {
179cdf0e10cSrcweir pvarData->vt = VT_BSTR;
180cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagData( META_INFO_SUBJECT).c_str());
181cdf0e10cSrcweir
182cdf0e10cSrcweir return S_OK;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_KEYWORDS)
185cdf0e10cSrcweir {
186cdf0e10cSrcweir pvarData->vt = VT_BSTR;
187cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagData( META_INFO_KEYWORDS).c_str());
188cdf0e10cSrcweir
189cdf0e10cSrcweir return S_OK;
190cdf0e10cSrcweir }
191cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_COMMENTS)
192cdf0e10cSrcweir {
193cdf0e10cSrcweir pvarData->vt = VT_BSTR;
194cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagData( META_INFO_DESCRIPTION).c_str());
195cdf0e10cSrcweir
196cdf0e10cSrcweir return S_OK;
197cdf0e10cSrcweir }
198cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_PAGECOUNT)
199cdf0e10cSrcweir {
200cdf0e10cSrcweir pvarData->vt = VT_BSTR;
201cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagAttribute( META_INFO_DOCUMENT_STATISTIC, META_INFO_PAGES).c_str());
202cdf0e10cSrcweir
203cdf0e10cSrcweir return S_OK;
204cdf0e10cSrcweir }
205cdf0e10cSrcweir }
206cdf0e10cSrcweir catch (const std::exception&)
207cdf0e10cSrcweir {
208cdf0e10cSrcweir return S_FALSE;
209cdf0e10cSrcweir }
210cdf0e10cSrcweir }
211cdf0e10cSrcweir
212cdf0e10cSrcweir return S_FALSE;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir
215cdf0e10cSrcweir //-----------------------------
216cdf0e10cSrcweir //
217cdf0e10cSrcweir //-----------------------------
218cdf0e10cSrcweir
IsOOFileExtension(wchar_t * Extension) const219cdf0e10cSrcweir bool CColumnInfo::IsOOFileExtension(wchar_t* Extension) const
220cdf0e10cSrcweir {
221cdf0e10cSrcweir for (size_t i = 0; i < OOFileExtensionTableSize; i++)
222cdf0e10cSrcweir {
223cdf0e10cSrcweir if (0 == _wcsicmp(Extension, OOFileExtensionTable[i].ExtensionUnicode))
224cdf0e10cSrcweir return true;
225cdf0e10cSrcweir }
226cdf0e10cSrcweir
227cdf0e10cSrcweir return false;
228cdf0e10cSrcweir }
229