void ReactionCdxLoader::loadReaction (Reaction &rxn)
{
   rxn.clear();

   QS_DEF(Array<char>, buf);
   _scanner.readAll(buf);
   buf.push(0);
}
void CrfLoader::loadReaction (Reaction &reaction)
{
   int i;
   int nreactants = _scanner.readPackedUInt();
   int nproducts = _scanner.readPackedUInt();
   byte flags = _scanner.readByte();
   int ncatalyst = 0;
   if (flags & CrfFeatureFlags::CRF_CATALYST)
      ncatalyst = _scanner.readPackedUInt();

   reaction.clear();

   _bond_rc_flags = 0;
   _atom_stereo_flags = 0;
   _aam = 0;

   bool have_aam = (flags != 0);

   for (i = 0; i < nreactants; i++)
   {
      int index = reaction.addReactant();
      _loadReactionMolecule(reaction, index, have_aam);
   }

   for (i = 0; i < nproducts; i++)
   {
      int index = reaction.addProduct();
      _loadReactionMolecule(reaction, index, have_aam);
   }

   for (i = 0; i < ncatalyst; i++)
   {
      int index = reaction.addCatalyst();
      _loadReactionMolecule(reaction, index, have_aam);
   }
}
void ReactionCmlLoader::loadReaction (Reaction &rxn)
{
   rxn.clear();

   QS_DEF(Array<char>, buf);
   _scanner.readAll(buf);
   buf.push(0);

   TiXmlDocument xml;

   xml.Parse(buf.ptr());

   if (xml.Error())
      throw Error("XML parsing error: %s", xml.ErrorDesc());

   TiXmlHandle hxml(&xml);
   TiXmlElement *elem;
   TiXmlHandle hroot(0);

   elem = hxml.FirstChild("reaction").Element();
   if (elem == 0)
      elem = hxml.FirstChild("cml").FirstChild("reaction").Element();
   if (elem == 0)
      throw Error("no <reaction>?");
   hroot = TiXmlHandle(elem);

   const char *title = elem->Attribute("title");

   if (title != 0)
      rxn.name.readString(title, true);

   QS_DEF(Molecule, mol);

   elem = hroot.FirstChild("reactantList").FirstChild().Element();
   for (; elem; elem = elem->NextSiblingElement())
   {
      if (strcasecmp(elem->Value(), "molecule") != 0)
         continue;
      TiXmlHandle handle(elem);
      MoleculeCmlLoader loader(handle);
      loader.stereochemistry_options = stereochemistry_options;
      loader.loadMolecule(mol);
      rxn.addReactantCopy(mol, 0, 0);
   }

   elem = hroot.FirstChild("productList").FirstChild().Element();
   for (; elem; elem = elem->NextSiblingElement())
   {
      if (strcasecmp(elem->Value(), "molecule") != 0)
         continue;
      TiXmlHandle handle(elem);
      MoleculeCmlLoader loader(handle);
      loader.stereochemistry_options = stereochemistry_options;
      loader.loadMolecule(mol);
      rxn.addProductCopy(mol, 0, 0);
   }

   elem = hroot.FirstChild("spectatorList").FirstChild().Element();
   for (; elem; elem = elem->NextSiblingElement())
   {
      if (strcasecmp(elem->Value(), "molecule") != 0)
         continue;
      TiXmlHandle handle(elem);
      MoleculeCmlLoader loader(handle);
      loader.stereochemistry_options = stereochemistry_options;
      loader.loadMolecule(mol);
      rxn.addCatalystCopy(mol, 0, 0);
   }
}