summaryrefslogtreecommitdiffstats
path: root/libmsi
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
parent2c0de8513cbcad50c0cf3989ad69b44732e7c095 (diff)
downloadmsitools-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.c54
-rw-r--r--libmsi/libmsi-record.c55
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 )