@ -0,0 +1,16 @@ | |||||
// Licensed under the Apache License, Version 2.0 (the "License"); | |||||
// you may not use this file except in compliance with the License. | |||||
// You may obtain a copy of the License at | |||||
// | |||||
// http://www.apache.org/licenses/LICENSE-2.0 | |||||
// | |||||
// Unless required by applicable law or agreed to in writing, software | |||||
// distributed under the License is distributed on an "AS IS" BASIS, | |||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
// See the License for the specific language governing permissions and | |||||
// limitations under the License. | |||||
package packet | |||||
func NewDiscovery() { | |||||
} |
@ -0,0 +1,38 @@ | |||||
// Licensed under the Apache License, Version 2.0 (the "License"); | |||||
// you may not use this file except in compliance with the License. | |||||
// You may obtain a copy of the License at | |||||
// | |||||
// http://www.apache.org/licenses/LICENSE-2.0 | |||||
// | |||||
// Unless required by applicable law or agreed to in writing, software | |||||
// distributed under the License is distributed on an "AS IS" BASIS, | |||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
// See the License for the specific language governing permissions and | |||||
// limitations under the License. | |||||
package packet | |||||
import ( | |||||
"encoding/json" | |||||
"fmt" | |||||
) | |||||
type Identity struct { | |||||
DeviceId string | |||||
DeviceName string | |||||
DeviceType string | |||||
ProtocolVersion uint | |||||
IncomingCapabilities []string | |||||
OutgoingCapabilities []string | |||||
TcpPort uint | |||||
} | |||||
func (p *Packet) AsIdentity() (*Identity, error) { | |||||
if p.Type != "kdeconnect.identity" { | |||||
return nil, fmt.Errorf("not an identity packet, unexpected type %q", p.Type) | |||||
} | |||||
var identity Identity | |||||
if err := json.Unmarshal(p.Body, &identity); err != nil { | |||||
return nil, err | |||||
} | |||||
return &identity, nil | |||||
} |
@ -0,0 +1,39 @@ | |||||
// Licensed under the Apache License, Version 2.0 (the "License"); | |||||
// you may not use this file except in compliance with the License. | |||||
// You may obtain a copy of the License at | |||||
// | |||||
// http://www.apache.org/licenses/LICENSE-2.0 | |||||
// | |||||
// Unless required by applicable law or agreed to in writing, software | |||||
// distributed under the License is distributed on an "AS IS" BASIS, | |||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
// See the License for the specific language governing permissions and | |||||
// limitations under the License. | |||||
package packet_test | |||||
import ( | |||||
"encoding/json" | |||||
"testing" | |||||
"github.com/stretchr/testify/assert" | |||||
"github.com/bboozzoo/mconnect/protocol/packet" | |||||
) | |||||
func TestPacketAsIdentity(t *testing.T) { | |||||
p := packet.Packet{ | |||||
Type: "kdeconnect.ping", | |||||
Body: json.RawMessage(`foo`), | |||||
} | |||||
i, err := p.AsIdentity() | |||||
assert.Nil(t, i) | |||||
assert.Error(t, err) | |||||
p = packet.Packet{ | |||||
Type: "kdeconnect.identity", | |||||
Body: json.RawMessage(`{}`), | |||||
} | |||||
i, err = p.AsIdentity() | |||||
assert.NotNil(t, i) | |||||
assert.NoError(t, err) | |||||
} |
@ -0,0 +1,22 @@ | |||||
// Licensed under the Apache License, Version 2.0 (the "License"); | |||||
// you may not use this file except in compliance with the License. | |||||
// You may obtain a copy of the License at | |||||
// | |||||
// http://www.apache.org/licenses/LICENSE-2.0 | |||||
// | |||||
// Unless required by applicable law or agreed to in writing, software | |||||
// distributed under the License is distributed on an "AS IS" BASIS, | |||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
// See the License for the specific language governing permissions and | |||||
// limitations under the License. | |||||
package packet | |||||
import ( | |||||
"encoding/json" | |||||
) | |||||
type Packet struct { | |||||
Id uint64 | |||||
Type string | |||||
Body json.RawMessage | |||||
} |
@ -0,0 +1,34 @@ | |||||
// Licensed under the Apache License, Version 2.0 (the "License"); | |||||
// you may not use this file except in compliance with the License. | |||||
// You may obtain a copy of the License at | |||||
// | |||||
// http://www.apache.org/licenses/LICENSE-2.0 | |||||
// | |||||
// Unless required by applicable law or agreed to in writing, software | |||||
// distributed under the License is distributed on an "AS IS" BASIS, | |||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
// See the License for the specific language governing permissions and | |||||
// limitations under the License. | |||||
package packet | |||||
import ( | |||||
"bytes" | |||||
"encoding/json" | |||||
"fmt" | |||||
) | |||||
func FromData(data []byte) (*Packet, error) { | |||||
var p Packet | |||||
if idx := bytes.LastIndexByte(data, '\n'); idx != -1 { | |||||
data = data[0:idx] | |||||
} | |||||
if err := json.Unmarshal(data, &p); err != nil { | |||||
return nil, err | |||||
} | |||||
if p.Id == uint64(0) || p.Type == "" || p.Body == nil { | |||||
return nil, fmt.Errorf("packet incomplete, missing id, type or body") | |||||
} | |||||
return &p, nil | |||||
} |
@ -0,0 +1,37 @@ | |||||
// Licensed under the Apache License, Version 2.0 (the "License"); | |||||
// you may not use this file except in compliance with the License. | |||||
// You may obtain a copy of the License at | |||||
// | |||||
// http://www.apache.org/licenses/LICENSE-2.0 | |||||
// | |||||
// Unless required by applicable law or agreed to in writing, software | |||||
// distributed under the License is distributed on an "AS IS" BASIS, | |||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
// See the License for the specific language governing permissions and | |||||
// limitations under the License. | |||||
package packet_test | |||||
import ( | |||||
"testing" | |||||
"github.com/stretchr/testify/assert" | |||||
"github.com/bboozzoo/mconnect/protocol/packet" | |||||
) | |||||
func TestParseFromData(t *testing.T) { | |||||
p, err := packet.FromData([]byte(`foobar`)) | |||||
assert.Error(t, err) | |||||
p, err = packet.FromData([]byte(`{}`)) | |||||
assert.Error(t, err) | |||||
p, err = packet.FromData([]byte(`{"id": 123, "type": "foo","body":{}}`)) | |||||
assert.NoError(t, err) | |||||
assert.NotNil(t, p) | |||||
assert.Equal(t, p, &packet.Packet{ | |||||
Id: uint64(123), | |||||
Type: "foo", | |||||
Body: []byte("{}"), | |||||
}) | |||||
} |