OLE32: test and fix StgCreateDocFile grfModes

Mike McCormack mike at codeweavers.com
Mon Jan 10 00:51:39 CST 2005


This fixes a few problems with StgCreateDocFile

Mike


ChangeLog:
* test and fix StgCreateDocFile grfModes
-------------- next part --------------
Index: dlls/ole32/storage32.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/storage32.c,v
retrieving revision 1.64
diff -u -r1.64 storage32.c
--- dlls/ole32/storage32.c	23 Dec 2004 20:20:49 -0000	1.64
+++ dlls/ole32/storage32.c	10 Jan 2005 06:49:44 -0000
@@ -5425,6 +5425,8 @@
    */
   if (ppstgOpen == 0)
     return STG_E_INVALIDPOINTER;
+  if (reserved != 0)
+    return STG_E_INVALIDPARAMETER;
 
   /*
    * Validate the STGM flags
@@ -5432,6 +5434,14 @@
   if ( FAILED( validateSTGM(grfMode) ))
     return STG_E_INVALIDFLAG;
 
+  /* StgCreateDocFile always opens for write */
+  if (!(grfMode & (STGM_WRITE|STGM_READWRITE)))
+    return STG_E_INVALIDFLAG;
+
+  /* always opens non-shared */
+  if (!(grfMode & STGM_SHARE_EXCLUSIVE))
+    return STG_E_INVALIDFLAG;
+      
   /*
    * Generate a unique name.
    */
@@ -5492,6 +5502,8 @@
 
   if (hFile == INVALID_HANDLE_VALUE)
   {
+    if(GetLastError() == ERROR_FILE_EXISTS)
+      return STG_E_FILEALREADYEXISTS;
     return E_FAIL;
   }
 
Index: dlls/ole32/tests/storage32.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/tests/storage32.c,v
retrieving revision 1.2
diff -u -r1.2 storage32.c
--- dlls/ole32/tests/storage32.c	2 Sep 2004 20:09:37 -0000	1.2
+++ dlls/ole32/tests/storage32.c	10 Jan 2005 06:49:44 -0000
@@ -66,7 +66,92 @@
     ok( refcount == 0, "ILockBytes refcount is wrong\n");
 }
 
+void test_create_storage_modes(void)
+{
+   static const WCHAR szPrefix[] = { 's','t','g',0 };
+   static const WCHAR szDot[] = { '.',0 };
+   WCHAR filename[MAX_PATH];
+   IStorage *stg = NULL;
+   HRESULT r;
+
+   if(!GetTempFileNameW(szDot, szPrefix, 0, filename))
+      return;
+
+   DeleteFileW(filename);
+
+   /* test with some invalid parameters */
+   r = StgCreateDocfile( NULL, 0, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, 0, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_CREATE, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_CREATE | STGM_READWRITE, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE |
+                                   STGM_READWRITE, 0, NULL);
+   ok(r==STG_E_INVALIDPOINTER, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE |
+                                   STGM_READWRITE, 1, &stg);
+   ok(r==STG_E_INVALIDPARAMETER, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_EXCLUSIVE | STGM_READ, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_PRIORITY, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   ok(stg == NULL, "stg was set\n");
+
+   /* check what happens if the file already exists */
+   r = StgCreateDocfile( filename, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, &stg);
+   ok(r==S_OK, "StgCreateDocfile failed\n");
+   r = IStorage_Release(stg);
+   ok(r == 0, "storage not released\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_EXCLUSIVE | STGM_READWRITE |
+                                   STGM_TRANSACTED, 0, &stg);
+   ok(r==STG_E_FILEALREADYEXISTS, "StgCreateDocfile wrong error\n");
+   r = StgCreateDocfile( filename, STGM_READ, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_EXCLUSIVE, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_DENY_WRITE, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile succeeded\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_DENY_NONE, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile failed\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_DENY_NONE | STGM_TRANSACTED, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile failed\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_DENY_NONE | STGM_READWRITE, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile failed\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_DENY_NONE | STGM_WRITE, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile failed\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_DENY_WRITE | STGM_WRITE, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile failed\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_DENY_WRITE | STGM_READ, 0, &stg);
+   ok(r==STG_E_INVALIDFLAG, "StgCreateDocfile wrong error\n");
+   ok(DeleteFileW(filename), "failed to delete file\n");
+
+   r = StgCreateDocfile( filename, STGM_SHARE_EXCLUSIVE | STGM_READWRITE |
+                                   STGM_TRANSACTED, 0, &stg);
+   ok(r==S_OK, "StgCreateDocfile failed\n");
+   r = IStorage_Release(stg);
+   ok(r == 0, "storage not released\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_EXCLUSIVE | STGM_READWRITE |
+                                   STGM_TRANSACTED |STGM_FAILIFTHERE, 0, &stg);
+   ok(r==STG_E_FILEALREADYEXISTS, "StgCreateDocfile wrong error\n");
+   r = StgCreateDocfile( filename, STGM_SHARE_EXCLUSIVE | STGM_WRITE, 0, &stg);
+   ok(r==STG_E_FILEALREADYEXISTS, "StgCreateDocfile wrong error\n");
+
+   r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE |
+                                   STGM_READWRITE |STGM_TRANSACTED, 0, &stg);
+   ok(r==S_OK, "StgCreateDocfile failed\n");
+   r = IStorage_Release(stg);
+   ok(r == 0, "storage not released\n");
+
+   ok(DeleteFileW(filename), "failed to delete file\n");
+}
+
 START_TEST(storage32)
 {
     test_hglobal_storage_stat();
+    test_create_storage_modes();
 }


More information about the wine-patches mailing list