00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "config.h"
00029
00030 #include <stdio.h>
00031
00032 #include "AISMerge.h"
00033 #include "AISExceptions.h"
00034 #include "Response.h"
00035
00048 Response *AISMerge::get_ais_resource(const string & res)
00049 {
00050 if (res.find("http:") == 0
00051 || res.find("file:") == 0 || res.find("https:") == 0) {
00052 return d_http.fetch_url(res);
00053 }
00054 else {
00055 FILE *s = fopen(res.c_str(), "r");
00056 if (!s)
00057 throw Error("I could not open local AIS resource '"
00058 + res + "'.");
00059 return new Response(s);
00060 }
00061 }
00062
00076 void AISMerge::merge(const string & primary, DAS & das)
00077 {
00078 if (!d_ais_db.has_resource(primary))
00079 return;
00080
00081 try {
00082 ResourceVector rv = d_ais_db.get_resource(primary);
00083
00084 for (ResourceVectorIter i = rv.begin(); i != rv.end(); ++i) {
00085 Response *ais_resource = get_ais_resource(i->get_url());
00086 switch (i->get_rule()) {
00087 case Resource::overwrite:
00088 das.parse(ais_resource->get_stream());
00089 break;
00090 case Resource::replace:
00091 das.erase();
00092 das.parse(ais_resource->get_stream());
00093 break;
00094 case Resource::fallback:
00095 if (das.get_size() == 0)
00096 das.parse(ais_resource->get_stream());
00097 break;
00098 }
00099 delete ais_resource;
00100 ais_resource = 0;
00101 }
00102 }
00103 catch (NoSuchPrimaryResource & e) {
00104 throw
00105 InternalErr(string
00106 ("I caught a 'NoSuchPrimaryResource' exception, it said:\n")
00107 + e.get_error_message() + string("\n"));
00108 }
00109 }