summaryrefslogtreecommitdiffstats
path: root/libmsi/libmsi-summary-info.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2012-12-11 11:35:57 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2012-12-11 11:38:05 +0100
commitcb4d4b7214170989fbce773bcf2dc0ca0581f4af (patch)
tree43cad405aa6ae7bb8064f1be47cad94dc255ba5c /libmsi/libmsi-summary-info.c
parent4a33d8ff9f1e0593bd49922cd46aa3e6a7aa1273 (diff)
parentae4c81e4fca5bb5816b5cbabb17a7dcc22f58a3b (diff)
downloadmsitools-cb4d4b7214170989fbce773bcf2dc0ca0581f4af.tar.gz
msitools-cb4d4b7214170989fbce773bcf2dc0ca0581f4af.tar.xz
msitools-cb4d4b7214170989fbce773bcf2dc0ca0581f4af.zip
Merge branch 'pre-gsf'
Conflicts: libmsi/Makefile.am libmsi/handle.c libmsi/libmsi-database.c libmsi/libmsi-query.c libmsi/libmsi-record.c libmsi/libmsi-summary-info.c libmsi/msipriv.h
Diffstat (limited to 'libmsi/libmsi-summary-info.c')
-rw-r--r--libmsi/libmsi-summary-info.c174
1 files changed, 138 insertions, 36 deletions
diff --git a/libmsi/libmsi-summary-info.c b/libmsi/libmsi-summary-info.c
index c18f1e8..fafa9e8 100644
--- a/libmsi/libmsi-summary-info.c
+++ b/libmsi/libmsi-summary-info.c
@@ -22,58 +22,133 @@
#include <time.h>
#include <assert.h>
+#include "libmsi-summary-info.h"
+
#include "debug.h"
#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 char szSumInfo[] = "\5SummaryInformation";
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, GsfInput *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)
{
- GsfInput *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);
+
+ 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;
+ }
+}
- si->update_count = uiUpdateCount;
- msiobj_addref( &db->hdr );
- si->database = db;
+static void
+libmsi_summary_info_constructed (GObject *object)
+{
+ LibmsiSummaryInfo *self = LIBMSI_SUMMARY_INFO (object);
+ LibmsiSummaryInfo *p = self;
+ GsfInput *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 );
- g_object_unref(G_OBJECT(stm));
+ r = msi_get_raw_stream (p->database, szSumInfo, &stm);
+ if (r == 0) {
+ load_summary_info (self, stm);
+ g_object_unref (G_OBJECT (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 )
@@ -466,7 +541,20 @@ 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 )
+{
+ GsfInput *stm = NULL;
+ LibmsiSummaryInfo *si;
+ unsigned r;
+
+ 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;
@@ -480,7 +568,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)
{
@@ -488,7 +576,7 @@ LibmsiResult libmsi_database_get_summary_info( LibmsiDatabase *db,
ret = LIBMSI_RESULT_SUCCESS;
}
- msiobj_release( &db->hdr );
+ g_object_unref(db);
return ret;
}
@@ -499,10 +587,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;
}
@@ -526,7 +614,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 )
@@ -571,7 +659,7 @@ LibmsiResult libmsi_summary_info_get_property(
FIXME("Unknown property variant type\n");
break;
}
- msiobj_release( &si->hdr );
+ g_object_unref(si);
return ret;
}
@@ -588,7 +676,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];
@@ -626,7 +714,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;
}
@@ -745,7 +833,7 @@ end:
if (r == LIBMSI_RESULT_SUCCESS)
r = suminfo_persist( si );
- msiobj_release( &si->hdr );
+ g_object_unref(si);
return r;
}
@@ -758,8 +846,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;
+}