Sync with trunk head
[reactos.git] / dll / win32 / msi / database.c
index 7855fea..8ec2411 100644 (file)
@@ -125,20 +125,14 @@ static UINT clone_open_stream( MSIDATABASE *db, LPCWSTR name, IStream **stm )
 
 UINT db_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm )
 {
-    LPWSTR encname;
     HRESULT r;
 
-    encname = encode_streamname(FALSE, stname);
-
-    TRACE("%s -> %s\n",debugstr_w(stname),debugstr_w(encname));
+    TRACE("%s\n", debugstr_w(stname));
 
-    if (clone_open_stream( db, encname, stm ) == ERROR_SUCCESS)
-    {
-        msi_free( encname );
+    if (clone_open_stream( db, stname, stm ) == ERROR_SUCCESS)
         return ERROR_SUCCESS;
-    }
 
-    r = IStorage_OpenStream( db->storage, encname, NULL,
+    r = IStorage_OpenStream( db->storage, stname, NULL,
                              STGM_READ | STGM_SHARE_EXCLUSIVE, 0, stm );
     if( FAILED( r ) )
     {
@@ -147,15 +141,13 @@ UINT db_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm )
         LIST_FOR_EACH_ENTRY( transform, &db->transforms, MSITRANSFORM, entry )
         {
             TRACE("looking for %s in transform storage\n", debugstr_w(stname) );
-            r = IStorage_OpenStream( transform->stg, encname, NULL,
+            r = IStorage_OpenStream( transform->stg, stname, NULL,
                                      STGM_READ | STGM_SHARE_EXCLUSIVE, 0, stm );
             if (SUCCEEDED(r))
                 break;
         }
     }
 
-    msi_free( encname );
-
     if( SUCCEEDED(r) )
     {
         MSISTREAM *stream;
@@ -181,10 +173,15 @@ UINT read_raw_stream_data( MSIDATABASE *db, LPCWSTR stname,
     ULONG sz, count;
     IStream *stm = NULL;
     STATSTG stat;
+    LPWSTR encname;
+
+    encname = encode_streamname( FALSE, stname );
+    r = db_get_raw_stream( db, encname, &stm );
+    msi_free( encname );
 
-    r = db_get_raw_stream( db, stname, &stm );
     if( r != ERROR_SUCCESS)
         return ret;
+
     r = IStream_Stat(stm, &stat, STATFLAG_NONAME );
     if( FAILED( r ) )
     {
@@ -225,16 +222,6 @@ end:
     return ret;
 }
 
-void append_storage_to_db( MSIDATABASE *db, IStorage *stg )
-{
-    MSITRANSFORM *t;
-
-    t = msi_alloc( sizeof *t );
-    t->stg = stg;
-    IStorage_AddRef( stg );
-    list_add_tail( &db->transforms, &t->entry );
-}
-
 static void free_transforms( MSIDATABASE *db )
 {
     while( !list_empty( &db->transforms ) )
@@ -259,6 +246,19 @@ static void free_streams( MSIDATABASE *db )
     }
 }
 
+void append_storage_to_db( MSIDATABASE *db, IStorage *stg )
+{
+    MSITRANSFORM *t;
+
+    t = msi_alloc( sizeof *t );
+    t->stg = stg;
+    IStorage_AddRef( stg );
+    list_add_tail( &db->transforms, &t->entry );
+
+    /* the transform may add or replace streams */
+    free_streams( db );
+}
+
 static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
 {
     MSIDATABASE *db = (MSIDATABASE *) arg;