Add support for ICE/STUN/TURN in res_rtp_asterisk and chan_sip.
[asterisk/asterisk.git] / res / pjproject / pjsip-apps / src / pocketpj / SettingsDlg.cpp
1 // SettingsDlg.cpp : implementation file
2 //
3
4 #include "stdafx.h"
5 #include "PocketPJ.h"
6 #include "SettingsDlg.h"
7 #include <pjsua-lib/pjsua.h>
8 #include <atlbase.h>
9
10 #ifdef _DEBUG
11 #define new DEBUG_NEW
12 #undef THIS_FILE
13 static char THIS_FILE[] = __FILE__;
14 #endif
15
16 #define REG_PATH        _T("pjsip.org\\PocketPC")
17 #define REG_DOMAIN      _T("Domain")
18 #define REG_USER        _T("User")
19 #define REG_PASSWD      _T("Data")
20 #define REG_USE_STUN    _T("UseSTUN")
21 #define REG_STUN_SRV    _T("STUNSrv")
22 #define REG_DNS         _T("DNS")
23 #define REG_USE_ICE     _T("UseICE")
24 #define REG_USE_SRTP    _T("UseSRTP")
25 #define REG_USE_PUBLISH _T("UsePUBLISH")
26 #define REG_BUDDY_CNT   _T("BuddyCnt")
27 #define REG_BUDDY_X     _T("Buddy%u")
28 #define REG_ENABLE_EC   _T("EnableEC")
29 #define REG_EC_TAIL     _T("ECTail")
30 #define REG_ENABLE_VAD  _T("EnableVAD")
31 #define REG_ENABLE_TCP  _T("EnableTCP")
32 #define REG_CODEC_CNT   _T("CodecCnt")
33 #define REG_CODEC_X     _T("Codec%u")
34 #define REG_AUTO_ANSWER _T("AutoAnswer")
35
36
37 /////////////////////////////////////////////////////////////////////////////
38 // Settings
39 CPocketPJSettings::CPocketPJSettings()
40 : m_UseStun(FALSE), m_UseIce(FALSE), m_UseSrtp(FALSE), m_UsePublish(FALSE),
41   m_EchoSuppress(TRUE), m_EcTail(200), m_TCP(FALSE), m_VAD(FALSE),
42   m_AutoAnswer(FALSE)
43 {
44     /* Init codec list */
45 #if defined(PJMEDIA_HAS_GSM_CODEC) && PJMEDIA_HAS_GSM_CODEC
46     m_Codecs.Add(_T("GSM"));
47 #endif
48 #if defined(PJMEDIA_HAS_G711_CODEC) && PJMEDIA_HAS_G711_CODEC
49     m_Codecs.Add(_T("PCMU"));
50     m_Codecs.Add(_T("PCMA"));
51 #endif
52 #if defined(PJMEDIA_HAS_SPEEX_CODEC) && PJMEDIA_HAS_SPEEX_CODEC
53     m_Codecs.Add(_T("Speex"));
54 #endif
55 }
56
57 // Load from registry
58 void CPocketPJSettings::LoadRegistry()
59 {
60     CRegKey key;
61     wchar_t textVal[256];
62     DWORD dwordVal;
63     DWORD cbData;
64
65
66     if (key.Open(HKEY_CURRENT_USER, REG_PATH) != ERROR_SUCCESS)
67         return;
68
69     cbData = sizeof(textVal);
70     if (key.QueryValue(textVal, REG_DOMAIN, &cbData) == ERROR_SUCCESS) {
71         m_Domain = textVal;
72     }
73
74     cbData = sizeof(textVal);
75     if (key.QueryValue(textVal, REG_USER, &cbData) == ERROR_SUCCESS) {
76         m_User = textVal;
77     }
78
79     cbData = sizeof(textVal);
80     if (key.QueryValue(textVal, REG_PASSWD, &cbData) == ERROR_SUCCESS) {
81         m_Password = textVal;
82     }
83
84     cbData = sizeof(textVal);
85     if (key.QueryValue(textVal, REG_STUN_SRV, &cbData) == ERROR_SUCCESS) {
86         m_StunSrv = textVal;
87     }
88
89     cbData = sizeof(textVal);
90     if (key.QueryValue(textVal, REG_DNS, &cbData) == ERROR_SUCCESS) {
91         m_DNS = textVal;
92     }
93
94     dwordVal = 0;
95     if (key.QueryValue(dwordVal, REG_USE_STUN) == ERROR_SUCCESS) {
96         m_UseStun = dwordVal != 0;
97     }
98
99     if (key.QueryValue(dwordVal, REG_USE_ICE) == ERROR_SUCCESS) {
100         m_UseIce = dwordVal != 0;
101     }
102
103
104     if (key.QueryValue(dwordVal, REG_USE_SRTP) == ERROR_SUCCESS) {
105         m_UseSrtp = dwordVal != 0;
106     }
107
108
109     cbData = sizeof(dwordVal);
110     if (key.QueryValue(dwordVal, REG_USE_PUBLISH) == ERROR_SUCCESS) {
111         m_UsePublish = dwordVal != 0;
112     }
113
114     cbData = sizeof(dwordVal);
115     if (key.QueryValue(dwordVal, REG_ENABLE_EC) == ERROR_SUCCESS) {
116         m_EchoSuppress = dwordVal != 0;
117     }
118
119     cbData = sizeof(dwordVal);
120     if (key.QueryValue(dwordVal, REG_EC_TAIL) == ERROR_SUCCESS) {
121         m_EcTail = dwordVal;
122     }
123
124     cbData = sizeof(dwordVal);
125     if (key.QueryValue(dwordVal, REG_ENABLE_TCP) == ERROR_SUCCESS) {
126         m_TCP = dwordVal != 0;
127     }
128
129     cbData = sizeof(dwordVal);
130     if (key.QueryValue(dwordVal, REG_ENABLE_VAD) == ERROR_SUCCESS) {
131         m_VAD = dwordVal != 0;
132     }
133
134     cbData = sizeof(dwordVal);
135     if (key.QueryValue(dwordVal, REG_AUTO_ANSWER) == ERROR_SUCCESS) {
136         m_AutoAnswer = dwordVal != 0;
137     }
138
139     m_BuddyList.RemoveAll();
140
141     DWORD buddyCount = 0;
142     cbData = sizeof(dwordVal);
143     if (key.QueryValue(dwordVal, REG_BUDDY_CNT) == ERROR_SUCCESS) {
144         buddyCount = dwordVal;
145     }
146
147     unsigned i;
148     for (i=0; i<buddyCount; ++i) {
149         CString entry;
150         entry.Format(REG_BUDDY_X, i);
151
152         cbData = sizeof(textVal);
153         if (key.QueryValue(textVal, entry, &cbData) == ERROR_SUCCESS) {
154             m_BuddyList.Add(textVal);
155         }
156     }
157
158     DWORD codecCount = 0;
159     cbData = sizeof(dwordVal);
160     if (key.QueryValue(codecCount, REG_CODEC_CNT) == ERROR_SUCCESS) {
161
162         m_Codecs.RemoveAll();
163
164         for (i=0; i<codecCount; ++i) {
165             CString entry;
166             entry.Format(REG_CODEC_X, i);
167
168             cbData = sizeof(textVal);
169             if (key.QueryValue(textVal, entry, &cbData) == ERROR_SUCCESS) {
170                 m_Codecs.Add(textVal);
171             }
172         }
173     }
174
175     key.Close();
176 }
177
178 // Save to registry
179 void CPocketPJSettings::SaveRegistry()
180 {
181     CRegKey key;
182
183     if (key.Create(HKEY_CURRENT_USER, REG_PATH) != ERROR_SUCCESS)
184         return;
185
186     key.SetValue(m_Domain, REG_DOMAIN);
187     key.SetValue(m_User, REG_USER);
188     key.SetValue(m_Password, REG_PASSWD);
189     key.SetValue(m_StunSrv, REG_STUN_SRV);
190     key.SetValue(m_DNS, REG_DNS);
191     
192     key.SetValue(m_UseStun, REG_USE_STUN);
193     key.SetValue(m_UseIce, REG_USE_ICE);
194     key.SetValue(m_UseSrtp, REG_USE_SRTP);
195     key.SetValue(m_UsePublish, REG_USE_PUBLISH);
196
197     key.SetValue(m_EchoSuppress, REG_ENABLE_EC);
198     key.SetValue(m_EcTail, REG_EC_TAIL);
199
200     key.SetValue(m_TCP, REG_ENABLE_TCP);
201     key.SetValue(m_VAD, REG_ENABLE_VAD);
202     key.SetValue(m_AutoAnswer, REG_AUTO_ANSWER);
203
204     key.SetValue(m_BuddyList.GetSize(), REG_BUDDY_CNT);
205
206     int i;
207     for (i=0; i<m_BuddyList.GetSize(); ++i) {
208         CString entry;
209         entry.Format(REG_BUDDY_X, i);
210         key.SetValue(m_BuddyList.GetAt(i), entry);
211     }
212
213     DWORD N = m_Codecs.GetSize();
214     key.SetValue(N, REG_CODEC_CNT);
215     for (i=0; i<m_Codecs.GetSize(); ++i) {
216         CString entry;
217         entry.Format(REG_CODEC_X, i);
218         key.SetValue(m_Codecs.GetAt(i), entry);
219     }
220
221     key.Close();
222 }
223
224
225 /////////////////////////////////////////////////////////////////////////////
226 // CSettingsDlg dialog
227
228
229 CSettingsDlg::CSettingsDlg(CPocketPJSettings &cfg, CWnd* pParent)
230         : CDialog(CSettingsDlg::IDD, pParent), m_Cfg(cfg)
231 {
232         //{{AFX_DATA_INIT(CSettingsDlg)
233         m_Domain = _T("");
234         m_ICE = FALSE;
235         m_Passwd = _T("");
236         m_PUBLISH = FALSE;
237         m_SRTP = FALSE;
238         m_STUN = FALSE;
239         m_StunSrv = _T("");
240         m_User = _T("");
241         m_Dns = _T("");
242         m_EchoSuppress = FALSE;
243         m_EcTail = _T("");
244         m_TCP = FALSE;
245         m_VAD = FALSE;
246         m_AutoAnswer = FALSE;
247         //}}AFX_DATA_INIT
248
249         m_Domain    = m_Cfg.m_Domain;
250         m_ICE       = m_Cfg.m_UseIce;
251         m_Passwd    = m_Cfg.m_Password;
252         m_PUBLISH   = m_Cfg.m_UsePublish;
253         m_SRTP      = m_Cfg.m_UseSrtp;
254         m_STUN      = m_Cfg.m_UseStun;
255         m_StunSrv   = m_Cfg.m_StunSrv;
256         m_User      = m_Cfg.m_User;
257         m_Dns       = m_Cfg.m_DNS;
258         m_EchoSuppress = m_Cfg.m_EchoSuppress;
259         m_TCP       = m_Cfg.m_TCP;
260         m_VAD       = m_Cfg.m_VAD;
261         m_AutoAnswer= m_Cfg.m_AutoAnswer;
262
263         CString s;
264         s.Format(_T("%d"), m_Cfg.m_EcTail);
265         m_EcTail    = s;
266
267 }
268
269
270 void CSettingsDlg::DoDataExchange(CDataExchange* pDX)
271 {
272         CDialog::DoDataExchange(pDX);
273         //{{AFX_DATA_MAP(CSettingsDlg)
274         DDX_Control(pDX, IDC_CODECS, m_Codecs);
275         DDX_Text(pDX, IDC_DOMAIN, m_Domain);
276         DDX_Check(pDX, IDC_ICE, m_ICE);
277         DDX_Text(pDX, IDC_PASSWD, m_Passwd);
278         DDX_Check(pDX, IDC_PUBLISH, m_PUBLISH);
279         DDX_Check(pDX, IDC_SRTP, m_SRTP);
280         DDX_Check(pDX, IDC_STUN, m_STUN);
281         DDX_Text(pDX, IDC_STUN_SRV, m_StunSrv);
282         DDX_Text(pDX, IDC_USER, m_User);
283         DDX_Text(pDX, IDC_DNS, m_Dns);
284         DDX_Check(pDX, IDC_ECHO_SUPPRESS, m_EchoSuppress);
285         DDX_Text(pDX, IDC_EC_TAIL, m_EcTail);
286         DDX_Check(pDX, IDC_TCP, m_TCP);
287         DDX_Check(pDX, IDC_VAD, m_VAD);
288         DDX_Check(pDX, IDC_AA, m_AutoAnswer);
289         //}}AFX_DATA_MAP
290
291         
292         if (m_Codecs.GetCount() == 0) {
293             int i;
294             for (i=0; i<m_Cfg.m_Codecs.GetSize(); ++i) {
295                 m_Codecs.AddString(m_Cfg.m_Codecs.GetAt(i));
296             }
297             m_Codecs.SetCurSel(0);
298         }
299 }
300
301
302 BEGIN_MESSAGE_MAP(CSettingsDlg, CDialog)
303         //{{AFX_MSG_MAP(CSettingsDlg)
304         ON_BN_CLICKED(IDC_STUN, OnStun)
305         ON_BN_CLICKED(IDC_ECHO_SUPPRESS, OnEchoSuppress)
306         ON_CBN_SELCHANGE(IDC_CODECS, OnSelchangeCodecs)
307         //}}AFX_MSG_MAP
308 END_MESSAGE_MAP()
309
310 /////////////////////////////////////////////////////////////////////////////
311 // CSettingsDlg message handlers
312
313 int CSettingsDlg::DoModal() 
314 {
315     int rc = CDialog::DoModal();        
316
317     return rc;
318 }
319
320 void CSettingsDlg::OnStun() 
321 {
322 }
323
324 void CSettingsDlg::OnEchoSuppress() 
325 {
326 }
327
328 void CSettingsDlg::OnSelchangeCodecs() 
329 {
330     int cur = m_Codecs.GetCurSel();
331     if (cur < 1)
332         return;
333
334     CString codec;
335     DWORD N;
336
337     m_Codecs.GetLBText(cur, codec);
338     N = m_Codecs.GetCount();
339     m_Codecs.DeleteString(cur);
340     N = m_Codecs.GetCount();
341     m_Codecs.InsertString(0, codec);
342     N = m_Codecs.GetCount();
343     m_Codecs.SetCurSel(0);
344 }
345
346
347 void CSettingsDlg::OnOK() 
348 {
349     UpdateData(TRUE);
350
351     m_Cfg.m_Domain      = m_Domain;
352     m_Cfg.m_UseIce      = m_ICE != 0;
353     m_Cfg.m_Password    = m_Passwd;
354     m_Cfg.m_UsePublish  = m_PUBLISH != 0;
355     m_Cfg.m_UseSrtp     = m_SRTP != 0;
356     m_Cfg.m_UseStun     = m_STUN != 0;
357     m_Cfg.m_StunSrv     = m_StunSrv;
358     m_Cfg.m_User        = m_User;
359     m_Cfg.m_DNS         = m_Dns;
360     m_Cfg.m_EchoSuppress= m_EchoSuppress != 0;
361     m_Cfg.m_EcTail      = _ttoi(m_EcTail);
362     m_Cfg.m_TCP         = m_TCP != 0;
363     m_Cfg.m_VAD         = m_VAD != 0;
364     m_Cfg.m_AutoAnswer  = m_AutoAnswer != 0;
365
366     unsigned i;
367     m_Cfg.m_Codecs.RemoveAll();
368     DWORD N = m_Codecs.GetCount();
369     for (i=0; i<N; ++i) {
370         CString codec;
371         m_Codecs.GetLBText(i, codec);
372         m_Cfg.m_Codecs.Add(codec);
373     }
374
375     CDialog::OnOK();
376 }