From b100434eca85ac32e8217dba6af31fe813fc0ede Mon Sep 17 00:00:00 2001 From: Sacha Froment Date: Mon, 5 Nov 2018 17:59:36 +0100 Subject: [PATCH] feat(ble): only export darwin in one file Signed-off-by: Sacha Froment --- core/network/ble/addr.go | 2 - core/network/ble/conn.go | 93 +----------------- core/network/ble/darwin.go | 179 ++++++++++++++++++++++++++++++++++ core/network/ble/listener.go | 39 -------- core/network/ble/os_other.go | 3 + core/network/ble/transport.go | 54 ---------- 6 files changed, 183 insertions(+), 187 deletions(-) create mode 100644 core/network/ble/darwin.go diff --git a/core/network/ble/addr.go b/core/network/ble/addr.go index 26202856ef..52f1a4fc83 100644 --- a/core/network/ble/addr.go +++ b/core/network/ble/addr.go @@ -1,5 +1,3 @@ -// +build darwin - package ble import "net" diff --git a/core/network/ble/conn.go b/core/network/ble/conn.go index 83e789cca9..35c3c4a206 100644 --- a/core/network/ble/conn.go +++ b/core/network/ble/conn.go @@ -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" @@ -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, @@ -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 } @@ -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() diff --git a/core/network/ble/darwin.go b/core/network/ble/darwin.go new file mode 100644 index 0000000000..b51836fe5c --- /dev/null +++ b/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") + }() +} diff --git a/core/network/ble/listener.go b/core/network/ble/listener.go index ad427b190f..fc193d8113 100644 --- a/core/network/ble/listener.go +++ b/core/network/ble/listener.go @@ -4,8 +4,6 @@ package ble import ( "net" - "time" - "unsafe" peer "github.com/libp2p/go-libp2p-peer" tpt "github.com/libp2p/go-libp2p-transport" @@ -13,13 +11,6 @@ import ( "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 @@ -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)) @@ -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{ diff --git a/core/network/ble/os_other.go b/core/network/ble/os_other.go index 80ebcce161..128943fac0 100644 --- a/core/network/ble/os_other.go +++ b/core/network/ble/os_other.go @@ -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 { diff --git a/core/network/ble/transport.go b/core/network/ble/transport.go index 21ac590f32..185ea29100 100644 --- a/core/network/ble/transport.go +++ b/core/network/ble/transport.go @@ -4,13 +4,10 @@ package ble import ( "context" - "fmt" "time" - "unsafe" logging "github.com/ipfs/go-log" host "github.com/libp2p/go-libp2p-host" - peer "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" tpt "github.com/libp2p/go-libp2p-transport" rtpt "github.com/libp2p/go-reuseport-transport" @@ -18,13 +15,6 @@ import ( "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" - var peerAdder chan *pstore.PeerInfo = make(chan *pstore.PeerInfo) // BLETransport is the TCP transport. @@ -40,26 +30,6 @@ type Transport struct { reuse rtpt.Transport } -//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") - }() -} - // DefaultConnectTimeout is the (default) maximum amount of time the TCP // transport will spend on the initial TCP connect before giving up. var DefaultConnectTimeout = 5 * time.Second @@ -117,30 +87,6 @@ func (t *Transport) CanDial(addr ma.Multiaddr) bool { return BLE.Matches(addr) } -// 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 -} - // UseReuseport returns true if reuseport is enabled and available. func (t *Transport) UseReuseport() bool { logger().Debug("BLETransport Reuseport")