diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2012-12-11 16:09:30 +0100 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2012-12-12 10:13:39 +0100 |
commit | 5993fa0bf82c58f1d071499b00e4df16a8c6d1c3 (patch) | |
tree | 78d0762dadd3b2fe6177692b308ad753bd311a5f /libmsi/libmsi-record.c | |
parent | 2c0de8513cbcad50c0cf3989ad69b44732e7c095 (diff) | |
download | msitools-5993fa0bf82c58f1d071499b00e4df16a8c6d1c3.tar.gz msitools-5993fa0bf82c58f1d071499b00e4df16a8c6d1c3.tar.xz msitools-5993fa0bf82c58f1d071499b00e4df16a8c6d1c3.zip |
Make libmsi_record_get_string() return allocated
Diffstat (limited to 'libmsi/libmsi-record.c')
-rw-r--r-- | libmsi/libmsi-record.c | 55 |
1 files changed, 10 insertions, 45 deletions
diff --git a/libmsi/libmsi-record.c b/libmsi/libmsi-record.c index 4d06a8a..e436777 100644 --- a/libmsi/libmsi-record.c +++ b/libmsi/libmsi-record.c @@ -305,60 +305,25 @@ gboolean libmsi_record_is_null( const LibmsiRecord *rec, unsigned iField ) return r; } -LibmsiResult libmsi_record_get_string(const LibmsiRecord *rec, unsigned iField, - char *szValue, unsigned *pcchValue) +gchar* libmsi_record_get_string(const LibmsiRecord *self, unsigned field) { - unsigned len=0, ret; - char buffer[16]; + g_return_val_if_fail (LIBMSI_IS_RECORD (self), NULL); - TRACE("%p %d %p %p\n", rec, iField, szValue, pcchValue); + TRACE ("%p %d\n", self, field); - if( !rec ) - return LIBMSI_RESULT_INVALID_HANDLE; + if (field > self->count) + return g_strdup (""); // FIXME: really? - if( iField > rec->count ) - { - if ( szValue && *pcchValue > 0 ) - szValue[0] = 0; - - *pcchValue = 0; - return LIBMSI_RESULT_SUCCESS; - } - - ret = LIBMSI_RESULT_SUCCESS; - switch( rec->fields[iField].type ) - { + switch (self->fields[field].type) { case LIBMSI_FIELD_TYPE_INT: - wsprintfA(buffer, "%d", rec->fields[iField].u.iVal); - len = strlen( buffer ); - if (szValue) - strcpynA(szValue, buffer, *pcchValue); - break; + return g_strdup_printf ("%d", self->fields[field].u.iVal); case LIBMSI_FIELD_TYPE_WSTR: - len = WideCharToMultiByte( CP_ACP, 0, rec->fields[iField].u.szwVal, -1, - NULL, 0 , NULL, NULL); - if (szValue) - WideCharToMultiByte( CP_ACP, 0, rec->fields[iField].u.szwVal, -1, - szValue, *pcchValue, NULL, NULL); - if( szValue && *pcchValue && len>*pcchValue ) - szValue[*pcchValue-1] = 0; - if( len ) - len--; - break; + return strdupWtoA (self->fields[field].u.szwVal); case LIBMSI_FIELD_TYPE_NULL: - if( szValue && *pcchValue > 0 ) - szValue[0] = 0; - break; - default: - ret = LIBMSI_RESULT_INVALID_PARAMETER; - break; + return g_strdup (""); } - if( szValue && *pcchValue <= len ) - ret = LIBMSI_RESULT_MORE_DATA; - *pcchValue = len; - - return ret; + return NULL; } const WCHAR *_libmsi_record_get_string_raw( const LibmsiRecord *rec, unsigned iField ) |