summaryrefslogtreecommitdiffstats
path: root/libmsi/libmsi-record.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2012-12-12 10:30:31 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2012-12-12 10:30:31 +0100
commit5599f82847186e6e7a158aa7ba6656d8daaab0db (patch)
treeb8393068f20312ef89d6de6a785d902716056081 /libmsi/libmsi-record.c
parent5e6b60c69feea5c6569af91926ba8ba5db4c17fa (diff)
parentab1e87b9aa9fd2ccee518f15c826a53aed71da1a (diff)
downloadmsitools-5599f82847186e6e7a158aa7ba6656d8daaab0db.tar.gz
msitools-5599f82847186e6e7a158aa7ba6656d8daaab0db.tar.xz
msitools-5599f82847186e6e7a158aa7ba6656d8daaab0db.zip
Merge branch 'pre-gsf'
Diffstat (limited to 'libmsi/libmsi-record.c')
-rw-r--r--libmsi/libmsi-record.c146
1 files changed, 76 insertions, 70 deletions
diff --git a/libmsi/libmsi-record.c b/libmsi/libmsi-record.c
index 87ab4ac..b472318 100644
--- a/libmsi/libmsi-record.c
+++ b/libmsi/libmsi-record.c
@@ -54,10 +54,14 @@ _libmsi_free_field (LibmsiField *field )
case LIBMSI_FIELD_TYPE_INT:
break;
case LIBMSI_FIELD_TYPE_STR:
- msi_free (field->u.szVal);
+ g_free (field->u.szVal);
+ field->u.szVal = NULL;
break;
case LIBMSI_FIELD_TYPE_STREAM:
- g_object_unref (G_OBJECT (field->u.stream));
+ if (field->u.stream) {
+ g_object_unref (G_OBJECT (field->u.stream));
+ field->u.stream = NULL;
+ }
break;
default:
ERR ("Invalid field type %d\n", field->type);
@@ -212,24 +216,24 @@ unsigned _libmsi_record_copy_field( LibmsiRecord *in_rec, unsigned in_n,
return r;
}
-int libmsi_record_get_int( const LibmsiRecord *rec, unsigned iField)
+int libmsi_record_get_int( const LibmsiRecord *rec, unsigned field)
{
int ret = 0;
- TRACE("%p %d\n", rec, iField );
+ TRACE("%p %d\n", rec, field);
if( !rec )
return LIBMSI_NULL_INT;
- if( iField > rec->count )
+ if( field > rec->count )
return LIBMSI_NULL_INT;
- switch( rec->fields[iField].type )
+ switch( rec->fields[field].type )
{
case LIBMSI_FIELD_TYPE_INT:
- return rec->fields[iField].u.iVal;
+ return rec->fields[field].u.iVal;
case LIBMSI_FIELD_TYPE_STR:
- if( expr_int_from_string( rec->fields[iField].u.szVal, &ret ) )
+ if( expr_int_from_string( rec->fields[field].u.szVal, &ret ) )
return ret;
return LIBMSI_NULL_INT;
default:
@@ -260,34 +264,34 @@ LibmsiResult libmsi_record_clear( LibmsiRecord *rec )
return LIBMSI_RESULT_SUCCESS;
}
-LibmsiResult libmsi_record_set_int( LibmsiRecord *rec, unsigned iField, int iVal )
+LibmsiResult libmsi_record_set_int( LibmsiRecord *rec, unsigned field, int iVal )
{
- TRACE("%p %u %d\n", rec, iField, iVal);
+ TRACE("%p %u %d\n", rec, field, iVal);
if( !rec )
return LIBMSI_RESULT_INVALID_HANDLE;
- if( iField > rec->count )
+ if( field > rec->count )
return LIBMSI_RESULT_INVALID_PARAMETER;
- _libmsi_free_field( &rec->fields[iField] );
- rec->fields[iField].type = LIBMSI_FIELD_TYPE_INT;
- rec->fields[iField].u.iVal = iVal;
+ _libmsi_free_field( &rec->fields[field] );
+ rec->fields[field].type = LIBMSI_FIELD_TYPE_INT;
+ rec->fields[field].u.iVal = iVal;
return LIBMSI_RESULT_SUCCESS;
}
-gboolean libmsi_record_is_null( const LibmsiRecord *rec, unsigned iField )
+gboolean libmsi_record_is_null( const LibmsiRecord *rec, unsigned field )
{
bool r = true;
- TRACE("%p %d\n", rec, iField );
+ TRACE("%p %d\n", rec, field );
if( !rec )
return 0;
- r = ( iField > rec->count ) ||
- ( rec->fields[iField].type == LIBMSI_FIELD_TYPE_NULL );
+ r = ( field > rec->count ) ||
+ ( rec->fields[field].type == LIBMSI_FIELD_TYPE_NULL );
return r;
}
@@ -313,27 +317,27 @@ gchar* libmsi_record_get_string(const LibmsiRecord *self, unsigned field)
return NULL;
}
-const char *_libmsi_record_get_string_raw( const LibmsiRecord *rec, unsigned iField )
+const char *_libmsi_record_get_string_raw( const LibmsiRecord *rec, unsigned field )
{
- if( iField > rec->count )
+ if( field > rec->count )
return NULL;
- if( rec->fields[iField].type != LIBMSI_FIELD_TYPE_STR )
+ if( rec->fields[field].type != LIBMSI_FIELD_TYPE_STR )
return NULL;
- return rec->fields[iField].u.szVal;
+ return rec->fields[field].u.szVal;
}
-unsigned _libmsi_record_get_string(const LibmsiRecord *rec, unsigned iField,
+unsigned _libmsi_record_get_string(const LibmsiRecord *rec, unsigned field,
char *szValue, unsigned *pcchValue)
{
unsigned len=0, ret;
char buffer[16];
static const char szFormat[] = "%d";
- TRACE("%p %d %p %p\n", rec, iField, szValue, pcchValue);
+ TRACE("%p %d %p %p\n", rec, field, szValue, pcchValue);
- if( iField > rec->count )
+ if( field > rec->count )
{
if ( szValue && *pcchValue > 0 )
szValue[0] = 0;
@@ -343,18 +347,18 @@ unsigned _libmsi_record_get_string(const LibmsiRecord *rec, unsigned iField,
}
ret = LIBMSI_RESULT_SUCCESS;
- switch( rec->fields[iField].type )
+ switch( rec->fields[field].type )
{
case LIBMSI_FIELD_TYPE_INT:
- sprintf(buffer, szFormat, rec->fields[iField].u.iVal);
+ sprintf(buffer, szFormat, rec->fields[field].u.iVal);
len = strlen( buffer );
if (szValue)
strcpyn(szValue, buffer, *pcchValue);
break;
case LIBMSI_FIELD_TYPE_STR:
- len = strlen( rec->fields[iField].u.szVal );
+ len = strlen( rec->fields[field].u.szVal );
if (szValue)
- strcpyn(szValue, rec->fields[iField].u.szVal, *pcchValue);
+ strcpyn(szValue, rec->fields[field].u.szVal, *pcchValue);
break;
case LIBMSI_FIELD_TYPE_NULL:
if( szValue && *pcchValue > 0 )
@@ -371,30 +375,30 @@ unsigned _libmsi_record_get_string(const LibmsiRecord *rec, unsigned iField,
return ret;
}
-LibmsiResult libmsi_record_set_string( LibmsiRecord *rec, unsigned iField, const char *szValue )
+LibmsiResult libmsi_record_set_string( LibmsiRecord *rec, unsigned field, const char *szValue )
{
char *str;
- TRACE("%d %d %s\n", rec, iField, debugstr_a(szValue));
+ TRACE("%d %d %s\n", rec, field, debugstr_a(szValue));
if( !rec )
return LIBMSI_RESULT_INVALID_HANDLE;
- if( iField > rec->count )
+ if( field > rec->count )
return LIBMSI_RESULT_INVALID_FIELD;
- _libmsi_free_field( &rec->fields[iField] );
+ _libmsi_free_field( &rec->fields[field] );
if( szValue && szValue[0] )
{
str = strdup( szValue );
- rec->fields[iField].type = LIBMSI_FIELD_TYPE_STR;
- rec->fields[iField].u.szVal = str;
+ rec->fields[field].type = LIBMSI_FIELD_TYPE_STR;
+ rec->fields[field].u.szVal = str;
}
else
{
- rec->fields[iField].type = LIBMSI_FIELD_TYPE_NULL;
- rec->fields[iField].u.szVal = NULL;
+ rec->fields[field].type = LIBMSI_FIELD_TYPE_NULL;
+ rec->fields[field].u.szVal = NULL;
}
return 0;
@@ -440,33 +444,33 @@ static unsigned _libmsi_addstream_from_file(const char *szFile, GsfInput **pstm)
return LIBMSI_RESULT_SUCCESS;
}
-unsigned _libmsi_record_load_stream(LibmsiRecord *rec, unsigned iField, GsfInput *stream)
+unsigned _libmsi_record_load_stream(LibmsiRecord *rec, unsigned field, GsfInput *stream)
{
- if ( (iField == 0) || (iField > rec->count) )
+ if ( (field == 0) || (field > rec->count) )
return LIBMSI_RESULT_INVALID_PARAMETER;
- _libmsi_free_field( &rec->fields[iField] );
- rec->fields[iField].type = LIBMSI_FIELD_TYPE_STREAM;
- rec->fields[iField].u.stream = stream;
+ _libmsi_free_field( &rec->fields[field] );
+ rec->fields[field].type = LIBMSI_FIELD_TYPE_STREAM;
+ rec->fields[field].u.stream = stream;
return LIBMSI_RESULT_SUCCESS;
}
-unsigned _libmsi_record_load_stream_from_file(LibmsiRecord *rec, unsigned iField, const char *szFilename)
+unsigned _libmsi_record_load_stream_from_file(LibmsiRecord *rec, unsigned field, const char *szFilename)
{
GsfInput *stm;
unsigned r;
- if( (iField == 0) || (iField > rec->count) )
+ if( (field == 0) || (field > rec->count) )
return LIBMSI_RESULT_INVALID_PARAMETER;
/* no filename means we should seek back to the start of the stream */
if( !szFilename )
{
- if( rec->fields[iField].type != LIBMSI_FIELD_TYPE_STREAM )
+ if( rec->fields[field].type != LIBMSI_FIELD_TYPE_STREAM )
return LIBMSI_RESULT_INVALID_FIELD;
- stm = rec->fields[iField].u.stream;
+ stm = rec->fields[field].u.stream;
if( !stm )
return LIBMSI_RESULT_INVALID_FIELD;
@@ -480,51 +484,51 @@ unsigned _libmsi_record_load_stream_from_file(LibmsiRecord *rec, unsigned iField
return r;
/* if all's good, store it in the record */
- _libmsi_record_load_stream(rec, iField, stm);
+ _libmsi_record_load_stream(rec, field, stm);
}
return LIBMSI_RESULT_SUCCESS;
}
-LibmsiResult libmsi_record_load_stream(LibmsiRecord *rec, unsigned iField, const char *szFilename)
+LibmsiResult libmsi_record_load_stream(LibmsiRecord *rec, unsigned field, const char *szFilename)
{
unsigned ret;
- TRACE("%d %d %s\n", rec, iField, debugstr_a(szFilename));
+ TRACE("%d %d %s\n", rec, field, debugstr_a(szFilename));
if( !rec )
return LIBMSI_RESULT_INVALID_HANDLE;
g_object_ref(rec);
- ret = _libmsi_record_load_stream_from_file( rec, iField, szFilename );
+ ret = _libmsi_record_load_stream_from_file( rec, field, szFilename );
g_object_unref(rec);
return ret;
}
-unsigned _libmsi_record_save_stream(const LibmsiRecord *rec, unsigned iField, char *buf, unsigned *sz)
+unsigned _libmsi_record_save_stream(const LibmsiRecord *rec, unsigned field, char *buf, unsigned *sz)
{
uint64_t left;
GsfInput *stm;
- TRACE("%p %d %p %p\n", rec, iField, buf, sz);
+ TRACE("%p %d %p %p\n", rec, field, buf, sz);
if( !sz )
return LIBMSI_RESULT_INVALID_PARAMETER;
- if( iField > rec->count)
+ if( field > rec->count)
return LIBMSI_RESULT_INVALID_PARAMETER;
- if ( rec->fields[iField].type == LIBMSI_FIELD_TYPE_NULL )
+ if ( rec->fields[field].type == LIBMSI_FIELD_TYPE_NULL )
{
*sz = 0;
return LIBMSI_RESULT_INVALID_DATA;
}
- if( rec->fields[iField].type != LIBMSI_FIELD_TYPE_STREAM )
+ if( rec->fields[field].type != LIBMSI_FIELD_TYPE_STREAM )
return LIBMSI_RESULT_INVALID_DATATYPE;
- stm = rec->fields[iField].u.stream;
+ stm = rec->fields[field].u.stream;
if( !stm )
return LIBMSI_RESULT_INVALID_PARAMETER;
@@ -551,49 +555,49 @@ unsigned _libmsi_record_save_stream(const LibmsiRecord *rec, unsigned iField, ch
return LIBMSI_RESULT_SUCCESS;
}
-LibmsiResult libmsi_record_save_stream(LibmsiRecord *rec, unsigned iField, char *buf, unsigned *sz)
+LibmsiResult libmsi_record_save_stream(LibmsiRecord *rec, unsigned field, char *buf, unsigned *sz)
{
unsigned ret;
- TRACE("%d %d %p %p\n", rec, iField, buf, sz);
+ TRACE("%d %d %p %p\n", rec, field, buf, sz);
if( !rec )
return LIBMSI_RESULT_INVALID_HANDLE;
g_object_ref(rec);
- ret = _libmsi_record_save_stream( rec, iField, buf, sz );
+ ret = _libmsi_record_save_stream( rec, field, buf, sz );
g_object_unref(rec);
return ret;
}
-unsigned _libmsi_record_set_gsf_input( LibmsiRecord *rec, unsigned iField, GsfInput *stm )
+unsigned _libmsi_record_set_gsf_input( LibmsiRecord *rec, unsigned field, GsfInput *stm )
{
- TRACE("%p %d %p\n", rec, iField, stm);
+ TRACE("%p %d %p\n", rec, field, stm);
- if( iField > rec->count )
+ if( field > rec->count )
return LIBMSI_RESULT_INVALID_FIELD;
- _libmsi_free_field( &rec->fields[iField] );
+ _libmsi_free_field( &rec->fields[field] );
- rec->fields[iField].type = LIBMSI_FIELD_TYPE_STREAM;
- rec->fields[iField].u.stream = stm;
+ rec->fields[field].type = LIBMSI_FIELD_TYPE_STREAM;
+ rec->fields[field].u.stream = stm;
g_object_ref(G_OBJECT(stm));
return LIBMSI_RESULT_SUCCESS;
}
-unsigned _libmsi_record_get_gsf_input( const LibmsiRecord *rec, unsigned iField, GsfInput **pstm)
+unsigned _libmsi_record_get_gsf_input( const LibmsiRecord *rec, unsigned field, GsfInput **pstm)
{
- TRACE("%p %d %p\n", rec, iField, pstm);
+ TRACE("%p %d %p\n", rec, field, pstm);
- if( iField > rec->count )
+ if( field > rec->count )
return LIBMSI_RESULT_INVALID_FIELD;
- if( rec->fields[iField].type != LIBMSI_FIELD_TYPE_STREAM )
+ if( rec->fields[field].type != LIBMSI_FIELD_TYPE_STREAM )
return LIBMSI_RESULT_INVALID_FIELD;
- *pstm = rec->fields[iField].u.stream;
+ *pstm = rec->fields[field].u.stream;
g_object_ref(G_OBJECT(*pstm));
return LIBMSI_RESULT_SUCCESS;
@@ -709,6 +713,8 @@ char *msi_dup_record_field( LibmsiRecord *rec, int field )
LibmsiRecord *
libmsi_record_new (guint count)
{
+ g_return_val_if_fail (count < 65535, NULL);
+
return g_object_new (LIBMSI_TYPE_RECORD,
"count", count,
NULL);