Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "WebSocketFrame.h"
8 :
9 : #include "WebSocketChannel.h"
10 : #include "nsSocketTransportService2.h"
11 : #include "nsThreadUtils.h" // for NS_IsMainThread
12 : #include "ipc/IPCMessageUtils.h"
13 :
14 : namespace mozilla {
15 : namespace net {
16 :
17 0 : NS_INTERFACE_MAP_BEGIN(WebSocketFrame)
18 0 : NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebSocketFrame)
19 0 : NS_INTERFACE_MAP_ENTRY(nsIWebSocketFrame)
20 0 : NS_INTERFACE_MAP_END
21 :
22 0 : NS_IMPL_ADDREF(WebSocketFrame)
23 0 : NS_IMPL_RELEASE(WebSocketFrame)
24 :
25 0 : WebSocketFrame::WebSocketFrame(const WebSocketFrameData& aData)
26 0 : : mData(aData)
27 0 : {}
28 :
29 0 : WebSocketFrame::WebSocketFrame(bool aFinBit, bool aRsvBit1, bool aRsvBit2,
30 : bool aRsvBit3, uint8_t aOpCode, bool aMaskBit,
31 0 : uint32_t aMask, const nsCString& aPayload)
32 0 : : mData(PR_Now(), aFinBit, aRsvBit1, aRsvBit2, aRsvBit3, aOpCode, aMaskBit,
33 0 : aMask, aPayload)
34 : {
35 0 : MOZ_ASSERT(OnSocketThread(), "not on socket thread");
36 0 : mData.mTimeStamp = PR_Now();
37 0 : }
38 :
39 0 : WebSocketFrame::~WebSocketFrame()
40 0 : {}
41 :
42 : #define WSF_GETTER( method, value , type ) \
43 : NS_IMETHODIMP \
44 : WebSocketFrame::method(type* aValue) \
45 : { \
46 : MOZ_ASSERT(NS_IsMainThread()); \
47 : if (!aValue) { \
48 : return NS_ERROR_FAILURE; \
49 : } \
50 : *aValue = value; \
51 : return NS_OK; \
52 : }
53 :
54 0 : WSF_GETTER(GetTimeStamp, mData.mTimeStamp, DOMHighResTimeStamp);
55 0 : WSF_GETTER(GetFinBit, mData.mFinBit, bool);
56 0 : WSF_GETTER(GetRsvBit1, mData.mRsvBit1, bool);
57 0 : WSF_GETTER(GetRsvBit2, mData.mRsvBit2, bool);
58 0 : WSF_GETTER(GetRsvBit3, mData.mRsvBit3, bool);
59 0 : WSF_GETTER(GetOpCode, mData.mOpCode, uint16_t);
60 0 : WSF_GETTER(GetMaskBit, mData.mMaskBit, bool);
61 0 : WSF_GETTER(GetMask, mData.mMask, uint32_t);
62 :
63 : #undef WSF_GETTER
64 :
65 : NS_IMETHODIMP
66 0 : WebSocketFrame::GetPayload(nsACString& aValue)
67 : {
68 0 : MOZ_ASSERT(NS_IsMainThread());
69 0 : aValue = mData.mPayload;
70 0 : return NS_OK;
71 : }
72 :
73 0 : WebSocketFrameData::WebSocketFrameData()
74 : : mTimeStamp(0)
75 : , mFinBit(false)
76 : , mRsvBit1(false)
77 : , mRsvBit2(false)
78 : , mRsvBit3(false)
79 : , mMaskBit(false)
80 : , mOpCode(0)
81 0 : , mMask(0)
82 : {
83 0 : MOZ_COUNT_CTOR(WebSocketFrameData);
84 0 : }
85 :
86 0 : WebSocketFrameData::WebSocketFrameData(DOMHighResTimeStamp aTimeStamp,
87 : bool aFinBit, bool aRsvBit1,
88 : bool aRsvBit2, bool aRsvBit3,
89 : uint8_t aOpCode, bool aMaskBit,
90 : uint32_t aMask,
91 0 : const nsCString& aPayload)
92 : : mTimeStamp(aTimeStamp)
93 : , mFinBit(aFinBit)
94 : , mRsvBit1(aRsvBit1)
95 : , mRsvBit2(aRsvBit2)
96 : , mRsvBit3(aRsvBit3)
97 : , mMaskBit(aMaskBit)
98 : , mOpCode(aOpCode)
99 : , mMask(aMask)
100 0 : , mPayload(aPayload)
101 : {
102 0 : MOZ_COUNT_CTOR(WebSocketFrameData);
103 0 : }
104 :
105 0 : WebSocketFrameData::WebSocketFrameData(const WebSocketFrameData& aData)
106 0 : : mTimeStamp(aData.mTimeStamp)
107 0 : , mFinBit(aData.mFinBit)
108 0 : , mRsvBit1(aData.mRsvBit1)
109 0 : , mRsvBit2(aData.mRsvBit2)
110 0 : , mRsvBit3(aData.mRsvBit3)
111 0 : , mMaskBit(aData.mMaskBit)
112 0 : , mOpCode(aData.mOpCode)
113 0 : , mMask(aData.mMask)
114 0 : , mPayload(aData.mPayload)
115 : {
116 0 : MOZ_COUNT_CTOR(WebSocketFrameData);
117 0 : }
118 :
119 0 : WebSocketFrameData::~WebSocketFrameData()
120 : {
121 0 : MOZ_COUNT_DTOR(WebSocketFrameData);
122 0 : }
123 :
124 : void
125 0 : WebSocketFrameData::WriteIPCParams(IPC::Message* aMessage) const
126 : {
127 0 : WriteParam(aMessage, mTimeStamp);
128 0 : WriteParam(aMessage, mFinBit);
129 0 : WriteParam(aMessage, mRsvBit1);
130 0 : WriteParam(aMessage, mRsvBit2);
131 0 : WriteParam(aMessage, mRsvBit3);
132 0 : WriteParam(aMessage, mOpCode);
133 0 : WriteParam(aMessage, mMaskBit);
134 0 : WriteParam(aMessage, mMask);
135 0 : WriteParam(aMessage, mPayload);
136 0 : }
137 :
138 : bool
139 0 : WebSocketFrameData::ReadIPCParams(const IPC::Message* aMessage,
140 : PickleIterator* aIter)
141 : {
142 0 : if (!ReadParam(aMessage, aIter, &mTimeStamp)) {
143 0 : return false;
144 : }
145 :
146 : #define ReadParamHelper(x) \
147 : { \
148 : bool bit; \
149 : if (!ReadParam(aMessage, aIter, &bit)) { \
150 : return false; \
151 : } \
152 : x = bit; \
153 : }
154 :
155 0 : ReadParamHelper(mFinBit);
156 0 : ReadParamHelper(mRsvBit1);
157 0 : ReadParamHelper(mRsvBit2);
158 0 : ReadParamHelper(mRsvBit3);
159 0 : ReadParamHelper(mMaskBit);
160 :
161 : #undef ReadParamHelper
162 :
163 0 : return ReadParam(aMessage, aIter, &mOpCode) &&
164 0 : ReadParam(aMessage, aIter, &mMask) &&
165 0 : ReadParam(aMessage, aIter, &mPayload);
166 : }
167 :
168 : } // net namespace
169 9 : } // mozilla namespace
|