YUMPatchParser.cc

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00013 #include <zypp/parser/yum/YUMPatchParser.h>
00014 #include <zypp/parser/yum/YUMPrimaryParser.h>
00015 #include <istream>
00016 #include <string>
00017 #include "zypp/parser/xml_parser_assert.h"
00018 #include <libxml/xmlreader.h>
00019 #include <libxml/tree.h>
00020 #include <zypp/parser/LibXMLHelper.h>
00021 #include <zypp/base/Logger.h>
00022 #include <zypp/parser/yum/schemanames.h>
00023 #include <zypp/ZYppFactory.h>
00024 
00025 using namespace std;
00026 namespace zypp
00027 {
00028 namespace parser
00029 {
00030 namespace yum
00031 {
00032 
00033 YUMPatchParser::~YUMPatchParser()
00034 { }
00035 
00036 YUMPatchParser::YUMPatchParser(std::istream &is, const std::string& baseUrl, parser::ParserProgress::Ptr progress )
00037     : XMLNodeIterator<YUMPatchData_Ptr>(is, baseUrl,PATCHSCHEMA, progress)
00038     , _zypp_architecture( getZYpp()->architecture() )
00039 {
00040   fetchNext();
00041 }
00042 
00043 YUMPatchParser::YUMPatchParser()
00044     : _zypp_architecture( getZYpp()->architecture() )
00045 { }
00046 
00047 YUMPatchParser::YUMPatchParser(YUMPatchData_Ptr& entry)
00048     : XMLNodeIterator<YUMPatchData_Ptr>(entry)
00049     , _zypp_architecture( getZYpp()->architecture() )
00050 { }
00051 
00052 
00053 // select for which elements process() will be called
00054 bool
00055 YUMPatchParser::isInterested(const xmlNodePtr nodePtr)
00056 {
00057   return _helper.isElement(nodePtr) && _helper.name(nodePtr) == "patch";
00058 }
00059 
00060 // do the actual processing
00061 YUMPatchData_Ptr
00062 YUMPatchParser::process(const xmlTextReaderPtr reader)
00063 {
00064   xml_assert(reader);
00065   YUMPatchData_Ptr patchPtr = new YUMPatchData;
00066   xmlNodePtr dataNode = xmlTextReaderExpand(reader);
00067   xml_assert(dataNode);
00068   patchPtr->timestamp = _helper.attribute(dataNode,"timestamp");
00069   patchPtr->patchId = _helper.attribute(dataNode,"patchid");
00070   patchPtr->engine = _helper.attribute(dataNode,"engine");
00071 
00072   // default values for optional entries
00073   patchPtr->rebootNeeded = false;
00074   patchPtr->packageManager = false;
00075 
00076   // FIXME move the respective method to a common class, inherit it
00077   YUMPrimaryParser prim;
00078 
00079   for (xmlNodePtr child = dataNode->children;
00080        child && child != dataNode;
00081        child = child->next)
00082   {
00083     if (_helper.isElement(child))
00084     {
00085       string name = _helper.name(child);
00086       if (name == "name")
00087       {
00088         patchPtr->name = _helper.content(child);
00089       }
00090       else if (name == "arch")
00091       {
00092         patchPtr->arch = _helper.content(child);
00093         try
00094         {
00095           if (!Arch(patchPtr->arch).compatibleWith( _zypp_architecture ))
00096           {
00097             patchPtr = NULL;                    // skip <patch>, incompatible architecture
00098             break;
00099           }
00100         }
00101         catch ( const Exception & excpt_r )
00102         {
00103           ZYPP_CAUGHT( excpt_r );
00104           DBG << "Skipping malformed " << patchPtr->arch << endl;
00105           patchPtr = NULL;
00106           break;
00107         }
00108       }
00109       else if (name == "summary")
00110       {
00111         patchPtr->summary.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00112       }
00113       else if (name == "description")
00114       {
00115         patchPtr->description.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00116       }
00117       else if (name == "license-to-confirm")
00118       {
00119         patchPtr->license_to_confirm.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00120       }
00121       else if (name == "version")
00122       {
00123         patchPtr->epoch = _helper.attribute(child,"epoch");
00124         patchPtr->ver = _helper.attribute(child,"ver");
00125         patchPtr->rel = _helper.attribute(child,"rel");
00126       }
00127       else if (name == "provides")
00128       {
00129         prim.parseDependencyEntries(& patchPtr->provides, child);
00130       }
00131       else if (name == "conflicts")
00132       {
00133         prim.parseDependencyEntries(& patchPtr->conflicts, child);
00134       }
00135       else if (name == "obsoletes")
00136       {
00137         prim.parseDependencyEntries(& patchPtr->obsoletes, child);
00138       }
00139       else if (name == "prerequires")
00140       {
00141         prim.parseDependencyEntries(& patchPtr->prerequires, child);
00142       }
00143       else if (name == "requires")
00144       {
00145         prim.parseDependencyEntries(& patchPtr->requires, child);
00146       }
00147       else if (name == "recommends")
00148       {
00149         prim.parseDependencyEntries(& patchPtr->recommends, child);
00150       }
00151       else if (name == "suggests")
00152       {
00153         prim.parseDependencyEntries(& patchPtr->suggests, child);
00154       }
00155       else if (name == "supplements")
00156       {
00157         prim.parseDependencyEntries(& patchPtr->supplements, child);
00158       }
00159       else if (name == "enhances")
00160       {
00161         prim.parseDependencyEntries(& patchPtr->enhances, child);
00162       }
00163       else if (name == "freshens")
00164       {
00165         prim.parseDependencyEntries(& patchPtr->freshens, child);
00166       }
00167       else if (name == "category")
00168       {
00169         patchPtr->category = _helper.content(child);
00170       }
00171       else if (name == "reboot-needed")
00172       {
00173         patchPtr->rebootNeeded = true;
00174       }
00175       else if (name == "package-manager")
00176       {
00177         patchPtr->packageManager = true;
00178       }
00179       else if (name == "update-script")
00180       {
00181         patchPtr->updateScript = _helper.content(child);
00182       }
00183       else if (name == "atoms")
00184       {
00185         parseAtomsNode(patchPtr, child);
00186       }
00187       else
00188       {
00189         WAR << "YUM <data> contains the unknown element <" << name << "> "
00190         << _helper.positionInfo(child) << ", skipping" << endl;
00191       }
00192     }
00193   }
00194   return patchPtr;
00195 } /* end process */
00196 
00197 
00198 void
00199 YUMPatchParser::parseAtomsNode(YUMPatchData_Ptr dataPtr,
00200                                xmlNodePtr formatNode)
00201 {
00202   xml_assert(formatNode);
00203   for (xmlNodePtr child = formatNode->children;
00204        child != 0;
00205        child = child ->next)
00206   {
00207     if (_helper.isElement(child))
00208     {
00209       string name = _helper.name(child);
00210       XXX << "parseAtomsNode(" << name << ")" << endl;
00211       if (name == "package")
00212       {
00213         parsePackageNode( dataPtr, child );
00214       }
00215       else if (name == "script")
00216       {
00217         parseScriptNode( dataPtr, child );
00218       }
00219       else if (name == "message")
00220       {
00221         parseMessageNode( dataPtr, child );
00222       }
00223       else
00224       {
00225         WAR << "YUM <atoms> contains the unknown element <" << name << "> "
00226         << _helper.positionInfo(child) << ", skipping" << endl;
00227       }
00228     }
00229   }
00230 }
00231 
00232 void
00233 YUMPatchParser::parseFormatNode(YUMPatchPackage *dataPtr,
00234                                 xmlNodePtr formatNode)
00235 {
00236   xml_assert(formatNode);
00237   dataPtr->installOnly = false;
00238 
00239   // FIXME move the respective method to a common class, inherit it
00240   YUMPrimaryParser prim;
00241 
00242   for (xmlNodePtr child = formatNode->children;
00243        child != 0;
00244        child = child ->next)
00245   {
00246     if (_helper.isElement(child))
00247     {
00248       string name = _helper.name(child);
00249       if (name == "license")
00250       {
00251         dataPtr->license = _helper.content(child);
00252       }
00253       else if (name == "vendor")
00254       {
00255         dataPtr->vendor = _helper.content(child);
00256       }
00257       else if (name == "group")
00258       {
00259         dataPtr->group = _helper.content(child);
00260       }
00261       else if (name == "buildhost")
00262       {
00263         dataPtr->buildhost = _helper.content(child);
00264       }
00265       else if (name == "sourcerpm")
00266       {
00267         dataPtr->sourcerpm = _helper.content(child);
00268       }
00269       else if (name == "header-range")
00270       {
00271         dataPtr->headerStart = _helper.attribute(child,"start");
00272         dataPtr->headerEnd = _helper.attribute(child,"end");
00273       }
00274       else if (name == "provides")
00275       {
00276         prim.parseDependencyEntries(& dataPtr->provides, child);
00277       }
00278       else if (name == "conflicts")
00279       {
00280         prim.parseDependencyEntries(& dataPtr->conflicts, child);
00281       }
00282       else if (name == "obsoletes")
00283       {
00284         prim.parseDependencyEntries(& dataPtr->obsoletes, child);
00285       }
00286       else if (name == "prerequires")
00287       {
00288         prim.parseDependencyEntries(& dataPtr->prerequires, child);
00289       }
00290       else if (name == "requires")
00291       {
00292         prim.parseDependencyEntries(& dataPtr->requires, child);
00293       }
00294       else if (name == "recommends")
00295       {
00296         prim.parseDependencyEntries(& dataPtr->recommends, child);
00297       }
00298       else if (name == "suggests")
00299       {
00300         prim.parseDependencyEntries(& dataPtr->suggests, child);
00301       }
00302       else if (name == "supplements")
00303       {
00304         prim.parseDependencyEntries(& dataPtr->supplements, child);
00305       }
00306       else if (name == "enhances")
00307       {
00308         prim.parseDependencyEntries(& dataPtr->enhances, child);
00309       }
00310       else if (name == "file")
00311       {
00312         dataPtr->files.push_back
00313         (FileData(_helper.content(child),
00314                   _helper.attribute(child,"type")));
00315       }
00316       /* SUSE specific elements */
00317       else if (name == "authors")
00318       {
00319         prim.parseAuthorEntries(& dataPtr->authors, child);
00320       }
00321       else if (name == "keywords")
00322       {
00323         prim.parseKeywordEntries(& dataPtr->keywords, child);
00324       }
00325       else if (name == "dirsizes")
00326       {
00327         prim.parseDirsizeEntries(& dataPtr->dirSizes, child);
00328       }
00329       else if (name == "freshens")
00330       {
00331         prim.parseDependencyEntries(& dataPtr->freshens, child);
00332       }
00333       else if (name == "install-only")
00334       {
00335         dataPtr->installOnly = true;
00336       }
00337       else
00338       {
00339         WAR << "YUM <atom/package/format> contains the unknown element <"
00340         << name << "> "
00341         << _helper.positionInfo(child) << ", skipping" << endl;
00342       }
00343     }
00344   }
00345 }
00346 
00347 void
00348 YUMPatchParser::parsePkgPlainRpmNode(YUMPatchPackage *dataPtr,
00349                                      xmlNodePtr formatNode)
00350 {
00351   YUMPlainRpm plainRpm;
00352   plainRpm.arch = _helper.attribute( formatNode, "arch" );
00353   plainRpm.filename = _helper.attribute( formatNode, "filename" );
00354   plainRpm.downloadsize = _helper.attribute( formatNode, "downloadsize" );
00355   plainRpm.md5sum = _helper.attribute( formatNode, "md5sum" );
00356   plainRpm.buildtime = _helper.attribute( formatNode, "buildtime" );
00357   for (xmlNodePtr child = formatNode->children;
00358        child != 0;
00359        child = child ->next)
00360   {
00361     if (_helper.isElement(child))
00362     {
00363       string name = _helper.name(child);
00364       WAR << "YUM <atom/package/pkgfiles/plain> contains the unknown element <"
00365       << name << "> "
00366       << _helper.positionInfo(child) << ", skipping" << endl;
00367     }
00368   }
00369   dataPtr->plainRpms.push_back(plainRpm);
00370 }
00371 
00372 void
00373 YUMPatchParser::parsePkgPatchRpmNode(YUMPatchPackage *dataPtr,
00374                                      xmlNodePtr formatNode)
00375 {
00376   YUMPatchRpm patchRpm;
00377   patchRpm.arch = _helper.attribute( formatNode, "arch" );
00378   patchRpm.filename = _helper.attribute( formatNode, "filename" );
00379   patchRpm.downloadsize = _helper.attribute( formatNode, "downloadsize" );
00380   patchRpm.md5sum = _helper.attribute( formatNode, "md5sum" );
00381   patchRpm.buildtime = _helper.attribute( formatNode, "buildtime" );
00382   patchRpm.media = "1";
00383   for (xmlNodePtr child = formatNode->children;
00384        child != 0;
00385        child = child ->next)
00386   {
00387     if (_helper.isElement(child))
00388     {
00389       string name = _helper.name(child);
00390       if (name == "base-version")
00391       {
00392         YUMPatchBaseVersion base_version;
00393         parsePkgPatchBaseVersionNode( &base_version, child);
00394         patchRpm.baseVersions.push_back( base_version );
00395       }
00396       else if (name == "location")
00397       {
00398         patchRpm.location = _helper.attribute(child,"href");
00399         patchRpm.media = _helper.attribute(child,"base","#1");
00400         int pos = patchRpm.media.find("#");
00401         if (pos > 0)
00402           patchRpm.media = patchRpm.media.substr(pos + 1);
00403       }
00404       else if (name == "media")
00405       {
00406         patchRpm.media = _helper.content(child);
00407       }
00408       else if (name == "checksum")
00409       {
00410         patchRpm.checksumType = _helper.attribute(child,"type");
00411         patchRpm.checksum = _helper.content(child);
00412       }
00413       else if (name == "time")
00414       {
00415         patchRpm.buildtime = _helper.attribute(child,"build");
00416       }
00417       else if (name == "size")
00418       {
00419         patchRpm.downloadsize = _helper.attribute(child,"package");
00420       }
00421       else
00422       {
00423         WAR << "YUM <atom/package/pkgfiles/patch> contains the unknown element <"
00424         << name << "> "
00425         << _helper.positionInfo(child) << ", skipping" << endl;
00426       }
00427     }
00428   }
00429   dataPtr->patchRpms.push_back(patchRpm);
00430 }
00431 
00432 void
00433 YUMPatchParser::parsePkgDeltaRpmNode(YUMPatchPackage *dataPtr,
00434                                      xmlNodePtr formatNode)
00435 {
00436   YUMDeltaRpm deltaRpm;
00437   deltaRpm.arch = _helper.attribute( formatNode, "arch" );
00438   deltaRpm.filename = _helper.attribute( formatNode, "filename" );
00439   deltaRpm.downloadsize = _helper.attribute( formatNode, "downloadsize" );
00440   deltaRpm.md5sum = _helper.attribute( formatNode, "md5sum" );
00441   deltaRpm.buildtime = _helper.attribute( formatNode, "buildtime" );
00442   deltaRpm.media = "1";
00443   for (xmlNodePtr child = formatNode->children;
00444        child != 0;
00445        child = child ->next)
00446   {
00447     if (_helper.isElement(child))
00448     {
00449       string name = _helper.name(child);
00450       if (name == "base-version")
00451       {
00452         parsePkgDeltaBaseVersionNode( &(deltaRpm.baseVersion), child);
00453       }
00454       else if (name == "location")
00455       {
00456         deltaRpm.location = _helper.attribute(child,"href");
00457         deltaRpm.media = _helper.attribute(child,"base","#1");
00458         int pos = deltaRpm.media.find("#");
00459         if (pos > 0)
00460           deltaRpm.media = deltaRpm.media.substr(pos + 1);
00461       }
00462       else if (name == "media")
00463       {
00464         deltaRpm.media = _helper.content(child);
00465       }
00466       else if (name == "checksum")
00467       {
00468         deltaRpm.checksumType = _helper.attribute(child,"type");
00469         deltaRpm.checksum = _helper.content(child);
00470       }
00471       else if (name == "time")
00472       {
00473         deltaRpm.buildtime = _helper.attribute(child,"build");
00474       }
00475       else if (name == "size")
00476       {
00477         deltaRpm.downloadsize = _helper.attribute(child,"package");
00478       }
00479       else
00480       {
00481         WAR << "YUM <atom/package/pkgfiles/delta> contains the unknown element <"
00482         << name << "> "
00483         << _helper.positionInfo(child) << ", skipping" << endl;
00484       }
00485     }
00486   }
00487   dataPtr->deltaRpms.push_back(deltaRpm);
00488 }
00489 
00490 
00491 void
00492 YUMPatchParser::parsePkgPatchBaseVersionNode(YUMPatchBaseVersion *dataPtr,
00493     xmlNodePtr formatNode)
00494 {
00495   dataPtr->edition.epoch = _helper.attribute( formatNode, "epoch" );
00496   dataPtr->edition.ver = _helper.attribute( formatNode, "ver" );
00497   dataPtr->edition.rel = _helper.attribute( formatNode, "rel" );
00498 }
00499 
00500 void
00501 YUMPatchParser::parsePkgDeltaBaseVersionNode(YUMDeltaBaseVersion *dataPtr,
00502     xmlNodePtr formatNode)
00503 {
00504   dataPtr->edition.epoch = _helper.attribute( formatNode, "epoch" );
00505   dataPtr->edition.ver = _helper.attribute( formatNode, "ver" );
00506   dataPtr->edition.rel = _helper.attribute( formatNode, "rel" );
00507   dataPtr->md5sum = _helper.attribute( formatNode, "md5sum" );
00508   dataPtr->buildtime = _helper.attribute( formatNode, "buildtime" );
00509   dataPtr->sequence_info = _helper.attribute( formatNode, "sequence_info" );
00510 }
00511 
00512 void
00513 YUMPatchParser::parsePkgFilesNode(YUMPatchPackage *dataPtr,
00514                                   xmlNodePtr formatNode)
00515 {
00516   for (xmlNodePtr child = formatNode->children;
00517        child != 0;
00518        child = child ->next)
00519   {
00520     if (_helper.isElement(child))
00521     {
00522       string name = _helper.name(child);
00523       if (name == "plainrpm")
00524       {
00525         parsePkgPlainRpmNode( dataPtr, child );
00526       }
00527       else if (name == "patchrpm")
00528       {
00529         parsePkgPatchRpmNode( dataPtr, child );
00530       }
00531       else if (name == "deltarpm")
00532       {
00533         parsePkgDeltaRpmNode( dataPtr, child );
00534       }
00535       else
00536       {
00537         WAR << "YUM <atom/package/pkgfiles> contains the unknown element <"
00538         << name << "> "
00539         << _helper.positionInfo(child) << ", skipping" << endl;
00540       }
00541     }
00542   }
00543 }
00544 
00545 
00546 
00547 
00548 
00549 
00550 void
00551 YUMPatchParser::parsePackageNode(YUMPatchData_Ptr dataPtr,
00552                                  xmlNodePtr formatNode)
00553 {
00554   shared_ptr<YUMPatchPackage> package(new YUMPatchPackage);
00555   package->type = _helper.attribute(formatNode,"type");
00556   package->installOnly = false;
00557   package->media = "1";
00558 
00559   // FIXME move the respective method to a common class, inherit it
00560   YUMPrimaryParser prim;
00561 
00562   for (xmlNodePtr child = formatNode->children;
00563        child != 0;
00564        child = child ->next)
00565   {
00566     if (_helper.isElement(child))
00567     {
00568       string name = _helper.name(child);
00569       XXX << "parsePackageNode(" << name << ")" << endl;
00570       if (name == "name")
00571       {
00572         package->name = _helper.content(child);
00573       }
00574       else if (name == "arch")
00575       {
00576         package->arch = _helper.content(child);
00577       }
00578       else if (name == "version")
00579       {
00580         package->epoch = _helper.attribute(child,"epoch");
00581         package->ver = _helper.attribute(child,"ver");
00582         package->rel = _helper.attribute(child,"rel");
00583       }
00584       else if (name == "checksum")
00585       {
00586         package->checksumType = _helper.attribute(child,"type");
00587         package->checksumPkgid = _helper.attribute(child,"pkgid");
00588         package->checksum = _helper.content(child);
00589       }
00590       else if (name == "summary")
00591       {
00592         package->summary = _helper.content(child);
00593       }
00594       else if (name == "description")
00595       {
00596         package->description = _helper.content(child);
00597       }
00598       else if (name == "packager")
00599       {
00600         package->packager = _helper.content(child);
00601       }
00602       else if (name == "url")
00603       {
00604         package->url = _helper.content(child);
00605       }
00606       else if (name == "time")
00607       {
00608         package->timeFile = _helper.attribute(child,"file");
00609         package->timeBuild = _helper.attribute(child,"build");
00610       }
00611       else if (name == "size")
00612       {
00613         package->sizePackage = _helper.attribute(child,"package");
00614         package->sizeInstalled = _helper.attribute(child,"installed");
00615         package->sizeArchive = _helper.attribute(child,"archive");
00616       }
00617       else if (name == "location")
00618       {
00619         package->location = _helper.attribute(child,"href");
00620         package->media = _helper.attribute(child,"base","#1");
00621         int pos = package->media.find("#");
00622         if (pos > 0)
00623           package->media = package->media.substr(pos + 1);
00624       }
00625       else if (name == "format")
00626       {
00627         parseFormatNode (&*package, child);
00628       }
00629       else if (name == "pkgfiles")
00630       {
00631         parsePkgFilesNode (&*package, child);
00632       }
00633       else if (name == "license-to-confirm")
00634       {
00635         package->license_to_confirm.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00636       }
00637       else
00638       {
00639         WAR << "YUM <atoms/package> contains the unknown element <"
00640         << name << "> "
00641         << _helper.positionInfo(child) << ", skipping" << endl;
00642       }
00643     }
00644   }
00645   dataPtr->atoms.push_back(package);
00646 }
00647 
00648 void
00649 YUMPatchParser::parseScriptNode(YUMPatchData_Ptr dataPtr,
00650                                 xmlNodePtr formatNode)
00651 {
00652   shared_ptr<YUMPatchScript> script(new YUMPatchScript);
00653   script->do_media = "1";
00654   script->undo_media = "1";
00655 
00656   // FIXME move the respective method to a common class, inherit it
00657   YUMPrimaryParser prim;
00658 
00659   for (xmlNodePtr child = formatNode->children;
00660        child != 0;
00661        child = child ->next)
00662   {
00663     if (_helper.isElement(child))
00664     {
00665       string name = _helper.name(child);
00666       if (name == "name")
00667       {
00668         script->name = _helper.content(child);
00669       }
00670       else if (name == "version")
00671       {
00672         script->epoch = _helper.attribute(child,"epoch");
00673         script->ver = _helper.attribute(child,"ver");
00674         script->rel = _helper.attribute(child,"rel");
00675       }
00676       else if (name == "do")
00677       {
00678         script->do_script = _helper.content(child);
00679       }
00680       else if (name == "undo")
00681       {
00682         script->undo_script = _helper.content(child);
00683       }
00684       else if (name == "do-location")
00685       {
00686         script->do_location = _helper.attribute(child,"href");
00687         script->do_media = _helper.attribute(child,"base","#1");
00688         int pos = script->do_media.find("#");
00689         if (pos > 0)
00690           script->do_media = script->do_media.substr(pos + 1);
00691       }
00692       else if (name == "undo-location")
00693       {
00694         script->undo_location = _helper.attribute(child,"href");
00695         script->undo_media = _helper.attribute(child,"base","#1");
00696         int pos = script->undo_media.find("#");
00697         if (pos > 0)
00698           script->undo_media = script->undo_media.substr(pos + 1);
00699       }
00700       else if (name == "do-checksum")
00701       {
00702         script->do_checksum_type = _helper.attribute(child,"type");
00703         script->do_checksum = _helper.content(child);
00704       }
00705       else if (name == "undo-checksum")
00706       {
00707         script->undo_checksum_type = _helper.attribute(child,"type");
00708         script->undo_checksum = _helper.content(child);
00709       }
00710       else if (name == "provides")
00711       {
00712         prim.parseDependencyEntries(& script->provides, child);
00713       }
00714       else if (name == "conflicts")
00715       {
00716         prim.parseDependencyEntries(& script->conflicts, child);
00717       }
00718       else if (name == "obsoletes")
00719       {
00720         prim.parseDependencyEntries(& script->obsoletes, child);
00721       }
00722       else if (name == "requires")
00723       {
00724         prim.parseDependencyEntries(& script->requires, child);
00725       }
00726       else if (name == "prerequires")
00727       {
00728         prim.parseDependencyEntries(& script->prerequires, child);
00729       }
00730       else if (name == "recommends")
00731       {
00732         prim.parseDependencyEntries(& script->recommends, child);
00733       }
00734       else if (name == "suggests")
00735       {
00736         prim.parseDependencyEntries(& script->suggests, child);
00737       }
00738       else if (name == "supplements")
00739       {
00740         prim.parseDependencyEntries(& script->supplements, child);
00741       }
00742       else if (name == "enhances")
00743       {
00744         prim.parseDependencyEntries(& script->enhances, child);
00745       }
00746       else if (name == "freshens")
00747       {
00748         prim.parseDependencyEntries(& script->freshens, child);
00749       }
00750       else
00751       {
00752         WAR << "YUM <atoms/script> contains the unknown element <"
00753         << name << "> "
00754         << _helper.positionInfo(child) << ", skipping" << endl;
00755       }
00756     }
00757   }
00758   dataPtr->atoms.push_back(script);
00759 }
00760 
00761 void
00762 YUMPatchParser::parseMessageNode(YUMPatchData_Ptr dataPtr,
00763                                  xmlNodePtr formatNode)
00764 {
00765   shared_ptr<YUMPatchMessage> message(new YUMPatchMessage);
00766 
00767   // FIXME move the respective method to a common class, inherit it
00768   YUMPrimaryParser prim;
00769 
00770   for (xmlNodePtr child = formatNode->children;
00771        child != 0;
00772        child = child ->next)
00773   {
00774     if (_helper.isElement(child))
00775     {
00776       string name = _helper.name(child);
00777       if (name == "name")
00778       {
00779         message->name = _helper.content(child);
00780       }
00781       else if (name == "version")
00782       {
00783         message->epoch = _helper.attribute(child,"epoch");
00784         message->ver = _helper.attribute(child,"ver");
00785         message->rel = _helper.attribute(child,"rel");
00786       }
00787       else if (name == "text")
00788       {
00789         message->text.setText(_helper.content(child), Locale(_helper.attribute(child,"lang")));
00790       }
00791       else if (name == "provides")
00792       {
00793         prim.parseDependencyEntries(& message->provides, child);
00794       }
00795       else if (name == "conflicts")
00796       {
00797         prim.parseDependencyEntries(& message->conflicts, child);
00798       }
00799       else if (name == "obsoletes")
00800       {
00801         prim.parseDependencyEntries(& message->obsoletes, child);
00802       }
00803       else if (name == "prerequires")
00804       {
00805         prim.parseDependencyEntries(& message->prerequires, child);
00806       }
00807       else if (name == "requires")
00808       {
00809         prim.parseDependencyEntries(& message->requires, child);
00810       }
00811       else if (name == "recommends")
00812       {
00813         prim.parseDependencyEntries(& message->recommends, child);
00814       }
00815       else if (name == "suggests")
00816       {
00817         prim.parseDependencyEntries(& message->suggests, child);
00818       }
00819       else if (name == "supplements")
00820       {
00821         prim.parseDependencyEntries(& message->supplements, child);
00822       }
00823       else if (name == "enhances")
00824       {
00825         prim.parseDependencyEntries(& message->enhances, child);
00826       }
00827       else if (name == "freshens")
00828       {
00829         prim.parseDependencyEntries(& message->freshens, child);
00830       }
00831       else
00832       {
00833         WAR << "YUM <atoms/message> contains the unknown element <"
00834         << name << "> "
00835         << _helper.positionInfo(child) << ", skipping" << endl;
00836       }
00837     }
00838   }
00839   dataPtr->atoms.push_back(message);
00840 }
00841 
00842 } // namespace yum
00843 } // namespace parser
00844 } // namespace zypp

Generated on Tue Nov 28 16:49:30 2006 for zypp by  doxygen 1.5.0