1 /* librepo - A library providing (libcURL like) API to downloading repository
2  * Copyright (C) 2012  Tomas Mlcoch
3  *
4  * Licensed under the GNU Lesser General Public License Version 2.1
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #ifndef __LR_METALINK_H__
22 #define __LR_METALINK_H__
23 
24 #include <glib.h>
25 #include "xmlparser.h"
26 
27 G_BEGIN_DECLS
28 
29 /** \defgroup   metalink  Metalink parser
30  *  \addtogroup metalink
31  *  @{
32  */
33 
34 /** Single checksum for the metalink target file. */
35 typedef struct {
36     char *type;     /*!< Type of checksum (e.g. "md5", "sha1", "sha256", ... */
37     char *value;    /*!< Value of the checksum */
38 } LrMetalinkHash;
39 
40 /** Single metalink URL */
41 typedef struct {
42     char *protocol;     /*!< Mirror protocol "http", "ftp", "rsync", ... */
43     char *type;         /*!< Mirror type "http", "ftp", "rsync", ... */
44     char *location;     /*!< ISO 3166-1 alpha-2 code ("US", "CZ", ..) */
45     int preference;     /*!< Integer number 1-100, higher is better */
46     char *url;          /*!< URL to the target file */
47 } LrMetalinkUrl;
48 
49 /** Alternate */
50 typedef struct {
51     gint64 timestamp; /*!< File timestamp */
52     gint64 size;      /*!< File size */
53     GSList *hashes;   /*!< List of pointers to LrMetalinkHashes (could be NULL) */
54 } LrMetalinkAlternate;
55 
56 /** Metalink */
57 typedef struct {
58     char *filename;   /*!< Filename */
59     gint64 timestamp; /*!< Repo timestamp (the highest ts in the repomd.xml) */
60     gint64 size;      /*!< File size */
61     GSList *hashes;   /*!< List of pointers to LrMetalinkHashes (could be NULL) */
62     GSList *urls;     /*!< List of pointers to LrMetalinkUrls (could be NULL) */
63     GSList *alternates; /*!< List of pointers to LrMetalinkAlternates (could be NULL) */
64 } LrMetalink;
65 
66 /** Create new empty metalink object.
67  * @return              New metalink object.
68  */
69 LrMetalink *
70 lr_metalink_init(void);
71 
72 /** Parse metalink file.
73  * @param metalink          Metalink object.
74  * @param fd                File descriptor.
75  * @param filename          File to look for in metalink file.
76  * @param warningcb         ::LrXmlParserWarningCb function or NULL
77  * @param warningcb_data    Warning callback data or NULL
78  * @param err               GError **
79  * @return                  TRUE if everything is ok, FALSE if err is set.
80  */
81 gboolean
82 lr_metalink_parse_file(LrMetalink *metalink,
83                        int fd,
84                        const char *filename,
85                        LrXmlParserWarningCb warningcb,
86                        void *warningcb_data,
87                        GError **err);
88 
89 /** Free metalink object and all its content.
90  * @param metalink      Metalink object.
91  */
92 void
93 lr_metalink_free(LrMetalink *metalink);
94 
95 /** @} */
96 
97 G_END_DECLS
98 
99 #endif
100