summaryrefslogtreecommitdiff
path: root/nfp/net/driver/Queue.h
blob: 55b2ff39d523bf4dbb37158005536145c13d202f (plain)
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*++

Copyright (c) Microsoft Corporation. All rights reserved.

Module Name:

    queue.h

Abstract:

    This file defines the queue callback interface.

Environment:

    user mode only

Revision History:

--*/

#pragma once

#include "device.h"
#include "Connection.h"

static const int KilobytesPerSecond = 20;

static const int MaxCbPayload = 10240;
static const int MaxCchType = 507; // maximum message type length is 5 for "?ubs\\", 250 for protocol + 250 for subtype + 1 each for dot "." and NULL terminator.
static const int MaxCchTypeNetwork = 502; // maximum message type length over the network is 250 for protocol + 250 for subtype + 1 each for dot "." and NULL terminator.
static const int MinCchType = 2;
static const int MaxCchMimeType = 256;

#define WINDOWS_PROTOCOL        L"Windows."
#define WINDOWS_PROTOCOL_CHARS  8

#define WINDOWSURI_PROTOCOL  L"WindowsUri"

#define WINDOWSMIME_PROTOCOL       L"WindowsMime"
#define WINDOWSMIME_PROTOCOL_CHARS 11

#define PUBS_NAMESPACE        L"Pubs\\"
#define PUBS_NAMESPACE_CHARS  5

#define SUBS_NAMESPACE        L"Subs\\"
#define SUBS_NAMESPACE_CHARS  5

#define DEVICE_ARRIVED       L"DeviceArrived"
#define DEVICE_DEPARTED      L"DeviceDeparted"

#define PAIRING_PROTOCOL        L"Pairing:"
#define PAIRING_PROTOCOL_CHARS  8

#define NDEF_PROTOCOL           L"NDEF"
#define NDEF_PROTOCOL_CHARS     4

#define NDEF_EMPTY_TYPE         L"Empty"
#define NDEF_EMPTY_TYPE_CHARS   5

struct MESSAGE
{
    MESSAGE() :
        m_cbPayload(0)
    {
        ZeroMemory(m_szType, sizeof(m_szType));
        ZeroMemory(m_Payload, sizeof(m_Payload));
    }
    
    void Initialize(
        _In_                   PCWSTR szType,
        _In_                   DWORD  cbPayload, 
        _In_reads_bytes_(cbPayload) PBYTE  pbPayload
        )
    {
        ZeroMemory(m_szType, sizeof(m_szType));
        ZeroMemory(m_Payload, sizeof(m_Payload));
        
        m_cbPayload = cbPayload;
        StringCchCopy(m_szType, ARRAY_SIZE(m_szType), szType);
        CopyMemory(m_Payload, pbPayload, cbPayload);
    }
    
    wchar_t m_szType[MaxCchTypeNetwork];
    DWORD   m_cbPayload;
    BYTE    m_Payload[MaxCbPayload];
};


//
// Queue Callback Object.
//

class ATL_NO_VTABLE CMyQueue : 
    public CComObjectRootEx<CComMultiThreadModel>,
    public IQueueCallbackCreate,
    public IQueueCallbackDeviceIoControl,
    public IRequestCallbackCancel,
    public IObjectCleanup,
    public IValidateAccept,
    public IConnectionCallback
{
public:

DECLARE_NOT_AGGREGATABLE(CMyQueue)

BEGIN_COM_MAP(CMyQueue)
    COM_INTERFACE_ENTRY(IQueueCallbackCreate)
    COM_INTERFACE_ENTRY(IQueueCallbackDeviceIoControl)
    COM_INTERFACE_ENTRY(IRequestCallbackCancel)
    COM_INTERFACE_ENTRY(IObjectCleanup)
END_COM_MAP()

public:

    //IQueueCallbackCreate
    STDMETHOD_(void,OnCreateFile)(_In_ IWDFIoQueue* pWdfQueue, _In_ IWDFIoRequest* pWDFRequest, _In_ IWDFFile* pWdfFileObject);

    //IQueueCallbackDeviceIoControl
    STDMETHOD_(void,OnDeviceIoControl)(_In_ IWDFIoQueue* pWdfQueue, _In_ IWDFIoRequest* pWDFRequest, _In_ ULONG ControlCode, _In_ SIZE_T InBufferSize, _In_ SIZE_T OutBufferSize);
    
    //IObjectCleanup
    STDMETHOD_(void,OnCleanup)(_In_ IWDFObject* pWdfObject);

    //IValidateAccept
    void ValidateAccept(_In_ SOCKET Socket, _In_ GUID* pMagicPacket);


    //IRequestCallbackCancel
    STDMETHODIMP_(void)
    OnCancel(
        _In_ IWDFIoRequest* pWdfRequest
        );

    //IConnectionCallback
    virtual void HandleReceivedMessage(_In_ MESSAGE* pMessageData);
    virtual void ConnectionEstablished(_In_ CConnection* pBthConnection);
    virtual BOOL ConnectionTerminated(_In_ CConnection* pBthConnection);

public:
    CMyQueue();
    ~CMyQueue();

    STDMETHOD(Initialize)(_In_ CMyDevice * Device);

    HRESULT
    Configure(
        VOID
        );
    
    STDMETHODIMP_(void)
    OnCloseFile(
        _In_ IWDFFile* pWdfFileObject
        );

private:
    
    void AddArrivalEvent();
    void AddRemovalEvent();

private:
    CComPtr<IWDFIoQueue> m_FxQueue;
    
    LIST_ENTRY       m_SubsHead;
    LIST_ENTRY       m_ArrivalSubsHead;
    LIST_ENTRY       m_DepartureSubsHead;
    CRITICAL_SECTION m_SubsLock;
    
    LIST_ENTRY       m_PubsHead;
    CRITICAL_SECTION m_PubsLock;
    
    LIST_ENTRY       m_ConnectionHead;
    CRITICAL_SECTION m_ConnectionLock;

    CSocketListener m_SocketListener;
};