123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- #include "main.h"
- #include "./import.h"
- #include "./api__ml_online.h"
- #include "./resource.h"
- #include "./serviceHost.h"
- #include "./serviceHelper.h"
- #include "./navigation.h"
- #include <ifc_omstorage.h>
- #include <ifc_omfilestorage.h>
- #include <ifc_omstorageenum.h>
- #include <ifc_omservice.h>
- #include <ifc_omserviceenum.h>
- #include <strsafe.h>
- static HRESULT ImportFile_GetEnumerator(ifc_omstorageenumerator **enumerator)
- {
- if (NULL == OMSERVICEMNGR) return E_UNEXPECTED;
- return OMSERVICEMNGR->EnumStorage(&STID_OmFileStorage, ifc_omstorage::capPublic | ifc_omstorage::capLoad, enumerator);
- }
- HRESULT ImportService_GetFileSupported()
- {
- if (NULL == OMSERVICEMNGR)
- return E_UNEXPECTED;
- ifc_omstorageenumerator *enumerator;
- HRESULT hr = ImportFile_GetEnumerator(&enumerator);
-
- if (SUCCEEDED(hr))
- {
- ifc_omstorage *storage;
- if(S_OK == enumerator->Next(1, &storage, NULL))
- {
- storage->Release();
- hr = S_OK;
- }
- else
- {
- hr = S_FALSE;
- }
- enumerator->Release();
- }
- return hr;
- }
- static HRESULT ImportFile_GetFilter(LPWSTR pszBuffer, UINT cchBufferMax, DWORD *defaultIndex)
- {
- if (NULL != defaultIndex)
- *defaultIndex = 0;
- if (NULL == pszBuffer)
- return E_POINTER;
- HRESULT hr;
- WCHAR szName[128] = {0}, szList[512] = {0};
- LPWSTR cursor = pszBuffer;
- size_t remaining = cchBufferMax;
- LPWSTR listC = szList;
- size_t listR = ARRAYSIZE(szList);
-
- DWORD counter = 0;
- szList[0] = L'\0';
- pszBuffer[0] = L'\0';
- WASABI_API_LNGSTRINGW_BUF(IDS_FILEFILTER_ALL, szName, ARRAYSIZE(szName));
- hr = Plugin_AppendFileFilter(cursor, remaining, szName, L"*.*", &cursor, &remaining, TRUE);
- if (FAILED(hr)) return hr;
- counter++;
- ifc_omstorageenumerator *enumerator;
- hr = ImportFile_GetEnumerator(&enumerator);
- if (SUCCEEDED(hr))
- {
- ifc_omstorage *storage;
- ifc_omfilestorage *fileStorage;
- while(S_OK == enumerator->Next(1, &storage, NULL))
- {
- if (SUCCEEDED(storage->QueryInterface(IFC_OmFileStorage, (void**)&fileStorage)))
- {
- WCHAR szFilter[64] = {0};
- if (SUCCEEDED(fileStorage->GetFilter(szFilter, ARRAYSIZE(szFilter))) &&
- L'\0' != szFilter[0] &&
- SUCCEEDED(storage->GetDescription(szName, ARRAYSIZE(szName))))
- {
- hr = Plugin_AppendFileFilter(cursor, remaining, szName, szFilter, &cursor, &remaining, TRUE);
- if (FAILED(hr)) break;
- counter++;
-
- if (listC == szList || SUCCEEDED(StringCchCopyEx(listC, listR, L";", &listC, &listR, 0)))
- StringCchCopyEx(listC, listR, szFilter, &listC, &listR, 0);
- }
- fileStorage->Release();
- }
- storage->Release();
- }
- enumerator->Release();
- }
- if (SUCCEEDED(hr) && L'\0' != szList[0])
- {
- WASABI_API_LNGSTRINGW_BUF(IDS_FILEFILTER_ALLKNOWN, szName, ARRAYSIZE(szName));
- hr = Plugin_AppendFileFilter(cursor, remaining, szName, szList, &cursor, &remaining, TRUE);
- if (FAILED(hr)) return hr;
-
- counter++;
- if (NULL != defaultIndex)
- *defaultIndex = counter;
- }
- return hr;
- }
- static HRESULT ImportFile_ProcessFile(HWND hOwner, ifc_omstorageenumerator *enumerator,
- ifc_omservicehost *serviceHost, ifc_omstorage *serviceStorage,
- LPCWSTR pszFile, ULONG *converted)
- {
- ifc_omstorage *storage;
- enumerator->Reset();
- Navigation *navigation;
- if (FAILED(Plugin_GetNavigation(&navigation)))
- return E_FAIL;
- ULONG loaded(0), saved(0);
- while(S_OK == enumerator->Next(1, &storage, NULL))
- {
- ifc_omserviceenum *serviceEnum;
- HRESULT hr = storage->Load(pszFile, serviceHost, &serviceEnum);
- if(SUCCEEDED(hr))
- {
- ifc_omservice *service;
- while(S_OK == serviceEnum->Next(1, &service, NULL))
- {
- loaded++;
- if (SUCCEEDED(service->SetAddress(NULL)))
- {
- service->UpdateFlags(SVCF_SUBSCRIBED | SVCF_PREAUTHORIZED);
- ULONG savedOk;
- if (SUCCEEDED(serviceStorage->Save(&service, 1, ifc_omstorage::saveClearModified, &savedOk)))
- {
- navigation->CreateItem(service, 1);
- saved += savedOk;
- }
- }
- service->Release();
- }
- serviceEnum->Release();
- break;
- }
- else if (OMSTORAGE_E_UNKNOWN_FORMAT != hr)
- {
- break;
- }
- storage->Release();
- }
- if (NULL != converted)
- *converted = saved;
- navigation->Release();
- return S_OK;
- }
- static HRESULT ImportFile_ProcessList(HWND hOwner, LPCWSTR pszList)
- {
- if (NULL == pszList)
- return E_INVALIDARG;
-
- LPCWSTR base, block, c;
- base = pszList;
- c = base;
- block = NULL;
- ULONG converted;
- ifc_omstorageenumerator *enumerator;
- HRESULT hr = ImportFile_GetEnumerator(&enumerator);
- if (FAILED(hr)) return hr;
- ServiceHost *serviceHost;
- hr = ServiceHost::GetCachedInstance(&serviceHost);
- if (SUCCEEDED(hr))
- {
- ifc_omstorage *serviceStorage;
- hr = ServiceHelper_QueryStorage(&serviceStorage);
- if (SUCCEEDED(hr))
- {
- ULONG scanned(0);
- while(L'\0' != *c)
- {
- block = c;
- while (L'\0' != *c) c++;
- if (c != block && block != base)
- {
- WCHAR szBuffer[MAX_PATH * 2] = {0};
- scanned++;
- if (SUCCEEDED(StringCchPrintf(szBuffer, ARRAYSIZE(szBuffer), L"%s\\%s", base, block)) &&
- SUCCEEDED(ImportFile_ProcessFile(hOwner, enumerator, serviceHost, serviceStorage, szBuffer, &converted)))
- {
- }
- }
- c++;
- }
- if (pszList == block && c != pszList &&
- SUCCEEDED(ImportFile_ProcessFile(hOwner, enumerator, serviceHost, serviceStorage, pszList, &converted)))
- {
- }
- serviceStorage->Release();
- }
- serviceHost->Release();
- }
- enumerator->Release();
- return hr;
- }
- HRESULT ImportService_FromFile(HWND hOwner)
- {
- if (NULL == OMSERVICEMNGR)
- return E_UNEXPECTED;
- OPENFILENAME of = {0};
- of.lStructSize = sizeof(of);
- WCHAR szFilter[1024] = {0};
- HRESULT hr = ImportFile_GetFilter(szFilter, ARRAYSIZE(szFilter), &of.nFilterIndex);
- if (FAILED(hr)) return hr;
- UINT cchResultMax = 16384;
- LPWSTR pszResult = Plugin_MallocString(cchResultMax);
- if (NULL == pszResult) return E_OUTOFMEMORY;
- *pszResult = L'\0';
-
- of.hwndOwner = hOwner;
- of.lpstrFilter = szFilter;
- of.lpstrFile = pszResult;
- of.nMaxFile = cchResultMax;
- of.lpstrInitialDir = WASABI_API_APP->path_getUserSettingsPath();
- of.lpstrTitle = WASABI_API_LNGSTRINGW(IDS_IMPORT_FILES);
- of.Flags = OFN_ENABLESIZING | OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT;
-
- if (0 == GetOpenFileName(&of))
- {
- INT err = CommDlgExtendedError();
- hr = (0 == err) ? S_FALSE : E_FAIL;
- }
- else
- {
- hr = ImportFile_ProcessList(hOwner, pszResult);
- }
- Plugin_FreeString(pszResult);
- return hr;
- }
|