summaryrefslogtreecommitdiffstats
path: root/libmsi/libmsi-summary-info.c
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2012-12-10 00:01:22 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2012-12-11 11:23:19 +0100
commitae4c81e4fca5bb5816b5cbabb17a7dcc22f58a3b (patch)
tree76012c4f3d176b748961c24f96e87724804f260a /libmsi/libmsi-summary-info.c
parent0ffc9bc6e55b5e42766e68fb6cc087f6cbead6e0 (diff)
downloadmsitools-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.c172
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;
+}