/** * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ #include "OCOverlay.h" #include "RegistryUtil.h" #include "StringUtil.h" #include "UtilConstants.h" #include "RemotePathChecker.h" #include "resource.h" #include #include #include using namespace std; #pragma comment(lib, "shlwapi.lib") extern HINSTANCE instanceHandle; #define IDM_DISPLAY 0 #define IDB_OK 101 OCOverlay::OCOverlay(int state) : _communicationSocket(0) , _referenceCount(1) , _checker(new RemotePathChecker(PORT)) , _state(state) { // FIXME: Use Registry instead _watchedDirectories = _checker->WatchedDirectories(); } OCOverlay::~OCOverlay(void) { } IFACEMETHODIMP_(ULONG) OCOverlay::AddRef() { return InterlockedIncrement(&_referenceCount); } IFACEMETHODIMP OCOverlay::QueryInterface(REFIID riid, void **ppv) { HRESULT hr = S_OK; if (IsEqualIID(IID_IUnknown, riid) || IsEqualIID(IID_IShellIconOverlayIdentifier, riid)) { *ppv = static_cast(this); } else { hr = E_NOINTERFACE; *ppv = NULL; } if (*ppv) { AddRef(); } return hr; } IFACEMETHODIMP_(ULONG) OCOverlay::Release() { ULONG cRef = InterlockedDecrement(&_referenceCount); if (0 == cRef) { delete this; } return cRef; } IFACEMETHODIMP OCOverlay::GetPriority(int *pPriority) { pPriority = 0; return S_OK; } IFACEMETHODIMP OCOverlay::IsMemberOf(PCWSTR pwszPath, DWORD dwAttrib) { //if(!_IsOverlaysEnabled()) //{ // return MAKE_HRESULT(S_FALSE, 0, 0); //} wstring wpath(pwszPath); wpath.append(L"\\"); vector::iterator it; bool watched = false; for (it = _watchedDirectories.begin(); it != _watchedDirectories.end(); ++it) { if (StringUtil::begins_with(wpath, *it)) { watched = true; } } if (!watched) { return MAKE_HRESULT(S_FALSE, 0, 0); } int state = 0; if (!_checker->IsMonitoredPath(pwszPath, &state)) { return MAKE_HRESULT(S_FALSE, 0, 0); } return MAKE_HRESULT(state == _state ? S_OK : S_FALSE, 0, 0); } IFACEMETHODIMP OCOverlay::GetOverlayInfo(PWSTR pwszIconFile, int cchMax, int *pIndex, DWORD *pdwFlags) { *pIndex = 0; *pdwFlags = ISIOI_ICONFILE | ISIOI_ICONINDEX; *pIndex = _state; if (GetModuleFileName(instanceHandle, pwszIconFile, cchMax) == 0) { HRESULT hResult = HRESULT_FROM_WIN32(GetLastError()); wcerr << L"IsOK? " << (hResult == S_OK) << L" with path " << pwszIconFile << L", index " << *pIndex << endl; return hResult; } return S_OK; } bool OCOverlay::_IsOverlaysEnabled() { //int enable; bool success = false; //if(RegistryUtil::ReadRegistry(REGISTRY_ROOT_KEY, REGISTRY_ENABLE_OVERLAY, &enable)) //{ // if(enable) { // success = true; // } //} return success; }