MSI: fix records according to test cases
Mike McCormack
mike at codeweavers.com
Thu Jan 6 04:26:54 CST 2005
ChangeLog:
* fix records according to test cases
-------------- next part --------------
Index: dlls/msi/record.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/record.c,v
retrieving revision 1.17
diff -u -r1.17 record.c
--- dlls/msi/record.c 27 Dec 2004 19:29:33 -0000 1.17
+++ dlls/msi/record.c 6 Jan 2005 10:25:31 -0000
@@ -77,10 +77,13 @@
TRACE("%d\n", cParams);
+ if( cParams>65535 )
+ return NULL;
+
len = sizeof (MSIRECORD) + sizeof (MSIFIELD)*cParams;
rec = alloc_msiobject( MSIHANDLETYPE_RECORD, len, MSI_CloseRecord );
if( rec )
- rec->count = cParams;
+ rec->count = cParams;
return rec;
}
@@ -111,10 +114,7 @@
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
if( !rec )
- {
- ERR("Record not found!\n");
- return 0;
- }
+ return -1;
msiobj_lock( &rec->hdr );
ret = MSI_RecordGetFieldCount( rec );
@@ -217,12 +217,12 @@
{
TRACE("%p %u %d\n", rec, iField, iVal);
- if( iField <= rec->count )
- {
- MSI_FreeField( &rec->fields[iField] );
- rec->fields[iField].type = MSIFIELD_INT;
- rec->fields[iField].u.iVal = iVal;
- }
+ if( iField > rec->count )
+ return ERROR_INVALID_PARAMETER;
+
+ MSI_FreeField( &rec->fields[iField] );
+ rec->fields[iField].type = MSIFIELD_INT;
+ rec->fields[iField].u.iVal = iVal;
return ERROR_SUCCESS;
}
@@ -266,7 +266,7 @@
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
if( !rec )
- return ERROR_INVALID_HANDLE;
+ return 0;
msiobj_lock( &rec->hdr );
ret = MSI_RecordIsNull( rec, iField );
msiobj_unlock( &rec->hdr );
@@ -299,9 +299,12 @@
NULL, 0 , NULL, NULL);
WideCharToMultiByte( CP_ACP, 0, rec->fields[iField].u.szwVal, -1,
szValue, *pcchValue, NULL, NULL);
+ if( *pcchValue && len>*pcchValue )
+ szValue[*pcchValue-1] = 0;
+ if( len )
+ len--;
break;
case MSIFIELD_NULL:
- len = 1;
if( *pcchValue > 0 )
szValue[0] = 0;
break;
@@ -404,10 +407,40 @@
return ret;
}
-UINT WINAPI MsiRecordDataSize(MSIHANDLE hRecord, unsigned int iField)
+UINT MSI_RecordDataSize(MSIRECORD *rec, unsigned int iField)
{
- FIXME("%ld %d\n", hRecord, iField);
+ TRACE("%p %d\n", rec, iField);
+
+ if( iField > rec->count )
+ return 0;
+
+ switch( rec->fields[iField].type )
+ {
+ case MSIFIELD_INT:
+ return sizeof (INT);
+ case MSIFIELD_WSTR:
+ return lstrlenW( rec->fields[iField].u.szwVal );
+ case MSIFIELD_NULL:
+ break;
+ }
return 0;
+}
+
+UINT WINAPI MsiRecordDataSize(MSIHANDLE handle, unsigned int iField)
+{
+ MSIRECORD *rec;
+ UINT ret;
+
+ TRACE("%ld %d\n", handle, iField);
+
+ rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
+ if( !rec )
+ return 0;
+ msiobj_lock( &rec->hdr );
+ ret = MSI_RecordDataSize( rec, iField);
+ msiobj_unlock( &rec->hdr );
+ msiobj_release( &rec->hdr );
+ return ret;
}
UINT MSI_RecordSetStringA( MSIRECORD *rec, unsigned int iField, LPCSTR szValue )
More information about the wine-patches
mailing list