Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.7 KiB

  1. /*
  2. * infotip.cpp - IQueryInfo implementation
  3. */
  4. /* Headers
  5. **********/
  6. #include "project.hpp"
  7. #include <stdio.h> // for _snwprintf
  8. #include "shellres.h"
  9. const UINT s_ucMaxNameLen = 20;
  10. const UINT s_ucMaxTypeLen = 10;
  11. const UINT s_ucMaxLocationLen = 15;
  12. const UINT s_ucMaxCodebaseLen = 15;
  13. // see GetInfoTip() for how the tip string/string-length is assembled
  14. const UINT s_ucMaxTipLen = s_ucMaxNameLen+s_ucMaxTypeLen+s_ucMaxLocationLen \
  15. +s_ucMaxCodebaseLen+DISPLAYNAMESTRINGLENGTH \
  16. +TYPESTRINGLENGTH+MAX_PATH+MAX_URL_LENGTH+8;
  17. extern HINSTANCE g_DllInstance;
  18. // ----------------------------------------------------------------------------
  19. HRESULT STDMETHODCALLTYPE CFusionShortcut::GetInfoFlags(DWORD *pdwFlags)
  20. {
  21. if (pdwFlags)
  22. *pdwFlags = 0;
  23. return S_OK; //E_NOTIMPL?
  24. }
  25. // ----------------------------------------------------------------------------
  26. // BUGBUG?: maybe replace the use of g_cwzEmptyString with L"(unknown)"?
  27. HRESULT STDMETHODCALLTYPE CFusionShortcut::GetInfoTip(DWORD dwFlags, LPWSTR *ppwszTip)
  28. {
  29. HRESULT hr = S_OK;
  30. LPMALLOC lpMalloc = NULL;
  31. WCHAR wzTip[s_ucMaxTipLen];
  32. WCHAR wzNameHint[s_ucMaxNameLen];
  33. WCHAR wzTypeHint[s_ucMaxTypeLen];
  34. WCHAR wzLocationHint[s_ucMaxLocationLen];
  35. WCHAR wzCodebaseHint[s_ucMaxCodebaseLen];
  36. LPWSTR pwzName = (m_pwzDesc ? m_pwzDesc : (LPWSTR) g_cwzEmptyString);
  37. LPWSTR pwzLocation = (m_pwzPath ? m_pwzPath : (LPWSTR) g_cwzEmptyString);
  38. LPWSTR pwzCodebase = (m_pwzCodebase ? m_pwzCodebase : (LPWSTR) g_cwzEmptyString);
  39. LPWSTR pwzAppType = NULL;
  40. LPASSEMBLY_IDENTITY pId = NULL;
  41. // dwFlags ignored
  42. if (ppwszTip)
  43. *ppwszTip = NULL;
  44. else
  45. {
  46. hr = E_INVALIDARG;
  47. goto exit;
  48. }
  49. // Allocate a shell memory object.
  50. hr = SHGetMalloc (&lpMalloc);
  51. if (FAILED (hr))
  52. goto exit;
  53. wzTip[0] = L'\0';
  54. // load resources
  55. if (!LoadString(g_DllInstance, IDS_TIP_NAME, wzNameHint, s_ucMaxNameLen))
  56. {
  57. // do not fail
  58. wzNameHint[0] = L'\0';
  59. }
  60. if (!LoadString(g_DllInstance, IDS_TIP_TYPE, wzTypeHint, s_ucMaxTypeLen))
  61. {
  62. // do not fail
  63. wzTypeHint[0] = L'\0';
  64. }
  65. if (!LoadString(g_DllInstance, IDS_TIP_LOCATION, wzLocationHint, s_ucMaxLocationLen))
  66. {
  67. // do not fail
  68. wzLocationHint[0] = L'\0';
  69. }
  70. if (!LoadString(g_DllInstance, IDS_TIP_CODEBASE, wzCodebaseHint, s_ucMaxCodebaseLen))
  71. {
  72. // do not fail
  73. wzCodebaseHint[0] = L'\0';
  74. }
  75. if (SUCCEEDED(hr = GetAssemblyIdentity(&pId)))
  76. {
  77. DWORD ccString = 0;
  78. if (FAILED(pId->GetAttribute(SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_TYPE, &pwzAppType, &ccString)))
  79. pwzAppType = NULL;
  80. pId->Release();
  81. pId = NULL;
  82. }
  83. // ignore error
  84. // BUGBUG?: "(null)" is displayed if m_pwzDesc or m_pwzPath == NULL...
  85. if (_snwprintf(wzTip, s_ucMaxTipLen, L"%s %s\n%s %s\n%s %s\n%s %s",
  86. wzNameHint, pwzName, wzTypeHint, (pwzAppType ? pwzAppType : g_cwzEmptyString),
  87. wzLocationHint, pwzLocation, wzCodebaseHint, pwzCodebase) < 0)
  88. wzTip[s_ucMaxTipLen-1] = L'\0';
  89. // Get some memory
  90. *ppwszTip = (LPWSTR) lpMalloc->Alloc ((wcslen(wzTip)+1)*sizeof(WCHAR));
  91. if (! *ppwszTip)
  92. {
  93. hr = E_OUTOFMEMORY;
  94. goto exit; // Error - could not allocate memory
  95. }
  96. wcscpy(*ppwszTip, wzTip);
  97. exit:
  98. if (pwzAppType)
  99. delete [] pwzAppType;
  100. if (lpMalloc)
  101. lpMalloc->Release();
  102. return hr;
  103. }