NS_IMETHODIMP nsFileProtocolHandler::ReadURLFile(nsIFile* aFile, nsIURI** aURI) { // IUniformResourceLocator isn't supported by VC5 (bless its little heart) #if _MSC_VER < 1200 return NS_ERROR_NOT_AVAILABLE; #else nsAutoString path; nsresult rv = aFile->GetPath(path); if (NS_FAILED(rv)) return rv; if (path.Length() < 4) return NS_ERROR_NOT_AVAILABLE; if (!StringTail(path, 4).LowerCaseEqualsLiteral(".url")) return NS_ERROR_NOT_AVAILABLE; HRESULT result; rv = NS_ERROR_NOT_AVAILABLE; IUniformResourceLocatorW* urlLink = nsnull; result = ::CoCreateInstance(CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER, IID_IUniformResourceLocatorW, (void**)&urlLink); if (SUCCEEDED(result) && urlLink) { IPersistFile* urlFile = nsnull; result = urlLink->QueryInterface(IID_IPersistFile, (void**)&urlFile); if (SUCCEEDED(result) && urlFile) { result = urlFile->Load(path.get(), STGM_READ); if (SUCCEEDED(result) ) { LPWSTR lpTemp = nsnull; // The URL this method will give us back seems to be already // escaped. Hence, do not do escaping of our own. result = urlLink->GetURL(&lpTemp); if (SUCCEEDED(result) && lpTemp) { rv = NS_NewURI(aURI, nsDependentString(lpTemp)); // free the string that GetURL alloc'd CoTaskMemFree(lpTemp); } } urlFile->Release(); } urlLink->Release(); } return rv; #endif //_MSC_VER < 1200 }
/****************************************************************** CreateUrl - Creates a shortcut via IUniformResourceLocatorW *******************************************************************/ static HRESULT CreateUrl( __in_z LPCWSTR wzTarget, __in_z LPCWSTR wzShortcutPath, __in_z_opt LPCWSTR wzIconPath, __in int iconIndex ) { HRESULT hr = S_OK; IUniformResourceLocatorW* piURL = NULL; IPersistFile* piPersistFile = NULL; IPropertySetStorage* piProperties = NULL; IPropertyStorage* piStorage = NULL; // create an internet shortcut object WcaLog(LOGMSG_STANDARD, "Creating IUniformResourceLocatorW shortcut '%ls' target '%ls'", wzShortcutPath, wzTarget); hr = ::CoCreateInstance(CLSID_InternetShortcut, NULL, CLSCTX_ALL, IID_IUniformResourceLocatorW, (void**)&piURL); ExitOnFailure(hr, "failed to create an instance of IUniformResourceLocatorW"); // set shortcut target hr = piURL->SetURL(wzTarget, 0); ExitOnFailure2(hr, "failed to set shortcut '%ls' target '%ls'", wzShortcutPath, wzTarget); if (wzIconPath) { hr = piURL->QueryInterface(IID_IPropertySetStorage, (void **)&piProperties); ExitOnFailure1(hr, "failed to get IPropertySetStorage for shortcut '%ls'", wzShortcutPath); hr = piProperties->Open(FMTID_Intshcut, STGM_WRITE, &piStorage); ExitOnFailure1(hr, "failed to open storage for shortcut '%ls'", wzShortcutPath); PROPSPEC ppids[2] = { {PRSPEC_PROPID, PID_IS_ICONINDEX}, {PRSPEC_PROPID, PID_IS_ICONFILE} }; PROPVARIANT ppvar[2]; PropVariantInit(ppvar); PropVariantInit(ppvar + 1); ppvar[0].vt = VT_I4; ppvar[0].lVal = iconIndex; ppvar[1].vt = VT_LPWSTR; ppvar[1].pwszVal = (LPWSTR)wzIconPath; hr = piStorage->WriteMultiple(2, ppids, ppvar, 0); ExitOnFailure1(hr, "failed to write icon storage for shortcut '%ls'", wzShortcutPath); hr = piStorage->Commit(STGC_DEFAULT); ExitOnFailure1(hr, "failed to commit icon storage for shortcut '%ls'", wzShortcutPath); } // get an IPersistFile and save the shortcut hr = piURL->QueryInterface(IID_IPersistFile, (void**)&piPersistFile); ExitOnFailure1(hr, "failed to get IPersistFile for shortcut '%ls'", wzShortcutPath); hr = piPersistFile->Save(wzShortcutPath, TRUE); ExitOnFailure1(hr, "failed to save shortcut '%ls'", wzShortcutPath); LExit: ReleaseObject(piPersistFile); ReleaseObject(piURL); ReleaseObject(piStorage); ReleaseObject(piProperties); return hr; }