plover/package.c
author J. Ali Harlow <ali@juiblex.co.uk>
Mon Jun 13 12:18:42 2016 +0100 (2016-06-13)
changeset 38 a29623b68ca2
parent 24 2b9f54d14cc2
child 44 43ffed8669ce
permissions -rw-r--r--
Add a testsuite and fix bugs found with it
ali@24
     1
/*
ali@24
     2
 * Copyright (C) 2010  J. Ali Harlow <ali@juiblex.co.uk>
ali@24
     3
 *
ali@24
     4
 * This program is free software; you can redistribute it and/or modify
ali@24
     5
 * it under the terms of the GNU General Public License as published by
ali@24
     6
 * the Free Software Foundation; either version 2 of the License, or
ali@24
     7
 * (at your option) any later version.
ali@24
     8
 *
ali@24
     9
 * This program is distributed in the hope that it will be useful,
ali@24
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ali@24
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ali@24
    12
 * GNU General Public License for more details.
ali@24
    13
 *
ali@24
    14
 * You should have received a copy of the GNU General Public License along
ali@24
    15
 * with this program; if not, write to the Free Software Foundation, Inc.,
ali@24
    16
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ali@24
    17
 */
ali@24
    18
ali@24
    19
#include "config.h"
ali@24
    20
#include <stdlib.h>
ali@24
    21
#include <string.h>
ali@24
    22
#include <glib-object.h>
ali@24
    23
#include <razor.h>
ali@24
    24
#include "plover/package.h"
ali@24
    25
ali@24
    26
G_DEFINE_TYPE(PloverPackage,plover_package,G_TYPE_OBJECT);
ali@24
    27
ali@24
    28
typedef struct _PloverPackagePrivate {
ali@24
    29
    struct razor_set *set;
ali@24
    30
    struct razor_package *pkg;
ali@24
    31
    const char **prefixes;
ali@24
    32
} PloverPackagePrivate;
ali@24
    33
ali@24
    34
#define PLOVER_PACKAGE_GET_PRIVATE(obj)\
ali@24
    35
				G_TYPE_INSTANCE_GET_PRIVATE(obj,\
ali@24
    36
				  PLOVER_TYPE_PACKAGE,PloverPackagePrivate)
ali@24
    37
ali@24
    38
enum {
ali@24
    39
    CHANGED=0,
ali@24
    40
    N_SIGNALS
ali@24
    41
};
ali@24
    42
ali@24
    43
static guint signals[N_SIGNALS];
ali@24
    44
ali@24
    45
static void plover_package_finalize(GObject *obj)
ali@24
    46
{
ali@24
    47
    PloverPackagePrivate *priv=PLOVER_PACKAGE_GET_PRIVATE(obj);
ali@24
    48
    g_free(priv->prefixes);
ali@38
    49
    razor_set_unref(priv->set);
ali@24
    50
    G_OBJECT_CLASS(plover_package_parent_class)->finalize(obj);
ali@24
    51
}
ali@24
    52
ali@24
    53
static void plover_package_dispose(GObject *obj)
ali@24
    54
{
ali@24
    55
    PloverPackagePrivate *priv=PLOVER_PACKAGE_GET_PRIVATE(obj);
ali@24
    56
    G_OBJECT_CLASS(plover_package_parent_class)->dispose(obj);
ali@24
    57
}
ali@24
    58
ali@24
    59
static void plover_package_class_init(PloverPackageClass *klass)
ali@24
    60
{
ali@24
    61
    GObjectClass *oclass=G_OBJECT_CLASS(klass);
ali@24
    62
    oclass->finalize=plover_package_finalize;
ali@24
    63
    oclass->dispose=plover_package_dispose;
ali@24
    64
    g_type_class_add_private(klass,sizeof(PloverPackagePrivate));
ali@24
    65
    signals[CHANGED]=g_signal_newv("changed",
ali@24
    66
      G_TYPE_FROM_CLASS(klass),G_SIGNAL_RUN_LAST,NULL,NULL,NULL,
ali@24
    67
      g_cclosure_marshal_VOID__VOID,G_TYPE_NONE,0,NULL);
ali@24
    68
}
ali@24
    69
ali@24
    70
static void plover_package_init(PloverPackage *package)
ali@24
    71
{
ali@24
    72
}
ali@24
    73
ali@24
    74
PloverPackage *plover_package_new(struct razor_set *set,
ali@24
    75
  struct razor_package *pkg)
ali@24
    76
{
ali@24
    77
    PloverPackage *package;
ali@24
    78
    PloverPackagePrivate *priv;
ali@24
    79
    package=g_object_new(PLOVER_TYPE_PACKAGE,NULL);
ali@24
    80
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@38
    81
    priv->set=razor_set_ref(set);
ali@24
    82
    priv->pkg=pkg;
ali@24
    83
    return package;
ali@24
    84
}
ali@24
    85
ali@24
    86
struct razor_set *plover_package_get_razor_set(PloverPackage *package)
ali@24
    87
{
ali@24
    88
    PloverPackagePrivate *priv;
ali@24
    89
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
    90
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
    91
    return priv->set;
ali@24
    92
}
ali@24
    93
ali@24
    94
struct razor_package *plover_package_get_razor_package(PloverPackage *package)
ali@24
    95
{
ali@24
    96
    PloverPackagePrivate *priv;
ali@24
    97
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
    98
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
    99
    return priv->pkg;
ali@24
   100
}
ali@24
   101
ali@24
   102
const char *plover_package_get_name(PloverPackage *package)
ali@24
   103
{
ali@24
   104
    PloverPackagePrivate *priv;
ali@24
   105
    const char *name=NULL;
ali@24
   106
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   107
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   108
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_NAME,&name,
ali@24
   109
      RAZOR_DETAIL_LAST);
ali@24
   110
    return name;
ali@24
   111
}
ali@24
   112
ali@24
   113
const char *plover_package_get_summary(PloverPackage *package)
ali@24
   114
{
ali@24
   115
    PloverPackagePrivate *priv;
ali@24
   116
    const char *summary=NULL;
ali@24
   117
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   118
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   119
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_SUMMARY,&summary,
ali@24
   120
      RAZOR_DETAIL_LAST);
ali@24
   121
    return summary;
ali@24
   122
}
ali@24
   123
ali@24
   124
const char *plover_package_get_version(PloverPackage *package)
ali@24
   125
{
ali@24
   126
    PloverPackagePrivate *priv;
ali@24
   127
    const char *version=NULL;
ali@24
   128
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   129
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   130
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_VERSION,&version,
ali@24
   131
      RAZOR_DETAIL_LAST);
ali@24
   132
    return version;
ali@24
   133
}
ali@24
   134
ali@24
   135
const char *plover_package_get_license(PloverPackage *package)
ali@24
   136
{
ali@24
   137
    PloverPackagePrivate *priv;
ali@24
   138
    const char *license=NULL;
ali@24
   139
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   140
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   141
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_LICENSE,&license,
ali@24
   142
      RAZOR_DETAIL_LAST);
ali@24
   143
    return license;
ali@24
   144
}
ali@24
   145
ali@24
   146
const char *plover_package_get_arch(PloverPackage *package)
ali@24
   147
{
ali@24
   148
    PloverPackagePrivate *priv;
ali@24
   149
    const char *arch=NULL;
ali@24
   150
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   151
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   152
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_ARCH,&arch,
ali@24
   153
      RAZOR_DETAIL_LAST);
ali@24
   154
    return arch;
ali@24
   155
}
ali@24
   156
ali@24
   157
const char *plover_package_get_description(PloverPackage *package)
ali@24
   158
{
ali@24
   159
    PloverPackagePrivate *priv;
ali@24
   160
    const char *description=NULL;
ali@24
   161
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   162
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   163
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_DESCRIPTION,
ali@24
   164
      &description,RAZOR_DETAIL_LAST);
ali@24
   165
    return description;
ali@24
   166
}
ali@24
   167
ali@24
   168
const char *plover_package_get_URL(PloverPackage *package)
ali@24
   169
{
ali@24
   170
    PloverPackagePrivate *priv;
ali@24
   171
    const char *URL=NULL;
ali@24
   172
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   173
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   174
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_URL,&URL,
ali@24
   175
      RAZOR_DETAIL_LAST);
ali@24
   176
    return URL;
ali@24
   177
}
ali@24
   178
ali@24
   179
/**
ali@24
   180
 * plover_package_read_icon:
ali@24
   181
 * @package: #PloverPackage to read icon from
ali@24
   182
 * @error: a #GError, or %NULL
ali@24
   183
 *
ali@24
   184
 * Opens an icon for reading. The result is a #GInputStream that
ali@24
   185
 * can be used to read the contents of the file.
ali@24
   186
 *
ali@24
   187
 * If the icon does not exist, the %G_IO_ERROR_NOT_FOUND error will be
ali@24
   188
 * returned. Other errors are possible too.
ali@24
   189
 *
ali@24
   190
 * Returns: (transfer full): #GInputStream or %NULL on error.
ali@24
   191
 *     Free the returned object with g_object_unref().
ali@24
   192
 */
ali@24
   193
GInputStream *plover_package_read_icon(PloverPackage *package,GError **error)
ali@24
   194
{
ali@24
   195
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   196
    g_set_error_literal(error,G_IO_ERROR,G_IO_ERROR_NOT_SUPPORTED,
ali@24
   197
      "Operation not supported");
ali@24
   198
    return NULL;
ali@24
   199
}
ali@24
   200
ali@24
   201
/**
ali@24
   202
 * plover_package_property_iterator_create:
ali@24
   203
 * @package: #PloverPackage to create property iterator for
ali@24
   204
 *
ali@24
   205
 * Creates a property iterator for package. The result is a
ali@24
   206
 * #struct razor_property_iterator that can be used to iterate over the
ali@24
   207
 * properties of a package.
ali@24
   208
 *
ali@24
   209
 * Returns: (transfer full): #struct razor_property_iterator or %NULL on error.
ali@24
   210
 *     Free the returned iterator with razor_property_iterator_destroy().
ali@24
   211
 */
ali@24
   212
struct razor_property_iterator *
ali@24
   213
  plover_package_property_iterator_create(PloverPackage *package)
ali@24
   214
{
ali@24
   215
    PloverPackagePrivate *priv;
ali@24
   216
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   217
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   218
    return razor_property_iterator_create(priv->set,priv->pkg);
ali@24
   219
}
ali@24
   220
ali@24
   221
/**
ali@24
   222
 * plover_package_file_iterator_create:
ali@24
   223
 * @package: #PloverPackage to create file iterator for
ali@24
   224
 * @reverse: %TRUE if the files should be iterated in reverse order
ali@24
   225
 *
ali@24
   226
 * Creates a file iterator for package. The result is a
ali@24
   227
 * #struct razor_file_iterator that can be used to iterate over the files
ali@24
   228
 * in a package.
ali@24
   229
 *
ali@24
   230
 * Returns: (transfer full): #struct razor_file_iterator or %NULL on error.
ali@24
   231
 *     Free the returned iterator with razor_file_iterator_destroy().
ali@24
   232
 */
ali@24
   233
struct razor_file_iterator *
ali@24
   234
  plover_package_file_iterator_create(PloverPackage *package,gboolean reverse)
ali@24
   235
{
ali@24
   236
    PloverPackagePrivate *priv;
ali@24
   237
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   238
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@38
   239
    g_return_val_if_fail(priv->set!=NULL,NULL);
ali@38
   240
    g_return_val_if_fail(priv->pkg!=NULL,NULL);
ali@24
   241
    return razor_file_iterator_create(priv->set,priv->pkg,reverse);
ali@24
   242
}
ali@24
   243
ali@24
   244
/**
ali@24
   245
 * plover_package_get_prefixes:
ali@24
   246
 * @package: #PloverPackage to get prefixes for
ali@24
   247
 *
ali@24
   248
 * Retrieve the prefixes for a relocatable package.
ali@24
   249
 *
ali@24
   250
 * Returns: (transfer none): NULL-terminated array of prefixes.
ali@24
   251
 */
ali@24
   252
const char *const *plover_package_get_prefixes(PloverPackage *package)
ali@24
   253
{
ali@24
   254
    const char *prefix;
ali@24
   255
    struct razor_string_iterator *si;
ali@24
   256
    GPtrArray *prefixes;
ali@24
   257
    PloverPackagePrivate *priv;
ali@24
   258
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   259
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   260
    if (!priv->prefixes)
ali@24
   261
    {
ali@24
   262
	prefixes=g_ptr_array_new();
ali@24
   263
	si=razor_install_prefix_iterator_create(priv->set,priv->pkg);
ali@24
   264
	while (razor_string_iterator_next(si,&prefix))
ali@38
   265
	    g_ptr_array_add(prefixes,(gpointer)prefix);
ali@24
   266
	razor_string_iterator_destroy(si);
ali@24
   267
	g_ptr_array_add(prefixes,NULL);
ali@38
   268
	priv->prefixes=(const char **)g_ptr_array_free(prefixes,FALSE);
ali@24
   269
    }
ali@24
   270
    return priv->prefixes;
ali@24
   271
}