[vlc-commits] win32:dirs: SHGetFolderPathW is not available on Winstore apps
Jean-Baptiste Kempf
git at videolan.org
Mon May 16 15:44:34 CEST 2016
vlc | branch: master | Jean-Baptiste Kempf <jb at videolan.org> | Fri May 8 17:39:24 2015 +0200| [6caacec0d3aaa111c313801854a75f2a1a980053] | committer: Jean-Baptiste Kempf
win32:dirs: SHGetFolderPathW is not available on Winstore apps
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6caacec0d3aaa111c313801854a75f2a1a980053
---
src/win32/dirs.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 136 insertions(+)
diff --git a/src/win32/dirs.c b/src/win32/dirs.c
index e5dba3c..c5a51f5 100644
--- a/src/win32/dirs.c
+++ b/src/win32/dirs.c
@@ -44,6 +44,142 @@
#include <assert.h>
#include <limits.h>
+#if VLC_WINSTORE_APP
+#define COBJMACROS
+#define INITGUID
+#include <winstring.h>
+#include <windows.storage.h>
+#include <roapi.h>
+
+DEFINE_GUID(IID_IStorageItem, 0x4207a996, 0xca2f, 0x42f7, 0xbd, 0xe8, 0x8b, 0x10, 0x45, 0x7a, 0x7f, 0x30);
+DEFINE_GUID(IID_IApplicationDataStatics, 0x5612147b, 0xe843, 0x45e3, 0x94, 0xd8, 0x06, 0x16, 0x9e, 0x3c, 0x8e, 0x17);
+DEFINE_GUID(IID_IKnownFoldersStatics, 0x5a2a7520, 0x4802, 0x452d, 0x9a, 0xd9, 0x43, 0x51, 0xad, 0xa7, 0xec, 0x35);
+
+static HRESULT WinRTSHGetFolderPath(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
+{
+ VLC_UNUSED(hwnd);
+ VLC_UNUSED(hToken);
+
+ HRESULT hr;
+ IStorageFolder *folder;
+
+ if (dwFlags != SHGFP_TYPE_CURRENT)
+ return E_NOTIMPL;
+
+ folder = NULL;
+ csidl &= ~0xFF00; /* CSIDL_FLAG_MASK */
+
+ if (csidl == CSIDL_APPDATA) {
+ IApplicationDataStatics *appDataStatics = NULL;
+ IApplicationData *appData = NULL;
+ static const WCHAR *className = L"Windows.Storage.ApplicationData";
+ const UINT32 clen = wcslen(className);
+
+ HSTRING hClassName = NULL;
+ HSTRING_HEADER header;
+ hr = WindowsCreateStringReference(className, clen, &header, &hClassName);
+ if (FAILED(hr))
+ goto end_appdata;
+
+ hr = RoGetActivationFactory(hClassName, &IID_IApplicationDataStatics, (void**)&appDataStatics);
+
+ if (FAILED(hr))
+ goto end_appdata;
+
+ if (!appDataStatics) {
+ hr = E_FAIL;
+ goto end_appdata;
+ }
+
+ hr = IApplicationDataStatics_get_Current(appDataStatics, &appData);
+
+ if (FAILED(hr))
+ goto end_appdata;
+
+ if (!appData) {
+ hr = E_FAIL;
+ goto end_appdata;
+ }
+
+ hr = IApplicationData_get_LocalFolder(appData, &folder);
+
+end_appdata:
+ WindowsDeleteString(hClassName);
+ if (appDataStatics)
+ IApplicationDataStatics_Release(appDataStatics);
+ if (appData)
+ IApplicationData_Release(appData);
+ }
+ else
+ {
+ IKnownFoldersStatics *knownFoldersStatics = NULL;
+ static const WCHAR *className = L"Windows.Storage.KnownFolders";
+ const UINT32 clen = wcslen(className);
+
+ HSTRING hClassName = NULL;
+ HSTRING_HEADER header;
+ hr = WindowsCreateStringReference(className, clen, &header, &hClassName);
+ if (FAILED(hr))
+ goto end_other;
+
+ hr = RoGetActivationFactory(hClassName, &IID_IKnownFoldersStatics, (void**)&knownFoldersStatics);
+
+ if (FAILED(hr))
+ goto end_other;
+
+ if (!knownFoldersStatics) {
+ hr = E_FAIL;
+ goto end_other;
+ }
+
+ switch (csidl) {
+ case CSIDL_PERSONAL:
+ hr = IKnownFoldersStatics_get_DocumentsLibrary(knownFoldersStatics, &folder);
+ break;
+ case CSIDL_MYMUSIC:
+ hr = IKnownFoldersStatics_get_MusicLibrary(knownFoldersStatics, &folder);
+ break;
+ case CSIDL_MYPICTURES:
+ hr = IKnownFoldersStatics_get_PicturesLibrary(knownFoldersStatics, &folder);
+ break;
+ case CSIDL_MYVIDEO:
+ hr = IKnownFoldersStatics_get_VideosLibrary(knownFoldersStatics, &folder);
+ break;
+ default:
+ hr = E_NOTIMPL;
+ }
+
+end_other:
+ WindowsDeleteString(hClassName);
+ if (knownFoldersStatics)
+ IKnownFoldersStatics_Release(knownFoldersStatics);
+ }
+
+ if( SUCCEEDED(hr) && folder != NULL )
+ {
+ HSTRING path = NULL;
+ IStorageItem *item = NULL;
+ PCWSTR pszPathTemp;
+ hr = IStorageFolder_QueryInterface(folder, &IID_IStorageItem, (void**)&item);
+ if (FAILED(hr))
+ goto end_folder;
+ hr = IStorageItem_get_Path(item, &path);
+ if (FAILED(hr))
+ goto end_folder;
+ pszPathTemp = WindowsGetStringRawBuffer(path, NULL);
+ wcscpy(pszPath, pszPathTemp);
+end_folder:
+ WindowsDeleteString(path);
+ IStorageFolder_Release(folder);
+ if (item)
+ IStorageItem_Release(item);
+ }
+
+ return hr;
+}
+#define SHGetFolderPathW WinRTSHGetFolderPath
+#endif
+
char *config_GetLibDir (void)
{
#if VLC_WINSTORE_APP
More information about the vlc-commits
mailing list