Dmitry Philippov (shedon@mail.ru): implement GetCommConfig and SetCommConfig
Modified: trunk/reactos/lib/kernel32/misc/comm.c

Modified: trunk/reactos/lib/kernel32/misc/comm.c
--- trunk/reactos/lib/kernel32/misc/comm.c	2005-06-24 18:11:16 UTC (rev 16257)
+++ trunk/reactos/lib/kernel32/misc/comm.c	2005-06-24 18:19:40 UTC (rev 16258)
@@ -1,5 +1,4 @@
-/* $Id$
- *
+/*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS system libraries
  * FILE:            lib/kernel32/misc/comm.c
@@ -8,6 +7,7 @@
  *                  modified from WINE [ Onno Hovers, (onno@stack.urc.tue.nl) ]
  *					Robert Dickenson (robd@mok.lvcom.com)
  *					Saveliy Tretiakov (saveliyt@mail.ru)
+ *					Dmitry Philippov (shedon@mail.ru)
  * UPDATE HISTORY:
  *                  Created 01/11/98
  *                  RDD (30/09/2002) implemented many function bodies to call serial driver.
@@ -15,6 +15,8 @@
  *                  ST  (21/03/2005) implemented GetCommProperties
  *                  ST  (24/03/2005) implemented ClearCommError. Corrected many functions.
  *                  ST  (05/04/2005) implemented CommConfigDialog
+ *                  DP  (11/06/2005) implemented GetCommConfig
+ *                  DP  (12/06/2005) implemented SetCommConfig
  *
  */
 
@@ -927,14 +929,64 @@
 
 
 /*
- * @unimplemented
+ * @implemented
  */
 BOOL
 STDCALL
 GetCommConfig(HANDLE hCommDev, LPCOMMCONFIG lpCC, LPDWORD lpdwSize)
 {
-	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-	return FALSE;
+	BOOL ReturnValue = FALSE;
+
+	DPRINT("GetCommConfig(%d, %p, %p)\n", hCommDev, lpCC, lpdwSize);
+
+	hProcessHeap = GetProcessHeap();
+
+	LPCOMMPROP lpComPort = RtlAllocateHeap( hProcessHeap,
+											HEAP_ZERO_MEMORY,
+											sizeof(COMMPROP) + 0x100 );
+	if(NULL == lpComPort) {
+		DPRINT("GetCommConfig() - ERROR_NOT_ENOUGH_MEMORY\n");
+		SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+		return FALSE;
+	}
+
+	if( (NULL == lpdwSize) 
+		|| (NULL == lpCC) ) {
+			DPRINT("GetCommConfig() - invalid parameter\n");
+			SetLastError(STATUS_INVALID_PARAMETER);
+			ReturnValue = FALSE;
+	}
+	else
+	{
+		lpComPort->wPacketLength = sizeof(COMMPROP) + 0x100;
+		lpComPort->dwProvSpec1 = COMMPROP_INITIALIZED;
+		ReturnValue = GetCommProperties(hCommDev, lpComPort);
+		if( ReturnValue )
+		{
+			lpCC->dwSize = sizeof(COMMCONFIG);
+			lpCC->wVersion = 1;
+			lpCC->wReserved = 0;
+			lpCC->dwProviderSubType = lpComPort->dwProvSubType;
+			lpCC->dwProviderSize = lpComPort->dwProvSpec2;
+			*lpdwSize = lpCC->dwSize+lpCC->dwProviderSize;
+			if( 0 == lpComPort->dwProvSpec2 ) {
+				lpCC->dwProviderOffset = 0;
+			} else {
+				lpCC->dwProviderOffset = (ULONG_PTR)&lpCC->wcProviderData[0] - (ULONG_PTR)lpCC;
+			}
+			if( (lpCC->dwProviderSize+lpCC->dwSize) > *lpdwSize ) {
+				DPRINT("GetCommConfig() - STATUS_BUFFER_TOO_SMALL\n");
+				SetLastError(STATUS_BUFFER_TOO_SMALL);
+				ReturnValue = FALSE;
+			} else {
+				RtlCopyMemory(lpCC->wcProviderData, lpComPort->wcProvChar, lpCC->dwProviderSize);
+				ReturnValue = GetCommState(hCommDev, &lpCC->dcb);
+			}
+		}
+	}
+
+	RtlFreeHeap(hProcessHeap, 0, lpComPort);
+	return (ReturnValue);
 }
 
 
@@ -1160,14 +1212,28 @@
 
 
 /*
- * @unimplemented
+ * @implemented
  */
 BOOL
 STDCALL
 SetCommConfig(HANDLE hCommDev, LPCOMMCONFIG lpCC, DWORD dwSize)
 {
-	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-	return FALSE;
+	BOOL ReturnValue = FALSE;
+
+	DPRINT("SetCommConfig(%d, %p, %d)\n", hCommDev, lpCC, dwSize);
+
+	if(NULL == lpCC)
+	{
+		DPRINT("SetCommConfig() - invalid parameter\n");
+		SetLastError(STATUS_INVALID_PARAMETER);
+		ReturnValue = FALSE;
+	}
+	else
+	{
+		ReturnValue = SetCommState(hCommDev, &lpCC->dcb);
+	}
+
+	return ReturnValue;
 }