www.pudn.com > ppc_Cellcore.rar > main.cpp


// 
// Copyright (c) Microsoft Corporation.  All rights reserved. 
// 
// 
// Use of this source code is subject to the terms of the Microsoft end-user 
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. 
// If you did not accept the terms of the EULA, you are not authorized to use 
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your 
// install media. 
// 
/* 
 
 MAIN.CPP 
 
 A simple TAPI dialer.  
 
 A dialog is presented allowing the user to  
 key in a phone number which is then dialed  
 using the TAPI function tapiRequestMakeCall. 
 
*/ 
 
#include  
#include  
#include  
#include "resource.h" 
 
#define BUFSIZE		256 
 
// Macro to simplify determining the number of elements in an array  
// (do *not* use this macro for pointers) 
#define ARRAY_LENGTH(x) (sizeof(x)/sizeof((x)[0])) 
 
// function declarations 
BOOL ConfirmNumber(void); 
BOOL DialNumber(void); 
BOOL CALLBACK DialogProc(const HWND hDlg, const UINT uiMessage,  
						 const WPARAM wParam, const LPARAM lParam); 
 
// globals variable declarations 
HINSTANCE		ghInstance; 
static TCHAR	gszDefaultNum[] = TEXT("+1 (425) 882-8080"); 
LPTSTR			gpszPhoneNum = gszDefaultNum; 
 
// Purpose: Determine at runtime if the app is running on a smartphone device 
static BOOL IsSmartphone()  
{ 
    TCHAR tszPlatform[64]; 
 
    if (TRUE == SystemParametersInfo(SPI_GETPLATFORMTYPE, 
         sizeof(tszPlatform)/sizeof(*tszPlatform),tszPlatform,0)) 
    { 
        if (0 == _tcsicmp(TEXT("Smartphone"), tszPlatform))  
        { 
            return TRUE; 
        } 
    } 
    return FALSE;    
} 
// *************************************************************************** 
// Function Name: WinMain 
// 
// Purpose: Main entry point into the HelloTAPI program 
// 
// Arguments: Standard WinMain arguments 
// 
// Return Values: 0 
// 
// Description: 
//	Our WinMain function essentialy just pops up a Dialog box to request a 
//	phone number to dial.  Then, based on the return value of that Dialog box, 
//	it (a) does nothing, (b) confirms, then dials the number, (c) dials. 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,  
				   LPTSTR lpCmdLine, int nShowCmd) 
{ 
	// flag 
	int iTryDial = 1; 
 
	// store the hInstance 
	ghInstance = hInstance; 
 
	// Create the dialog box.  
    // The dialog box is modal so control will not be returned to this  
    // function until the callback function (DialogPrc) has been invoked  
    // and has called EndDialog. 
    // 
    // Note the use of the MAKEINTRESOURCE macro to set the high-order  
    // word of the resource identifier to zero as it is passed to DialogBox  
	iTryDial = DialogBox(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, (DLGPROC)DialogProc); 
 
    // switch on the value set in DialogProc and do the  
    // appropriate action.  
	switch (iTryDial)  
    { 
		case 0: // cancel 
			// do nothing 
			break; 
		case 1: // confirm, then dial 
			if (ConfirmNumber())  
            { 
				if (!DialNumber())  
                { 
					MessageBox(NULL, TEXT("Doh!!!"), TEXT("Phone Call Failed"), MB_OK); 
				} 
			} 
			break; 
		case 2: // dial now 
			if (!DialNumber())  
            { 
				MessageBox(NULL, TEXT("Doh!!!"), TEXT("Phone Call Failed"), MB_OK); 
			} 
			break; 
		default: // error 
			MessageBox(NULL, TEXT("An error has occurred while initializing the dialog box."), 
					   TEXT("Error!!!"), MB_OK); 
			break; 
	} 
 
	return 0; 
} 
 
// *************************************************************************** 
// Function Name: DialogProc 
//  
// Purpose: Message Handler for HelloTAPI Dialog Box 
// 
// Arguments: Standard Dialog Procedure Arguments 
// 
// Return Values: 
//	Returns a number between -1 and 2, inclusive, indicating the following: 
//	   -1	An error occurred while initializing the Dialog 
//		0	Cancel was pressed 
//		1	Confirm, then Dial 
//		2	Dial Immediately 
// 
// Side Effects: 
//	Sets gpszPhoneNum to point to either a copy of the number entered, or 
//	to the default number. 
//	 
// Description: 
//	Dialog Procedure for the main HelloMAPI Dialog.  Accepts a phone number as 
//	input and copies it to a global variable.  Demonstrates use of SoftKey menus 
//	as well (user can Dial or Cancel). 
 
BOOL CALLBACK DialogProc(const HWND hDlg, const UINT uiMessage,  
						 const WPARAM wParam, const LPARAM lParam) 
{ 
	BOOL	bProcessedMsg = true; 
	int		iDial = 1; 
	DWORD	dwFlags = 0; 
 
	 
	switch(uiMessage) 
	{ 
		case WM_INITDIALOG: 
            // This is a standard message received before the dialog 
            // box is displayed so initialise and set up the resources. 
 
            // Specify that the dialog box should stretch full screen 
			SHINITDLGINFO shidi; 
			 
			ZeroMemory(&shidi, sizeof(shidi)); 
             
			dwFlags = SHIDIF_SIZEDLGFULLSCREEN; 
 
			if (!IsSmartphone()) 
			{ 
				dwFlags |= SHIDIF_DONEBUTTON; 
			} 
			shidi.dwMask = SHIDIM_FLAGS; 
            shidi.dwFlags = dwFlags; 
            shidi.hDlg = hDlg; 
             
			// Set up the menu bar 
			SHMENUBARINFO shmbi; 
			ZeroMemory(&shmbi, sizeof(shmbi)); 
            shmbi.cbSize = sizeof(shmbi); 
            shmbi.hwndParent = hDlg; 
            shmbi.nToolBarId = IDR_HELLOMAPI_APPMENUBAR; 
            shmbi.hInstRes = ghInstance; 
			 
 
			// If we could not initialize the dialog box, return an error 
			if (!(SHInitDialog(&shidi) && SHCreateMenuBar(&shmbi)))  
            { 
				EndDialog(hDlg, -1); 
			} 
            else 
			// set the title bar  
            { 
                TCHAR sz[160];  
                LoadString(ghInstance, IDS_HELLOMAPI_TITLE, sz, ARRAY_LENGTH(sz));  
                SetWindowText(hDlg, sz);  
            }  
			break; 
 
		case WM_COMMAND: 
            // An event has occured in the dialog box 
            // The low-order word of wParam specifies the identifier  
            // of the menu item, control, or accelerator. 
			switch (LOWORD(wParam))  
            { 
				case IDM_HELLOMAPI_DIALNOW: 
					// Increment iDial, so that EndDialog returns 2 
					// This is because we want to distinguish between confirm 
					// and no confirm.  Fall through the case. 
					++iDial; 
				case IDM_HELLOMAPI_CONFIRM: 
					// malloc space for the phone number 
					gpszPhoneNum = (LPTSTR) malloc(BUFSIZE * sizeof(TCHAR)); 
					if (!gpszPhoneNum)  
                    { 
						gpszPhoneNum = gszDefaultNum; 
						EndDialog(hDlg, -1); 
                        break; 
					} 
 
					// get the number - set to default if empty 
					if (!GetDlgItemText(hDlg, IDC_PHONENUM, gpszPhoneNum,  
										BUFSIZE - 1))  
                    { 
						free(gpszPhoneNum); 
						gpszPhoneNum = gszDefaultNum; 
					} 
 
					EndDialog(hDlg, iDial);  
					break; 
				case IDM_HELLOMAPI_CANCEL: 
				case IDOK: 
					// do nothing 
					EndDialog(hDlg, 0); 
					break; 
			} 
			break; 
 
		default: 
			// nothing was processed 
			bProcessedMsg = false; 
			break; 
	} 
 
	return bProcessedMsg; 
} 
 
// *************************************************************************** 
// Function Name: ConfirmNumber 
//  
// Purpose:  
//	Give the user one last chance to confirm that the number they entered 
//	is indeed the one they want to dial. 
// 
// Arguments: None 
// 
// Return Values: 
//	TRUE if ok to Dial, FALSE if not ok 
// 
// Description: 
//	Pops up a YESNO Message box allowing the user to confirm the number 
//	to be dialed. 
 
BOOL ConfirmNumber(void) 
{ 
	int				iResult; 
	TCHAR			szTemp[BUFSIZE]; 
	TCHAR			szConfirmString[BUFSIZE]; 
 
	// sanity check 
	ASSERT(gpszPhoneNum && *gpszPhoneNum); 
 
	// Create Confirmation String. MessageBox requires a 0 terminated string. 
    LoadString(ghInstance, IDS_HELLOMAPI_AREYOUSURE, szTemp, ARRAY_LENGTH(szTemp)); 
    StringCchPrintf(szConfirmString, BUFSIZE, TEXT("%s %s?"), szTemp, gpszPhoneNum); 
     
 
	// Confirm the number to be dialed. 
    LoadString(ghInstance, IDS_HELLOMAPI_DIALCONFIRMATION, szTemp, ARRAY_LENGTH(szTemp)); 
	iResult = MessageBox(NULL, szConfirmString, szTemp, MB_YESNO); 
 
	// Dial the number? 
	return (IDYES == iResult); 
} 
 
// *************************************************************************** 
// Function Name: DialNumber 
// 
// Purpose: Attempt to dial a phone number with tapiRequestMakeCall 
// 
// Arguments: none 
// 
// Return Values: 
//	TRUE if dial attempt was successful, FALSE otherwise 
//	Note: even a busy signal is considered a successful dial 
// 
// Description: 
//	Essentially all this function does is tries to make a phone call. 
//	If the call is not successful, one might be interested in the return 
//	value of tapiRequestMakeCall, but in this program we are content just to 
//	return whether the call was successful or not. 
 
BOOL DialNumber(void) 
{ 
	LONG lResult; 
	lResult = tapiRequestMakeCall(gpszPhoneNum, NULL, NULL, NULL); 
	return (0 == lResult); 
}