Skip to content

Commit

Permalink
feat(ble): only export darwin in one file
Browse files Browse the repository at this point in the history
Signed-off-by: Sacha Froment <sfroment42@gmail.com>
  • Loading branch information
sfroment committed Nov 9, 2018
1 parent 3367e00 commit b100434
Show file tree
Hide file tree
Showing 6 changed files with 183 additions and 187 deletions.
2 changes: 0 additions & 2 deletions core/network/ble/addr.go
@@ -1,5 +1,3 @@
// +build darwin

package ble

import "net"
Expand Down
93 changes: 1 addition & 92 deletions core/network/ble/conn.go
Expand Up @@ -2,17 +2,8 @@

package ble

/*
#cgo darwin CFLAGS: -x objective-c -Wno-incompatible-pointer-types -Wno-missing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wdocumentation -Wunreachable-code -Wno-implicit-atomic-properties -Werror=deprecated-objc-isa-usage -Wno-objc-interface-ivars -Werror=objc-root-class -Wno-arc-repeated-use-of-weak -Wimplicit-retain-self -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wno-float-conversion -Wnon-literal-null-conversion -Wobjc-literal-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wdeprecated-implementations -DNS_BLOCK_ASSERTIONS=1 -DOBJC_OLD_DISPATCH_PROTOTYPES=0
#cgo darwin LDFLAGS: -framework Foundation -framework CoreBluetooth
#import "ble.h"
*/
import "C"

import (
"fmt"
"time"
"unsafe"
"C"

ic "github.com/libp2p/go-libp2p-crypto"
peer "github.com/libp2p/go-libp2p-peer"
Expand Down Expand Up @@ -43,40 +34,6 @@ type ConnForSmux struct {

var conns map[string]*Conn = make(map[string]*Conn)

//export sendBytesToConn
func sendBytesToConn(bleUUID *C.char, bytes unsafe.Pointer, length C.int) {
goBleUUID := C.GoString(bleUUID)
b := C.GoBytes(bytes, length)
go func(goBleUUID string, b []byte) {
for {
if conn, ok := conns[goBleUUID]; ok {
conn.incoming <- b
return
}
time.Sleep(1 * time.Second)
}
}(goBleUUID, b)
}

//export setConnClosed
func setConnClosed(bleUUID *C.char) {
goBleUUID := C.GoString(bleUUID)
if conn, ok := conns[goBleUUID]; ok {
delete(conns, goBleUUID)
conn.closed = true
conn.sess.Close()
}
}

//export callConnClose
func callConnClose(bleUUID *C.char) {
goBleUUID := C.GoString(bleUUID)
if conn, ok := conns[goBleUUID]; ok {
delete(conns, goBleUUID)
conn.sess.Close()
}
}

func NewConn(transport *Transport, lID, rID peer.ID, lAddr, rAddr ma.Multiaddr, dir int) Conn {
conn := Conn{
closed: false,
Expand Down Expand Up @@ -126,28 +83,6 @@ func (b *Conn) Read(p []byte) (n int, err error) {
return copied, nil
}

func (b *Conn) Write(p []byte) (n int, err error) {
if b.IsClosed() {
return 0, fmt.Errorf("conn already closed")
}
val, err := b.rAddr.ValueForProtocol(PBle)
if err != nil {
return 0, err
}

ma := C.CString(val)
defer C.free(unsafe.Pointer(ma))

C.writeNSData(
C.Bytes2NSData(
unsafe.Pointer(&p[0]),
C.int(len(p)),
),
ma,
)
return len(p), nil
}

func (b *Conn) LocalPeer() peer.ID {
return b.lID
}
Expand Down Expand Up @@ -177,37 +112,11 @@ func (b *Conn) Transport() tpt.Transport {
return b.transport
}

func (b *Conn) Close() error {
logger().Debug("BLEConn Close")
b.closed = true
val, err := b.rAddr.ValueForProtocol(PBle)
if err != nil {
logger().Debug("BLEConn close", zap.Error(err))
return err
}
ma := C.CString(val)
defer C.free(unsafe.Pointer(ma))
C.closeConn(ma)
return nil
}

func (b *ConnForSmux) Close() error {
logger().Debug("BLEConnForSmux Close")
return nil
}

func (b *Conn) IsClosed() bool {
val, err := b.rAddr.ValueForProtocol(PBle)
if err != nil {
logger().Debug("BLEConn IsClosed", zap.Error(err))
return true
}
ma := C.CString(val)
defer C.free(unsafe.Pointer(ma))

return b.closed
}

// OpenStream creates a new stream.
func (b *Conn) OpenStream() (smu.Stream, error) {
s, err := b.sess.OpenStream()
Expand Down
179 changes: 179 additions & 0 deletions core/network/ble/darwin.go
@@ -0,0 +1,179 @@
// +build darwin

package ble

import (
"context"
"fmt"
"time"
"unsafe"

peer "github.com/libp2p/go-libp2p-peer"
pstore "github.com/libp2p/go-libp2p-peerstore"
tpt "github.com/libp2p/go-libp2p-transport"
ma "github.com/multiformats/go-multiaddr"
"go.uber.org/zap"
)

/*
#cgo darwin CFLAGS: -x objective-c -Wno-incompatible-pointer-types -Wno-missing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wdocumentation -Wunreachable-code -Wno-implicit-atomic-properties -Werror=deprecated-objc-isa-usage -Wno-objc-interface-ivars -Werror=objc-root-class -Wno-arc-repeated-use-of-weak -Wimplicit-retain-self -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wno-float-conversion -Wnon-literal-null-conversion -Wobjc-literal-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wdeprecated-implementations -DNS_BLOCK_ASSERTIONS=1 -DOBJC_OLD_DISPATCH_PROTOTYPES=0
#cgo darwin LDFLAGS: -framework Foundation -framework CoreBluetooth
#import "ble.h"
*/
import "C"

//export sendBytesToConn
func sendBytesToConn(bleUUID *C.char, bytes unsafe.Pointer, length C.int) {
goBleUUID := C.GoString(bleUUID)
b := C.GoBytes(bytes, length)
go func(goBleUUID string, b []byte) {
for {
if conn, ok := conns[goBleUUID]; ok {
conn.incoming <- b
return
}
time.Sleep(1 * time.Second)
}
}(goBleUUID, b)
}

//export setConnClosed
func setConnClosed(bleUUID *C.char) {
goBleUUID := C.GoString(bleUUID)
if conn, ok := conns[goBleUUID]; ok {
delete(conns, goBleUUID)
conn.closed = true
conn.sess.Close()
}
}

//export callConnClose
func callConnClose(bleUUID *C.char) {
goBleUUID := C.GoString(bleUUID)
if conn, ok := conns[goBleUUID]; ok {
delete(conns, goBleUUID)
conn.sess.Close()
}
}

func (b *Conn) IsClosed() bool {
val, err := b.rAddr.ValueForProtocol(PBle)
if err != nil {
logger().Debug("BLEConn IsClosed", zap.Error(err))
return true
}
ma := C.CString(val)
defer C.free(unsafe.Pointer(ma))

return b.closed
}

func (b *Conn) Close() error {
logger().Debug("BLEConn Close")
b.closed = true
val, err := b.rAddr.ValueForProtocol(PBle)
if err != nil {
logger().Debug("BLEConn close", zap.Error(err))
return err
}
ma := C.CString(val)
defer C.free(unsafe.Pointer(ma))
C.closeConn(ma)
return nil
}

func (b *Conn) Write(p []byte) (n int, err error) {
if b.IsClosed() {
return 0, fmt.Errorf("conn already closed")
}
val, err := b.rAddr.ValueForProtocol(PBle)
if err != nil {
return 0, err
}

ma := C.CString(val)
defer C.free(unsafe.Pointer(ma))

C.writeNSData(
C.Bytes2NSData(
unsafe.Pointer(&p[0]),
C.int(len(p)),
),
ma,
)
return len(p), nil
}

//export sendAcceptToListenerForPeerID
func sendAcceptToListenerForPeerID(peerID *C.char, ble *C.char, incPeerID *C.char) {
goPeerID := C.GoString(peerID)
goble := C.GoString(ble)
goIncPeerID := C.GoString(incPeerID)
go RealAcceptSender(goPeerID, goble, goIncPeerID)
}

func NewListener(lAddr ma.Multiaddr, hostID peer.ID, t *Transport) *Listener {
m, _ := lAddr.ValueForProtocol(PBle)
val := C.CString(m)
peerID := C.CString(hostID.Pretty())
defer C.free(unsafe.Pointer(val))
defer C.free(unsafe.Pointer(peerID))
C.init(val, peerID)
time.Sleep(1 * time.Second)
go C.startAdvertising()
go C.startDiscover()
listerner := &Listener{
lAddr: lAddr,
incomingBLEUUID: make(chan string),
incomingPeerID: make(chan string),
connected: make(map[string]*Conn),
transport: t,
}

listeners[t.ID] = listerner
return listerner
}

// Dial dials the peer at the remote address.
func (t *Transport) Dial(ctx context.Context, rAddr ma.Multiaddr, p peer.ID) (tpt.Conn, error) {
if int(C.isDiscovering()) != 1 {
go C.startDiscover()
}
s, err := rAddr.ValueForProtocol(PBle)
if err != nil {
return nil, err
}

ma := C.CString(s)
defer C.free(unsafe.Pointer(ma))
if C.dialPeer(ma) == 0 {
return nil, fmt.Errorf("error dialing ble")
}

if conn, ok := conns[s]; ok {
conn.closed = false
return conn, nil
}
c := NewConn(t, t.MySelf.ID(), p, t.lAddr, rAddr, 0)
return &c, nil
}

//export AddToPeerStore
func AddToPeerStore(peerID *C.char, rAddr *C.char) {
pID, err := peer.IDB58Decode(C.GoString(peerID))
if err != nil {
panic(err)
}
rMa, err := ma.NewMultiaddr(fmt.Sprintf("/ble/%s", C.GoString(rAddr)))
if err != nil {
panic(err)
}
pi := &pstore.PeerInfo{
ID: pID,
Addrs: []ma.Multiaddr{rMa},
}
defer func() {
peerAdder <- pi
logger().Debug("SENDED TO PEERADDER\n")
}()
}
39 changes: 0 additions & 39 deletions core/network/ble/listener.go
Expand Up @@ -4,22 +4,13 @@ package ble

import (
"net"
"time"
"unsafe"

peer "github.com/libp2p/go-libp2p-peer"
tpt "github.com/libp2p/go-libp2p-transport"
ma "github.com/multiformats/go-multiaddr"
"go.uber.org/zap"
)

/*
#cgo darwin CFLAGS: -x objective-c -Wno-incompatible-pointer-types -Wno-missing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wdocumentation -Wunreachable-code -Wno-implicit-atomic-properties -Werror=deprecated-objc-isa-usage -Wno-objc-interface-ivars -Werror=objc-root-class -Wno-arc-repeated-use-of-weak -Wimplicit-retain-self -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wuninitialized -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wno-float-conversion -Wnon-literal-null-conversion -Wobjc-literal-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wdeprecated-implementations -DNS_BLOCK_ASSERTIONS=1 -DOBJC_OLD_DISPATCH_PROTOTYPES=0
#cgo darwin LDFLAGS: -framework Foundation -framework CoreBluetooth
#import "ble.h"
*/
import "C"

// Listener implement ipfs Listener interface
type Listener struct {
tpt.Listener
Expand All @@ -34,14 +25,6 @@ type Listener struct {

var listeners map[string]*Listener = make(map[string]*Listener)

//export sendAcceptToListenerForPeerID
func sendAcceptToListenerForPeerID(peerID *C.char, ble *C.char, incPeerID *C.char) {
goPeerID := C.GoString(peerID)
goble := C.GoString(ble)
goIncPeerID := C.GoString(incPeerID)
go RealAcceptSender(goPeerID, goble, goIncPeerID)
}

func RealAcceptSender(peerID string, ble string, incPeerID string) {
for {
logger().Debug("ACCEPT\n", zap.String("peer", peerID))
Expand All @@ -53,28 +36,6 @@ func RealAcceptSender(peerID string, ble string, incPeerID string) {
}
}

func NewListener(lAddr ma.Multiaddr, hostID peer.ID, t *Transport) *Listener {
m, _ := lAddr.ValueForProtocol(PBle)
val := C.CString(m)
peerID := C.CString(hostID.Pretty())
defer C.free(unsafe.Pointer(val))
defer C.free(unsafe.Pointer(peerID))
C.init(val, peerID)
time.Sleep(1 * time.Second)
go C.startAdvertising()
go C.startDiscover()
listerner := &Listener{
lAddr: lAddr,
incomingBLEUUID: make(chan string),
incomingPeerID: make(chan string),
connected: make(map[string]*Conn),
transport: t,
}

listeners[t.ID] = listerner
return listerner
}

func (b *Listener) Addr() net.Addr {
m, _ := b.lAddr.ValueForProtocol(PBle)
return &Addr{
Expand Down
3 changes: 3 additions & 0 deletions core/network/ble/os_other.go
Expand Up @@ -4,12 +4,15 @@ package ble

import (
"context"
"fmt"
"runtime"

host "github.com/libp2p/go-libp2p-host"
peer "github.com/libp2p/go-libp2p-peer"
tpt "github.com/libp2p/go-libp2p-transport"
ma "github.com/multiformats/go-multiaddr"
"github.com/pkg/errors"
"go.uber.org/zap"
)

type Transport struct {
Expand Down

0 comments on commit b100434

Please sign in to comment.