1
// PocketPJDlg.cpp : implementation file
6
#include "PocketPJDlg.h"
12
static char THIS_FILE[] = __FILE__;
16
static CPocketPJDlg *theDlg;
18
/////////////////////////////////////////////////////////////////////////////
19
// CPocketPJDlg dialog
21
CPocketPJDlg::CPocketPJDlg(CWnd* pParent /*=NULL*/)
22
: CDialog(CPocketPJDlg::IDD, pParent), m_PopUp(NULL)
24
//{{AFX_DATA_INIT(CPocketPJDlg)
25
// NOTE: the ClassWizard will add member initialization here
27
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
28
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
32
m_PopUp = new CPopUpWnd(this);
37
for (i=0; i<POPUP_MAX_TYPE; ++i) {
38
m_PopUpState[i] = FALSE;
42
void CPocketPJDlg::DoDataExchange(CDataExchange* pDX)
44
CDialog::DoDataExchange(pDX);
45
//{{AFX_DATA_MAP(CPocketPJDlg)
46
DDX_Control(pDX, IDC_URL, m_Url);
47
DDX_Control(pDX, IDC_BUDDY_LIST, m_BuddyList);
48
DDX_Control(pDX, IDC_BTN_ACTION, m_BtnUrlAction);
49
DDX_Control(pDX, IDC_BTN_ACC, m_BtnAcc);
50
DDX_Control(pDX, IDC_ACC_ID, m_AccId);
54
BEGIN_MESSAGE_MAP(CPocketPJDlg, CDialog)
55
//{{AFX_MSG_MAP(CPocketPJDlg)
56
ON_BN_CLICKED(IDC_BTN_ACC, OnBtnAcc)
57
ON_BN_CLICKED(IDC_BTN_ACTION, OnBtnAction)
58
ON_COMMAND(IDC_ACC_SETTINGS, OnSettings)
59
ON_COMMAND(IDC_URI_CALL, OnUriCall)
61
ON_COMMAND(IDC_URI_ADD_BUDDY, OnUriAddBuddy)
62
ON_COMMAND(IDC_URI_DEL_BUDDY, OnUriDelBuddy)
63
ON_COMMAND(IDC_ACC_ONLINE, OnAccOnline)
64
ON_COMMAND(IDC_ACC_INVISIBLE, OnAccInvisible)
65
ON_NOTIFY(NM_CLICK, IDC_BUDDY_LIST, OnClickBuddyList)
70
void CPocketPJDlg::Error(const CString &title, pj_status_t rc)
72
char errmsg[PJ_ERR_MSG_SIZE];
73
wchar_t werrmsg[PJ_ERR_MSG_SIZE];
75
pj_strerror(rc, errmsg, sizeof(errmsg));
76
pj_ansi_to_unicode(errmsg, strlen(errmsg), werrmsg, PJ_ARRAY_SIZE(werrmsg));
78
AfxMessageBox(title + _T(": ") + werrmsg);
81
BOOL CPocketPJDlg::Restart()
87
sprintf(ver, "PocketPJ/%s", pj_get_version());
90
PopUp_Show(POPUP_REGISTRATION, ver,
91
"Starting up....", "", "", "", 0);
96
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Cleaning up..");
99
m_BtnAcc.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_OFFLINE)) );
104
PopUp_Show(POPUP_REGISTRATION, ver,
105
"Starting up....", "Creating stack..", "", "", 0);
107
status = pjsua_create();
108
if (status != PJ_SUCCESS) {
109
Error(_T("Error in creating library"), status);
110
PopUp_Hide(POPUP_REGISTRATION);
115
pjsua_logging_config log_cfg;
116
pjsua_media_config media_cfg;
118
pjsua_config_default(&cfg);
121
cfg.user_agent = pj_str(ver);
123
cfg.cb.on_call_state = &on_call_state;
124
cfg.cb.on_call_media_state = &on_call_media_state;
125
cfg.cb.on_incoming_call = &on_incoming_call;
126
cfg.cb.on_reg_state = &on_reg_state;
127
cfg.cb.on_buddy_state = &on_buddy_state;
128
cfg.cb.on_pager = &on_pager;
130
/* Configure nameserver */
134
PIP_ADDR_STRING pDNS = NULL;
135
ULONG len = sizeof(fi);
138
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Retrieving network parameters..");
139
if (GetNetworkParams(&fi, &len) != ERROR_SUCCESS) {
140
err = _T("Info: Error querying network parameters. You must configure DNS server.");
141
} else if (fi.CurrentDnsServer) {
142
pDNS = fi.CurrentDnsServer;
143
} else if (fi.DnsServerList.IpAddress.String[0] != 0) {
144
pDNS = &fi.DnsServerList;
146
err = _T("Info: DNS server not configured. You must configure DNS server.");
149
if (err.GetLength()) {
150
if (m_Cfg.m_DNS.GetLength()) {
151
pj_unicode_to_ansi((LPCTSTR)m_Cfg.m_DNS, m_Cfg.m_DNS.GetLength(),
152
nameserver, sizeof(nameserver));
153
cfg.nameserver_count = 1;
154
cfg.nameserver[0] = pj_str(nameserver);
158
PopUp_Hide(POPUP_REGISTRATION);
162
strcpy(nameserver, pDNS->IpAddress.String);
163
cfg.nameserver_count = 1;
164
cfg.nameserver[0] = pj_str(nameserver);
169
if (m_Cfg.m_UseStun) {
170
pj_unicode_to_ansi((LPCTSTR)m_Cfg.m_StunSrv, m_Cfg.m_StunSrv.GetLength(),
171
tmp_stun, sizeof(tmp_stun));
172
cfg.stun_host = pj_str(tmp_stun);
175
pjsua_logging_config_default(&log_cfg);
176
log_cfg.msg_logging = PJ_TRUE;
177
log_cfg.log_filename = pj_str("\\PocketPJ.TXT");
179
pjsua_media_config_default(&media_cfg);
180
media_cfg.clock_rate = 8000;
181
media_cfg.audio_frame_ptime = 40;
182
media_cfg.ec_tail_len = 0;
183
media_cfg.ilbc_mode = 30;
184
media_cfg.max_media_ports = 8;
185
// use default quality setting
186
//media_cfg.quality = 5;
187
media_cfg.thread_cnt = 1;
188
media_cfg.enable_ice = m_Cfg.m_UseIce;
189
media_cfg.no_vad = !m_Cfg.m_VAD;
191
if (m_Cfg.m_EchoSuppress) {
192
media_cfg.ec_options = PJMEDIA_ECHO_SIMPLE;
193
media_cfg.ec_tail_len = m_Cfg.m_EcTail;
197
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Initializing..");
198
status = pjsua_init(&cfg, &log_cfg, &media_cfg);
199
if (status != PJ_SUCCESS) {
200
Error(_T("Error initializing library"), status);
202
PopUp_Hide(POPUP_REGISTRATION);
206
// Create one UDP transport
207
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Adding UDP transport..");
208
pjsua_transport_id transport_id;
209
pjsua_transport_config udp_cfg;
211
pjsua_transport_config_default(&udp_cfg);
213
status = pjsua_transport_create(PJSIP_TRANSPORT_UDP,
214
&udp_cfg, &transport_id);
215
if (status != PJ_SUCCESS) {
216
Error(_T("Error creating UDP transport"), status);
218
PopUp_Hide(POPUP_REGISTRATION);
222
// Always instantiate TCP to support auto-switching to TCP when
223
// packet is larger than 1300 bytes. If TCP is disabled when
224
// no auto-switching will occur
226
// Create one TCP transport
227
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Adding TCP transport..");
228
pjsua_transport_id transport_id;
229
pjsua_transport_config tcp_cfg;
231
pjsua_transport_config_default(&tcp_cfg);
233
status = pjsua_transport_create(PJSIP_TRANSPORT_TCP,
234
&tcp_cfg, &transport_id);
235
if (status != PJ_SUCCESS) {
236
Error(_T("Error creating TCP transport"), status);
238
PopUp_Hide(POPUP_REGISTRATION);
243
// Adjust codecs priority
245
pjsua_codec_set_priority(pj_cstr(&tmp, "*"), 0);
246
for (i=0; i<(unsigned)m_Cfg.m_Codecs.GetSize(); ++i) {
247
CString codec = m_Cfg.m_Codecs.GetAt(i);
250
pj_unicode_to_ansi((LPCTSTR)codec, codec.GetLength(),
251
tmp_nam, sizeof(tmp_nam));
252
pjsua_codec_set_priority(pj_cstr(&tmp, tmp_nam), (pj_uint8_t)(200-i));
256
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Starting..");
257
status = pjsua_start();
258
if (status != PJ_SUCCESS) {
259
Error(_T("Error starting library"), status);
261
PopUp_Hide(POPUP_REGISTRATION);
266
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "Adding account..");
267
char domain[80], username[80], passwd[80];
268
char id[80], reg_uri[80];
269
pjsua_acc_config acc_cfg;
271
pj_unicode_to_ansi((LPCTSTR)m_Cfg.m_Domain, m_Cfg.m_Domain.GetLength(),
272
domain, sizeof(domain));
273
pj_unicode_to_ansi((LPCTSTR)m_Cfg.m_User, m_Cfg.m_User.GetLength(),
274
username, sizeof(username));
275
pj_unicode_to_ansi((LPCTSTR)m_Cfg.m_Password, m_Cfg.m_Password.GetLength(),
276
passwd, sizeof(passwd));
278
snprintf(id, sizeof(id), "<sip:%s@%s>", username, domain);
279
snprintf(reg_uri, sizeof(reg_uri), "sip:%s", domain);
281
pjsua_acc_config_default(&acc_cfg);
282
acc_cfg.id = pj_str(id);
283
acc_cfg.reg_uri = pj_str(reg_uri);
284
acc_cfg.cred_count = 1;
285
acc_cfg.cred_info[0].scheme = pj_str("Digest");
286
acc_cfg.cred_info[0].realm = pj_str("*");
287
acc_cfg.cred_info[0].username = pj_str(username);
288
acc_cfg.cred_info[0].data_type = 0;
289
acc_cfg.cred_info[0].data = pj_str(passwd);
291
#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
292
acc_cfg.use_srtp = (m_Cfg.m_UseSrtp ? PJMEDIA_SRTP_OPTIONAL : PJMEDIA_SRTP_DISABLED);
293
acc_cfg.srtp_secure_signaling = 0;
296
acc_cfg.publish_enabled = m_Cfg.m_UsePublish;
300
snprintf(route, sizeof(route), "<sip:%s;lr;transport=tcp>", domain);
301
acc_cfg.proxy[acc_cfg.proxy_cnt++] = pj_str(route);
303
snprintf(route, sizeof(route), "<sip:%s;lr>", domain);
304
acc_cfg.proxy[acc_cfg.proxy_cnt++] = pj_str(route);
307
status = pjsua_acc_add(&acc_cfg, PJ_TRUE, &m_PjsuaAccId);
308
if (status != PJ_SUCCESS) {
309
Error(_T("Invalid account settings"), status);
311
PopUp_Hide(POPUP_REGISTRATION);
315
CString acc_text = m_Cfg.m_User + _T("@") + m_Cfg.m_Domain;
316
m_AccId.SetWindowText(acc_text);
318
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE1, acc_text);
319
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE2, "Registering..");
320
PopUp_Modify(POPUP_REGISTRATION, POPUP_EL_TITLE3, "");
322
SetTimer(TIMER_ID, 100, NULL);
327
void CPocketPJDlg::PopUp_Show( PopUpType type,
328
const CString& title1,
329
const CString& title2,
330
const CString& title3,
335
PJ_UNUSED_ARG(userData);
337
if (!m_PopUpState[type])
340
m_PopUpState[type] = TRUE;
342
m_PopUpContent[type].m_Title1 = title1;
343
m_PopUpContent[type].m_Title2 = title2;
344
m_PopUpContent[type].m_Title3 = title3;
345
m_PopUpContent[type].m_Btn1 = btn1;
346
m_PopUpContent[type].m_Btn2 = btn2;
348
m_PopUp->SetContent(m_PopUpContent[type]);
352
void CPocketPJDlg::PopUp_Modify(PopUpType type,
357
case POPUP_EL_TITLE1:
358
m_PopUpContent[type].m_Title1 = text;
360
case POPUP_EL_TITLE2:
361
m_PopUpContent[type].m_Title2 = text;
363
case POPUP_EL_TITLE3:
364
m_PopUpContent[type].m_Title3 = text;
366
case POPUP_EL_BUTTON1:
367
m_PopUpContent[type].m_Btn1 = text;
369
case POPUP_EL_BUTTON2:
370
m_PopUpContent[type].m_Btn1 = text;
374
m_PopUp->SetContent(m_PopUpContent[type]);
377
void CPocketPJDlg::PopUp_Hide(PopUpType type)
379
if (m_PopUpState[type])
382
m_PopUpState[type] = FALSE;
384
if (m_PopUpCount == 0) {
388
for (int i=POPUP_MAX_TYPE-1; i>=0; --i) {
389
if (m_PopUpState[i]) {
390
m_PopUp->SetContent(m_PopUpContent[i]);
397
void CPocketPJDlg::OnIncomingCall()
401
pjsua_call_get_info(0, &ci);
403
PopUp_Show(POPUP_CALL, "Incoming call..", ci.remote_info.ptr, "",
404
"Answer", "Hangup", 0);
405
pjsua_call_answer(0, 180, NULL, NULL);
406
if (m_Cfg.m_AutoAnswer)
410
void CPocketPJDlg::OnCallState()
414
pjsua_call_get_info(0, &ci);
417
case PJSIP_INV_STATE_NULL: /**< Before INVITE is sent or received */
419
case PJSIP_INV_STATE_CALLING: /**< After INVITE is sent */
420
PopUp_Show(POPUP_CALL, "Calling..", ci.remote_info.ptr, "",
423
case PJSIP_INV_STATE_INCOMING: /**< After INVITE is received. */
426
case PJSIP_INV_STATE_EARLY: /**< After response with To tag. */
427
case PJSIP_INV_STATE_CONNECTING:/**< After 2xx is sent/received. */
428
case PJSIP_INV_STATE_CONFIRMED: /**< After ACK is sent/received. */
430
CString stateText = ci.state_text.ptr;
431
PopUp_Modify(POPUP_CALL, POPUP_EL_TITLE3, stateText);
434
case PJSIP_INV_STATE_DISCONNECTED:/**< Session is terminated. */
435
PopUp_Modify(POPUP_CALL, POPUP_EL_TITLE3, "Disconnected");
436
PopUp_Hide(POPUP_CALL);
441
void CPocketPJDlg::on_call_state(pjsua_call_id call_id, pjsip_event *e)
444
PJ_UNUSED_ARG(call_id);
446
theDlg->OnCallState();
449
void CPocketPJDlg::on_call_media_state(pjsua_call_id call_id)
451
pjsua_call_info call_info;
453
pjsua_call_get_info(call_id, &call_info);
454
if (call_info.media_status == PJSUA_CALL_MEDIA_ACTIVE) {
455
pjsua_conf_connect(call_info.conf_slot, 0);
456
pjsua_conf_connect(0, call_info.conf_slot);
460
void CPocketPJDlg::on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id,
461
pjsip_rx_data *rdata)
463
PJ_UNUSED_ARG(acc_id);
464
PJ_UNUSED_ARG(call_id);
465
PJ_UNUSED_ARG(rdata);
467
theDlg->OnIncomingCall();
470
void CPocketPJDlg::OnRegState()
473
pjsua_acc_get_info(m_PjsuaAccId, &ai);
475
CString acc_text = m_Cfg.m_User + _T("@") + m_Cfg.m_Domain;
477
if (ai.expires>0 && ai.status/100==2) {
478
/* Registration success */
479
HBITMAP old = m_BtnAcc.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_ONLINE)) );
482
m_AccId.SetWindowText(acc_text);
483
} else if (ai.status/100 != 2) {
484
acc_text += " (err)";
485
Error(_T("SIP registration error"), PJSIP_ERRNO_FROM_SIP_STATUS(ai.status));
486
m_AccId.SetWindowText(acc_text);
488
PopUp_Hide(POPUP_REGISTRATION);
491
void CPocketPJDlg::on_reg_state(pjsua_acc_id acc_id)
493
PJ_UNUSED_ARG(acc_id);
495
theDlg->OnRegState();
498
void CPocketPJDlg::on_buddy_state(pjsua_buddy_id buddy_id)
500
PJ_UNUSED_ARG(buddy_id);
502
theDlg->RedrawBuddyList();
505
void CPocketPJDlg::on_pager(pjsua_call_id call_id, const pj_str_t *from,
506
const pj_str_t *to, const pj_str_t *contact,
507
const pj_str_t *mime_type, const pj_str_t *text)
509
PJ_UNUSED_ARG(call_id);
512
PJ_UNUSED_ARG(contact);
513
PJ_UNUSED_ARG(mime_type);
517
/////////////////////////////////////////////////////////////////////////////
518
// CPocketPJDlg message handlers
520
BOOL CPocketPJDlg::OnInitDialog()
522
CDialog::OnInitDialog();
524
// Set the icon for this dialog. The framework does this automatically
525
// when the application's main window is not a dialog
526
SetIcon(m_hIcon, TRUE); // Set big icon
527
SetIcon(m_hIcon, FALSE); // Set small icon
529
CenterWindow(GetDesktopWindow()); // center to the hpc screen
531
// TODO: Add extra initialization here
533
m_Cfg.LoadRegistry();
534
//ShowWindow(SW_SHOW);
535
m_AccId.SetWindowText(m_Cfg.m_User);
537
CImageList *il = new CImageList;
538
VERIFY(il->Create(16, 16, ILC_COLOR|ILC_MASK, 2, 4));
540
CBitmap *bmp = new CBitmap;
541
bmp->LoadBitmap(MAKEINTRESOURCE(IDB_BLANK));
542
il->Add(bmp, RGB(255,255,255));
544
bmp->LoadBitmap(MAKEINTRESOURCE(IDB_ONLINE));
545
il->Add(bmp, RGB(255,255,255));
547
m_BuddyList.SetImageList(il, LVSIL_SMALL);
549
if (m_Cfg.m_Domain.GetLength()==0 || Restart() == FALSE) {
551
CSettingsDlg dlg(m_Cfg);
552
if (dlg.DoModal() != IDOK) {
557
m_Cfg.SaveRegistry();
565
return TRUE; // return TRUE unless you set the focus to a control
570
void CPocketPJDlg::OnBtnAcc()
573
VERIFY(menu.LoadMenu(IDR_ACC_MENU));
574
CMenu* pPopup = menu.GetSubMenu(0);
575
ASSERT(pPopup != NULL);
578
m_BtnAcc.GetWindowRect(&r);
579
pPopup->TrackPopupMenu(TPM_LEFTALIGN, r.left+4, r.top+4, this);
582
void CPocketPJDlg::OnBtnAction()
585
VERIFY(menu.LoadMenu(IDR_URI_MENU));
586
CMenu* pPopup = menu.GetSubMenu(0);
587
ASSERT(pPopup != NULL);
590
this->m_BtnUrlAction.GetWindowRect(&r);
591
pPopup->TrackPopupMenu(TPM_LEFTALIGN, r.left+4, r.top+4, this);
594
void CPocketPJDlg::OnSettings()
597
CSettingsDlg dlg(m_Cfg);
598
if (dlg.DoModal() != IDOK) {
602
m_Cfg.SaveRegistry();
609
void CPocketPJDlg::OnOK()
611
if (AfxMessageBox(_T("Quit PocketPJ?"), MB_YESNO)==IDYES) {
613
PopUp_Show(POPUP_REGISTRATION, "", "Shutting down..", "", "", "", 0);
616
PopUp_Hide(POPUP_REGISTRATION);
617
m_Cfg.SaveRegistry();
622
void CPocketPJDlg::OnTimer(UINT nIDEvent)
624
pjsua_handle_events(10);
625
CDialog::OnTimer(nIDEvent);
628
int CPocketPJDlg::FindBuddyInPjsua(const CString &Uri)
631
pjsua_buddy_id id[128];
632
unsigned i, count = PJ_ARRAY_SIZE(id);
634
if (pjsua_enum_buddies(id, &count) != PJ_SUCCESS)
635
return PJSUA_INVALID_ID;
637
return PJSUA_INVALID_ID;
639
pj_unicode_to_ansi((LPCTSTR)Uri, Uri.GetLength(), uri, sizeof(uri));
641
for (i=0; i<count; ++i) {
643
pjsua_buddy_get_info(id[i], &bi);
644
if (pj_strcmp2(&bi.uri, uri)==0)
648
return PJSUA_INVALID_ID;
651
int CPocketPJDlg::FindBuddyInCfg(const CString &uri)
654
for (i=0; i<m_Cfg.m_BuddyList.GetSize(); ++i) {
655
if (m_Cfg.m_BuddyList.GetAt(0) == uri) {
662
void CPocketPJDlg::RedrawBuddyList()
666
m_BuddyList.DeleteAllItems();
668
for (i=0; i<m_Cfg.m_BuddyList.GetSize(); ++i) {
672
id = FindBuddyInPjsua(m_Cfg.m_BuddyList.GetAt(i));
673
if (id != PJSUA_INVALID_ID) {
675
pjsua_buddy_get_info(id, &bi);
676
isOnline = (bi.status == PJSUA_BUDDY_STATUS_ONLINE);
682
memset(&lvi, 0, sizeof(lvi));
683
lvi.mask = LVIF_TEXT | LVIF_IMAGE;
685
lvi.iImage = isOnline;
686
lvi.pszText = (LPTSTR)(LPCTSTR)m_Cfg.m_BuddyList.GetAt(i);
688
m_BuddyList.InsertItem(&lvi);
692
void CPocketPJDlg::OnUriCall()
698
m_Url.GetWindowText(uri);
699
pj_unicode_to_ansi((LPCTSTR)uri, uri.GetLength(), tmp, sizeof(tmp));
700
if ((status=pjsua_verify_sip_url(tmp)) != PJ_SUCCESS) {
701
Error("The URL is not valid SIP URL", status);
705
pj_str_t dest_uri = pj_str(tmp);
706
pjsua_call_id call_id;
708
status = pjsua_call_make_call(m_PjsuaAccId, &dest_uri, 0, NULL, NULL, &call_id);
710
if (status != PJ_SUCCESS)
711
Error("Unable to make call", status);
714
void CPocketPJDlg::OnUriAddBuddy()
721
m_Url.GetWindowText(uri);
722
pj_unicode_to_ansi((LPCTSTR)uri, uri.GetLength(), tmp, sizeof(tmp));
723
if ((status=pjsua_verify_sip_url(tmp)) != PJ_SUCCESS) {
724
Error("The URL is not valid SIP URL", status);
728
for (i=0; i<m_Cfg.m_BuddyList.GetSize(); ++i) {
729
if (m_Cfg.m_BuddyList.GetAt(0) == uri) {
730
AfxMessageBox(_T("The URI is already in the buddy list"));
735
m_Cfg.m_BuddyList.Add(uri);
739
void CPocketPJDlg::OnUriDelBuddy()
743
m_Url.GetWindowText(uri);
744
int i = FindBuddyInCfg(uri);
746
/* Buddy not found */
750
m_Cfg.m_BuddyList.RemoveAt(i);
752
AfxMessageBox(_T("Buddy " + uri + " deleted"));
755
void CPocketPJDlg::OnAccOnline()
757
pjsua_acc_set_online_status(m_PjsuaAccId, PJ_TRUE);
758
m_BtnAcc.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_ONLINE)) );
761
void CPocketPJDlg::OnAccInvisible()
763
pjsua_acc_set_online_status(m_PjsuaAccId, PJ_FALSE);
764
m_BtnAcc.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_INVISIBLE)) );
767
void CPocketPJDlg::OnPopUpButton(int btnNo)
770
pjsua_call_answer(0, 200, NULL, 0);
771
PopUp_Modify(POPUP_CALL, POPUP_EL_BUTTON1, "");
772
} else if (btnNo == 2) {
774
PopUp_Modify(POPUP_CALL, POPUP_EL_TITLE2, "Hang up..");
775
PopUp_Modify(POPUP_CALL, POPUP_EL_TITLE3, "");
776
pjsua_call_hangup(0, PJSIP_SC_DECLINE, 0, 0);
780
void CPocketPJDlg::OnClickBuddyList(NMHDR* pNMHDR, LRESULT* pResult)
782
POSITION pos = m_BuddyList.GetFirstSelectedItemPosition();
784
PJ_UNUSED_ARG(pNMHDR);
787
int iItem = m_BuddyList.GetNextSelectedItem(pos);
788
CString uri = m_BuddyList.GetItemText(iItem, 0);
789
m_Url.SetWindowText(uri);