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.

128 lines
3.0 KiB

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1997, Microsoft Corp. All rights reserved.
  4. //
  5. // FILE
  6. //
  7. // AuditChannel.cpp
  8. //
  9. // SYNOPSIS
  10. //
  11. // Implements the class AuditChannel.
  12. //
  13. // MODIFICATION HISTORY
  14. //
  15. // 09/05/1997 Original version.
  16. //
  17. ///////////////////////////////////////////////////////////////////////////////
  18. #include <iascore.h>
  19. #include <guard.h>
  20. #include <algorithm>
  21. #include <AuditChannel.h>
  22. ///////////////////////////////////////////////////////////////////////////////
  23. //
  24. // METHOD
  25. //
  26. // AuditChannel::Clear
  27. //
  28. ///////////////////////////////////////////////////////////////////////////////
  29. STDMETHODIMP AuditChannel::Clear()
  30. {
  31. _com_serialize
  32. sinks.clear();
  33. return S_OK;
  34. }
  35. ///////////////////////////////////////////////////////////////////////////////
  36. //
  37. // METHOD
  38. //
  39. // AuditChannel::Connect
  40. //
  41. ///////////////////////////////////////////////////////////////////////////////
  42. STDMETHODIMP AuditChannel::Connect(IAuditSink* pSink)
  43. {
  44. if (pSink == NULL) { return E_POINTER; }
  45. _com_serialize
  46. // Check if we already have this audit sink.
  47. if (std::find(sinks.begin(), sinks.end(), pSink) != sinks.end())
  48. {
  49. return HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS);
  50. }
  51. try
  52. {
  53. // Insert the interface into the audit sink list.
  54. sinks.push_back(pSink);
  55. }
  56. catch (std::bad_alloc)
  57. {
  58. return E_OUTOFMEMORY;
  59. }
  60. return S_OK;
  61. }
  62. ///////////////////////////////////////////////////////////////////////////////
  63. //
  64. // METHOD
  65. //
  66. // AuditChannel::Disconnect
  67. //
  68. ///////////////////////////////////////////////////////////////////////////////
  69. STDMETHODIMP AuditChannel::Disconnect(IAuditSink* pSink)
  70. {
  71. if (pSink == NULL) { return E_POINTER; }
  72. _com_serialize
  73. // Find the specified audit sink.
  74. SinkVector::iterator i = std::find(sinks.begin(), sinks.end(), pSink);
  75. if (i == sinks.end()) { return E_INVALIDARG; }
  76. // Erase the audit sink from the list.
  77. sinks.erase(i);
  78. return S_OK;
  79. }
  80. ///////////////////////////////////////////////////////////////////////////////
  81. //
  82. // METHOD
  83. //
  84. // AuditChannel::AuditEvent
  85. //
  86. ///////////////////////////////////////////////////////////////////////////////
  87. STDMETHODIMP AuditChannel::AuditEvent(ULONG ulEventID,
  88. ULONG ulNumStrings,
  89. ULONG ulDataSize,
  90. wchar_t** aszStrings,
  91. byte* pRawData)
  92. {
  93. _ASSERT(ulNumStrings == 0 || aszStrings != NULL);
  94. _ASSERT(ulDataSize == 0 || pRawData != NULL);
  95. _com_serialize
  96. // Forward the data to each sink.
  97. for (SinkVector::iterator i = sinks.begin(); i != sinks.end(); ++i)
  98. {
  99. (*i)->AuditEvent(ulEventID,
  100. ulNumStrings,
  101. ulDataSize,
  102. aszStrings,
  103. pRawData);
  104. }
  105. return S_OK;
  106. }