1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* vim: set sw=2 ts=8 et ft=cpp: */
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 "mozilla/ipc/Nfc.h"
12 #include <sys/socket.h>
16 #if (defined(MOZ_WIDGET_GONK) && defined(DEBUG))
17 #include <android/log.h>
18 #define CHROMIUM_LOG(args...) __android_log_print(ANDROID_LOG_INFO, "Gonk", args)
20 #define CHROMIUM_LOG(args...)
23 #include "jsfriendapi.h"
24 #include "mozilla/ArrayUtils.h"
25 #include "mozilla/ipc/UnixSocketConnector.h"
26 #include "nsThreadUtils.h" // For NS_IsMainThread.
28 using namespace mozilla::ipc
;
32 static const char NFC_SOCKET_NAME
[] = "/dev/socket/nfcd";
34 // Network port to connect to for adb forwarded sockets when doing
35 // desktop development.
36 static const uint32_t NFC_TEST_PORT
= 6400;
38 class SendNfcSocketDataTask final
: public nsRunnable
41 SendNfcSocketDataTask(NfcConsumer
* aConsumer
, UnixSocketRawData
* aRawData
)
42 : mConsumer(aConsumer
)
48 MOZ_ASSERT(NS_IsMainThread());
51 mConsumer
->GetConnectionStatus() != SOCKET_CONNECTED
) {
52 // Probably shuting down.
56 mConsumer
->SendSocketData(mRawData
.forget());
61 NfcConsumer
* mConsumer
;
62 nsAutoPtr
<UnixSocketRawData
> mRawData
;
65 class NfcConnector final
: public mozilla::ipc::UnixSocketConnector
71 int Create() override
;
72 bool CreateAddr(bool aIsServer
,
75 const char* aAddress
) override
;
76 bool SetUp(int aFd
) override
;
77 bool SetUpListenSocket(int aFd
) override
;
78 void GetSocketAddr(const sockaddr_any
& aAddr
,
79 nsAString
& aAddrStr
) override
;
83 NfcConnector::Create()
85 MOZ_ASSERT(!NS_IsMainThread());
89 #if defined(MOZ_WIDGET_GONK)
90 fd
= socket(AF_LOCAL
, SOCK_STREAM
, 0);
92 // If we can't hit a local loopback, fail later in connect.
93 fd
= socket(AF_INET
, SOCK_STREAM
, 0);
97 NS_WARNING("Could not open nfc socket!");
102 NS_WARNING("Could not set up socket!");
108 NfcConnector::CreateAddr(bool aIsServer
,
109 socklen_t
& aAddrSize
,
111 const char* aAddress
)
113 // We never open nfc socket as server.
114 MOZ_ASSERT(!aIsServer
);
116 #if defined(MOZ_WIDGET_GONK)
123 aAddr
.un
.sun_family
= af
;
124 if(strlen(aAddress
) > sizeof(aAddr
.un
.sun_path
)) {
125 NS_WARNING("Address too long for socket struct!");
128 strcpy((char*)&aAddr
.un
.sun_path
, aAddress
);
129 aAddrSize
= strlen(aAddress
) + offsetof(struct sockaddr_un
, sun_path
) + 1;
132 aAddr
.in
.sin_family
= af
;
133 aAddr
.in
.sin_port
= htons(NFC_TEST_PORT
);
134 aAddr
.in
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
135 aAddrSize
= sizeof(sockaddr_in
);
138 NS_WARNING("Socket type not handled by connector!");
145 NfcConnector::SetUp(int aFd
)
147 // Nothing to do here.
152 NfcConnector::SetUpListenSocket(int aFd
)
154 // Nothing to do here.
159 NfcConnector::GetSocketAddr(const sockaddr_any
& aAddr
,
162 MOZ_CRASH("This should never be called!");
165 } // anonymous namespace
170 NfcConsumer::NfcConsumer(NfcSocketListener
* aListener
)
171 : mListener(aListener
)
174 mAddress
= NFC_SOCKET_NAME
;
176 Connect(new NfcConnector(), mAddress
.get());
180 NfcConsumer::Shutdown()
182 MOZ_ASSERT(NS_IsMainThread());
189 NfcConsumer::PostToNfcDaemon(const uint8_t* aData
, size_t aSize
)
191 MOZ_ASSERT(!NS_IsMainThread());
193 UnixSocketRawData
* raw
= new UnixSocketRawData(aData
, aSize
);
194 nsRefPtr
<SendNfcSocketDataTask
> task
= new SendNfcSocketDataTask(this, raw
);
195 NS_DispatchToMainThread(task
);
200 NfcConsumer::ReceiveSocketData(nsAutoPtr
<UnixSocketRawData
>& aData
)
202 MOZ_ASSERT(NS_IsMainThread());
205 mListener
->ReceiveSocketData(aData
);
210 NfcConsumer::OnConnectSuccess()
212 // Nothing to do here.
213 CHROMIUM_LOG("NFC: %s\n", __FUNCTION__
);
217 NfcConsumer::OnConnectError()
219 CHROMIUM_LOG("NFC: %s\n", __FUNCTION__
);
224 NfcConsumer::OnDisconnect()
226 CHROMIUM_LOG("NFC: %s\n", __FUNCTION__
);
228 Connect(new NfcConnector(), mAddress
.get(), GetSuggestedConnectDelayMs());
232 ConnectionOrientedSocketIO
*
235 return PrepareAccept(new NfcConnector());
239 } // namespace mozilla