2 * Copyright (C) 2020 J. Ali Harlow <ali@juiblex.co.uk>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include <plover/plover.h>
25 #include "pre-inst/post.h"
27 #define PLOVER_XML_NS "http://project.juiblex.co.uk/plover/ns/2009"
33 POST_STATE_INSTALL_PREFIX,
34 POST_STATE_REPOSITORY,
39 enum post_state state;
45 static void post_start_element(void *data,const char *name,const char **atts)
47 struct post_context *ctx=data;
48 if (ctx->unknown_elements)
49 ctx->unknown_elements++;
50 else if (ctx->state==POST_STATE_BEGIN &&
51 !strcmp(name,PLOVER_XML_NS "\xFF" "post"))
52 ctx->state=POST_STATE_ROOT;
53 else if (ctx->state==POST_STATE_ROOT &&
54 !strcmp(name,PLOVER_XML_NS "\xFF" "command"))
56 ctx->state=POST_STATE_ARGUMENT;
59 ctx->str=g_ptr_array_index(ctx->args,0);
60 g_string_truncate(ctx->str,0);
64 ctx->str=g_string_new(NULL);
65 g_ptr_array_add(ctx->args,ctx->str);
68 else if (ctx->state==POST_STATE_ROOT &&
69 !strcmp(name,PLOVER_XML_NS "\xFF" "argument"))
71 ctx->state=POST_STATE_ARGUMENT;
72 ctx->str=g_string_new(NULL);
73 if (ctx->args->len==0)
74 g_ptr_array_add(ctx->args,NULL);
75 g_ptr_array_add(ctx->args,ctx->str);
77 else if (ctx->state==POST_STATE_ARGUMENT)
79 if (!strcmp(name,PLOVER_XML_NS "\xFF" "install-prefix"))
80 ctx->state=POST_STATE_INSTALL_PREFIX;
81 else if (!strcmp(name,PLOVER_XML_NS "\xFF" "repository"))
82 ctx->state=POST_STATE_REPOSITORY;
84 ctx->unknown_elements++;
87 ctx->unknown_elements++;
90 static void post_end_element(void *data,const char *name)
92 struct post_context *ctx=data;
93 if (ctx->unknown_elements)
94 ctx->unknown_elements--;
98 case POST_STATE_BEGIN:
99 g_assert_not_reached();
101 case POST_STATE_ROOT:
102 ctx->state=POST_STATE_BEGIN;
104 case POST_STATE_ARGUMENT:
105 ctx->state=POST_STATE_ROOT;
107 case POST_STATE_INSTALL_PREFIX:
108 if (ctx->post->install_prefix)
109 g_string_append(ctx->str,ctx->post->install_prefix);
110 ctx->state=POST_STATE_ARGUMENT;
112 case POST_STATE_REPOSITORY:
113 if (ctx->post->repository)
114 g_string_append(ctx->str,ctx->post->repository);
115 ctx->state=POST_STATE_ARGUMENT;
120 static void post_character_data(void *data,const XML_Char *s,int len)
122 struct post_context *ctx=data;
125 case POST_STATE_ARGUMENT:
126 g_string_append_len(ctx->str,s,len);
133 struct post *pre_install_post_new(const char *repository,
134 const char *install_prefix)
137 post=g_new0(struct post,1);
138 post->repository=g_strdup(repository);
139 post->install_prefix=g_strdup(install_prefix);
143 void pre_install_post_free(struct post *post)
145 g_free(post->repository);
146 g_free(post->install_prefix);
150 gboolean pre_install_post_load_uri(struct post *post,const char *uri,
155 struct post_context ctx={0,};
156 struct razor_error *tmp_error=NULL;
160 contents=razor_uri_get_contents(uri,&length,FALSE,&tmp_error);
163 plover_propagate_razor_error(error,tmp_error);
166 parser=XML_ParserCreateNS(NULL,'\xFF');
168 ctx.state=POST_STATE_BEGIN;
169 ctx.args=g_ptr_array_new();
170 XML_SetUserData(parser,&ctx);
171 XML_SetElementHandler(parser,post_start_element,post_end_element);
172 XML_SetCharacterDataHandler(parser,post_character_data);
173 retval=XML_Parse(parser,contents,length,TRUE)!=XML_STATUS_ERROR;
175 g_set_error(error,PLOVER_GENERAL_ERROR,PLOVER_GENERAL_ERROR_FAILED,
176 "%s on line %lu of '%s'\n",
177 XML_ErrorString(XML_GetErrorCode(parser)),
178 (unsigned long)XML_GetCurrentLineNumber(parser),uri);
179 XML_ParserFree(parser);
180 razor_uri_free_contents(contents,length);
183 if (ctx.args->len>0 && !g_ptr_array_index(ctx.args,0))
184 g_warning("post: ignoring arguments because no command specified");
186 g_strfreev(post->argv);
187 if (ctx.args->len>0 && g_ptr_array_index(ctx.args,0))
189 post->argc=ctx.args->len;
190 post->argv=g_new(gchar *,post->argc+1);
191 for(i=0;i<post->argc;i++)
193 g_string_free(g_ptr_array_index(ctx.args,i),FALSE);
199 post->argv=g_new0(gchar *,1);
201 g_ptr_array_free(ctx.args,FALSE);