summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBernd Wachter <bwachter-tmw@lart.info>2010-02-25 15:31:04 +0100
committerBernd Wachter <bwachter-tmw@lart.info>2010-02-25 21:59:09 +0100
commit56e3e3a0571719f12112106b835f2836785fec4d (patch)
treeb6c05b939d3fb83dc06572a488d5591c9b5ba80c /src
parent2ebd55fdcd7e177be150f9c5bdd1cbff9b110ad3 (diff)
downloadmana-client-56e3e3a0571719f12112106b835f2836785fec4d.tar.gz
mana-client-56e3e3a0571719f12112106b835f2836785fec4d.tar.bz2
mana-client-56e3e3a0571719f12112106b835f2836785fec4d.tar.xz
mana-client-56e3e3a0571719f12112106b835f2836785fec4d.zip
Add support for special folder lookup on Win32
Reviewed-by: Jared Adams
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt7
-rw-r--r--src/Makefile.am2
-rw-r--r--src/utils/specialfolder.cpp78
-rw-r--r--src/utils/specialfolder.h30
4 files changed, 116 insertions, 1 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ed579993..eda28b38 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -593,7 +593,12 @@ SET(SRCS_MANA
)
IF (WIN32)
- SET(SRCS_MANA ${SRCS_MANA} mana.rc)
+ SET(SRCS_MANA
+ ${SRCS_MANA}
+ utils/specialfolder.cpp
+ utils/specialfolder.h
+ mana.rc
+ )
ENDIF ()
SET (PROGRAMS mana)
diff --git a/src/Makefile.am b/src/Makefile.am
index a9ac7dff..bfffef4b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -290,6 +290,8 @@ mana_SOURCES = gui/widgets/avatarlistbox.cpp \
utils/mkdir.h \
utils/sha256.cpp \
utils/sha256.h \
+ utils/specialfolder.cpp \
+ utils/specialfolder.h \
utils/stringutils.cpp \
utils/stringutils.h \
utils/mutex.h \
diff --git a/src/utils/specialfolder.cpp b/src/utils/specialfolder.cpp
new file mode 100644
index 00000000..64607716
--- /dev/null
+++ b/src/utils/specialfolder.cpp
@@ -0,0 +1,78 @@
+/*
+ * The Mana Client
+ * Copyright (C) 2010 The Mana Developers
+ *
+ * This file is part of The Mana Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef WIN32
+#include "specialfolder.h"
+#include <windows.h>
+
+#ifdef _SPECIALFOLDERLOCATION_TEST_
+// compile with -D_SPECIALFOLDERLOCATION_TEST_ to get a standalone
+// binary for testing
+#include <iostream>
+#endif
+
+/*
+ * Retrieve the pathname of special folders on win32, or an empty string
+ * on error / if the folder does not exist.
+ * See http://msdn.microsoft.com/en-us/library/bb762494(VS.85).aspx for
+ * a list of folder ids
+ */
+std::string getSpecialFolderLocation(int folderId)
+{
+ std::string ret;
+ LPITEMIDLIST pItemIdList;
+ LPMALLOC pMalloc;
+ char szPath[_MAX_PATH];
+
+ // get the item ID list for folderId
+ HRESULT hr = SHGetSpecialFolderLocation(NULL, folderId, &pItemIdList);
+ if (hr != S_OK)
+ return ret;
+
+ // convert the ID list into a file system path
+ if (SHGetPathFromIDList(pItemIdList, szPath) == FALSE)
+ return ret;
+
+ // get the IMalloc pointer and free all resources we used
+ hr = SHGetMalloc(&pMalloc);
+ pMalloc->Free(pItemIdList);
+ pMalloc->Release();
+
+ ret = szPath;
+ return ret;
+}
+
+#ifdef _SPECIALFOLDERLOCATION_TEST_
+int main()
+{
+ std::cout << "APPDATA " << getSpecialFolderLocation(CSIDL_APPDATA)
+ << std::endl;
+ std::cout << "DESKTOP " << getSpecialFolderLocation(CSIDL_DESKTOP)
+ << std::endl;
+ std::cout << "LOCAL_APPDATA "
+ << getSpecialFolderLocation(CSIDL_LOCAL_APPDATA)
+ << std::endl;
+ std::cout << "MYPICTURES " << getSpecialFolderLocation(CSIDL_MYPICTURES)
+ << std::endl;
+ std::cout << "PERSONAL " << getSpecialFolderLocation(CSIDL_PERSONAL)
+ << std::endl;
+}
+#endif
+#endif
diff --git a/src/utils/specialfolder.h b/src/utils/specialfolder.h
new file mode 100644
index 00000000..c2c2e0be
--- /dev/null
+++ b/src/utils/specialfolder.h
@@ -0,0 +1,30 @@
+/*
+ * The Mana Client
+ * Copyright (C) 2010 The Mana Developers
+ *
+ * This file is part of The Mana Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _SPECIALFOLDER_H
+#define _SPECIALFOLDER_H
+
+#ifdef WIN32
+#include <shlobj.h>
+#include <string>
+std::string getSpecialFolderLocation(int folderId);
+#endif
+
+#endif