diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2012-12-12 10:30:31 +0100 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2012-12-12 10:30:31 +0100 |
commit | 5599f82847186e6e7a158aa7ba6656d8daaab0db (patch) | |
tree | b8393068f20312ef89d6de6a785d902716056081 /libmsi/libmsi-record.c | |
parent | 5e6b60c69feea5c6569af91926ba8ba5db4c17fa (diff) | |
parent | ab1e87b9aa9fd2ccee518f15c826a53aed71da1a (diff) | |
download | msitools-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.c | 146 |
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); |