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
114
115
116
117
118
119
120
121
122
123
124
125
|
#include "./commandWinampAuth.h"
#include "./resultWinampAuth.h"
LoginCommandWinampAuth::LoginCommandWinampAuth()
: ref(1)
{
}
LoginCommandWinampAuth::~LoginCommandWinampAuth()
{
}
HRESULT LoginCommandWinampAuth::CreateInstance(LoginCommandWinampAuth **instance)
{
if (NULL == instance) return E_POINTER;
*instance = new LoginCommandWinampAuth();
if (NULL == *instance) return E_OUTOFMEMORY;
return S_OK;
}
ULONG LoginCommandWinampAuth::AddRef()
{
return InterlockedIncrement((LONG*)&ref);
}
ULONG LoginCommandWinampAuth::Release()
{
if (0 == ref)
return ref;
LONG r = InterlockedDecrement((LONG*)&ref);
if (0 == r)
delete(this);
return r;
}
HRESULT LoginCommandWinampAuth::GetType(GUID *commandUid)
{
if (NULL == commandUid) return E_INVALIDARG;
*commandUid = LCUID_WINAMPAUTH;
return S_OK;
}
HRESULT LoginCommandWinampAuth::SetParameter(LPCWSTR pszKey, LPCWSTR pszValue)
{
return E_NOTIMPL;
}
HRESULT LoginCommandWinampAuth::IsValid()
{
return S_OK;
}
HRESULT LoginCommandWinampAuth::IsIdentical(LoginCommand *test)
{
if (NULL == test)
return E_INVALIDARG;
GUID typeId;
if (FAILED(test->GetType(&typeId)) || FALSE == IsEqualGUID(LCUID_WINAMPAUTH, typeId))
return S_FALSE;
return S_OK;
}
HRESULT LoginCommandWinampAuth::BeginLogin(LoginData *data, LoginResult::Callback callback, void *user, LoginResult **result)
{
LoginResultWinampAuth *winampAuth;
HRESULT hr = LoginResultWinampAuth::CreateInstance(data, callback, user, &winampAuth);
if (SUCCEEDED(hr))
{
if (NULL != result)
*result = winampAuth;
else
winampAuth->Release();
}
else
{
if (NULL != result)
*result = NULL;
}
return hr;
}
HRESULT LoginCommandWinampAuth::EndLogin(LoginResult *result, INT *authCode, LoginCredentials **credentials)
{
if (NULL == result)
return E_INVALIDARG;
HRESULT hr = result->IsCompleted();
if (S_OK != hr)
{
HANDLE completed;
hr = result->GetWaitHandle(&completed);
if (SUCCEEDED(hr))
{
WaitForSingleObjectEx(completed, INFINITE, TRUE);
CloseHandle(completed);
}
}
if (SUCCEEDED(hr))
{
LoginResultWinampAuth *winampAuth;
hr = result->QueryInterface(LCUID_WINAMPAUTH, (void**)&winampAuth);
if(SUCCEEDED(hr))
{
hr = winampAuth->GetResult(authCode, credentials);
winampAuth->Release();
}
}
return hr;
}
HRESULT LoginCommandWinampAuth::RequestAbort(LoginResult *result, BOOL drop)
{
if (NULL == result) return E_INVALIDARG;
return result->RequestAbort(drop);
}
|