diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2012-12-10 00:01:22 +0100 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2012-12-11 11:23:19 +0100 |
commit | ae4c81e4fca5bb5816b5cbabb17a7dcc22f58a3b (patch) | |
tree | 76012c4f3d176b748961c24f96e87724804f260a /libmsi/libmsi-summary-info.c | |
parent | 0ffc9bc6e55b5e42766e68fb6cc087f6cbead6e0 (diff) | |
download | msitools-ae4c81e4fca5bb5816b5cbabb17a7dcc22f58a3b.tar.gz msitools-ae4c81e4fca5bb5816b5cbabb17a7dcc22f58a3b.tar.xz msitools-ae4c81e4fca5bb5816b5cbabb17a7dcc22f58a3b.zip |
convert to GObject
Diffstat (limited to 'libmsi/libmsi-summary-info.c')
-rw-r--r-- | libmsi/libmsi-summary-info.c | 172 |
1 files changed, 136 insertions, 36 deletions
diff --git a/libmsi/libmsi-summary-info.c b/libmsi/libmsi-summary-info.c index 3e7644e..00a10e3 100644 --- a/libmsi/libmsi-summary-info.c +++ b/libmsi/libmsi-summary-info.c @@ -22,6 +22,8 @@ #include <time.h> #include <assert.h> +#include "libmsi-summary-info.h" + #define COBJMACROS #define NONAMELESSUNION @@ -30,54 +32,127 @@ #include "libmsi.h" #include "msipriv.h" + +enum +{ + PROP_0, + + PROP_DATABASE, + PROP_UPDATE_COUNT, +}; + +G_DEFINE_TYPE (LibmsiSummaryInfo, libmsi_summary_info, G_TYPE_OBJECT); + static const WCHAR szSumInfo[] = {5 ,'S','u','m','m','a','r','y','I','n','f','o','r','m','a','t','i','o','n',0}; static const uint8_t fmtid_SummaryInformation[16] = { 0xe0, 0x85, 0x9f, 0xf2, 0xf9, 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9}; -static unsigned load_summary_info( LibmsiSummaryInfo *si, IStream *stm ); +static unsigned load_summary_info (LibmsiSummaryInfo *si, IStream *stm); -static void free_prop( LibmsiOLEVariant *prop ) +static void +libmsi_summary_info_init (LibmsiSummaryInfo *p) +{ +} + +static void +free_prop (LibmsiOLEVariant *prop) { if (prop->vt == OLEVT_LPSTR) - msi_free( prop->strval ); + msi_free (prop->strval); prop->vt = OLEVT_EMPTY; } -static void _libmsi_summary_info_destroy( LibmsiObject *arg ) +static void +libmsi_summary_info_finalize (GObject *object) { - LibmsiSummaryInfo *si = (LibmsiSummaryInfo *) arg; + LibmsiSummaryInfo *p = LIBMSI_SUMMARY_INFO (object); unsigned i; - for( i = 0; i < MSI_MAX_PROPS; i++ ) - free_prop( &si->property[i] ); - msiobj_release( &si->database->hdr ); + for (i = 0; i < MSI_MAX_PROPS; i++) + free_prop (&p->property[i]); + + if (p->database) + g_object_unref (p->database); + + G_OBJECT_CLASS (libmsi_summary_info_parent_class)->finalize (object); } -LibmsiSummaryInfo *_libmsi_get_summary_information( LibmsiDatabase *db, unsigned uiUpdateCount ) +static void +summary_info_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { - IStream *stm = NULL; - LibmsiSummaryInfo *si; - unsigned r; + g_return_if_fail (LIBMSI_IS_SUMMARY_INFO (object)); + LibmsiSummaryInfo *p = LIBMSI_SUMMARY_INFO (object); - TRACE("%p %d\n", db, uiUpdateCount ); + switch (prop_id) { + case PROP_DATABASE: + g_return_if_fail (p->database == NULL); + p->database = g_value_dup_object (value); + break; + case PROP_UPDATE_COUNT: + p->update_count = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} - si = alloc_msiobject( sizeof (LibmsiSummaryInfo), _libmsi_summary_info_destroy ); - if( !si ) - return si; +static void +summary_info_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + g_return_if_fail (LIBMSI_IS_SUMMARY_INFO (object)); + LibmsiSummaryInfo *p = LIBMSI_SUMMARY_INFO (object); - si->update_count = uiUpdateCount; - msiobj_addref( &db->hdr ); - si->database = db; + switch (prop_id) { + case PROP_DATABASE: + g_value_set_object (value, p->database); + break; + case PROP_UPDATE_COUNT: + g_value_set_uint (value, p->update_count); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +libmsi_summary_info_constructed (GObject *object) +{ + LibmsiSummaryInfo *self = LIBMSI_SUMMARY_INFO (object); + LibmsiSummaryInfo *p = self; + IStream *stm = NULL; + unsigned r; /* read the stream... if we fail, we'll start with an empty property set */ - r = msi_get_raw_stream( db, szSumInfo, &stm ); - if( r == 0 ) - { - load_summary_info( si, stm ); + r = msi_get_raw_stream (p->database, szSumInfo, &stm); + if (r == 0) { + load_summary_info (self, stm); IStream_Release( stm ); } - return si; + G_OBJECT_CLASS (libmsi_summary_info_parent_class)->constructed (object); +} + +static void +libmsi_summary_info_class_init (LibmsiSummaryInfoClass *klass) +{ + GObjectClass* object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = libmsi_summary_info_finalize; + object_class->set_property = summary_info_set_property; + object_class->get_property = summary_info_get_property; + object_class->constructed = libmsi_summary_info_constructed; + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DATABASE, + g_param_spec_object ("database", "database", "database", LIBMSI_TYPE_DATABASE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_UPDATE_COUNT, + g_param_spec_uint ("update-count", "update-count", "update-count", 0, G_MAXUINT, 0, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); } static unsigned get_type( unsigned uiProperty ) @@ -479,7 +554,18 @@ static unsigned suminfo_persist( LibmsiSummaryInfo *si ) return r; } -LibmsiResult libmsi_database_get_summary_info( LibmsiDatabase *db, +LibmsiSummaryInfo *_libmsi_get_summary_information( LibmsiDatabase *db, unsigned uiUpdateCount ) +{ + LibmsiSummaryInfo *si; + + TRACE("%p %d\n", db, uiUpdateCount ); + + si = libmsi_summary_info_new (db, uiUpdateCount, NULL); + + return si; +} + +LibmsiResult libmsi_database_get_summary_info( LibmsiDatabase *db, unsigned uiUpdateCount, LibmsiSummaryInfo **psi ) { LibmsiSummaryInfo *si; @@ -493,7 +579,7 @@ LibmsiResult libmsi_database_get_summary_info( LibmsiDatabase *db, if( !db ) return LIBMSI_RESULT_INVALID_HANDLE; - msiobj_addref( &db->hdr); + g_object_ref(db); si = _libmsi_get_summary_information( db, uiUpdateCount ); if (si) { @@ -501,7 +587,7 @@ LibmsiResult libmsi_database_get_summary_info( LibmsiDatabase *db, ret = LIBMSI_RESULT_SUCCESS; } - msiobj_release( &db->hdr ); + g_object_unref(db); return ret; } @@ -512,10 +598,10 @@ LibmsiResult libmsi_summary_info_get_property_count(LibmsiSummaryInfo *si, unsig if( !si ) return LIBMSI_RESULT_INVALID_HANDLE; - msiobj_addref( &si->hdr ); + g_object_ref(si); if( pCount ) *pCount = get_property_count( si->property ); - msiobj_release( &si->hdr ); + g_object_unref(si); return LIBMSI_RESULT_SUCCESS; } @@ -539,7 +625,7 @@ LibmsiResult libmsi_summary_info_get_property( if( !si ) return LIBMSI_RESULT_INVALID_HANDLE; - msiobj_addref( &si->hdr ); + g_object_ref(si); prop = &si->property[uiProperty]; switch( prop->vt ) @@ -584,7 +670,7 @@ LibmsiResult libmsi_summary_info_get_property( FIXME("Unknown property variant type\n"); break; } - msiobj_release( &si->hdr ); + g_object_unref(si); return ret; } @@ -601,7 +687,7 @@ static LibmsiResult _libmsi_summary_info_set_property( LibmsiSummaryInfo *si, un if( type == OLEVT_FILETIME && !pftValue ) return LIBMSI_RESULT_INVALID_PARAMETER; - msiobj_addref( &si->hdr); + g_object_ref(si); prop = &si->property[uiProperty]; @@ -639,7 +725,7 @@ static LibmsiResult _libmsi_summary_info_set_property( LibmsiSummaryInfo *si, un ret = LIBMSI_RESULT_SUCCESS; end: - msiobj_release( &si->hdr ); + g_object_unref(si); return ret; } @@ -758,7 +844,7 @@ end: if (r == LIBMSI_RESULT_SUCCESS) r = suminfo_persist( si ); - msiobj_release( &si->hdr ); + g_object_unref(si); return r; } @@ -771,8 +857,22 @@ LibmsiResult libmsi_summary_info_persist( LibmsiSummaryInfo *si ) if( !si ) return LIBMSI_RESULT_INVALID_HANDLE; - msiobj_addref( &si->hdr); + g_object_ref(si); ret = suminfo_persist( si ); - msiobj_release( &si->hdr ); + g_object_unref(si); + return ret; } + +LibmsiSummaryInfo* +libmsi_summary_info_new (LibmsiDatabase *database, unsigned update_count, GError **error) +{ + LibmsiSummaryInfo *self; + + self = g_object_new (LIBMSI_TYPE_SUMMARY_INFO, + "database", database, + "update-count", update_count, + NULL); + + return self; +} |