1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_shell.hxx" 30*cdf0e10cSrcweir #include "internal/global.hxx" 31*cdf0e10cSrcweir #include "internal/infotips.hxx" 32*cdf0e10cSrcweir #include "internal/shlxthdl.hxx" 33*cdf0e10cSrcweir #include "internal/metainforeader.hxx" 34*cdf0e10cSrcweir #include "internal/contentreader.hxx" 35*cdf0e10cSrcweir #include "internal/utilities.hxx" 36*cdf0e10cSrcweir #include "internal/registry.hxx" 37*cdf0e10cSrcweir #include "internal/fileextensions.hxx" 38*cdf0e10cSrcweir #include "internal/iso8601_converter.hxx" 39*cdf0e10cSrcweir #include "internal/config.hxx" 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include "internal/resource.h" 42*cdf0e10cSrcweir #include <stdio.h> 43*cdf0e10cSrcweir #include <utility> 44*cdf0e10cSrcweir #include <stdlib.h> 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir #define MAX_STRING 80 48*cdf0e10cSrcweir #define KB 1024.0 49*cdf0e10cSrcweir const std::wstring WSPACE = std::wstring(SPACE); 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir //----------------------------- 52*cdf0e10cSrcweir // 53*cdf0e10cSrcweir //----------------------------- 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir CInfoTip::CInfoTip(long RefCnt) : 56*cdf0e10cSrcweir m_RefCnt(RefCnt) 57*cdf0e10cSrcweir { 58*cdf0e10cSrcweir ZeroMemory(m_szFileName, sizeof(m_szFileName)); 59*cdf0e10cSrcweir InterlockedIncrement(&g_DllRefCnt); 60*cdf0e10cSrcweir } 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir //----------------------------- 63*cdf0e10cSrcweir // 64*cdf0e10cSrcweir //----------------------------- 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir CInfoTip::~CInfoTip() 67*cdf0e10cSrcweir { 68*cdf0e10cSrcweir InterlockedDecrement(&g_DllRefCnt); 69*cdf0e10cSrcweir } 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir //----------------------------- 72*cdf0e10cSrcweir // IUnknown methods 73*cdf0e10cSrcweir //----------------------------- 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CInfoTip::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject) 76*cdf0e10cSrcweir { 77*cdf0e10cSrcweir *ppvObject = 0; 78*cdf0e10cSrcweir 79*cdf0e10cSrcweir IUnknown* pUnk = 0; 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir if (IID_IUnknown == riid || IID_IQueryInfo == riid) 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir pUnk = static_cast<IQueryInfo*>(this); 84*cdf0e10cSrcweir pUnk->AddRef(); 85*cdf0e10cSrcweir *ppvObject = pUnk; 86*cdf0e10cSrcweir return S_OK; 87*cdf0e10cSrcweir } 88*cdf0e10cSrcweir else if (IID_IPersistFile == riid) 89*cdf0e10cSrcweir { 90*cdf0e10cSrcweir pUnk = static_cast<IPersistFile*>(this); 91*cdf0e10cSrcweir pUnk->AddRef(); 92*cdf0e10cSrcweir *ppvObject = pUnk; 93*cdf0e10cSrcweir return S_OK; 94*cdf0e10cSrcweir } 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir return E_NOINTERFACE; 97*cdf0e10cSrcweir } 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir //---------------------------- 100*cdf0e10cSrcweir // 101*cdf0e10cSrcweir //---------------------------- 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CInfoTip::AddRef(void) 104*cdf0e10cSrcweir { 105*cdf0e10cSrcweir return InterlockedIncrement(&m_RefCnt); 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir //---------------------------- 109*cdf0e10cSrcweir // 110*cdf0e10cSrcweir //---------------------------- 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir ULONG STDMETHODCALLTYPE CInfoTip::Release( void) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir long refcnt = InterlockedDecrement(&m_RefCnt); 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir if (0 == m_RefCnt) 117*cdf0e10cSrcweir delete this; 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir return refcnt; 120*cdf0e10cSrcweir } 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir //********************helper functions for GetInfoTip functions********************** 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir /** get file type infomation from registry. 125*cdf0e10cSrcweir */ 126*cdf0e10cSrcweir std::wstring getFileTypeInfo(const std::string& file_extension) 127*cdf0e10cSrcweir { 128*cdf0e10cSrcweir char extKeyValue[MAX_STRING]; 129*cdf0e10cSrcweir char typeKeyValue[MAX_STRING]; 130*cdf0e10cSrcweir ::std::string sDot("."); 131*cdf0e10cSrcweir if (QueryRegistryKey(HKEY_CLASSES_ROOT, (sDot.append(file_extension)).c_str(), "", extKeyValue, MAX_STRING)) 132*cdf0e10cSrcweir if (QueryRegistryKey( HKEY_CLASSES_ROOT, extKeyValue, "",typeKeyValue, MAX_STRING)) 133*cdf0e10cSrcweir return StringToWString(typeKeyValue); 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir return EMPTY_STRING; 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir /** get file size. 139*cdf0e10cSrcweir */ 140*cdf0e10cSrcweir DWORD getSizeOfFile( char* FileName ) 141*cdf0e10cSrcweir { 142*cdf0e10cSrcweir HANDLE hFile = CreateFile(StringToWString(FileName).c_str(), // open file 143*cdf0e10cSrcweir GENERIC_READ, // open for reading 144*cdf0e10cSrcweir FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, // share for all operations 145*cdf0e10cSrcweir NULL, // no security 146*cdf0e10cSrcweir OPEN_EXISTING, // existing file only 147*cdf0e10cSrcweir FILE_ATTRIBUTE_NORMAL, // normal file 148*cdf0e10cSrcweir NULL); // no attr. template 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir if (hFile != INVALID_HANDLE_VALUE) 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir DWORD dwSize = GetFileSize( HANDLE(hFile), NULL ); 153*cdf0e10cSrcweir CloseHandle( HANDLE(hFile) ); 154*cdf0e10cSrcweir return dwSize; 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir return INVALID_FILE_SIZE; 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir /** format file size in to be more readable. 161*cdf0e10cSrcweir */ 162*cdf0e10cSrcweir std::wstring formatSizeOfFile( DWORD dwSize ) 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir if ( dwSize < 1000 ) 165*cdf0e10cSrcweir { 166*cdf0e10cSrcweir char buffer[3]; 167*cdf0e10cSrcweir int dFileSize = dwSize; 168*cdf0e10cSrcweir 169*cdf0e10cSrcweir _itoa( dFileSize, buffer, 10 ); 170*cdf0e10cSrcweir return StringToWString( buffer ).append(StringToWString("B")); 171*cdf0e10cSrcweir } 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir char *buffer=NULL; 174*cdf0e10cSrcweir int decimal, sign; 175*cdf0e10cSrcweir double dFileSize = (double)dwSize/(double)KB; 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir buffer = _fcvt( dFileSize, 1, &decimal, &sign ); 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir ::std::wstring wsTemp = StringToWString( buffer ); 180*cdf0e10cSrcweir int pos=decimal % 3; 181*cdf0e10cSrcweir ::std::wstring wsBuffer = wsTemp.substr( 0,pos); 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir if ( decimal ) 184*cdf0e10cSrcweir for (;decimal - pos > 2;pos += 3) 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir if (pos) 187*cdf0e10cSrcweir wsBuffer.append(StringToWString(",")); 188*cdf0e10cSrcweir wsBuffer.append( wsTemp.substr( pos, 3) ); 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir else 191*cdf0e10cSrcweir wsBuffer.append(StringToWString("0")); 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir wsBuffer.append(StringToWString(".")); 194*cdf0e10cSrcweir wsBuffer.append(wsTemp.substr( decimal, wsTemp.size()-decimal )); 195*cdf0e10cSrcweir wsBuffer.append(StringToWString("KB")); 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir return wsBuffer; 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir /** get file size infomation. 202*cdf0e10cSrcweir */ 203*cdf0e10cSrcweir std::wstring getFileSizeInfo(char* FileName) 204*cdf0e10cSrcweir { 205*cdf0e10cSrcweir DWORD dwSize=getSizeOfFile(FileName); 206*cdf0e10cSrcweir if (dwSize != INVALID_FILE_SIZE) 207*cdf0e10cSrcweir return formatSizeOfFile( dwSize ); 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir return EMPTY_STRING; 210*cdf0e10cSrcweir } 211*cdf0e10cSrcweir 212*cdf0e10cSrcweir //---------------------------- 213*cdf0e10cSrcweir // IQueryInfo methods 214*cdf0e10cSrcweir //---------------------------- 215*cdf0e10cSrcweir 216*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CInfoTip::GetInfoTip(DWORD /*dwFlags*/, wchar_t** ppwszTip) 217*cdf0e10cSrcweir { 218*cdf0e10cSrcweir std::wstring msg; 219*cdf0e10cSrcweir const std::wstring CONST_SPACE(SPACE); 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir //display File Type, no matter other info is loaded successfully or not. 222*cdf0e10cSrcweir std::wstring tmpTypeStr = getFileTypeInfo( get_file_name_extension(m_szFileName) ); 223*cdf0e10cSrcweir if ( tmpTypeStr != EMPTY_STRING ) 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir msg += GetResString(IDS_TYPE_COLON) + CONST_SPACE; 226*cdf0e10cSrcweir msg += tmpTypeStr; 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir try 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir CMetaInfoReader meta_info_accessor(m_szFileName); 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir //display document title; 234*cdf0e10cSrcweir if ( meta_info_accessor.getTagData( META_INFO_TITLE ).length() > 0) 235*cdf0e10cSrcweir { 236*cdf0e10cSrcweir if ( msg != EMPTY_STRING ) 237*cdf0e10cSrcweir msg += L"\n"; 238*cdf0e10cSrcweir msg += GetResString(IDS_TITLE_COLON) + CONST_SPACE; 239*cdf0e10cSrcweir msg += meta_info_accessor.getTagData( META_INFO_TITLE ); 240*cdf0e10cSrcweir } 241*cdf0e10cSrcweir else 242*cdf0e10cSrcweir { 243*cdf0e10cSrcweir if ( msg != EMPTY_STRING ) 244*cdf0e10cSrcweir msg += L"\n"; 245*cdf0e10cSrcweir msg += GetResString(IDS_TITLE_COLON) + CONST_SPACE; 246*cdf0e10cSrcweir msg += m_FileNameOnly; 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir //display document author; 250*cdf0e10cSrcweir if ( meta_info_accessor.getTagData( META_INFO_AUTHOR ).length() > 0) 251*cdf0e10cSrcweir { 252*cdf0e10cSrcweir if ( msg != EMPTY_STRING ) 253*cdf0e10cSrcweir msg += L"\n"; 254*cdf0e10cSrcweir msg += GetResString( IDS_AUTHOR_COLON ) + CONST_SPACE; 255*cdf0e10cSrcweir msg += meta_info_accessor.getTagData( META_INFO_AUTHOR ); 256*cdf0e10cSrcweir } 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir //display document subject; 259*cdf0e10cSrcweir if ( meta_info_accessor.getTagData( META_INFO_SUBJECT ).length() > 0) 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir if ( msg != EMPTY_STRING ) 262*cdf0e10cSrcweir msg += L"\n"; 263*cdf0e10cSrcweir msg += GetResString(IDS_SUBJECT_COLON) + CONST_SPACE; 264*cdf0e10cSrcweir msg += meta_info_accessor.getTagData( META_INFO_SUBJECT ); 265*cdf0e10cSrcweir } 266*cdf0e10cSrcweir 267*cdf0e10cSrcweir //display document description; 268*cdf0e10cSrcweir if ( meta_info_accessor.getTagData( META_INFO_DESCRIPTION ).length() > 0) 269*cdf0e10cSrcweir { 270*cdf0e10cSrcweir if ( msg != EMPTY_STRING ) 271*cdf0e10cSrcweir msg += L"\n"; 272*cdf0e10cSrcweir msg += GetResString( IDS_COMMENTS_COLON ) + CONST_SPACE; 273*cdf0e10cSrcweir msg += meta_info_accessor.getTagData( META_INFO_DESCRIPTION ); 274*cdf0e10cSrcweir } 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir //display midified time formated into locale representation. 277*cdf0e10cSrcweir if ( iso8601_date_to_local_date(meta_info_accessor.getTagData(META_INFO_MODIFIED )).length() > 0) 278*cdf0e10cSrcweir { 279*cdf0e10cSrcweir if ( msg != EMPTY_STRING ) 280*cdf0e10cSrcweir msg += L"\n"; 281*cdf0e10cSrcweir msg += GetResString( IDS_MODIFIED_COLON ) + CONST_SPACE; 282*cdf0e10cSrcweir msg += iso8601_date_to_local_date(meta_info_accessor.getTagData(META_INFO_MODIFIED )); 283*cdf0e10cSrcweir } 284*cdf0e10cSrcweir } 285*cdf0e10cSrcweir catch (const std::exception&) 286*cdf0e10cSrcweir { 287*cdf0e10cSrcweir //return E_FAIL; 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir 290*cdf0e10cSrcweir //display file size, no matter other infomation is loaded successfully or not. 291*cdf0e10cSrcweir std::wstring tmpSizeStr = getFileSizeInfo( m_szFileName ); 292*cdf0e10cSrcweir if ( tmpSizeStr != EMPTY_STRING ) 293*cdf0e10cSrcweir { 294*cdf0e10cSrcweir msg += L"\n"; 295*cdf0e10cSrcweir msg += GetResString( IDS_SIZE_COLON ) + CONST_SPACE; 296*cdf0e10cSrcweir msg += tmpSizeStr; 297*cdf0e10cSrcweir } 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir //finalize and assignthe string. 301*cdf0e10cSrcweir LPMALLOC lpMalloc; 302*cdf0e10cSrcweir HRESULT hr = SHGetMalloc(&lpMalloc); 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir if (SUCCEEDED(hr)) 305*cdf0e10cSrcweir { 306*cdf0e10cSrcweir size_t len = sizeof(wchar_t) * msg.length() + sizeof(wchar_t); 307*cdf0e10cSrcweir wchar_t* pMem = reinterpret_cast<wchar_t*>(lpMalloc->Alloc(len)); 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir ZeroMemory(pMem, len); 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir msg.copy(pMem,msg.length()); 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir *ppwszTip = pMem; 314*cdf0e10cSrcweir lpMalloc->Release(); 315*cdf0e10cSrcweir 316*cdf0e10cSrcweir return S_OK; 317*cdf0e10cSrcweir } 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir return E_FAIL; 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir //---------------------------- 323*cdf0e10cSrcweir // 324*cdf0e10cSrcweir //---------------------------- 325*cdf0e10cSrcweir 326*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CInfoTip::GetInfoFlags(DWORD * /*pdwFlags*/ ) 327*cdf0e10cSrcweir { 328*cdf0e10cSrcweir return E_NOTIMPL; 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir 331*cdf0e10cSrcweir //---------------------------- 332*cdf0e10cSrcweir // IPersist methods 333*cdf0e10cSrcweir //---------------------------- 334*cdf0e10cSrcweir 335*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CInfoTip::GetClassID(CLSID* pClassID) 336*cdf0e10cSrcweir { 337*cdf0e10cSrcweir pClassID = const_cast<CLSID*>(&CLSID_INFOTIP_HANDLER); 338*cdf0e10cSrcweir return S_OK; 339*cdf0e10cSrcweir } 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir //---------------------------- 342*cdf0e10cSrcweir // IPersistFile methods 343*cdf0e10cSrcweir //---------------------------- 344*cdf0e10cSrcweir 345*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CInfoTip::Load(LPCOLESTR pszFileName, DWORD /*dwMode*/) 346*cdf0e10cSrcweir { 347*cdf0e10cSrcweir std::wstring fname = pszFileName; 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir // there must be a '\' and there must even be an 350*cdf0e10cSrcweir // extension, else we would not have been called 351*cdf0e10cSrcweir std::wstring::iterator begin = fname.begin() + fname.find_last_of(L"\\") + 1; 352*cdf0e10cSrcweir std::wstring::iterator end = fname.end(); 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir m_FileNameOnly = std::wstring(begin, end); 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir fname = getShortPathName( fname ); 357*cdf0e10cSrcweir 358*cdf0e10cSrcweir std::string fnameA = WStringToString(fname); 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir // #115531# 361*cdf0e10cSrcweir // ZeroMemory because strncpy doesn't '\0'-terminates the destination 362*cdf0e10cSrcweir // string; reserve the last place in the buffer for the final '\0' 363*cdf0e10cSrcweir // that's why '(sizeof(m_szFileName) - 1)' 364*cdf0e10cSrcweir ZeroMemory(m_szFileName, sizeof(m_szFileName)); 365*cdf0e10cSrcweir strncpy(m_szFileName, fnameA.c_str(), (sizeof(m_szFileName) - 1)); 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir return S_OK; 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir //---------------------------- 371*cdf0e10cSrcweir // 372*cdf0e10cSrcweir //---------------------------- 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CInfoTip::IsDirty(void) 375*cdf0e10cSrcweir { 376*cdf0e10cSrcweir return E_NOTIMPL; 377*cdf0e10cSrcweir } 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir //---------------------------- 380*cdf0e10cSrcweir // 381*cdf0e10cSrcweir //---------------------------- 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CInfoTip::Save(LPCOLESTR /*pszFileName*/, BOOL /*fRemember*/) 384*cdf0e10cSrcweir { 385*cdf0e10cSrcweir return E_NOTIMPL; 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir 388*cdf0e10cSrcweir //---------------------------- 389*cdf0e10cSrcweir // 390*cdf0e10cSrcweir //---------------------------- 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CInfoTip::SaveCompleted(LPCOLESTR /*pszFileName*/) 393*cdf0e10cSrcweir { 394*cdf0e10cSrcweir return E_NOTIMPL; 395*cdf0e10cSrcweir } 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir //---------------------------- 398*cdf0e10cSrcweir // 399*cdf0e10cSrcweir //---------------------------- 400*cdf0e10cSrcweir 401*cdf0e10cSrcweir HRESULT STDMETHODCALLTYPE CInfoTip::GetCurFile(LPOLESTR __RPC_FAR * /*ppszFileName*/) 402*cdf0e10cSrcweir { 403*cdf0e10cSrcweir return E_NOTIMPL; 404*cdf0e10cSrcweir } 405