- Merge from trunk
[reactos.git] / dll / win32 / msi / record.c
index 45adbac..7bc8281 100644 (file)
@@ -45,6 +45,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb);
 #define MSIFIELD_INT    1
 #define MSIFIELD_WSTR   3
 #define MSIFIELD_STREAM 4
+#define MSIFIELD_INTPTR 5
 
 static void MSI_FreeField( MSIFIELD *field )
 {
@@ -52,6 +53,7 @@ static void MSI_FreeField( MSIFIELD *field )
     {
     case MSIFIELD_NULL:
     case MSIFIELD_INT:
+    case MSIFIELD_INTPTR:
         break;
     case MSIFIELD_WSTR:
         msi_free( field->u.szwVal);
@@ -177,6 +179,9 @@ UINT MSI_RecordCopyField( MSIRECORD *in_rec, UINT in_n,
         case MSIFIELD_INT:
             out->u.iVal = in->u.iVal;
             break;
+        case MSIFIELD_INTPTR:
+            out->u.pVal = in->u.pVal;
+            break;
         case MSIFIELD_WSTR:
             str = strdupW( in->u.szwVal );
             if ( !str )
@@ -200,6 +205,32 @@ UINT MSI_RecordCopyField( MSIRECORD *in_rec, UINT in_n,
     return r;
 }
 
+INT_PTR MSI_RecordGetIntPtr( MSIRECORD *rec, UINT iField )
+{
+    int ret;
+
+    TRACE( "%p %d\n", rec, iField );
+
+    if( iField > rec->count )
+        return MININT_PTR;
+
+    switch( rec->fields[iField].type )
+    {
+    case MSIFIELD_INT:
+        return rec->fields[iField].u.iVal;
+    case MSIFIELD_INTPTR:
+        return rec->fields[iField].u.pVal;
+    case MSIFIELD_WSTR:
+        if( string2intW( rec->fields[iField].u.szwVal, &ret ) )
+            return ret;
+        return MININT_PTR;
+    default:
+        break;
+    }
+
+    return MININT_PTR;
+}
+
 int MSI_RecordGetInteger( MSIRECORD *rec, UINT iField)
 {
     int ret = 0;
@@ -213,6 +244,8 @@ int MSI_RecordGetInteger( MSIRECORD *rec, UINT iField)
     {
     case MSIFIELD_INT:
         return rec->fields[iField].u.iVal;
+    case MSIFIELD_INTPTR:
+        return rec->fields[iField].u.pVal;
     case MSIFIELD_WSTR:
         if( string2intW( rec->fields[iField].u.szwVal, &ret ) )
             return ret;
@@ -267,6 +300,20 @@ UINT WINAPI MsiRecordClearData( MSIHANDLE handle )
     return ERROR_SUCCESS;
 }
 
+UINT MSI_RecordSetIntPtr( MSIRECORD *rec, UINT iField, INT_PTR pVal )
+{
+    TRACE("%p %u %ld\n", rec, iField, pVal);
+
+    if( iField > rec->count )
+        return ERROR_INVALID_PARAMETER;
+
+    MSI_FreeField( &rec->fields[iField] );
+    rec->fields[iField].type = MSIFIELD_INTPTR;
+    rec->fields[iField].u.pVal = pVal;
+
+    return ERROR_SUCCESS;
+}
+
 UINT MSI_RecordSetInteger( MSIRECORD *rec, UINT iField, int iVal )
 {
     TRACE("%p %u %d\n", rec, iField, iVal);