📄 pjsua_wince.cpp
字号:
pjsua_codec_set_priority(pj_cstr(&tmp, "speex/32000"), 0);
pjsua_codec_set_priority(pj_cstr(&tmp, "gsm"), 100);
/* Add UDP transport and the corresponding PJSUA account */
status = pjsua_transport_create(PJSIP_TRANSPORT_UDP,
&udp_cfg, &transport_id);
if (status != PJ_SUCCESS) {
OnError(TEXT("Error starting SIP transport"), status);
return FALSE;
}
pjsua_transport_get_info(transport_id, &transport_info);
g_local_uri.ptr = (char*)pj_pool_alloc(g_pool, 128);
g_local_uri.slen = pj_ansi_sprintf(g_local_uri.ptr,
"<sip:%.*s:%d>",
(int)transport_info.local_name.host.slen,
transport_info.local_name.host.ptr,
transport_info.local_name.port);
/* Add local account */
pjsua_acc_add_local(transport_id, PJ_TRUE, &g_current_acc);
pjsua_acc_set_online_status(g_current_acc, PJ_TRUE);
/* Start pjsua */
status = pjsua_start();
if (status != PJ_SUCCESS) {
OnError(TEXT("Error starting pjsua"), status);
return FALSE;
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HACCEL hAccelTable;
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_PJSUA_WINCE);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
static ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PJSUA_WINCE));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];
hInst = hInstance;
/* Init stack */
if (OnInitStack() == FALSE)
return FALSE;
LoadString(hInstance, IDC_PJSUA_WINCE, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance, szWindowClass);
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 200,
NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
hMainWnd = hWnd;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
if (hwndCB)
CommandBar_Show(hwndCB, TRUE);
SetTimer(hMainWnd, ID_POLL_TIMER, 50, NULL);
return TRUE;
}
static void OnCreate(HWND hWnd)
{
enum
{
X = 10,
Y = 40,
W = 220,
H = 30,
};
DWORD dwStyle;
hMainWnd = hWnd;
hwndCB = CommandBar_Create(hInst, hWnd, 1);
CommandBar_InsertMenubar(hwndCB, hInst, IDM_MENU, 0);
CommandBar_AddAdornments(hwndCB, 0, 0);
// Create global status text
dwStyle = WS_CHILD | WS_VISIBLE | WS_DISABLED | ES_LEFT;
hwndGlobalStatus = CreateWindow(
TEXT("EDIT"), // Class name
NULL, // Window text
dwStyle, // Window style
X, // x-coordinate of the upper-left corner
Y+0, // y-coordinate of the upper-left corner
W, // Width of the window for the edit
// control
H-5, // Height of the window for the edit
// control
hWnd, // Window handle to the parent window
(HMENU) ID_GLOBAL_STATUS, // Control identifier
hInst, // Instance handle
NULL); // Specify NULL for this parameter when
// you create a control
SetLocalURI(g_local_uri.ptr, g_local_uri.slen, false);
// Create URI edit
dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER;
hwndURI = CreateWindow (
TEXT("EDIT"), // Class name
NULL, // Window text
dwStyle, // Window style
X, // x-coordinate of the upper-left corner
Y+H, // y-coordinate of the upper-left corner
W, // Width of the window for the edit
// control
H-5, // Height of the window for the edit
// control
hWnd, // Window handle to the parent window
(HMENU) ID_URI, // Control identifier
hInst, // Instance handle
NULL); // Specify NULL for this parameter when
// you create a control
// Create action Button
hwndActionButton = CreateWindow( L"button", L"Action",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
X, Y+2*H,
60, H-5, hWnd,
(HMENU) ID_BTN_ACTION,
hInst, NULL );
// Create exit button
hwndExitButton = CreateWindow( L"button", L"E&xit",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
X+70, Y+2*H,
60, H-5, hWnd,
(HMENU) ID_EXIT,
hInst, NULL );
// Create call status edit
dwStyle = WS_CHILD | WS_VISIBLE | WS_DISABLED;
hwndCallStatus = CreateWindow (
TEXT("EDIT"), // Class name
NULL, // Window text
dwStyle, // Window style
X, // x-coordinate of the upper-left corner
Y+3*H, // y-coordinate of the upper-left corner
W, // Width of the window for the edit
// control
H-5, // Height of the window for the edit
// control
hWnd, // Window handle to the parent window
(HMENU) ID_CALL_STATUS, // Control identifier
hInst, // Instance handle
NULL); // Specify NULL for this parameter when
// you create a control
SetCallStatus("Ready", 5);
SetAction(ID_MENU_CALL);
SetURI(DEFAULT_URI, -1);
SetFocus(hWnd);
}
static void OnDestroy(void)
{
pjsua_destroy();
}
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message) {
case WM_KEYUP:
if (wParam==114) {
wParam = ID_MENU_CALL;
} else if (wParam==115) {
if (g_current_call == PJSUA_INVALID_ID)
wParam = ID_EXIT;
else
wParam = ID_MENU_DISCONNECT;
} else
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
if (wmId == ID_BTN_ACTION)
wmId = g_current_action;
switch (wmId)
{
case ID_MENU_CALL:
if (g_current_call != PJSUA_INVALID_ID) {
MessageBox(NULL, TEXT("Can not make call"),
TEXT("You already have one call active"), MB_OK);
}
pj_str_t dst_uri;
wchar_t text[256];
char tmp[256];
pj_status_t status;
GetWindowText(hwndURI, text, PJ_ARRAY_SIZE(text));
pj_unicode_to_ansi(text, pj_unicode_strlen(text),
tmp, sizeof(tmp));
dst_uri.ptr = tmp;
dst_uri.slen = pj_ansi_strlen(tmp);
status = pjsua_call_make_call(g_current_acc,
&dst_uri, 0, NULL,
NULL, &g_current_call);
if (status != PJ_SUCCESS)
OnError(TEXT("Unable to make call"), status);
break;
case ID_MENU_ANSWER:
if (g_current_call == PJSUA_INVALID_ID)
MessageBox(NULL, TEXT("Can not answer"),
TEXT("There is no call!"), MB_OK);
else
pjsua_call_answer(g_current_call, 200, NULL, NULL);
break;
case ID_MENU_DISCONNECT:
if (g_current_call == PJSUA_INVALID_ID)
MessageBox(NULL, TEXT("Can not disconnect"),
TEXT("There is no call!"), MB_OK);
else
pjsua_call_hangup(g_current_call, PJSIP_SC_DECLINE, NULL, NULL);
break;
case ID_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
OnCreate(hWnd);
break;
case WM_DESTROY:
OnDestroy();
CommandBar_Destroy(hwndCB);
PostQuitMessage(0);
break;
case WM_TIMER:
pjsua_handle_events(1);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -