Commit in reactos/subsys/win32k/ntuser on MAIN
clipboard.c+116-481.9 -> 1.10
Patch by Pablo Borobia <pablog7@argentina.com>
Work on clipboard.

reactos/subsys/win32k/ntuser
clipboard.c 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- clipboard.c	23 May 2004 04:04:10 -0000	1.9
+++ clipboard.c	2 Jun 2004 18:29:21 -0000	1.10
@@ -29,14 +29,23 @@
 #define NDEBUG
 #include <debug.h>
 
-#if 0
+#define CHECK_LOCK                                                      \
+        if (ClipboardThread && ClipboardThread != PsGetWin32Thread())   \
+        {                                                               \
+        SetLastWin32Error(ERROR_LOCKED);                                \
+        return FALSE;                                                   \
+        }
+
 PW32THREAD ClipboardThread;
 HWND ClipboardWindow;
-#endif
+HWND tempClipboardWindow;
+HANDLE hCBData;
+UINT   uCBFormat;
 
 ULONG FASTCALL
 IntGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName)
 {
+
    return IntGetAtomName((RTL_ATOM)format, FormatName->Buffer,
       FormatName->MaximumLength);
 }
@@ -44,44 +53,33 @@
 UINT FASTCALL
 IntEnumClipboardFormats(UINT format)
 {
-   UNIMPLEMENTED;
-   return 0;
+
+   CHECK_LOCK
+
+   if (!hCBData)
+       return FALSE;
+   //UNIMPLEMENTED;
+   return 1;
 }
 
 BOOL STDCALL
 NtUserOpenClipboard(HWND hWnd, DWORD Unknown1)
 {
-#if 0
-   if (ClipboardThread && ClipboardThread != PsGetWin32Thread())
-   {
-      SetLastWin32Error(ERROR_LOCKED);
-      return FALSE;
-   }
-   ClipboardWindow = hWnd;
+   CHECK_LOCK
+
+   tempClipboardWindow = hWnd;
    ClipboardThread = PsGetWin32Thread();
    return TRUE;
-#else
-   DPRINT1("NtUserOpenClipboard is unimplemented\n");
-   return FALSE;
-#endif
 }
 
 BOOL STDCALL
 NtUserCloseClipboard(VOID)
 {
-#if 0
-   if (ClipboardThread && ClipboardThread != PsGetWin32Thread())
-   {
-      SetLastWin32Error(ERROR_LOCKED);
-      return FALSE;
-   }
+   CHECK_LOCK
+
    ClipboardWindow = 0;
    ClipboardThread = NULL;
    return TRUE;
-#else
-   UNIMPLEMENTED
-   return FALSE;
-#endif
 }
 
 /*
@@ -90,8 +88,11 @@
 HWND STDCALL
 NtUserGetOpenClipboardWindow(VOID)
 {
+   /*
    UNIMPLEMENTED
    return 0;
+   */
+   return ClipboardWindow;
 }
 
 BOOL STDCALL
@@ -111,33 +112,50 @@
 DWORD STDCALL
 NtUserEmptyClipboard(VOID)
 {
-   UNIMPLEMENTED
-   return 0;
+   CHECK_LOCK
+
+//   if (!hCBData)
+//       return FALSE;
+
+//   FIXME!
+//   GlobalUnlock(hCBData);
+//   GlobalFree(hCBData);
+   hCBData = NULL;
+   uCBFormat = 0;
+   ClipboardWindow = tempClipboardWindow;
+
+   return TRUE;
 }
 
 HANDLE STDCALL
 NtUserGetClipboardData(UINT uFormat, DWORD Unknown1)
 {
-   UNIMPLEMENTED
-   return 0;
+   CHECK_LOCK
+
+   if ((uFormat==1 && uCBFormat==13) || (uFormat==13 && uCBFormat==1))
+       uCBFormat = uFormat;
+
+   if (uFormat != uCBFormat)
+       return FALSE;
+
+   return hCBData;
 }
 
 INT STDCALL
 NtUserGetClipboardFormatName(UINT format, PUNICODE_STRING FormatName,
    INT cchMaxCount)
 {
-#if 1
   NTSTATUS Status;
   PWSTR Buf;
   UNICODE_STRING SafeFormatName, BufFormatName;
   ULONG Ret;
-  
+
   if((cchMaxCount < 1) || !FormatName)
   {
     SetLastWin32Error(ERROR_INVALID_PARAMETER);
     return 0;
   }
-  
+
   /* copy the FormatName UNICODE_STRING structure */
   Status = MmCopyFromCaller(&SafeFormatName, FormatName, sizeof(UNICODE_STRING));
   if(!NT_SUCCESS(Status))
@@ -145,7 +163,7 @@
     SetLastNtError(Status);
     return 0;
   }
-  
+
   /* Allocate memory for the string */
   Buf = ExAllocatePoolWithTag(NonPagedPool, cchMaxCount * sizeof(WCHAR), TAG_STRING);
   if(!Buf)
@@ -153,21 +171,29 @@
     SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
     return 0;
   }
-  
+
   /* Setup internal unicode string */
   BufFormatName.Length = 0;
   BufFormatName.MaximumLength = min(cchMaxCount * sizeof(WCHAR), SafeFormatName.MaximumLength);
   BufFormatName.Buffer = Buf;
-  
+
   if(BufFormatName.MaximumLength < sizeof(WCHAR))
   {
     ExFreePool(Buf);
     SetLastWin32Error(ERROR_INVALID_PARAMETER);
     return 0;
   }
-  
-  Ret = IntGetClipboardFormatName(format, &BufFormatName);
-  
+
+  if (format >= 0xC000)
+  {
+     Ret = IntGetClipboardFormatName(format, &BufFormatName);
+  }
+  else
+  {
+     SetLastNtError(NO_ERROR);
+     return 0;
+  }
+
   /* copy the UNICODE_STRING buffer back to the user */
   Status = MmCopyToCaller(SafeFormatName.Buffer, BufFormatName.Buffer, BufFormatName.MaximumLength);
   if(!NT_SUCCESS(Status))
@@ -176,10 +202,10 @@
     SetLastNtError(Status);
     return 0;
   }
-  
+
   BufFormatName.MaximumLength = SafeFormatName.MaximumLength;
   BufFormatName.Buffer = SafeFormatName.Buffer;
-  
+
   /* update the UNICODE_STRING structure (only the Length member should change) */
   Status = MmCopyToCaller(FormatName, &BufFormatName, sizeof(UNICODE_STRING));
   if(!NT_SUCCESS(Status))
@@ -188,12 +214,9 @@
     SetLastNtError(Status);
     return 0;
   }
-  
+
   ExFreePool(Buf);
   return Ret;
-#else
-   return IntGetClipboardFormatName(format, FormatName);
-#endif
 }
 
 HWND STDCALL
@@ -227,15 +250,60 @@
 BOOL STDCALL
 NtUserIsClipboardFormatAvailable(UINT format)
 {
-   DPRINT1("FIXME: NtUserIsClipboardFormatAvailable() is not implemented\n");
-   return 0;
+   //UNIMPLEMENTED
+
+   if (format != 1 && format != 13) {
+      DbgPrint("Clipboard Format unavailable (%d)\n", format);
+      return FALSE;
+   }
+
+   if ((format==1 && uCBFormat==13) || (format==13 && uCBFormat==1))
+       uCBFormat = format;
+
+   if (format != uCBFormat)
+     return FALSE;
+
+   return TRUE;
 }
 
+//SetClipboardData(CF_UNICODETEXT, hdst);
 HANDLE STDCALL
 NtUserSetClipboardData(UINT uFormat, HANDLE hMem, DWORD Unknown2)
 {
-   UNIMPLEMENTED
-   return 0;
+//    LPVOID pMem;
+    CHECK_LOCK
+
+
+   if (uFormat != 1 && uFormat != 13) {
+      DbgPrint("Clipboard unsupported format (%d)\n", uFormat);
+      return FALSE;
+   }
+
+    if (hMem)
+    {
+        uCBFormat = uFormat;
+        hCBData = hMem;
+        //pMem = GlobalLock(hMem);
+        /*
+        switch (uFormat) {
+            default:
+                DbgPrint("Clipboard unsupported format (%d)\n", uFormat);
+                return FALSE;
+            case CF_TEXT:             // 1
+                break;
+            case CF_UNICODETEXT:      // 13
+                break;
+            case CF_BITMAP:           // 2
+                break;
+            case CF_OEMTEXT:          // 7
+                break;
+        } */
+    }
+    else
+    {
+    //the window provides data in the specified format
+    }
+    return hMem;
 }
 
 HWND STDCALL
CVSspam 0.2.8