1 /* <!-- copyright */
2 /*
3  * libmetalink
4  *
5  * Copyright (c) 2008 Tatsuhiro Tsujikawa
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  */
25 /* copyright --> */
26 #include "metalink_pctrl.h"
27 
28 #include <string.h>
29 
new_metalink_pctrl(void)30 metalink_pctrl_t* new_metalink_pctrl(void)
31 {
32   metalink_pctrl_t* ctrl;
33   ctrl = malloc(sizeof(metalink_pctrl_t));
34   if(!ctrl) {
35     return NULL;
36   }
37   memset(ctrl, 0, sizeof(metalink_pctrl_t));
38   ctrl->metalink = metalink_new();
39   if(!ctrl->metalink) {
40     goto NEW_METALINK_PCTRL_ERROR;
41   }
42   ctrl->files = metalink_list_new();
43   if(!ctrl->files) {
44     goto NEW_METALINK_PCTRL_ERROR;
45   }
46   ctrl->languages = metalink_list_new();
47   if(!ctrl->languages) {
48     goto NEW_METALINK_PCTRL_ERROR;
49   }
50   ctrl->oses = metalink_list_new();
51   if(!ctrl->oses) {
52     goto NEW_METALINK_PCTRL_ERROR;
53   }
54   ctrl->resources = metalink_list_new();
55   if(!ctrl->resources) {
56     goto NEW_METALINK_PCTRL_ERROR;
57   }
58   ctrl->metaurls = metalink_list_new();
59   if(!ctrl->metaurls) {
60     goto NEW_METALINK_PCTRL_ERROR;
61   }
62   ctrl->checksums = metalink_list_new();
63   if(!ctrl->checksums) {
64     goto NEW_METALINK_PCTRL_ERROR;
65   }
66   ctrl->piece_hashes = metalink_list_new();
67   if(!ctrl->piece_hashes) {
68     goto NEW_METALINK_PCTRL_ERROR;
69   }
70   return ctrl;
71  NEW_METALINK_PCTRL_ERROR:
72   delete_metalink_pctrl(ctrl);
73   return NULL;
74 }
75 
delete_metalink_pctrl(metalink_pctrl_t * ctrl)76 void delete_metalink_pctrl(metalink_pctrl_t* ctrl)
77 {
78   if(!ctrl) {
79     return;
80   }
81   metalink_delete(ctrl->metalink);
82 
83   metalink_list_for_each(ctrl->files, (void (*)(void*))&metalink_file_delete);
84   metalink_list_delete(ctrl->files);
85   metalink_file_delete(ctrl->temp_file);
86 
87   /* metalink_list_delete takes care of freeing the pointers in those lists */
88   metalink_list_delete(ctrl->languages);
89   metalink_list_delete(ctrl->oses);
90 
91   metalink_list_for_each(ctrl->resources,
92 			 (void (*)(void*))&metalink_resource_delete);
93   metalink_list_delete(ctrl->resources);
94   metalink_resource_delete(ctrl->temp_resource);
95 
96   metalink_list_for_each(ctrl->metaurls,
97 			 (void (*)(void*))&metalink_metaurl_delete);
98   metalink_list_delete(ctrl->metaurls);
99   metalink_metaurl_delete(ctrl->temp_metaurl);
100 
101   metalink_list_for_each(ctrl->checksums,
102 			 (void (*)(void*))&metalink_checksum_delete);
103   metalink_list_delete(ctrl->checksums);
104   metalink_checksum_delete(ctrl->temp_checksum);
105 
106   metalink_chunk_checksum_delete(ctrl->temp_chunk_checksum);
107 
108   metalink_list_for_each(ctrl->piece_hashes,
109 			 (void (*)(void*))&metalink_piece_hash_delete);
110   metalink_list_delete(ctrl->piece_hashes);
111   metalink_piece_hash_delete(ctrl->temp_piece_hash);
112 
113   metalink_signature_delete(ctrl->temp_signature);
114 
115   free(ctrl);
116 }
117 
metalink_pctrl_detach_metalink(metalink_pctrl_t * ctrl)118 metalink_t* metalink_pctrl_detach_metalink(metalink_pctrl_t* ctrl)
119 {
120   metalink_t* metalink;
121   metalink = ctrl->metalink;
122   ctrl->metalink = NULL;
123   return metalink;
124 }
125 
metalink_pctrl_set_error(metalink_pctrl_t * ctrl,metalink_error_t error)126 void metalink_pctrl_set_error(metalink_pctrl_t* ctrl, metalink_error_t error)
127 {
128   ctrl->error = error;
129 }
130 
metalink_pctrl_get_error(metalink_pctrl_t * ctrl)131 metalink_error_t metalink_pctrl_get_error(metalink_pctrl_t* ctrl)
132 {
133   return ctrl->error;
134 }
135 
metalink_pctrl_metalink_accumulate_files(metalink_pctrl_t * ctrl)136 metalink_error_t metalink_pctrl_metalink_accumulate_files(metalink_pctrl_t* ctrl)
137 {
138   size_t files_length;
139   files_length = metalink_list_length(ctrl->files);
140   if(files_length) {
141     ctrl->metalink->files = calloc(files_length+1, sizeof(metalink_file_t*));
142     if(!ctrl->metalink->files) {
143       return METALINK_ERR_BAD_ALLOC;
144     }
145     metalink_list_to_array(ctrl->files, (void**)ctrl->metalink->files);
146     ctrl->metalink->files[files_length] = NULL;
147 
148     metalink_list_clear(ctrl->files);
149   }
150   return 0;
151 }
152 
commit_list_to_array(void *** array_ptr,metalink_list_t * src,size_t ele_size)153 static metalink_error_t commit_list_to_array(void*** array_ptr, metalink_list_t* src, size_t ele_size)
154 {
155   size_t size;
156   size = metalink_list_length(src);
157   if(size) {
158     *array_ptr = calloc(size+1, ele_size);
159     if(!*array_ptr) {
160       return METALINK_ERR_BAD_ALLOC;
161     }
162     metalink_list_to_array(src, *array_ptr);
163     (*array_ptr)[size] = NULL;
164     metalink_list_clear(src);
165   }
166   return 0;
167 }
168 
169 /* transaction functions */
metalink_pctrl_new_file_transaction(metalink_pctrl_t * ctrl)170 metalink_file_t* metalink_pctrl_new_file_transaction(metalink_pctrl_t* ctrl)
171 {
172   if(ctrl->temp_file) {
173     metalink_file_delete(ctrl->temp_file);
174   }
175   ctrl->temp_file = metalink_file_new();
176 
177   metalink_list_clear(ctrl->languages);
178   metalink_list_clear(ctrl->oses);
179 
180   metalink_list_for_each(ctrl->resources,
181 			 (void (*)(void*))&metalink_resource_delete);
182   metalink_list_clear(ctrl->resources);
183 
184   metalink_list_for_each(ctrl->metaurls,
185 			 (void (*)(void*))&metalink_metaurl_delete);
186   metalink_list_clear(ctrl->metaurls);
187 
188   metalink_list_for_each(ctrl->checksums,
189 			 (void (*)(void*))&metalink_checksum_delete);
190   metalink_list_clear(ctrl->checksums);
191 
192   return ctrl->temp_file;
193 }
194 
resource_pri_comp(const void * lhs,const void * rhs)195 static int resource_pri_comp(const void *lhs, const void *rhs)
196 {
197   return (*(const metalink_resource_t**)lhs)->priority -
198     (*(const metalink_resource_t**)rhs)->priority;
199 }
200 
metaurl_pri_comp(const void * lhs,const void * rhs)201 static int metaurl_pri_comp(const void *lhs, const void *rhs)
202 {
203   return (*(const metalink_metaurl_t**)lhs)->priority -
204     (*(const metalink_metaurl_t**)rhs)->priority;
205 }
206 
metalink_pctrl_commit_file_transaction(metalink_pctrl_t * ctrl)207 metalink_error_t metalink_pctrl_commit_file_transaction(metalink_pctrl_t* ctrl)
208 {
209   metalink_error_t r;
210   if(!ctrl->temp_file) {
211     return METALINK_ERR_NO_FILE_TRANSACTION;
212   }
213 
214   /* copy ctrl->languages to ctrl->temp_file->languages */
215   r = commit_list_to_array((void*)&ctrl->temp_file->languages,
216 			   ctrl->languages, sizeof(char*));
217   if(r != 0) {
218     return r;
219   }
220   if(ctrl->temp_file->languages) {
221     ctrl->temp_file->language = ctrl->temp_file->languages[0];
222   }
223 
224   /* copy ctrl->oses to ctrl->temp_file->oses */
225   r = commit_list_to_array((void*)&ctrl->temp_file->oses,
226 			   ctrl->oses, sizeof(char*));
227   if(r != 0) {
228     return r;
229   }
230   if(ctrl->temp_file->oses) {
231     ctrl->temp_file->os = ctrl->temp_file->oses[0];
232   }
233 
234   /* copy ctrl->resources to ctrl->temp_file->resources */
235   r = commit_list_to_array((void*)&ctrl->temp_file->resources,
236 			   ctrl->resources, sizeof(metalink_resource_t*));
237   if(r != 0) {
238     return r;
239   }
240   if(ctrl->temp_file->resources) {
241     size_t size;
242     for(size = 0; ctrl->temp_file->resources[size]; ++size);
243     /* Sort by priority */
244     qsort(ctrl->temp_file->resources, size, sizeof(metalink_resource_t*),
245           resource_pri_comp);
246   }
247 
248   /* copy ctrl->metaurls to ctrl->temp_file->metaurls */
249   r = commit_list_to_array((void*)&ctrl->temp_file->metaurls,
250 			   ctrl->metaurls, sizeof(metalink_metaurl_t*));
251   if(r != 0) {
252     return r;
253   }
254   if(ctrl->temp_file->metaurls) {
255     size_t size;
256     for(size = 0; ctrl->temp_file->metaurls[size]; ++size);
257     /* Sort by priority */
258     qsort(ctrl->temp_file->metaurls, size, sizeof(metalink_metaurl_t*),
259           metaurl_pri_comp);
260   }
261 
262   /* copy ctrl->checksums to ctrl->temp_file->checksums */
263   r = commit_list_to_array((void*)&ctrl->temp_file->checksums,
264 			   ctrl->checksums, sizeof(metalink_checksum_t*));
265   if(r != 0) {
266     return r;
267   }
268 
269   if(metalink_list_append(ctrl->files, ctrl->temp_file) != 0) {
270     return METALINK_ERR_BAD_ALLOC;
271   }
272 
273   ctrl->temp_file = NULL;
274   return 0;
275 }
276 
metalink_pctrl_new_resource_transaction(metalink_pctrl_t * ctrl)277 metalink_resource_t* metalink_pctrl_new_resource_transaction(metalink_pctrl_t* ctrl)
278 {
279   if(ctrl->temp_resource) {
280     metalink_resource_delete(ctrl->temp_resource);
281   }
282   ctrl->temp_resource = metalink_resource_new();
283   return ctrl->temp_resource;
284 }
285 
metalink_pctrl_commit_resource_transaction(metalink_pctrl_t * ctrl)286 metalink_error_t metalink_pctrl_commit_resource_transaction(metalink_pctrl_t* ctrl)
287 {
288   if(!ctrl->temp_resource) {
289     return METALINK_ERR_NO_RESOURCE_TRANSACTION;
290   }
291 
292   if(metalink_list_append(ctrl->resources, ctrl->temp_resource) != 0) {
293     return METALINK_ERR_BAD_ALLOC;
294   }
295 
296   ctrl->temp_resource = NULL;
297   return 0;
298 }
299 
metalink_pctrl_new_metaurl_transaction(metalink_pctrl_t * ctrl)300 metalink_metaurl_t* metalink_pctrl_new_metaurl_transaction(metalink_pctrl_t* ctrl)
301 {
302   if(ctrl->temp_metaurl) {
303     metalink_metaurl_delete(ctrl->temp_metaurl);
304   }
305   ctrl->temp_metaurl = metalink_metaurl_new();
306   return ctrl->temp_metaurl;
307 }
308 
metalink_pctrl_commit_metaurl_transaction(metalink_pctrl_t * ctrl)309 metalink_error_t metalink_pctrl_commit_metaurl_transaction(metalink_pctrl_t* ctrl)
310 {
311   if(!ctrl->temp_metaurl) {
312     return METALINK_ERR_NO_RESOURCE_TRANSACTION;
313   }
314 
315   if(metalink_list_append(ctrl->metaurls, ctrl->temp_metaurl) != 0) {
316     return METALINK_ERR_BAD_ALLOC;
317   }
318 
319   ctrl->temp_metaurl = NULL;
320   return 0;
321 }
322 
metalink_pctrl_new_checksum_transaction(metalink_pctrl_t * ctrl)323 metalink_checksum_t* metalink_pctrl_new_checksum_transaction(metalink_pctrl_t* ctrl)
324 {
325   if(ctrl->temp_checksum) {
326     metalink_checksum_delete(ctrl->temp_checksum);
327   }
328   ctrl->temp_checksum = metalink_checksum_new();
329   return ctrl->temp_checksum;
330 }
331 
metalink_pctrl_commit_checksum_transaction(metalink_pctrl_t * ctrl)332 metalink_error_t metalink_pctrl_commit_checksum_transaction(metalink_pctrl_t* ctrl)
333 {
334   if(!ctrl->temp_checksum) {
335     return METALINK_ERR_NO_CHECKSUM_TRANSACTION;
336   }
337 
338   if(metalink_list_append(ctrl->checksums, ctrl->temp_checksum) != 0) {
339     return METALINK_ERR_BAD_ALLOC;
340   }
341   ctrl->temp_checksum = NULL;
342   return 0;
343 }
344 
345 metalink_chunk_checksum_t*
metalink_pctrl_new_chunk_checksum_transaction(metalink_pctrl_t * ctrl)346 metalink_pctrl_new_chunk_checksum_transaction(metalink_pctrl_t* ctrl)
347 {
348   if(ctrl->temp_chunk_checksum) {
349     metalink_chunk_checksum_delete(ctrl->temp_chunk_checksum);
350   }
351 
352   ctrl->temp_chunk_checksum = metalink_chunk_checksum_new();
353   metalink_list_for_each(ctrl->piece_hashes,
354 			 (void (*)(void*))&metalink_piece_hash_delete);
355   metalink_list_clear(ctrl->piece_hashes);
356 
357   return ctrl->temp_chunk_checksum;
358 }
359 
metalink_pctrl_commit_chunk_checksum_transaction(metalink_pctrl_t * ctrl)360 metalink_error_t metalink_pctrl_commit_chunk_checksum_transaction(metalink_pctrl_t* ctrl)
361 {
362   metalink_error_t r;
363   if(!ctrl->temp_chunk_checksum) {
364     return METALINK_ERR_NO_CHUNK_CHECKSUM_TRANSACTION;
365   }
366   if(!ctrl->temp_file) {
367     return METALINK_ERR_NO_FILE_TRANSACTION;
368   }
369   r = commit_list_to_array((void*)&ctrl->temp_chunk_checksum->piece_hashes,
370 			   ctrl->piece_hashes, sizeof(metalink_piece_hash_t*));
371   if(r != 0) {
372     return r;
373   }
374   metalink_list_clear(ctrl->piece_hashes);
375   ctrl->temp_file->chunk_checksum = ctrl->temp_chunk_checksum;
376   ctrl->temp_chunk_checksum = NULL;
377   return 0;
378 }
379 
metalink_pctrl_new_piece_hash_transaction(metalink_pctrl_t * ctrl)380 metalink_piece_hash_t* metalink_pctrl_new_piece_hash_transaction(metalink_pctrl_t* ctrl)
381 {
382   if(ctrl->temp_piece_hash) {
383     metalink_piece_hash_delete(ctrl->temp_piece_hash);
384   }
385   ctrl->temp_piece_hash = metalink_piece_hash_new();
386   return ctrl->temp_piece_hash;
387 }
388 
metalink_pctrl_commit_piece_hash_transaction(metalink_pctrl_t * ctrl)389 metalink_error_t metalink_pctrl_commit_piece_hash_transaction(metalink_pctrl_t* ctrl)
390 {
391   if(!ctrl->temp_piece_hash) {
392     return METALINK_ERR_NO_PIECE_HASH_TRANSACTION;
393   }
394   if(metalink_list_append(ctrl->piece_hashes,
395 			  (void*)ctrl->temp_piece_hash) != 0) {
396     return METALINK_ERR_BAD_ALLOC;
397   }
398   ctrl->temp_piece_hash = NULL;
399   return 0;
400 }
401 
metalink_pctrl_new_signature_transaction(metalink_pctrl_t * ctrl)402 metalink_signature_t* metalink_pctrl_new_signature_transaction(metalink_pctrl_t* ctrl) {
403   if(ctrl->temp_signature) {
404     metalink_signature_delete(ctrl->temp_signature);
405   }
406   ctrl->temp_signature = metalink_signature_new();
407   return ctrl->temp_signature;
408 }
409 
metalink_pctrl_commit_signature_transaction(metalink_pctrl_t * ctrl)410 metalink_error_t metalink_pctrl_commit_signature_transaction(metalink_pctrl_t* ctrl) {
411   if(!ctrl->temp_signature) {
412     return METALINK_ERR_NO_SIGNATURE_TRANSACTION;
413   }
414   if(ctrl->temp_file->signature) {
415     metalink_signature_delete(ctrl->temp_file->signature);
416   }
417   ctrl->temp_file->signature = ctrl->temp_signature;
418   ctrl->temp_signature = NULL;
419   return 0;
420 }
421 
422 /* metalink manipulation functions */
metalink_pctrl_set_version(metalink_pctrl_t * ctrl,metalink_version_t version)423 void metalink_pctrl_set_version(metalink_pctrl_t* ctrl, metalink_version_t version)
424 {
425   metalink_set_version(ctrl->metalink, version);
426 }
427 
metalink_pctrl_add_language(metalink_pctrl_t * ctrl,const char * language)428 metalink_error_t metalink_pctrl_add_language(metalink_pctrl_t* ctrl, const char* language)
429 {
430   char *l;
431 
432   l = strdup(language);
433   if(!l || metalink_list_append(ctrl->languages, l) != 0) {
434     return METALINK_ERR_BAD_ALLOC;
435   }
436   return 0;
437 }
438 
metalink_pctrl_add_os(metalink_pctrl_t * ctrl,const char * os)439 metalink_error_t metalink_pctrl_add_os(metalink_pctrl_t* ctrl, const char* os)
440 {
441   char *o;
442 
443   o = strdup(os);
444   if(!o || metalink_list_append(ctrl->oses, o) != 0) {
445     return METALINK_ERR_BAD_ALLOC;
446   }
447   return 0;
448 }
449 
metalink_pctrl_set_identity(metalink_pctrl_t * ctrl,const char * identity)450 metalink_error_t metalink_pctrl_set_identity(metalink_pctrl_t* ctrl, const char* identity)
451 {
452   return metalink_set_identity(ctrl->metalink, identity);
453 }
454 
metalink_pctrl_set_tags(metalink_pctrl_t * ctrl,const char * tags)455 metalink_error_t metalink_pctrl_set_tags(metalink_pctrl_t* ctrl, const char* tags)
456 {
457   return metalink_set_tags(ctrl->metalink, tags);
458 }
459 
460 /* file manipulation functions*/
metalink_pctrl_file_set_language(metalink_pctrl_t * ctrl,const char * language)461 metalink_error_t metalink_pctrl_file_set_language(metalink_pctrl_t* ctrl, const char* language)
462 {
463   char *l;
464 
465   if(ctrl->languages) {
466     metalink_list_delete(ctrl->languages);
467   }
468 
469   l = strdup(language);
470   ctrl->languages = metalink_list_new();
471   if(!ctrl->languages || !l || metalink_list_append(ctrl->languages, l) != 0) {
472     return METALINK_ERR_BAD_ALLOC;
473   }
474 
475   return 0;
476 }
477 
metalink_pctrl_file_set_os(metalink_pctrl_t * ctrl,const char * os)478 metalink_error_t metalink_pctrl_file_set_os(metalink_pctrl_t* ctrl, const char* os)
479 {
480   char *o;
481 
482   if(ctrl->oses) {
483     metalink_list_delete(ctrl->oses);
484   }
485 
486   o = strdup(os);
487   ctrl->oses = metalink_list_new();
488   if(!ctrl->oses || !o || metalink_list_append(ctrl->oses, o) != 0) {
489     return METALINK_ERR_BAD_ALLOC;
490   }
491 
492   return 0;
493 }
494 
metalink_pctrl_file_set_name(metalink_pctrl_t * ctrl,const char * name)495 metalink_error_t metalink_pctrl_file_set_name(metalink_pctrl_t* ctrl, const char* name)
496 {
497   return metalink_file_set_name(ctrl->temp_file, name);
498 }
499 
metalink_pctrl_file_set_description(metalink_pctrl_t * ctrl,const char * description)500 metalink_error_t metalink_pctrl_file_set_description(metalink_pctrl_t* ctrl, const char* description)
501 {
502   return metalink_file_set_description(ctrl->temp_file, description);
503 }
504 
metalink_pctrl_file_set_copyright(metalink_pctrl_t * ctrl,const char * copyright)505 metalink_error_t metalink_pctrl_file_set_copyright(metalink_pctrl_t* ctrl, const char* copyright)
506 {
507   return metalink_file_set_copyright(ctrl->temp_file, copyright);
508 }
509 
metalink_pctrl_file_set_identity(metalink_pctrl_t * ctrl,const char * identity)510 metalink_error_t metalink_pctrl_file_set_identity(metalink_pctrl_t* ctrl, const char* identity)
511 {
512   return metalink_file_set_identity(ctrl->temp_file, identity);
513 }
514 
metalink_pctrl_file_set_logo(metalink_pctrl_t * ctrl,const char * logo)515 metalink_error_t metalink_pctrl_file_set_logo(metalink_pctrl_t* ctrl, const char* logo)
516 {
517   return metalink_file_set_logo(ctrl->temp_file, logo);
518 }
519 
metalink_pctrl_file_set_publisher_name(metalink_pctrl_t * ctrl,const char * name)520 metalink_error_t metalink_pctrl_file_set_publisher_name(metalink_pctrl_t* ctrl, const char* name)
521 {
522   return metalink_file_set_publisher_name(ctrl->temp_file, name);
523 }
524 
metalink_pctrl_file_set_publisher_url(metalink_pctrl_t * ctrl,const char * url)525 metalink_error_t metalink_pctrl_file_set_publisher_url(metalink_pctrl_t* ctrl, const char* url)
526 {
527   return metalink_file_set_publisher_url(ctrl->temp_file, url);
528 }
529 
metalink_pctrl_file_set_size(metalink_pctrl_t * ctrl,long long int size)530 void metalink_pctrl_file_set_size(metalink_pctrl_t* ctrl, long long int size)
531 {
532   metalink_file_set_size(ctrl->temp_file, size);
533 }
534 
metalink_pctrl_file_set_version(metalink_pctrl_t * ctrl,const char * version)535 metalink_error_t metalink_pctrl_file_set_version(metalink_pctrl_t* ctrl, const char* version)
536 {
537   return metalink_file_set_version(ctrl->temp_file, version);
538 }
539 
metalink_pctrl_file_set_maxconnections(metalink_pctrl_t * ctrl,int maxconnections)540 void metalink_pctrl_file_set_maxconnections(metalink_pctrl_t* ctrl, int maxconnections)
541 {
542   metalink_file_set_maxconnections(ctrl->temp_file, maxconnections);
543 }
544 
545 
546 /* resource manipulation functions */
metalink_pctrl_resource_set_type(metalink_pctrl_t * ctrl,const char * type)547 metalink_error_t metalink_pctrl_resource_set_type(metalink_pctrl_t* ctrl, const char* type)
548 {
549   return metalink_resource_set_type(ctrl->temp_resource, type);
550 }
551 
metalink_pctrl_resource_set_location(metalink_pctrl_t * ctrl,const char * location)552 metalink_error_t metalink_pctrl_resource_set_location(metalink_pctrl_t* ctrl,
553 					 const char* location)
554 {
555   return metalink_resource_set_location(ctrl->temp_resource, location);
556 }
557 
metalink_pctrl_resource_set_preference(metalink_pctrl_t * ctrl,int preference)558 void metalink_pctrl_resource_set_preference(metalink_pctrl_t* ctrl,
559 					    int preference)
560 {
561   metalink_resource_set_preference(ctrl->temp_resource, preference);
562 }
563 
metalink_pctrl_resource_set_priority(metalink_pctrl_t * ctrl,int priority)564 void metalink_pctrl_resource_set_priority(metalink_pctrl_t* ctrl,
565 					    int priority)
566 {
567   metalink_resource_set_priority(ctrl->temp_resource, priority);
568 }
569 
metalink_pctrl_resource_set_maxconnections(metalink_pctrl_t * ctrl,int maxconnections)570 void metalink_pctrl_resource_set_maxconnections(metalink_pctrl_t* ctrl,
571 						int maxconnections)
572 {
573   metalink_resource_set_maxconnections(ctrl->temp_resource, maxconnections);
574 }
575 
metalink_pctrl_resource_set_url(metalink_pctrl_t * ctrl,const char * url)576 metalink_error_t metalink_pctrl_resource_set_url(metalink_pctrl_t* ctrl, const char* url)
577 {
578   return metalink_resource_set_url(ctrl->temp_resource, url);
579 }
580 
581 /* metaurl manipulation functions */
metalink_pctrl_metaurl_set_mediatype(metalink_pctrl_t * ctrl,const char * mediatype)582 metalink_error_t metalink_pctrl_metaurl_set_mediatype(metalink_pctrl_t* ctrl,
583 						      const char* mediatype)
584 {
585   return metalink_metaurl_set_mediatype(ctrl->temp_metaurl, mediatype);
586 }
587 
metalink_pctrl_metaurl_set_name(metalink_pctrl_t * ctrl,const char * name)588 metalink_error_t metalink_pctrl_metaurl_set_name(metalink_pctrl_t* ctrl,
589 						 const char* name)
590 {
591   return metalink_metaurl_set_name(ctrl->temp_metaurl, name);
592 }
593 
metalink_pctrl_metaurl_set_priority(metalink_pctrl_t * ctrl,int priority)594 void metalink_pctrl_metaurl_set_priority(metalink_pctrl_t* ctrl,
595 					 int priority)
596 {
597   metalink_metaurl_set_priority(ctrl->temp_metaurl, priority);
598 }
599 
metalink_pctrl_metaurl_set_url(metalink_pctrl_t * ctrl,const char * url)600 metalink_error_t metalink_pctrl_metaurl_set_url(metalink_pctrl_t* ctrl,
601 						const char* url)
602 {
603   return metalink_metaurl_set_url(ctrl->temp_metaurl, url);
604 }
605 
606 /* checksum manipulation functions */
metalink_pctrl_checksum_set_type(metalink_pctrl_t * ctrl,const char * type)607 metalink_error_t metalink_pctrl_checksum_set_type(metalink_pctrl_t* ctrl, const char* type)
608 {
609   return metalink_checksum_set_type(ctrl->temp_checksum, type);
610 }
611 
metalink_pctrl_checksum_set_hash(metalink_pctrl_t * ctrl,const char * hash)612 metalink_error_t metalink_pctrl_checksum_set_hash(metalink_pctrl_t* ctrl, const char* hash)
613 {
614   return metalink_checksum_set_hash(ctrl->temp_checksum, hash);
615 }
616 
617 /* piece hash manipulation functions */
metalink_pctrl_piece_hash_set_piece(metalink_pctrl_t * ctrl,int piece)618 void metalink_pctrl_piece_hash_set_piece(metalink_pctrl_t* ctrl, int piece)
619 {
620   metalink_piece_hash_set_piece(ctrl->temp_piece_hash, piece);
621 }
622 
metalink_pctrl_piece_hash_set_hash(metalink_pctrl_t * ctrl,const char * hash)623 metalink_error_t metalink_pctrl_piece_hash_set_hash(metalink_pctrl_t* ctrl, const char* hash)
624 {
625   return metalink_piece_hash_set_hash(ctrl->temp_piece_hash, hash);
626 }
627 
628 /* chunk checksum manipulation functions */
metalink_pctrl_chunk_checksum_set_type(metalink_pctrl_t * ctrl,const char * type)629 metalink_error_t metalink_pctrl_chunk_checksum_set_type(metalink_pctrl_t* ctrl, const char* type)
630 {
631   return metalink_chunk_checksum_set_type(ctrl->temp_chunk_checksum, type);
632 }
633 
metalink_pctrl_chunk_checksum_set_length(metalink_pctrl_t * ctrl,int length)634 void metalink_pctrl_chunk_checksum_set_length(metalink_pctrl_t* ctrl, int length)
635 {
636   metalink_chunk_checksum_set_length(ctrl->temp_chunk_checksum, length);
637 }
638 
metalink_pctrl_chunk_checksum_set_piece_hashes(metalink_pctrl_t * ctrl,metalink_piece_hash_t ** piece_hashes)639 void metalink_pctrl_chunk_checksum_set_piece_hashes
640 (metalink_pctrl_t* ctrl, metalink_piece_hash_t** piece_hashes)
641 {
642   metalink_chunk_checksum_set_piece_hashes(ctrl->temp_chunk_checksum,
643 					   piece_hashes);
644 }
645 
646 /* signature manipulation functions */
metalink_pctrl_signature_set_signature(metalink_pctrl_t * ctrl,const char * signature)647 metalink_error_t metalink_pctrl_signature_set_signature(metalink_pctrl_t* ctrl, const char* signature) {
648   return metalink_signature_set_signature(ctrl->temp_signature, signature);
649 }
650 
651 /* information functions */
metalink_pctrl_set_generator(metalink_pctrl_t * ctrl,const char * generator)652 metalink_error_t metalink_pctrl_set_generator(metalink_pctrl_t* ctrl, const char* generator)
653 {
654   return metalink_set_generator(ctrl->metalink, generator);
655 }
656 
metalink_pctrl_set_origin(metalink_pctrl_t * ctrl,const char * origin)657 metalink_error_t metalink_pctrl_set_origin(metalink_pctrl_t* ctrl, const char* origin)
658 {
659   return metalink_set_origin(ctrl->metalink, origin);
660 }
661 
metalink_pctrl_set_origin_dynamic(metalink_pctrl_t * ctrl,int origin_dynamic)662 void metalink_pctrl_set_origin_dynamic(metalink_pctrl_t* ctrl,
663                                        int origin_dynamic)
664 {
665   metalink_set_origin_dynamic(ctrl->metalink, origin_dynamic);
666 }
667 
metalink_pctrl_set_published(metalink_pctrl_t * ctrl,int published)668 void metalink_pctrl_set_published(metalink_pctrl_t* ctrl, int published)
669 {
670   metalink_set_published(ctrl->metalink, published);
671 }
672 
metalink_pctrl_set_updated(metalink_pctrl_t * ctrl,int updated)673 void metalink_pctrl_set_updated(metalink_pctrl_t* ctrl, int updated)
674 {
675   metalink_set_updated(ctrl->metalink, updated);
676 }
677