plover/package.c
author J. Ali Harlow <ali@juiblex.co.uk>
Thu Jul 16 19:54:45 2020 +0100 (2020-07-16)
changeset 99 0121592e2512
parent 50 a4f43ad0e0c8
permissions -rw-r--r--
Fix most compiler warnings
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@44
    25
#include "plover/uri-handler.h"
ali@24
    26
ali@24
    27
G_DEFINE_TYPE(PloverPackage,plover_package,G_TYPE_OBJECT);
ali@24
    28
ali@24
    29
typedef struct _PloverPackagePrivate {
ali@24
    30
    struct razor_set *set;
ali@24
    31
    struct razor_package *pkg;
ali@24
    32
    const char **prefixes;
ali@24
    33
} PloverPackagePrivate;
ali@24
    34
ali@24
    35
#define PLOVER_PACKAGE_GET_PRIVATE(obj)\
ali@24
    36
				G_TYPE_INSTANCE_GET_PRIVATE(obj,\
ali@24
    37
				  PLOVER_TYPE_PACKAGE,PloverPackagePrivate)
ali@24
    38
ali@24
    39
enum {
ali@24
    40
    CHANGED=0,
ali@24
    41
    N_SIGNALS
ali@24
    42
};
ali@24
    43
ali@24
    44
static guint signals[N_SIGNALS];
ali@24
    45
ali@24
    46
static void plover_package_finalize(GObject *obj)
ali@24
    47
{
ali@24
    48
    PloverPackagePrivate *priv=PLOVER_PACKAGE_GET_PRIVATE(obj);
ali@24
    49
    g_free(priv->prefixes);
ali@38
    50
    razor_set_unref(priv->set);
ali@24
    51
    G_OBJECT_CLASS(plover_package_parent_class)->finalize(obj);
ali@24
    52
}
ali@24
    53
ali@24
    54
static void plover_package_dispose(GObject *obj)
ali@24
    55
{
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@50
    62
    plover__uri_handler_init();
ali@24
    63
    oclass->finalize=plover_package_finalize;
ali@24
    64
    oclass->dispose=plover_package_dispose;
ali@24
    65
    g_type_class_add_private(klass,sizeof(PloverPackagePrivate));
ali@24
    66
    signals[CHANGED]=g_signal_newv("changed",
ali@24
    67
      G_TYPE_FROM_CLASS(klass),G_SIGNAL_RUN_LAST,NULL,NULL,NULL,
ali@24
    68
      g_cclosure_marshal_VOID__VOID,G_TYPE_NONE,0,NULL);
ali@24
    69
}
ali@24
    70
ali@24
    71
static void plover_package_init(PloverPackage *package)
ali@24
    72
{
ali@24
    73
}
ali@24
    74
ali@24
    75
PloverPackage *plover_package_new(struct razor_set *set,
ali@24
    76
  struct razor_package *pkg)
ali@24
    77
{
ali@24
    78
    PloverPackage *package;
ali@24
    79
    PloverPackagePrivate *priv;
ali@24
    80
    package=g_object_new(PLOVER_TYPE_PACKAGE,NULL);
ali@24
    81
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@38
    82
    priv->set=razor_set_ref(set);
ali@24
    83
    priv->pkg=pkg;
ali@24
    84
    return package;
ali@24
    85
}
ali@24
    86
ali@24
    87
struct razor_set *plover_package_get_razor_set(PloverPackage *package)
ali@24
    88
{
ali@24
    89
    PloverPackagePrivate *priv;
ali@24
    90
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
    91
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
    92
    return priv->set;
ali@24
    93
}
ali@24
    94
ali@24
    95
struct razor_package *plover_package_get_razor_package(PloverPackage *package)
ali@24
    96
{
ali@24
    97
    PloverPackagePrivate *priv;
ali@24
    98
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
    99
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   100
    return priv->pkg;
ali@24
   101
}
ali@24
   102
ali@24
   103
const char *plover_package_get_name(PloverPackage *package)
ali@24
   104
{
ali@24
   105
    PloverPackagePrivate *priv;
ali@24
   106
    const char *name=NULL;
ali@24
   107
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   108
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   109
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_NAME,&name,
ali@24
   110
      RAZOR_DETAIL_LAST);
ali@24
   111
    return name;
ali@24
   112
}
ali@24
   113
ali@24
   114
const char *plover_package_get_summary(PloverPackage *package)
ali@24
   115
{
ali@24
   116
    PloverPackagePrivate *priv;
ali@24
   117
    const char *summary=NULL;
ali@24
   118
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   119
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   120
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_SUMMARY,&summary,
ali@24
   121
      RAZOR_DETAIL_LAST);
ali@24
   122
    return summary;
ali@24
   123
}
ali@24
   124
ali@24
   125
const char *plover_package_get_version(PloverPackage *package)
ali@24
   126
{
ali@24
   127
    PloverPackagePrivate *priv;
ali@24
   128
    const char *version=NULL;
ali@24
   129
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   130
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   131
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_VERSION,&version,
ali@24
   132
      RAZOR_DETAIL_LAST);
ali@24
   133
    return version;
ali@24
   134
}
ali@24
   135
ali@24
   136
const char *plover_package_get_license(PloverPackage *package)
ali@24
   137
{
ali@24
   138
    PloverPackagePrivate *priv;
ali@24
   139
    const char *license=NULL;
ali@24
   140
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   141
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   142
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_LICENSE,&license,
ali@24
   143
      RAZOR_DETAIL_LAST);
ali@24
   144
    return license;
ali@24
   145
}
ali@24
   146
ali@24
   147
const char *plover_package_get_arch(PloverPackage *package)
ali@24
   148
{
ali@24
   149
    PloverPackagePrivate *priv;
ali@24
   150
    const char *arch=NULL;
ali@24
   151
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   152
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   153
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_ARCH,&arch,
ali@24
   154
      RAZOR_DETAIL_LAST);
ali@24
   155
    return arch;
ali@24
   156
}
ali@24
   157
ali@24
   158
const char *plover_package_get_description(PloverPackage *package)
ali@24
   159
{
ali@24
   160
    PloverPackagePrivate *priv;
ali@24
   161
    const char *description=NULL;
ali@24
   162
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   163
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   164
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_DESCRIPTION,
ali@24
   165
      &description,RAZOR_DETAIL_LAST);
ali@24
   166
    return description;
ali@24
   167
}
ali@24
   168
ali@24
   169
const char *plover_package_get_URL(PloverPackage *package)
ali@24
   170
{
ali@24
   171
    PloverPackagePrivate *priv;
ali@24
   172
    const char *URL=NULL;
ali@24
   173
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   174
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   175
    razor_package_get_details(priv->set,priv->pkg,RAZOR_DETAIL_URL,&URL,
ali@24
   176
      RAZOR_DETAIL_LAST);
ali@24
   177
    return URL;
ali@24
   178
}
ali@24
   179
ali@24
   180
/**
ali@24
   181
 * plover_package_read_icon:
ali@24
   182
 * @package: #PloverPackage to read icon from
ali@24
   183
 * @error: a #GError, or %NULL
ali@24
   184
 *
ali@24
   185
 * Opens an icon for reading. The result is a #GInputStream that
ali@24
   186
 * can be used to read the contents of the file.
ali@24
   187
 *
ali@24
   188
 * If the icon does not exist, the %G_IO_ERROR_NOT_FOUND error will be
ali@24
   189
 * returned. Other errors are possible too.
ali@24
   190
 *
ali@24
   191
 * Returns: (transfer full): #GInputStream or %NULL on error.
ali@24
   192
 *     Free the returned object with g_object_unref().
ali@24
   193
 */
ali@24
   194
GInputStream *plover_package_read_icon(PloverPackage *package,GError **error)
ali@24
   195
{
ali@24
   196
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   197
    g_set_error_literal(error,G_IO_ERROR,G_IO_ERROR_NOT_SUPPORTED,
ali@24
   198
      "Operation not supported");
ali@24
   199
    return NULL;
ali@24
   200
}
ali@24
   201
ali@24
   202
/**
ali@24
   203
 * plover_package_property_iterator_create:
ali@24
   204
 * @package: #PloverPackage to create property iterator for
ali@24
   205
 *
ali@24
   206
 * Creates a property iterator for package. The result is a
ali@24
   207
 * #struct razor_property_iterator that can be used to iterate over the
ali@24
   208
 * properties of a package.
ali@24
   209
 *
ali@24
   210
 * Returns: (transfer full): #struct razor_property_iterator or %NULL on error.
ali@24
   211
 *     Free the returned iterator with razor_property_iterator_destroy().
ali@24
   212
 */
ali@24
   213
struct razor_property_iterator *
ali@24
   214
  plover_package_property_iterator_create(PloverPackage *package)
ali@24
   215
{
ali@24
   216
    PloverPackagePrivate *priv;
ali@24
   217
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   218
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   219
    return razor_property_iterator_create(priv->set,priv->pkg);
ali@24
   220
}
ali@24
   221
ali@24
   222
/**
ali@24
   223
 * plover_package_file_iterator_create:
ali@24
   224
 * @package: #PloverPackage to create file iterator for
ali@24
   225
 * @reverse: %TRUE if the files should be iterated in reverse order
ali@24
   226
 *
ali@24
   227
 * Creates a file iterator for package. The result is a
ali@24
   228
 * #struct razor_file_iterator that can be used to iterate over the files
ali@24
   229
 * in a package.
ali@24
   230
 *
ali@24
   231
 * Returns: (transfer full): #struct razor_file_iterator or %NULL on error.
ali@24
   232
 *     Free the returned iterator with razor_file_iterator_destroy().
ali@24
   233
 */
ali@24
   234
struct razor_file_iterator *
ali@24
   235
  plover_package_file_iterator_create(PloverPackage *package,gboolean reverse)
ali@24
   236
{
ali@24
   237
    PloverPackagePrivate *priv;
ali@24
   238
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   239
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@38
   240
    g_return_val_if_fail(priv->set!=NULL,NULL);
ali@38
   241
    g_return_val_if_fail(priv->pkg!=NULL,NULL);
ali@24
   242
    return razor_file_iterator_create(priv->set,priv->pkg,reverse);
ali@24
   243
}
ali@24
   244
ali@24
   245
/**
ali@24
   246
 * plover_package_get_prefixes:
ali@24
   247
 * @package: #PloverPackage to get prefixes for
ali@24
   248
 *
ali@24
   249
 * Retrieve the prefixes for a relocatable package.
ali@24
   250
 *
ali@24
   251
 * Returns: (transfer none): NULL-terminated array of prefixes.
ali@24
   252
 */
ali@24
   253
const char *const *plover_package_get_prefixes(PloverPackage *package)
ali@24
   254
{
ali@24
   255
    const char *prefix;
ali@24
   256
    struct razor_string_iterator *si;
ali@24
   257
    GPtrArray *prefixes;
ali@24
   258
    PloverPackagePrivate *priv;
ali@24
   259
    g_return_val_if_fail(PLOVER_IS_PACKAGE(package),NULL);
ali@24
   260
    priv=PLOVER_PACKAGE_GET_PRIVATE(package);
ali@24
   261
    if (!priv->prefixes)
ali@24
   262
    {
ali@24
   263
	prefixes=g_ptr_array_new();
ali@24
   264
	si=razor_install_prefix_iterator_create(priv->set,priv->pkg);
ali@24
   265
	while (razor_string_iterator_next(si,&prefix))
ali@38
   266
	    g_ptr_array_add(prefixes,(gpointer)prefix);
ali@24
   267
	razor_string_iterator_destroy(si);
ali@24
   268
	g_ptr_array_add(prefixes,NULL);
ali@38
   269
	priv->prefixes=(const char **)g_ptr_array_free(prefixes,FALSE);
ali@24
   270
    }
ali@24
   271
    return priv->prefixes;
ali@24
   272
}