1f8e2c85aSAndrew Rist /**************************************************************
2*48fbb544Smseidel *
3f8e2c85aSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4f8e2c85aSAndrew Rist * or more contributor license agreements. See the NOTICE file
5f8e2c85aSAndrew Rist * distributed with this work for additional information
6f8e2c85aSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7f8e2c85aSAndrew Rist * to you under the Apache License, Version 2.0 (the
8f8e2c85aSAndrew Rist * "License"); you may not use this file except in compliance
9f8e2c85aSAndrew Rist * with the License. You may obtain a copy of the License at
10*48fbb544Smseidel *
11f8e2c85aSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*48fbb544Smseidel *
13f8e2c85aSAndrew Rist * Unless required by applicable law or agreed to in writing,
14f8e2c85aSAndrew Rist * software distributed under the License is distributed on an
15f8e2c85aSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16f8e2c85aSAndrew Rist * KIND, either express or implied. See the License for the
17f8e2c85aSAndrew Rist * specific language governing permissions and limitations
18f8e2c85aSAndrew Rist * under the License.
19*48fbb544Smseidel *
20f8e2c85aSAndrew Rist *************************************************************/
21f8e2c85aSAndrew Rist
22f8e2c85aSAndrew 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 {
43*48fbb544Smseidel {{PSGUID_SUMMARYINFORMATION, PIDSI_TITLE}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Title", L"Title"},
44*48fbb544Smseidel {{PSGUID_SUMMARYINFORMATION, PIDSI_AUTHOR}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Author", L"Author"},
45*48fbb544Smseidel {{PSGUID_SUMMARYINFORMATION, PIDSI_SUBJECT}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Subject", L"Subject"},
46*48fbb544Smseidel {{PSGUID_SUMMARYINFORMATION, PIDSI_KEYWORDS}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Keywords", L"Keywords"},
47*48fbb544Smseidel {{PSGUID_SUMMARYINFORMATION, PIDSI_COMMENTS}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Comments", L"Comments"},
48*48fbb544Smseidel {{PSGUID_SUMMARYINFORMATION, PIDSI_PAGECOUNT}, VT_BSTR, LVCFMT_LEFT, 30, SHCOLSTATE_TYPE_STR, L"Pagecount", L"Pagecount"}
49cdf0e10cSrcweir };
50*48fbb544Smseidel
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 {
70*48fbb544Smseidel 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
81*48fbb544Smseidel 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 }
88*48fbb544Smseidel
89cdf0e10cSrcweir return E_NOINTERFACE;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
92cdf0e10cSrcweir //----------------------------
93*48fbb544Smseidel //
94cdf0e10cSrcweir //----------------------------
95*48fbb544Smseidel
AddRef(void)96cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CColumnInfo::AddRef(void)
97cdf0e10cSrcweir {
98cdf0e10cSrcweir return InterlockedIncrement(&m_RefCnt);
99cdf0e10cSrcweir }
100cdf0e10cSrcweir
101cdf0e10cSrcweir //----------------------------
102*48fbb544Smseidel //
103cdf0e10cSrcweir //----------------------------
104*48fbb544Smseidel
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
133*48fbb544Smseidel // Return information on each column we support. Return S_FALSE
134*48fbb544Smseidel // to indicate that we have returned information on all our
135*48fbb544Smseidel // columns. GetColumnInfo will be called repeatedly until S_FALSE
136*48fbb544Smseidel // or an error is returned
137cdf0e10cSrcweir psci->scid.fmtid = ColumnInfoTable[dwIndex].scid.fmtid;
138cdf0e10cSrcweir psci->scid.pid = ColumnInfoTable[dwIndex].scid.pid;
139*48fbb544Smseidel ZeroMemory(psci->wszTitle, sizeof(psci->wszTitle));
140*48fbb544Smseidel 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 //-----------------------------
148*48fbb544Smseidel //
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 {
157*48fbb544Smseidel std::wstring fname = getShortPathName( std::wstring( pscd->wszFile ) );
158cdf0e10cSrcweir
159cdf0e10cSrcweir CMetaInfoReader meta_info_accessor(WStringToString(fname));
160*48fbb544Smseidel
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());
167*48fbb544Smseidel
168cdf0e10cSrcweir return S_OK;
169cdf0e10cSrcweir }
170cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_AUTHOR)
171cdf0e10cSrcweir {
172*48fbb544Smseidel pvarData->vt = VT_BSTR;
173cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagData( META_INFO_AUTHOR).c_str());
174*48fbb544Smseidel
175cdf0e10cSrcweir return S_OK;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_SUBJECT)
178cdf0e10cSrcweir {
179*48fbb544Smseidel pvarData->vt = VT_BSTR;
180cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagData( META_INFO_SUBJECT).c_str());
181*48fbb544Smseidel
182cdf0e10cSrcweir return S_OK;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_KEYWORDS)
185cdf0e10cSrcweir {
186*48fbb544Smseidel pvarData->vt = VT_BSTR;
187cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagData( META_INFO_KEYWORDS).c_str());
188*48fbb544Smseidel
189cdf0e10cSrcweir return S_OK;
190cdf0e10cSrcweir }
191cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_COMMENTS)
192cdf0e10cSrcweir {
193*48fbb544Smseidel pvarData->vt = VT_BSTR;
194cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagData( META_INFO_DESCRIPTION).c_str());
195*48fbb544Smseidel
196cdf0e10cSrcweir return S_OK;
197*48fbb544Smseidel }
198cdf0e10cSrcweir else if (IsEqualGUID (pscid->fmtid, FMTID_SummaryInformation) && pscid->pid == PIDSI_PAGECOUNT)
199cdf0e10cSrcweir {
200*48fbb544Smseidel pvarData->vt = VT_BSTR;
201cdf0e10cSrcweir pvarData->bstrVal = SysAllocString(meta_info_accessor.getTagAttribute( META_INFO_DOCUMENT_STATISTIC, META_INFO_PAGES).c_str());
202*48fbb544Smseidel
203cdf0e10cSrcweir return S_OK;
204*48fbb544Smseidel }
205cdf0e10cSrcweir }
206cdf0e10cSrcweir catch (const std::exception&)
207cdf0e10cSrcweir {
208cdf0e10cSrcweir return S_FALSE;
209cdf0e10cSrcweir }
210cdf0e10cSrcweir }
211cdf0e10cSrcweir
212cdf0e10cSrcweir return S_FALSE;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir
215cdf0e10cSrcweir //-----------------------------
216*48fbb544Smseidel //
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
227*48fbb544Smseidel return false;
228cdf0e10cSrcweir }
229*48fbb544Smseidel
230*48fbb544Smseidel /* vim: set noet sw=4 ts=4: */
231