summaryrefslogtreecommitdiffstats
path: root/libmsi/libmsi-record.c
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2012-12-11 16:09:30 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2012-12-12 10:13:39 +0100
commit5993fa0bf82c58f1d071499b00e4df16a8c6d1c3 (patch)
tree78d0762dadd3b2fe6177692b308ad753bd311a5f /libmsi/libmsi-record.c
parent2c0de8513cbcad50c0cf3989ad69b44732e7c095 (diff)
downloadmsitools-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.c55
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 )