forked from sippy/go-b2bua
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sdp_origin.go
133 lines (116 loc) · 2.95 KB
/
sdp_origin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package sippy_sdp
import (
"crypto/rand"
"errors"
"net"
"strconv"
"strings"
"sync/atomic"
"github.com/egovorukhin/go-b2bua/sippy/net"
)
var _sdp_session_id int64
func init() {
buf := make([]byte, 6)
rand.Read(buf)
for i := 0; i < len(buf); i++ {
_sdp_session_id |= int64(buf[i]) << (uint(i) * 8)
}
}
type SdpOrigin struct {
username string
session_id string
version int64
network_type string
address_type string
address string
}
func ParseSdpOrigin(body string) (*SdpOrigin, error) {
arr := strings.Fields(body)
if len(arr) != 6 {
return nil, errors.New("Malformed field: " + body)
}
version, err := strconv.ParseInt(arr[2], 10, 64)
if err != nil {
return nil, err
}
return &SdpOrigin{
username: arr[0],
session_id: arr[1],
version: version,
network_type: arr[3],
address_type: arr[4],
address: arr[5],
}, nil
}
func NewSdpOrigin() *SdpOrigin {
// RFC4566
// *******
// For privacy reasons, it is sometimes desirable to obfuscate the
// username and IP address of the session originator. If this is a
// concern, an arbitrary <username> and private <unicast-address> MAY be
// chosen to populate the "o=" field, provided that these are selected
// in a manner that does not affect the global uniqueness of the field.
// *******
sid := atomic.AddInt64(&_sdp_session_id, 1)
return &SdpOrigin{
username: "-",
session_id: strconv.FormatInt(sid, 10),
network_type: "IN",
address_type: "IP4",
address: "192.0.2.1", // 192.0.2.0/24 (TEST-NET-1)
version: sid,
}
}
func NewSdpOriginWithAddress(address string) (*SdpOrigin, error) {
ip := net.ParseIP(address)
if ip == nil {
return nil, errors.New("The address is not IP address: " + address)
}
address_type := "IP4"
if !sippy_net.IsIP4(ip) {
address_type = "IP6"
}
sid := atomic.AddInt64(&_sdp_session_id, 1)
s := &SdpOrigin{
username: "-",
session_id: strconv.FormatInt(sid, 10),
network_type: "IN",
address_type: address_type,
address: address,
version: sid,
}
return s, nil
}
func (s *SdpOrigin) String() string {
version := strconv.FormatInt(s.version, 10)
return strings.Join([]string{s.username, s.session_id, version, s.network_type, s.address_type, s.address}, " ")
}
func (s *SdpOrigin) LocalStr(hostPort *sippy_net.HostPort) string {
version := strconv.FormatInt(s.version, 10)
return strings.Join([]string{s.username, s.session_id, version, s.network_type, s.address_type, s.address}, " ")
}
func (s *SdpOrigin) GetCopy() *SdpOrigin {
if s == nil {
return nil
}
var ret SdpOrigin = *s
return &ret
}
func (s *SdpOrigin) IncVersion() {
s.version++
}
func (s *SdpOrigin) GetSessionId() string {
return s.session_id
}
func (s *SdpOrigin) GetVersion() int64 {
return s.version
}
func (s *SdpOrigin) SetAddress(addr string) {
s.address = addr
}
func (s *SdpOrigin) SetAddressType(t string) {
s.address_type = t
}
func (s *SdpOrigin) SetNetworkType(t string) {
s.network_type = t
}