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 | |
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')
-rw-r--r-- | libmsi/libmsi-database.c | 54 | ||||
-rw-r--r-- | libmsi/libmsi-record.c | 55 |
2 files changed, 27 insertions, 82 deletions
diff --git a/libmsi/libmsi-database.c b/libmsi/libmsi-database.c index 1f9edbc..dfdde15 100644 --- a/libmsi/libmsi-database.c +++ b/libmsi/libmsi-database.c @@ -1336,50 +1336,30 @@ LibmsiResult libmsi_database_import(LibmsiDatabase *db, const char *szFolder, co static unsigned msi_export_record( int fd, LibmsiRecord *row, unsigned start ) { - unsigned i, count, len, r = LIBMSI_RESULT_SUCCESS; - const char *sep; - char *buffer; - unsigned sz; + unsigned i, count; - len = 0x100; - buffer = msi_alloc( len ); - if ( !buffer ) - return LIBMSI_RESULT_OUTOFMEMORY; + count = libmsi_record_get_field_count (row); + for (i = start; i <= count; i++) { + char *str; - count = libmsi_record_get_field_count( row ); - for ( i=start; i<=count; i++ ) - { - sz = len; - r = libmsi_record_get_string( row, i, buffer, &sz ); - if (r == LIBMSI_RESULT_MORE_DATA) - { - char *p = msi_realloc( buffer, sz + 1 ); - if (!p) - break; - len = sz + 1; - buffer = p; - } - sz = len; - r = libmsi_record_get_string( row, i, buffer, &sz ); - if (r != LIBMSI_RESULT_SUCCESS) - break; + str = libmsi_record_get_string (row, i); + if (!str) + return LIBMSI_RESULT_FUNCTION_FAILED; /* TODO full_write */ - if (write( fd, buffer, sz ) != sz) - { - r = LIBMSI_RESULT_FUNCTION_FAILED; - break; + if (write (fd, str, strlen (str)) != strlen (str)) { + g_free (str); + return LIBMSI_RESULT_FUNCTION_FAILED; } - sep = (i < count) ? "\t" : "\r\n"; - if (write( fd, sep, strlen(sep) ) != strlen(sep)) - { - r = LIBMSI_RESULT_FUNCTION_FAILED; - break; - } + g_free (str); + + const char *sep = (i < count) ? "\t" : "\r\n"; + if (write (fd, sep, strlen (sep)) != strlen (sep)) + return LIBMSI_RESULT_FUNCTION_FAILED; } - msi_free( buffer ); - return r; + + return LIBMSI_RESULT_SUCCESS; } static unsigned msi_export_row( LibmsiRecord *row, void *arg ) 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 ) |