1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#ifndef NULLSOFT_WMHANDLERH
#define NULLSOFT_WMHANDLERH
#include <wmsdk.h>
#define NEXT(x) { if (next) next->x; }
enum DRM_INDIVIDUALIZATION_STATUS {
INDI_UNDEFINED = 0x0000,
INDI_BEGIN = 0x0001,
INDI_SUCCEED = 0x0002,
INDI_FAIL = 0x0004,
INDI_CANCEL = 0x0008,
INDI_DOWNLOAD = 0x0010,
INDI_INSTALL = 0x0020
};
enum DRM_HTTP_STATUS {
HTTP_NOTINITIATED = 0,
HTTP_CONNECTING = 1,
HTTP_REQUESTING = 2,
HTTP_RECEIVING = 3,
HTTP_COMPLETED = 4
};
typedef struct _WMGetLicenseData {
DWORD dwSize;
HRESULT hr;
WCHAR* wszURL;
WCHAR* wszLocalFilename;
BYTE* pbPostData;
DWORD dwPostDataSize;
} WM_GET_LICENSE_DATA;
typedef struct _WMIndividualizeStatus {
HRESULT hr;
DRM_INDIVIDUALIZATION_STATUS enIndiStatus;
LPSTR pszIndiRespUrl;
DWORD dwHTTPRequest;
DRM_HTTP_STATUS enHTTPStatus;
DWORD dwHTTPReadProgress;
DWORD dwHTTPReadTotal;
} WM_INDIVIDUALIZE_STATUS;
class WMHandler //: public Chainable<WMHandler>
{
public:
WMHandler();
~WMHandler();
WMHandler &operator << (WMHandler &chain);
WMHandler &operator >> (WMHandler &chain);
WMHandler&operator << (WMHandler *chain);
WMHandler &operator >> (WMHandler *chain);
WMHandler &First();
virtual void Opened() NEXT(Opened())
virtual void OpenFailed();
virtual void ReOpen();
virtual void SampleReceived(QWORD &timeStamp, QWORD &duration, unsigned long &outputNum, unsigned long &flags, INSSBuffer *&sample)
NEXT(SampleReceived(timeStamp, duration, outputNum, flags, sample))
virtual void AudioDataReceived(void *data, unsigned long sizeBytes, DWORD timestamp)
NEXT(AudioDataReceived(data, sizeBytes, timestamp))
virtual void TimeReached(QWORD &timeReached) NEXT(TimeReached(timeReached))
virtual void NewSourceFlags() NEXT(NewSourceFlags())
virtual void HasVideo(bool &video) NEXT(HasVideo(video))
virtual void Started();
virtual void Stopped();
virtual void Stopping() NEXT(Stopping())
virtual void DRMExpired() NEXT(DRMExpired())
virtual void Error();
virtual void Kill() NEXT(Kill())
virtual void PreRollComplete();
virtual void EndOfFile();
virtual void Closed();
virtual void BufferingStarted();
virtual void BufferingStopped();
virtual void NewMetadata();
virtual void Connecting() NEXT(Connecting())
virtual void Locating() NEXT(Locating())
virtual void Individualize();
virtual void NeedsIndividualization() NEXT(NeedsIndividualization())
virtual void IndividualizeStatus(WM_INDIVIDUALIZE_STATUS *status) NEXT(IndividualizeStatus(status))
virtual void SignatureState(WMT_DRMLA_TRUST *&state);
virtual void NoRights(wchar_t *licenseData);
virtual void NoRightsEx(WM_GET_LICENSE_DATA *&licenseData);
virtual void AcquireLicense(WM_GET_LICENSE_DATA *&licenseData);
virtual void LicenseRequired();
virtual void BrowserClosed() NEXT(BrowserClosed())
virtual void LicenseAcquired() NEXT(LicenseAcquired())
virtual void AllocateOutput(long outputNum, long bufferSize, INSSBuffer *&buffer);
virtual void MonitorCancelled() NEXT(MonitorCancelled())
virtual void SilentCancelled() NEXT(SilentCancelled())
virtual void VideoCatchup(QWORD time);
virtual void TimeToSync(QWORD timeStamp, __int64 &diff);
virtual void OpenCalled() NEXT(OpenCalled())
virtual void InitPlaylistBurn() NEXT(InitPlaylistBurn())
virtual void AccessDenied() NEXT(AccessDenied())
private:
WMHandler *next, *prev;
};
#undef NEXT
#endif
|