Bumping manifests a=b2g-bump
[gecko.git] / dom / nfc / MozNDEFRecord.cpp
blob2dd1fa0890090d6d65696fe7908e520f409ac9de
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
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/. */
7 /* Copyright © 2013 Deutsche Telekom, Inc. */
9 #include "MozNDEFRecord.h"
10 #include "mozilla/dom/MozNDEFRecordBinding.h"
11 #include "mozilla/HoldDropJSObjects.h"
12 #include "nsContentUtils.h"
15 namespace mozilla {
16 namespace dom {
19 NS_IMPL_CYCLE_COLLECTION_CLASS(MozNDEFRecord)
21 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MozNDEFRecord)
22 NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow)
23 NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
24 tmp->DropData();
25 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
27 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(MozNDEFRecord)
28 NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
29 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
30 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
32 NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(MozNDEFRecord)
33 NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mType)
34 NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mId)
35 NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mPayload)
36 NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
37 NS_IMPL_CYCLE_COLLECTION_TRACE_END
39 NS_IMPL_CYCLE_COLLECTING_ADDREF(MozNDEFRecord)
40 NS_IMPL_CYCLE_COLLECTING_RELEASE(MozNDEFRecord)
41 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MozNDEFRecord)
42 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
43 NS_INTERFACE_MAP_ENTRY(nsISupports)
44 NS_INTERFACE_MAP_END
46 void
47 MozNDEFRecord::HoldData()
49 mozilla::HoldJSObjects(this);
52 void
53 MozNDEFRecord::DropData()
55 if (mType) {
56 mType = nullptr;
58 if (mId) {
59 mId = nullptr;
61 if (mPayload) {
62 mPayload = nullptr;
64 mozilla::DropJSObjects(this);
67 /**
68 * Validate TNF.
69 * See section 3.3 THE NDEF Specification Test Requirements,
70 * NDEF specification 1.0
72 /* static */
73 bool
74 MozNDEFRecord::ValidateTNF(const MozNDEFRecordOptions& aOptions,
75 ErrorResult& aRv)
77 // * The TNF field MUST have a value between 0x00 and 0x06.
78 // * The TNF value MUST NOT be 0x07.
79 // These two requirements are already handled by WebIDL bindings.
81 // If the TNF value is 0x00 (Empty), the TYPE, ID, and PAYLOAD fields MUST be
82 // omitted from the record.
83 if ((aOptions.mTnf == TNF::Empty) &&
84 (aOptions.mType.WasPassed() || aOptions.mId.WasPassed() ||
85 aOptions.mPayload.WasPassed())) {
86 NS_WARNING("tnf is empty but type/id/payload is not null.");
87 aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
88 return false;
91 // If the TNF value is 0x05 (Unknown) or 0x06(Unchanged), the TYPE field MUST
92 // be omitted from the NDEF record.
93 if ((aOptions.mTnf == TNF::Unknown || aOptions.mTnf == TNF::Unchanged) &&
94 aOptions.mType.WasPassed()) {
95 NS_WARNING("tnf is unknown/unchanged but type is not null.");
96 aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
97 return false;
100 return true;
103 /* static */
104 already_AddRefed<MozNDEFRecord>
105 MozNDEFRecord::Constructor(const GlobalObject& aGlobal,
106 const MozNDEFRecordOptions& aOptions,
107 ErrorResult& aRv)
109 nsCOMPtr<nsPIDOMWindow> win = do_QueryInterface(aGlobal.GetAsSupports());
110 if (!win) {
111 aRv.Throw(NS_ERROR_FAILURE);
112 return nullptr;
115 if (!ValidateTNF(aOptions, aRv)) {
116 return nullptr;
119 nsRefPtr<MozNDEFRecord> ndefrecord = new MozNDEFRecord(aGlobal.Context(),
120 win, aOptions);
121 if (!ndefrecord) {
122 aRv.Throw(NS_ERROR_FAILURE);
123 return nullptr;
125 return ndefrecord.forget();
128 MozNDEFRecord::MozNDEFRecord(JSContext* aCx, nsPIDOMWindow* aWindow,
129 const MozNDEFRecordOptions& aOptions)
131 mWindow = aWindow; // For GetParentObject()
133 mTnf = aOptions.mTnf;
134 mSize = 3; // 1(flags) + 1(type_length) + 1(payload_length)
136 if (aOptions.mType.WasPassed()) {
137 const Uint8Array& type = aOptions.mType.Value();
138 type.ComputeLengthAndData();
139 mType = Uint8Array::Create(aCx, this, type.Length(), type.Data());
140 mSize += type.Length();
143 if (aOptions.mId.WasPassed()) {
144 const Uint8Array& id = aOptions.mId.Value();
145 id.ComputeLengthAndData();
146 mId = Uint8Array::Create(aCx, this, id.Length(), id.Data());
147 mSize += 1 /* id_length */ + id.Length();
150 if (aOptions.mPayload.WasPassed()) {
151 const Uint8Array& payload = aOptions.mPayload.Value();
152 payload.ComputeLengthAndData();
153 mPayload = Uint8Array::Create(aCx, this, payload.Length(), payload.Data());
154 if (payload.Length() > 0xff) {
155 mSize += 3;
157 mSize += payload.Length();
160 HoldData();
163 MozNDEFRecord::~MozNDEFRecord()
165 DropData();
168 JSObject*
169 MozNDEFRecord::WrapObject(JSContext* aCx)
171 return MozNDEFRecordBinding::Wrap(aCx, this);
174 } // namespace dom
175 } // namespace mozilla