// tstril.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "tstril.h" #include #include #include #include "ril.h" #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE g_hInst; // The current instance HWND g_hwndCB; // The command bar handle HWND g_hwndEdit; HRIL g_hRil = 0; DWORD g_dwParam = 0x55AA55AA; static SHACTIVATEINFO s_sai; // Forward declarations of functions included in this code module: ATOM MyRegisterClass (HINSTANCE, LPTSTR); BOOL InitInstance (HINSTANCE, int); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM); HWND CreateRpCommandBar(HWND); TCHAR *hexdump(unsigned char *data, int n) { static TCHAR buf[1000]; TCHAR *p; p=buf; while (n--) { p += _sntprintf(p, 4, TEXT(" %02x"), *data++); } return buf; } void DoError(LPTSTR where) { TCHAR *msgbuf; int msglen= FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, (LPTSTR) &msgbuf, 0, NULL); MessageBox(NULL, msgbuf, where, MB_OK); LocalFree(msgbuf); } BOOL GetDateAndTime(SYSTEMTIME *st, LPTSTR szDate, LPTSTR szTime, DWORD dwSize) { if (!GetDateFormat(LOCALE_NEUTRAL, DATE_SHORTDATE, st, NULL, szDate, dwSize)) { DoError(L"GetDateFormat"); return FALSE; } if (!GetTimeFormat(LOCALE_NEUTRAL, TIME_NOSECONDS, st, NULL, szTime, dwSize)) { DoError(L"GetTimeFormat"); return FALSE; } return TRUE; } void DisplayDCS(RILMSGDCS * prmDCS) { TCHAR szString[256]; wsprintf(szString, L" DCS cbSize: 0x%0x, %d", prmDCS->cbSize, prmDCS->cbSize); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" DCS dwParams: 0x%0x, %d", prmDCS->dwParams, prmDCS->dwParams); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" DCS dwType: 0x%0x, %d", prmDCS->dwType, prmDCS->dwType); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" DCS dwFlags: 0x%0x, %d", prmDCS->dwFlags, prmDCS->dwFlags); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" DCS dwMsgClass: 0x%0x, %d", prmDCS->dwMsgClass, prmDCS->dwMsgClass); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" DCS dwAlphabet: 0x%0x, %d", prmDCS->dwAlphabet, prmDCS->dwAlphabet); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" DCS dwIndication: 0x%0x, %d", prmDCS->dwIndication, prmDCS->dwIndication); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" DCS dwLanguage: 0x%0x, %d", prmDCS->dwLanguage, prmDCS->dwLanguage); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); } void DisplayMessage(RILMESSAGE *prmMsg) { TCHAR szDate[256], szTime[256]; TCHAR szString[1024]; wsprintf(szString, L" cbSize: 0x%0x, %d", prmMsg->cbSize, prmMsg->cbSize); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" dwParams: 0x%0x, %d", prmMsg->dwParams, prmMsg->dwParams); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" Service Centre: %s", prmMsg->raSvcCtrAddress.wszAddress); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" dwType: 0x%0x, %d", prmMsg->dwType, prmMsg->dwType); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" dwFlags: 0x%0x, %d", prmMsg->dwFlags, prmMsg->dwFlags); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); switch(prmMsg->dwType) { case RIL_MSG_IN_DELIVER: { wsprintf(szString, L" From: %s", prmMsg->msgInDeliver.raOrigAddress.wszAddress); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" dwProtocolID: 0x%0x, %d", prmMsg->msgInDeliver.dwProtocolID, prmMsg->msgInDeliver.dwProtocolID); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); DisplayDCS(&prmMsg->msgInDeliver.rmdDataCoding); if (!GetDateAndTime(&prmMsg->msgInDeliver.stSCReceiveTime, szDate, szTime, 256)) { return; } wsprintf(szString, L" Received: %s on %s", szTime, szDate); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" Header Length: %d", prmMsg->msgInDeliver.cbHdrLength); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" Body Length: %d", prmMsg->msgInDeliver.cchMsgLength); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); if (prmMsg->msgInDeliver.cchMsgLength) { wsprintf(szString, L" Message: %s", hexdump(prmMsg->msgInDeliver.rgbMsg, prmMsg->msgInDeliver.cchMsgLength)); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); } break; } case RIL_MSG_IN_STATUS: { wsprintf(szString, L" Target address: %s", prmMsg->msgInStatus.raTgtRecipAddress.wszAddress); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); if (!GetDateAndTime(&prmMsg->msgInStatus.stTgtSCReceiveTime, szDate, szTime, 256)) { return; } wsprintf(szString, L" Receive Time: %s on %s", szTime, szDate); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); if (!GetDateAndTime(&prmMsg->msgInStatus.stTgtDischargeTime, szDate, szTime, 256)) { return; } wsprintf(szString, L" Discharge Time: %s on %s", szTime, szDate); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" dwTgtDlvStatus: 0x%0x, %d", prmMsg->msgInStatus.dwTgtDlvStatus, prmMsg->msgInStatus.dwTgtDlvStatus); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" dwProtocolID: 0x%0x, %d", prmMsg->msgInStatus.dwProtocolID, prmMsg->msgInStatus.dwProtocolID); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); DisplayDCS(&prmMsg->msgInStatus.rmdDataCoding); wsprintf(szString, L" Header Length: %d", prmMsg->msgInStatus.cbHdrLength); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); wsprintf(szString, L" Body Length: %d", prmMsg->msgInStatus.cchMsgLength); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); if (prmMsg->msgInStatus.cchMsgLength) { wsprintf(szString, L" Message: %s", hexdump(prmMsg->msgInStatus.rgbMsg, prmMsg->msgInStatus.cchMsgLength)); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); } break; } default: wsprintf(szString, L"Message type not covered yet!"); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); break; } } void CALLBACK NotifyCallback(DWORD dwCode, const void *lpData, DWORD cbData, DWORD dwParam) { TCHAR szString[256]; wsprintf(szString, L"notify: dwCode=0x%0X lpData=%p, cbData=%d",dwCode, lpData, cbData); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); switch (dwCode & RIL_NCLASS_ALL) { case RIL_NCLASS_MESSAGE: { wsprintf(szString, L"SMS Message Notification:"); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); switch (dwCode & 0xff) { case RIL_NOTIFY_MESSAGE: { RILMESSAGE *prm = (RILMESSAGE *)lpData; wsprintf(szString, L" Incoming message"); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); DisplayMessage(prm); break; } case RIL_NOTIFY_STATUSMESSAGE: { RILMESSAGE *prm = (RILMESSAGE *)lpData; wsprintf(szString, L" Incoming status message"); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); DisplayMessage(prm); break; } } break; } } } void CALLBACK ResultCallback(DWORD dwCode, HRESULT hrCmdID, const void *lpData, DWORD cbData, DWORD dwParam) { TCHAR szString[256]; wsprintf(szString, L"result: dwCode=%d, hrCmdID=%d lpData=%p, cbData=%d",dwCode, hrCmdID, lpData, cbData); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); } DWORD DoRIL(LPVOID lpvoid) { HRESULT result; DWORD dwNotificationClasses = 0xFF0000; LRESULT lresult; TCHAR szString[256]; SendMessage(g_hwndEdit, LB_RESETCONTENT, 0, 0); lresult = SendMessage(g_hwndEdit, LB_GETHORIZONTALEXTENT, 0, 0); SendMessage(g_hwndEdit, LB_SETHORIZONTALEXTENT, 1000, 0); result = RIL_Initialize(1, ResultCallback, NotifyCallback, dwNotificationClasses, g_dwParam, &g_hRil); wsprintf(szString, L"RIL Handle: %08X, result %08X", g_hRil, result); SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); while(1) { Sleep(100); // wsprintf(szString, L"%s",L"..."); // SendMessage(g_hwndEdit, LB_ADDSTRING, 0, (LPARAM) szString); } return 0; } 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_TSTRIL); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } // // FUNCTION: MyRegisterClass() // // PURPOSE: Registers the window class. // // COMMENTS: // // It is important to call this function so that the application // will get 'well formed' small icons associated with it. // 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_TSTRIL)); wc.hCursor = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = 0; wc.lpszClassName = szWindowClass; return RegisterClass(&wc); } // // FUNCTION: InitInstance(HANDLE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd = NULL; TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // The window class name g_hInst = hInstance; // Store instance handle in our global variable // Initialize global strings LoadString(hInstance, IDC_TSTRIL, szWindowClass, MAX_LOADSTRING); LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); //If it is already running, then focus on the window hWnd = FindWindow(szWindowClass, szTitle); if (hWnd) { // set focus to foremost child window // The "| 0x01" is used to bring any owned windows to the foreground and // activate them. SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001)); return 0; } MyRegisterClass(hInstance, szWindowClass); RECT rect; GetClientRect(hWnd, &rect); hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } //When the main window is created using CW_USEDEFAULT the height of the menubar (if one // is created is not taken into account). So we resize the window after creating it // if a menubar is present { RECT rc; GetWindowRect(hWnd, &rc); rc.bottom -= MENU_HEIGHT; if (g_hwndCB) MoveWindow(hWnd, rc.left, rc.top, rc.right, rc.bottom, FALSE); } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; int wmId, wmEvent; PAINTSTRUCT ps; DWORD dwError, dwThreadID; HANDLE hReadThread = NULL; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_TOOLS_EXIT: return SendMessage (hWnd, WM_CLOSE, 0, 0); case IDM_HELP_ABOUT: DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDOK: SendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hWnd); SendMessage (hWnd, WM_CLOSE, 0, 0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_CREATE: g_hwndCB = CreateRpCommandBar(hWnd); // Initialize the shell activate info structure memset (&s_sai, 0, sizeof (s_sai)); s_sai.cbSize = sizeof (s_sai); g_hwndEdit = CreateWindow(L"listbox", L"", WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_HSCROLL, 0, 0, 500, 300, hWnd, 0, g_hInst, 0); // Create a read thread for reading data from the communication port. if (hReadThread = CreateThread (NULL, 0, DoRIL, 0, 0, &dwThreadID)) { CloseHandle (hReadThread); } else { // Could not create the read thread. MessageBox (hWnd, TEXT("Unable to create the RIL thread"), TEXT("Error"), MB_OK); dwError = GetLastError (); return FALSE; } break; case WM_SIZE: MoveWindow(g_hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam) - 26, TRUE); break; case WM_PAINT: RECT rt; hdc = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rt); EndPaint(hWnd, &ps); break; case WM_DESTROY: CommandBar_Destroy(g_hwndCB); PostQuitMessage(0); break; case WM_ACTIVATE: // Notify shell of our activate message SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE); break; case WM_SETTINGCHANGE: SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } HWND CreateRpCommandBar(HWND hwnd) { SHMENUBARINFO mbi; memset(&mbi, 0, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(SHMENUBARINFO); mbi.hwndParent = hwnd; mbi.nToolBarId = IDM_MENU; mbi.hInstRes = g_hInst; mbi.nBmpId = 0; mbi.cBmpImages = 0; if (!SHCreateMenuBar(&mbi)) return NULL; return mbi.hwndMB; } // Mesage handler for the About box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { SHINITDLGINFO shidi; switch (message) { case WM_INITDIALOG: // Create a Done button and size it. shidi.dwMask = SHIDIM_FLAGS; shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN; shidi.hDlg = hDlg; SHInitDialog(&shidi); return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; }