isnewshk.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 9k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /*
  2.  * isnewshk.cpp - INewShortcutHook implementation for URL class.
  3.  */
  4. #include "priv.h"
  5. #include "ishcut.h"
  6. #include "resource.h"
  7. #include <mluisupp.h>
  8. #pragma warning(disable:4100) /* "unreferenced formal parameter" warning */
  9. STDMETHODIMP
  10. Intshcut::SetReferent(
  11.     LPCTSTR pcszReferent,
  12.     HWND hwndParent)
  13. {
  14.     HRESULT hr;
  15.     TCHAR szURL[MAX_URL_STRING];
  16.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  17.     ASSERT(IS_VALID_STRING_PTR(pcszReferent, -1));
  18.     ASSERT(IS_VALID_HANDLE(hwndParent, WND));
  19.     hr = IURLQualify(pcszReferent, UQF_IGNORE_FILEPATHS | UQF_GUESS_PROTOCOL, szURL, NULL, NULL);
  20.     if (SUCCEEDED(hr))
  21.     {
  22.         hr = ValidateURL(szURL);
  23.         if (hr == S_OK)
  24.             hr = SetURL(szURL, 0);
  25.     }
  26.     if (S_OK != hr)
  27.     {
  28.         ASSERT(FAILED(hr));
  29.         // Massage result
  30.         switch (hr)
  31.         {
  32.             case URL_E_INVALID_SYNTAX:
  33.             case URL_E_UNREGISTERED_PROTOCOL:
  34.                 hr = S_FALSE;
  35.                 break;
  36.             default:
  37.                 break;
  38.         }
  39.         TraceMsg(TF_INTSHCUT, "Intshcut::SetReferent(): Failed to set referent to %s.",
  40.                    pcszReferent);
  41.     }
  42.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  43.     return(hr);
  44. }
  45. #pragma warning(default:4100) /* "unreferenced formal parameter" warning */
  46. STDMETHODIMP Intshcut::GetReferent(PTSTR pszReferent, int cchReferent)
  47. {
  48.     HRESULT hr = InitProp();
  49.     if (SUCCEEDED(hr))
  50.     {
  51.         TCHAR szURL[INTERNET_MAX_URL_LENGTH];
  52.         hr = m_pprop->GetProp(PID_IS_URL, szURL, SIZECHARS(szURL));
  53.         if (S_OK == hr)
  54.         {
  55.             if (lstrlen(szURL) < cchReferent)
  56.             {
  57.                 StrCpyN(pszReferent, szURL, cchReferent);
  58.                 hr = S_OK;
  59.             }
  60.             else
  61.                 hr = E_FAIL;
  62.         }
  63.         else
  64.             hr = S_FALSE;
  65.         if (hr != S_OK)
  66.         {
  67.             if (cchReferent > 0)
  68.                 *pszReferent = '';
  69.         }
  70.     }
  71.     return hr;
  72. }
  73. STDMETHODIMP Intshcut::SetFolder(LPCTSTR pcszFolder)
  74. {
  75.     HRESULT hr;
  76.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  77.     ASSERT(PathIsDirectory(pcszFolder));
  78.     if (Str_SetPtr(&m_pszFolder, pcszFolder))
  79.     {
  80.         hr = S_OK;
  81.         TraceMsg(TF_INTSHCUT, "Intshcut::SetFolder(): Set folder to %s.",
  82.                    m_pszFolder);
  83.     }
  84.     else
  85.         hr = E_OUTOFMEMORY;
  86.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  87.     return(hr);
  88. }
  89. STDMETHODIMP
  90. Intshcut::GetFolder(
  91.     LPTSTR pszFolder,
  92.     int cchFolder)
  93. {
  94.     HRESULT hr;
  95.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  96.     ASSERT(IS_VALID_WRITE_BUFFER(pszFolder, TCHAR, cchFolder));
  97.     if (m_pszFolder)
  98.     {
  99.         if (lstrlen(m_pszFolder) < cchFolder)
  100.         {
  101.             StrCpyN(pszFolder, m_pszFolder, cchFolder);
  102.             hr = S_OK;
  103.             TraceMsg(TF_INTSHCUT, "Intshcut::GetFolder(): Returning folder %s.",
  104.                      pszFolder);
  105.         }
  106.         else
  107.             hr = E_FAIL;
  108.     }
  109.     else
  110.         hr = S_FALSE;
  111.     if (hr != S_OK)
  112.     {
  113.         if (cchFolder > 0)
  114.             *pszFolder = '';
  115.     }
  116.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  117.     ASSERT((hr == S_OK &&
  118.             IS_VALID_STRING_PTR(pszFolder, -1) &&
  119.             EVAL(lstrlen(pszFolder) < cchFolder)) ||
  120.            ((hr == S_FALSE ||
  121.              hr == E_FAIL) &&
  122.             EVAL(! cchFolder ||
  123.                  ! *pszFolder)));
  124.     return(hr);
  125. }
  126. STDMETHODIMP
  127. Intshcut::GetName(
  128.     LPTSTR pszName,
  129.     int cchBuf)
  130. {
  131.     HRESULT hr = E_FAIL;
  132.     TCHAR rgchShortName[MAX_PATH];
  133.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  134.     ASSERT(IS_VALID_WRITE_BUFFER(pszName, TCHAR, cchBuf));
  135.     hr = E_FAIL;
  136.     if (MLLoadString(IDS_SHORT_NEW_INTSHCUT, rgchShortName, SIZECHARS(rgchShortName)))
  137.     {
  138.         TCHAR rgchLongName[MAX_PATH];
  139.         if (MLLoadString(IDS_NEW_INTSHCUT, rgchLongName, SIZECHARS(rgchLongName)))
  140.         {
  141.             TCHAR rgchCurDir[MAX_PATH];
  142.             LPCTSTR pcszFolderToUse;
  143.             // Use current directory if m_pszFolder has not been set.
  144.             pcszFolderToUse = m_pszFolder;
  145.             if (! pcszFolderToUse)
  146.             {
  147.                 if (GetCurrentDirectory(SIZECHARS(rgchCurDir), rgchCurDir) > 0)
  148.                     pcszFolderToUse = rgchCurDir;
  149.             }
  150.             if (pcszFolderToUse)
  151.             {
  152.                 TCHAR rgchUniqueName[MAX_PATH];
  153.                 if (PathYetAnotherMakeUniqueName(rgchUniqueName, pcszFolderToUse,
  154.                                                  rgchShortName, rgchLongName))
  155.                 {
  156.                     PTSTR pszFileName;
  157.                     PTSTR pszRemoveExt;
  158.                     pszFileName = (PTSTR)PathFindFileName(rgchUniqueName);
  159.                     pszRemoveExt = (PTSTR)PathFindExtension(pszFileName);
  160.                     *pszRemoveExt = '';
  161.                     if (lstrlen(pszFileName) < cchBuf)
  162.                     {
  163.                         StrCpyN(pszName, pszFileName, cchBuf);
  164.                         hr = S_OK;
  165.                     }
  166.                 }
  167.             }
  168.         }
  169.     }
  170.     if (hr == S_OK)
  171.         TraceMsg(TF_INTSHCUT, "Intshcut::GetName(): Returning %s.", pszName);
  172.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  173.     ASSERT((hr == S_OK &&
  174.             IS_VALID_STRING_PTR(pszName, -1) &&
  175.             EVAL(lstrlen(pszName) < cchBuf)) ||
  176.            (hr == E_FAIL &&
  177.             (! cchBuf ||
  178.              ! *pszName)));
  179.     return(hr);
  180. }
  181. STDMETHODIMP
  182. Intshcut::GetExtension(
  183.     LPTSTR pszExtension,
  184.     int cchBufMax)
  185. {
  186.     HRESULT hr;
  187.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  188.     ASSERT(IS_VALID_WRITE_BUFFER(pszExtension, TCHAR, cchBufMax));
  189.     if (SIZECHARS(TEXT(".url")) < cchBufMax)
  190.     {
  191.         StrCpyN(pszExtension, TEXT(".url"), cchBufMax);
  192.         hr = S_OK;
  193.         TraceMsg(TF_INTSHCUT, "Intshcut::GetExtension(): Returning extension %s.",
  194.                    pszExtension);
  195.     }
  196.     else
  197.     {
  198.         if (cchBufMax > 0)
  199.             *pszExtension = '';
  200.         hr = E_FAIL;
  201.     }
  202.     ASSERT(IS_VALID_STRUCT_PTR(this, CIntshcut));
  203.     ASSERT((hr == S_OK &&
  204.             IS_VALID_STRING_PTR(pszExtension, -1) &&
  205.             EVAL(lstrlen(pszExtension) < cchBufMax)) ||
  206.            (hr == E_FAIL &&
  207.             EVAL(! cchBufMax ||
  208.                  ! *pszExtension)));
  209.     return(hr);
  210. }
  211. // Ansi versions.  Needed for W9x
  212. STDMETHODIMP
  213. Intshcut::SetReferent(
  214.     LPCSTR pcszReferent,
  215.     HWND hwndParent)
  216. {
  217.     HRESULT hr;
  218.     WCHAR szReferent[MAX_URL_STRING];
  219.     ASSERT(lstrlenA(pcszReferent) + 1 < ARRAYSIZE(szReferent));
  220.     SHAnsiToUnicode(pcszReferent, szReferent, ARRAYSIZE(szReferent));
  221.     hr = SetReferent(szReferent, hwndParent);
  222.     return hr;
  223. }
  224. STDMETHODIMP Intshcut::GetReferent(PSTR pszReferent, int cchReferent)
  225. {
  226.     HRESULT hr;
  227.     WCHAR szReferent[MAX_URL_STRING];
  228.     ASSERT(cchReferent <= ARRAYSIZE(szReferent));
  229.     hr = GetReferent(szReferent, ARRAYSIZE(szReferent));
  230.     if (SUCCEEDED(hr))
  231.         SHUnicodeToAnsi(szReferent, pszReferent, cchReferent);
  232.     return hr;
  233. }
  234. STDMETHODIMP Intshcut::SetFolder(LPCSTR pcszFolder)
  235. {
  236.     HRESULT hr;
  237.     WCHAR szFolder[MAX_PATH];
  238.     ASSERT(lstrlenA(pcszFolder) + 1 < ARRAYSIZE(szFolder))
  239.     SHAnsiToUnicode(pcszFolder, szFolder, ARRAYSIZE(szFolder));
  240.     hr = SetFolder(szFolder);
  241.     
  242.     return(hr);
  243. }
  244. STDMETHODIMP
  245. Intshcut::GetFolder(
  246.     LPSTR pszFolder,
  247.     int cchFolder)
  248. {
  249.     HRESULT hr;
  250.     WCHAR szFolder[MAX_PATH];
  251.     ASSERT(cchFolder <= ARRAYSIZE(szFolder));
  252.     hr = GetFolder(szFolder, ARRAYSIZE(szFolder));
  253.     if (SUCCEEDED(hr))
  254.         SHUnicodeToAnsi(szFolder, pszFolder, cchFolder);
  255.     return hr;
  256. }
  257. STDMETHODIMP
  258. Intshcut::GetName(
  259.     LPSTR pszName,
  260.     int cchBuf)
  261. {
  262.     HRESULT hr;
  263.     WCHAR szName[MAX_PATH];
  264.     ASSERT(cchBuf <= ARRAYSIZE(szName));
  265.     hr = GetName(szName, ARRAYSIZE(szName));
  266.     if (SUCCEEDED(hr))
  267.         SHUnicodeToAnsi(szName, pszName, cchBuf);
  268.     return hr;
  269. }
  270. STDMETHODIMP
  271. Intshcut::GetExtension(
  272.     LPSTR pszExtension,
  273.     int cchBufMax)
  274. {
  275.     HRESULT hr;
  276.     WCHAR szExtension[MAX_PATH];
  277.     ASSERT(cchBufMax<= ARRAYSIZE(szExtension));
  278.     hr = GetExtension(szExtension, ARRAYSIZE(szExtension));
  279.     if (SUCCEEDED(hr))
  280.         SHUnicodeToAnsi(szExtension, pszExtension, cchBufMax);
  281.     return hr;
  282. }