ManaPlus
specialfolder.cpp
Go to the documentation of this file.
1 /*
2  * The ManaPlus Client
3  * Copyright (C) 2010 The Mana Developers
4  * Copyright (C) 2011-2019 The ManaPlus Developers
5  * Copyright (C) 2019-2021 Andrei Karas
6  *
7  * This file is part of The ManaPlus Client.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <http://www.gnu.org/licenses/>.
21  */
22 
23 #ifdef WIN32
24 #include "fs/specialfolder.h"
25 #include <windows.h>
26 
27 #include "debug.h"
28 
29 /*
30  * Retrieve the pathname of special folders on win32, or an empty string
31  * on error / if the folder does not exist.
32  * See http://msdn.microsoft.com/en-us/library/bb762494(VS.85).aspx for
33  * a list of folder ids
34  */
35 std::string getSpecialFolderLocation(const int folderId)
36 {
37  std::string ret;
38  LPITEMIDLIST pItemIdList;
39  LPMALLOC pMalloc;
40  char szPath[_MAX_PATH];
41 
42  // get the item ID list for folderId
43  HRESULT hr = SHGetSpecialFolderLocation(nullptr, folderId, &pItemIdList);
44  if (hr != S_OK)
45  return ret;
46 
47  // convert the ID list into a file system path
48  if (SHGetPathFromIDList(pItemIdList, szPath) == FALSE)
49  return ret;
50 
51  // get the IMalloc pointer and free all resources we used
52  hr = SHGetMalloc(&pMalloc);
53  pMalloc->Free(pItemIdList);
54  pMalloc->Release();
55 
56  ret = szPath;
57  return ret;
58 }
59 
60 #endif // WIN32