DATAMODE.C
上传用户:daguish
上传日期:2007-01-07
资源大小:14k
文件大小:15k
源码类别:

通讯/手机编程

开发平台:

Visual C++

  1. // This code was designed as a simple example of TAPI.  By no means was
  2. // this designed to be an all inclusive example.  This code and example is 
  3. // provided "AS IS" without warranty of any kind, either expressed or implied,
  4. // including but not limited to the implied warranties of merchantability 
  5. // and/or fitness for a particular purpose.
  6. //
  7. // This was designed on Windows 95 with Microsoft MSVC 2.0 compiler.
  8. // This program will NOT run on WinNT and has not been tested on Win 3.1/3.11.
  9. //
  10. // Files required to compile program :
  11. // datamode.c
  12. // tapi.h
  13. // resource.h
  14. // datamode.rc
  15. // datamode.def
  16. // tapi32.lib
  17. //
  18. // Author  : Mike Zercher
  19. // Date : 5/26/95
  20. //
  21. // This program and all related files are public domain and may be freely
  22. // distributed.  By using the program or any included part, the user assumes
  23. // full responsibility for it's proper use and may not hold the author liable
  24. // for any loss or damage.  If unable to accept this condition, the program
  25. // and all related parts may not be used and must be destroyed immediately.
  26. #include "windows.h"
  27. #include "tapi.h"
  28. #include "resource.h"
  29. LONG ConnectToData( HWND, LPTSTR );
  30. void CALLBACK LineCallBackProc(DWORD hDevice,DWORD dwMessage,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3);
  31. BOOL WINAPI MainDialog(HWND hDlg, WORD msg, WORD wParam, LONG lParam);
  32. void SendStatus( HWND hWnd, LPTSTR OutputString );
  33. void SetVariableProperties( HWND hWnd, DWORD hDevice );
  34. #define tapiVersionCur                            (MAKELONG(4,1))
  35. #define TAPI_LINE_REPLY 5000
  36. #define TAPI_LINECALLSTATE_CONNECTED 5001
  37. #define TAPI_LINECALLSTATE_IDLE 5002
  38. #define TAPI_LINECALLSTATE_DISCONNECTED 5003
  39. #define TAPI_LINECALLSTATE_BUSY 5004
  40. #define TAPI_LINECALLSTATE_ACCEPTED 5005
  41. #define TAPI_LINECALLSTATE_PROCEEDING 5006
  42. #define TAPI_LINECALLSTATE_OFFERING 5007
  43. #define TAPI_LINECALLSTATE_DIALTONE 5008
  44. #define TAPI_LINECALLSTATE_DIALING 5009
  45. LINECALLPARAMS LineParams;
  46. DWORD lines;
  47. HINSTANCE hInst;
  48. HWND MainWin, ButtonWnd;
  49. HLINEAPP LineHandle = NULL;
  50. int PASCAL WinMain( HANDLE hInstance, HANDLE hPrev, LPSTR lpCmd, int nShow )
  51. {
  52.     SetMessageQueue( 100 );
  53.     hInst = hInstance;
  54. DialogBox( hInstance, MAKEINTRESOURCE( ID_MAIN_SCREEN ), NULL, MainDialog ); 
  55.     return( FALSE );
  56. }
  57. BOOL WINAPI MainDialog(HWND hDlg, WORD msg, WORD wParam, LONG lParam)
  58. {
  59. switch (msg)
  60. {
  61. case WM_INITDIALOG:
  62. {
  63. // Set the necessary properties to null
  64. SetProp( hDlg, "HCALL", NULL );
  65. SetProp( hDlg, "HLINE", NULL );
  66. SetProp( hDlg, "HCOMM", NULL );
  67. break;
  68. }
  69. case WM_COMMAND:
  70. {
  71. switch( wParam )
  72. {
  73. case IDOK: // This is the exit routine.
  74. {
  75. HCALL hCall;
  76. HLINE hLine;
  77. HANDLE hComm;
  78. hCall = (HCALL)GetProp( hDlg, "HCALL" ); // Get the properties
  79. hLine = (HLINE)GetProp( hDlg, "HLINE" );
  80. hComm = (HANDLE)GetProp( hDlg, "HCOMM" );
  81. if( hComm != NULL ) // is there a comm handle?
  82. {
  83. CloseHandle( hComm ); // Yes, close it down.
  84. SetProp( hDlg, "HCOMM", NULL ); // Set its value to NULL
  85. }
  86. if( hCall != NULL ) // is there a call present?
  87. {
  88. lineDrop( hCall, NULL, 0 ); // Close down the line.
  89. SetProp( hDlg, "HCALL", NULL ); // Set it's value to NULL
  90. }
  91. if( hLine != NULL ) // is the line open?
  92. {
  93. lineClose( hLine ); // Yes, close it down
  94. SetProp( hDlg, "HLINE", NULL ); // Set it to NULL
  95. }
  96. if( LineHandle != NULL ) //Was the line initialized?
  97. {
  98. lineShutdown( LineHandle ); //Yes, shut it down
  99. LineHandle = NULL; // Set it to NULL
  100. }
  101. RemoveProp( hDlg, "HCALL" ); // Remove the properties
  102. RemoveProp( hDlg, "HLINE" );
  103. RemoveProp( hDlg, "HCOMM" );
  104.     EndDialog( hDlg, FALSE ); // Goodbye
  105.     break;
  106.     }
  107.    
  108.     case ID_CALL:
  109.     {
  110. // This is where the call will be called from.
  111. char PhoneNumber[ 100 ];
  112. HCALL hCall;
  113. // Check and see if there is anything left hanging open
  114. hCall = (HCALL)GetProp( hDlg, "HCALL" );
  115. if( hCall != NULL  ) // Is there a current call?
  116. {
  117.   MessageBox( hDlg, "Please Disconnect before making another call!", " Tapi Error", MB_ICONSTOP );
  118. break;
  119. }
  120. // Get the Phone Number from the dialog
  121. GetDlgItemText( hDlg, ID_PHONE, PhoneNumber, sizeof( PhoneNumber ) );
  122. if( ConnectToData( hDlg, PhoneNumber ) < 0 )
  123. SendStatus( hDlg, "Unable to start a TAPI Function" );
  124.     break;
  125.     }
  126. case ID_DISCONNECT: // Time to Disconnect a call
  127. {
  128. LONG retcode;
  129. HCALL hCall;
  130. HANDLE hComm;
  131. hCall = (HCALL)GetProp( hDlg, "HCALL" ); // Get the properties
  132. hComm = (HANDLE)GetProp( hDlg, "HCOMM" );
  133. if( hComm != NULL ) // Is there a comm handle?
  134. {
  135. CloseHandle( hComm ); // Yes, close it
  136. SetProp( hDlg, "HCALL", NULL );
  137. }
  138. if( hCall != NULL ) // Is there a call?
  139. {
  140. retcode = lineDrop( hCall, NULL, 0 );  // Drop the call
  141. SendStatus( hDlg, "Call is Dropped" );
  142. SetProp( hDlg, "HCALL", NULL );
  143. }
  144. break;
  145. }
  146. case TAPI_LINE_REPLY:
  147. {
  148. SendStatus( hDlg, "Line Reply" ); 
  149.   break;
  150. }
  151. case TAPI_LINECALLSTATE_CONNECTED:
  152. {
  153. SendStatus( hDlg, "Line Call State is Connected" ); 
  154. break;
  155. }    
  156. case TAPI_LINECALLSTATE_IDLE:
  157. {
  158. LONG retcode;
  159. HLINE hLine;
  160. // Since the call has been closed, you may now close down the line
  161. hLine = (HLINE)GetProp( hDlg, "HLINE" ); 
  162. if( hLine != NULL ) // Make sure there is a line open
  163. {
  164. retcode = lineClose( hLine );  // Yes there was
  165. SetProp( hDlg, "HLINE", (HANDLE)NULL );
  166. }
  167. SendStatus( hDlg, "Line Call State is idle" );
  168. break;
  169. }
  170. // The rest of this switch is calls that are originated from my TAPI
  171. // callback function.  This is just to show you how you can wait for
  172. // certain functions to happen without using PeekMessage loops
  173. case TAPI_LINECALLSTATE_DISCONNECTED:
  174. {
  175. SendStatus( hDlg, "Line Call State is Disconnected" );
  176. break;
  177. }
  178. case TAPI_LINECALLSTATE_BUSY:
  179. {
  180. SendStatus( hDlg, "Line Call State is Busy" );
  181. break;
  182. }
  183. case TAPI_LINECALLSTATE_ACCEPTED:
  184. {
  185. SendStatus( hDlg, "Line Call State is Accepted" );
  186. break;
  187. }
  188. case TAPI_LINECALLSTATE_PROCEEDING:
  189. {
  190. SendStatus( hDlg, "Line Call State is Proceeding" );
  191. break;
  192. }
  193. case TAPI_LINECALLSTATE_OFFERING:
  194. {
  195. SendStatus( hDlg, "Line Call State is Offering" );
  196. break;
  197. }
  198. case TAPI_LINECALLSTATE_DIALTONE:
  199. {
  200. SendStatus( hDlg, "Line Call State is DialTone" );
  201. break;
  202. }
  203. case TAPI_LINECALLSTATE_DIALING:
  204. {
  205. SendStatus( hDlg, "Line Call State is Dialing" );
  206. break;
  207. }
  208. default:
  209.     break;
  210.     }
  211. break;
  212. }
  213. default:
  214. break;
  215. }
  216. return (FALSE);
  217. }
  218. LONG ConnectToData( HWND hWnd, LPTSTR PhoneNumber )
  219. {
  220. // Here is the meat of the connection of a phone line.  This is not all inclusive
  221. // and by no means have all the error checking present.
  222. LONG retcode;
  223. DWORD i;
  224. DWORD ApiVersion;
  225. DWORD RetApiVersion;
  226. LINEEXTENSIONID ExtensionID;
  227. HLINE hLine;
  228. HCALL hCall;
  229. if( lstrlen( PhoneNumber ) < 1 ) //No Phone Number Provided
  230. return( -1 );
  231. // Initialize the Line Handle
  232. if( LineHandle == NULL )
  233. retcode = lineInitialize( &LineHandle, hInst, (LINECALLBACK)LineCallBackProc, "DataModem", &lines );
  234. if( retcode < 0 )
  235. return( retcode );
  236. hLine = (HLINE)GetProp( hWnd, "HLINE" );
  237. if( hLine == NULL )
  238. {
  239. for( i=0; i < lines; i++ )
  240. {
  241. // Negotiate the API Version
  242. ApiVersion = tapiVersionCur;
  243. retcode = lineNegotiateAPIVersion( LineHandle, i, ApiVersion, ApiVersion, &RetApiVersion,
  244. &ExtensionID );
  245. retcode = lineOpen( LineHandle, i, &hLine, RetApiVersion, 0, (DWORD)hWnd,
  246. LINECALLPRIVILEGE_OWNER | LINECALLPRIVILEGE_MONITOR,
  247. LINEMEDIAMODE_DATAMODEM, NULL );
  248. if( retcode == 0 )
  249. break;
  250. }
  251. if( retcode != 0 )
  252. return( -1 );
  253. }
  254. SetProp( hWnd, "HLINE",(HANDLE)(HLINE)hLine );
  255. // This will set up some line parameters for TAPI
  256. memset( &LineParams, 0, sizeof( LINECALLPARAMS ) ); // Make sure you clear the memory first
  257. LineParams.dwTotalSize = sizeof( LINECALLPARAMS );
  258. LineParams.dwMinRate = 9600; //This is needed for me. You may leave
  259. LineParams.dwMaxRate = 9600; // these alone or put your own values in.
  260. LineParams.dwMediaMode = LINEMEDIAMODE_DATAMODEM;
  261. retcode = lineMakeCall( hLine, &hCall, PhoneNumber, 0, &LineParams );
  262. return( retcode );
  263. }
  264. void CALLBACK LineCallBackProc(DWORD hDevice,DWORD dwMessage,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3)
  265. {   
  266.     switch (dwMessage) 
  267.         { 
  268.         case LINE_LINEDEVSTATE:
  269.             switch (dwParam1)
  270.             {
  271.              case LINEDEVSTATE_REINIT:
  272.              break;
  273.              case LINEDEVSTATE_RINGING:
  274.              break;
  275.             } 
  276.             break;
  277.         /* process state transition */
  278.         case LINE_CALLSTATE:
  279.             {
  280. switch( dwParam1 )
  281. {
  282. case LINECALLSTATE_IDLE:
  283. {
  284. LONG retcode;
  285. LINECALLINFO LineCallInfo;
  286. // This will get information about the call
  287. memset( &LineCallInfo, 0, sizeof( LINECALLINFO ) );
  288. LineCallInfo.dwTotalSize = sizeof( LINECALLINFO );
  289. lineGetCallInfo( (HCALL)hDevice, &LineCallInfo );
  290. // OK, time to dealloc the line
  291. retcode = lineDeallocateCall( (HCALL)hDevice );
  292. // Notify main window of idle state
  293. PostMessage((HWND)dwInstance, WM_COMMAND, TAPI_LINECALLSTATE_IDLE, (LPARAM)(HLINE)LineCallInfo.hLine );
  294. break;    
  295. }      
  296. case LINECALLSTATE_ACCEPTED:
  297. {
  298. SetVariableProperties( (HWND)dwInstance, hDevice );
  299. PostMessage( (HWND)dwInstance, WM_COMMAND, TAPI_LINECALLSTATE_ACCEPTED,(LPARAM)(HCALL)hDevice );
  300.   break;
  301. }
  302. case LINECALLSTATE_PROCEEDING:
  303. {
  304. SetVariableProperties( (HWND)dwInstance, hDevice );
  305. PostMessage( (HWND)dwInstance, WM_COMMAND, TAPI_LINECALLSTATE_PROCEEDING,(LPARAM)(HCALL)hDevice );
  306. break;
  307. }
  308. case LINECALLSTATE_CONNECTED:
  309. {
  310. LPVARSTRING lpVarStringStruct = NULL;
  311. size_t sizeofVarStringStruct = sizeof( VARSTRING ) + 1024;
  312. HANDLE CommFile = NULL;
  313. long lreturn;
  314. // This is how to get the comm handle from TAPI.
  315. // MAKE SURE YOU CLOSE THIS HANDLE. If you don't, TAPI keeps
  316. // the resource locked and you will not be able to make other
  317. // calls on the line.  The error result will be resource unavailable
  318. lpVarStringStruct = LocalAlloc( 0, sizeofVarStringStruct );
  319. do
  320. {
  321. memset( lpVarStringStruct, 0, sizeofVarStringStruct );
  322. lpVarStringStruct->dwTotalSize = (DWORD)sizeofVarStringStruct;
  323. lreturn = lineGetID( 0, 0, (HCALL)hDevice, LINECALLSELECT_CALL, lpVarStringStruct, "comm/datamodem" );
  324. } while( lreturn != 0 );
  325. CommFile = *( (LPHANDLE )( ( LPBYTE )lpVarStringStruct + lpVarStringStruct->dwStringOffset ) );
  326. SetProp( (HWND)dwInstance, "HCOMM", CommFile );
  327. SetVariableProperties( (HWND)dwInstance, hDevice );
  328. // Notify the main window that you are now connected.
  329. PostMessage( (HWND)dwInstance, WM_COMMAND, TAPI_LINECALLSTATE_CONNECTED, (LPARAM)(HANDLE)CommFile );
  330. LocalFree( lpVarStringStruct );
  331. break;
  332. }
  333. case LINECALLSTATE_OFFERING:
  334. {
  335. SetVariableProperties( (HWND)dwInstance, hDevice );
  336. PostMessage( (HWND)dwInstance, WM_COMMAND, TAPI_LINECALLSTATE_OFFERING, (LPARAM)(HCALL)hDevice );
  337. break;
  338. }
  339. case LINECALLSTATE_DIALTONE:
  340. {
  341. SetVariableProperties( (HWND)dwInstance, hDevice );
  342. PostMessage( (HWND)dwInstance, WM_COMMAND, TAPI_LINECALLSTATE_DIALTONE, (LPARAM)(HCALL)hDevice );
  343. break;
  344. }
  345. case LINECALLSTATE_DIALING:
  346. {
  347. SetVariableProperties( (HWND)dwInstance, hDevice );
  348. PostMessage( (HWND)dwInstance, WM_COMMAND, TAPI_LINECALLSTATE_DIALING, (LPARAM)(HCALL)hDevice );
  349. break;
  350. }
  351. case LINECALLSTATE_BUSY:
  352. {
  353. SetVariableProperties( (HWND)dwInstance, hDevice );
  354. PostMessage( (HWND)dwInstance, WM_COMMAND, TAPI_LINECALLSTATE_BUSY, 0 );
  355. break;
  356. }
  357. case LINECALLSTATE_DISCONNECTED:
  358. {
  359. SetVariableProperties( (HWND)dwInstance, hDevice );
  360. PostMessage( (HWND)dwInstance, WM_COMMAND, TAPI_LINECALLSTATE_DISCONNECTED, (LPARAM)(HCALL)hDevice );
  361. break;
  362. }
  363. }
  364.              break;
  365.             }
  366.         case LINE_CLOSE: 
  367.             {
  368.             break; 
  369.             }
  370.         /* handle the async completion of TAPI functions lineMakeCall/lineDropCall */
  371.         case LINE_REPLY:
  372. {
  373. PostMessage( (HWND)dwInstance, WM_COMMAND, TAPI_LINE_REPLY, 0 );
  374.             break;
  375. }
  376.         /* other messages that can be processed */
  377.         case LINE_REQUEST:
  378.         case LINE_ADDRESSSTATE:
  379.             break;
  380.         case LINE_CALLINFO:
  381.             break;
  382.         case LINE_DEVSPECIFIC:
  383.             break;
  384.         case LINE_DEVSPECIFICFEATURE:
  385.             break;
  386.         case LINE_GATHERDIGITS:
  387.             break;
  388.         case LINE_GENERATE:
  389.             break;
  390.         case LINE_MONITORDIGITS:
  391.             break;
  392.         case LINE_MONITORMEDIA:
  393.             break;
  394.         case LINE_MONITORTONE:
  395.             break;
  396.         } /* switch */ 
  397.         
  398. } /* LineCallBackProc */
  399. void SendStatus( HWND hDlg, LPTSTR OutputString )
  400. {
  401. DWORD dwIndex;
  402. int i;
  403. dwIndex = SendDlgItemMessage( hDlg, ID_STATUS_LIST, LB_ADDSTRING, 0, (LPARAM)(LPSTR)OutputString );
  404. if( dwIndex == LB_ERR ) // Oops no more room in listbox, delete the top 10 entries
  405. {
  406. for( i = 0; i < 10; i++ )
  407. SendDlgItemMessage( hDlg, ID_STATUS_LIST, LB_DELETESTRING, 0, 0 );
  408. // Ok, There should be room now, resubmit it 
  409. dwIndex = SendDlgItemMessage( hDlg, ID_STATUS_LIST, LB_ADDSTRING, 0, (LPARAM)(LPSTR)OutputString );
  410. }
  411. SendDlgItemMessage( hDlg, ID_STATUS_LIST, LB_SETCURSEL, (WPARAM)dwIndex, 0 );
  412. return;
  413. }
  414. void SetVariableProperties( HWND hWnd, DWORD hDevice )
  415. {
  416. LINECALLINFO LineCallInfo;
  417. memset( &LineCallInfo, 0, sizeof( LINECALLINFO ) );
  418. SetProp( hWnd, "HCALL", (HANDLE)(HCALL)hDevice );
  419. LineCallInfo.dwTotalSize = sizeof( LINECALLINFO );
  420. lineGetCallInfo( (HCALL)hDevice, &LineCallInfo );
  421.   SetProp( hWnd, "HLINE", (HANDLE)(HLINE)LineCallInfo.hLine );
  422. return;
  423. }
  424.