25 |
#include "GEDCOMParser/GEDCOMFactory.hh" |
#include "GEDCOMParser/GEDCOMFactory.hh" |
26 |
#include "GEDCOMParser/GEDCOMFactoryAccessor.hh" |
#include "GEDCOMParser/GEDCOMFactoryAccessor.hh" |
27 |
|
|
|
#include <iostream> |
|
28 |
|
|
29 |
GEDCOMParser::Header * GEDCOMParser::LineageLinkageGedcom::setHeader(GEDCOMParser::Header * const data = 0) |
GEDCOMParser::Header * GEDCOMParser::LineageLinkageGedcom::setHeader(GEDCOMParser::Header * const data = 0) |
30 |
{ |
{ |
82 |
{ |
{ |
83 |
_id_generator = new GEDCOMParser::IdGenerator(); |
_id_generator = new GEDCOMParser::IdGenerator(); |
84 |
} |
} |
85 |
|
|
86 |
if (data == 0) |
if (data == 0) |
87 |
{ |
{ |
88 |
GEDCOMParser::GEDCOMFactory * factory = GEDCOMParser::GEDCOMFactoryAccessor::getFactory(); |
GEDCOMParser::GEDCOMFactory * factory = GEDCOMParser::GEDCOMFactoryAccessor::getFactory(); |
219 |
return _submitter_records[id].getPtr(); |
return _submitter_records[id].getPtr(); |
220 |
} |
} |
221 |
|
|
222 |
GEDCOMParser::SpouseToFamilyLink * GEDCOMParser::LineageLinkageGedcom::AddSpouse(GEDCOMParser::IndividualRecord * spouse) |
void GEDCOMParser::LineageLinkageGedcom::RemoveFamilyRecord(SmartPtr < GEDCOMParser::FamilyRecord > const &family) |
|
{ |
|
|
GEDCOMParser::SpouseToFamilyLink * family_link = 0; |
|
|
if (spouse != 0) |
|
|
{ |
|
|
family_link = spouse->addSpouseToFamilyLink(); |
|
|
GEDCOMParser::FamilyRecord * family_record = addFamilyRecord(); |
|
|
family_record->setSpouse(*spouse); |
|
|
family_link->setFamsXref(family_record->getId()); |
|
|
} |
|
|
return family_link; |
|
|
} |
|
|
|
|
|
void GEDCOMParser::LineageLinkageGedcom::RemoveSpouseToFamilyLink(GEDCOMParser::IndividualRecord * individual, GEDCOMParser::SpouseToFamilyLink * family_link_to_delete) |
|
|
{ |
|
|
if (individual != 0) |
|
|
{ |
|
|
SmartPtr < GEDCOMParser::FamilyRecord > family = _family_records[family_link_to_delete->getFamsXref()]; |
|
|
SmartPtr < GEDCOMParser::IndividualRecord > spouse; |
|
|
GEDCOMParser::SpouseToFamilyLinks_t spouse_links; |
|
|
GEDCOMParser::SpouseToFamilyLinks_t::iterator spouse_link_iter; |
|
|
std::string const & spouse_id = family->getSpouseId(*individual); |
|
|
|
|
|
if (spouse_id != "") |
|
|
{ |
|
|
spouse = _individual_records[spouse_id]; |
|
|
spouse_links = spouse->getSpouseToFamilyLinks(); |
|
|
spouse_link_iter = find_if(spouse_links.begin(), spouse_links.end(), GEDCOMParser::SpouseToFamilyLink::IsEqualByFamsXref(family->getId())); |
|
|
} |
|
|
family->RemoveSpouse(*individual); |
|
|
individual->RemoveFamilyLink(family_link_to_delete); |
|
|
if (FamilyIsUsed(family.getPtr()) == false) |
|
|
{ |
|
|
RemoveFamilyRecord(*(family.getPtr())); |
|
|
} |
|
|
if (spouse_id != "") |
|
|
{ |
|
|
if (spouse_link_iter != spouse_links.end()) |
|
|
{ |
|
|
RemoveSpouseToFamilyLink(spouse.getPtr(), (*spouse_link_iter).getPtr()); |
|
|
} |
|
|
} |
|
|
} |
|
|
return; |
|
|
} |
|
|
|
|
|
void GEDCOMParser::LineageLinkageGedcom::RemoveFamilyRecord(GEDCOMParser::FamilyRecord const &family) |
|
223 |
{ |
{ |
224 |
GEDCOMParser::FamilyRecords_t::iterator family_iter = _family_records.find(family.getId()); |
GEDCOMParser::FamilyRecords_t::iterator family_iter = _family_records.find(family->getId()); |
225 |
_family_records.erase(family_iter); |
_family_records.erase(family_iter); |
226 |
return; |
return; |
227 |
} |
} |
228 |
|
|
|
GEDCOMParser::ChildToFamilyLink * GEDCOMParser::LineageLinkageGedcom::AddParents(GEDCOMParser::IndividualRecord * child) |
|
|
{ |
|
|
GEDCOMParser::ChildToFamilyLink * family_link = 0; |
|
|
if (child != 0) |
|
|
{ |
|
|
family_link = child->addChildToFamilyLink(); |
|
|
GEDCOMParser::FamilyRecord * family_record = addFamilyRecord(); |
|
|
family_record->addChilXref(child->getId()); |
|
|
family_link->setFamcXref(family_record->getId()); |
|
|
} |
|
|
return family_link; |
|
|
} |
|
|
|
|
|
void GEDCOMParser::LineageLinkageGedcom::setParent(GEDCOMParser::FamilyRecord * const family, GEDCOMParser::IndividualRecord * parent) |
|
|
{ |
|
|
|
|
|
if ((family != 0) && (parent != 0)) |
|
|
{ |
|
|
family->setSpouse(*parent); |
|
|
GEDCOMParser::SpouseToFamilyLink * spouse_link = parent->addSpouseToFamilyLink(); |
|
|
std::string const &family_id = family->getId(); |
|
|
spouse_link->setFamsXref(family_id); |
|
|
} |
|
|
return; |
|
|
} |
|
|
|
|
|
void GEDCOMParser::LineageLinkageGedcom::RemoveChildToFamilyLink(GEDCOMParser::IndividualRecord * individual, GEDCOMParser::ChildToFamilyLink * family_link_to_delete) |
|
|
{ |
|
|
if (individual != 0) |
|
|
{ |
|
|
SmartPtr < GEDCOMParser::FamilyRecord > family = _family_records[family_link_to_delete->getFamcXref()]; |
|
|
family->RemoveChilXref(individual->getId()); |
|
|
individual->RemoveFamilyLink(family_link_to_delete); |
|
|
if (FamilyIsUsed(family.getPtr()) == false) |
|
|
{ |
|
|
RemoveFamilyRecord(*(family.getPtr())); |
|
|
} |
|
|
} |
|
|
return; |
|
|
} |
|
|
|
|
229 |
SmartPtr<GEDCOMParser::Header> const & GEDCOMParser::LineageLinkageGedcom::getHeader(void) const |
SmartPtr<GEDCOMParser::Header> const & GEDCOMParser::LineageLinkageGedcom::getHeader(void) const |
230 |
{ |
{ |
231 |
return _header; |
return _header; |
271 |
return _submitter_records; |
return _submitter_records; |
272 |
} |
} |
273 |
|
|
|
SmartPtr<GEDCOMParser::IndividualRecord> GEDCOMParser::LineageLinkageGedcom::getIndividualParent(GEDCOMParser::IndividualRecord const * const individu, GEDCOMParser::LineageLinkageGedcom::enumParents parent_type) const |
|
|
{ |
|
|
std::string fam_id; |
|
|
std::string parent_id; |
|
|
FamilyRecords_t::const_iterator fam_iter; |
|
|
IndividualRecords_t::const_iterator parent_iter; |
|
|
SmartPtr<GEDCOMParser::IndividualRecord> res; |
|
|
|
|
|
if (individu->getChildToFamilyLinks().size() == 1) |
|
|
{ |
|
|
fam_id = individu->getChildToFamilyLinks()[0]->getFamcXref(); |
|
|
fam_iter = _family_records.find(fam_id); |
|
|
if (fam_iter != _family_records.end()) |
|
|
{ |
|
|
if (parent_type == e_Husband) |
|
|
{ |
|
|
parent_id = (*fam_iter).second->getHusb(); |
|
|
} |
|
|
else |
|
|
{ |
|
|
parent_id = (*fam_iter).second->getWife(); |
|
|
} |
|
|
parent_iter = _individual_records.find(parent_id); |
|
|
if (parent_iter != _individual_records.end()) |
|
|
{ |
|
|
res = (*parent_iter).second; |
|
|
} |
|
|
} |
|
|
} |
|
|
return res; |
|
|
} |
|
|
|
|
|
bool GEDCOMParser::LineageLinkageGedcom::hasChildren(GEDCOMParser::IndividualRecord const * const individu) const |
|
|
{ |
|
|
std::string fam_id; |
|
|
FamilyRecords_t::const_iterator fam_iter; |
|
|
IndividualRecords_t::const_iterator child_iter; |
|
|
bool found = false; |
|
|
|
|
|
if (individu != 0) |
|
|
{ |
|
|
SpouseToFamilyLinks_t spouse_to_family_links = individu->getSpouseToFamilyLinks(); |
|
|
SpouseToFamilyLinks_t::const_iterator spouse_to_family_links_iter = spouse_to_family_links.begin(); |
|
|
while ((!found) && (spouse_to_family_links_iter != spouse_to_family_links.end())) |
|
|
{ |
|
|
fam_id = (*spouse_to_family_links_iter)->getFamsXref(); |
|
|
fam_iter = _family_records.find(fam_id); |
|
|
if (fam_iter != _family_records.end()) |
|
|
{ |
|
|
if ((*fam_iter).second->getChilXrefs().size() > 0) |
|
|
{ |
|
|
found = true; |
|
|
} |
|
|
} |
|
|
spouse_to_family_links_iter++; |
|
|
} |
|
|
} |
|
|
return found; |
|
|
} |
|
|
|
|
|
bool GEDCOMParser::LineageLinkageGedcom::hasSpouse(GEDCOMParser::IndividualRecord const * const individu) const |
|
|
{ |
|
|
std::string fam_id; |
|
|
std::string spouse_id; |
|
|
FamilyRecords_t::const_iterator fam_iter; |
|
|
IndividualRecords_t::const_iterator spouse_iter; |
|
|
bool found = false; |
|
|
|
|
|
if (individu != 0) |
|
|
{ |
|
|
SpouseToFamilyLinks_t spouse_to_family_links = individu->getSpouseToFamilyLinks(); |
|
|
SpouseToFamilyLinks_t::const_iterator spouse_to_family_links_iter = spouse_to_family_links.begin(); |
|
|
while ((!found) && (spouse_to_family_links_iter != spouse_to_family_links.end())) |
|
|
{ |
|
|
fam_id = (*spouse_to_family_links_iter)->getFamsXref(); |
|
|
fam_iter = _family_records.find(fam_id); |
|
|
if (fam_iter != _family_records.end()) |
|
|
{ |
|
|
if (individu->getSex() == "M") |
|
|
{ |
|
|
spouse_id = (*fam_iter).second->getWife(); |
|
|
} |
|
|
else |
|
|
{ |
|
|
spouse_id = (*fam_iter).second->getHusb(); |
|
|
} |
|
|
if (spouse_id != "") |
|
|
{ |
|
|
found = true; |
|
|
} |
|
|
} |
|
|
spouse_to_family_links_iter++; |
|
|
} |
|
|
} |
|
|
return found; |
|
|
} |
|
|
|
|
|
|
|
|
bool GEDCOMParser::LineageLinkageGedcom::FamilyIsUsed(GEDCOMParser::FamilyRecord const * const family) const |
|
|
{ |
|
|
bool res = false; |
|
|
std::string family_id = family->getId(); |
|
|
GEDCOMParser::IndividualRecords_t::const_iterator individu_iter = _individual_records.begin(); |
|
|
do |
|
|
{ |
|
|
GEDCOMParser::ChildToFamilyLinks_t const child_links = (*individu_iter).second->getChildToFamilyLinks(); |
|
|
GEDCOMParser::ChildToFamilyLinks_t::const_iterator child_link_iter = find_if(child_links.begin(), child_links.end(), GEDCOMParser::ChildToFamilyLink::IsEqualByFamcXref(family_id)); |
|
|
if (child_link_iter != child_links.end()) |
|
|
{ |
|
|
res = true; |
|
|
} |
|
|
if (res == false) |
|
|
{ |
|
|
GEDCOMParser::SpouseToFamilyLinks_t spouse_links = (*individu_iter).second->getSpouseToFamilyLinks(); |
|
|
GEDCOMParser::SpouseToFamilyLinks_t::const_iterator spouse_link_iter = find_if(spouse_links.begin(), spouse_links.end(), GEDCOMParser::SpouseToFamilyLink::IsEqualByFamsXref(family_id)); |
|
|
if (spouse_link_iter != spouse_links.end()) |
|
|
{ |
|
|
res = true; |
|
|
} |
|
|
} |
|
|
individu_iter++; |
|
|
} |
|
|
while ((res == false) && (individu_iter != _individual_records.end())); |
|
|
return res; |
|
|
} |
|
|
|
|
|
GEDCOMParser::IndividualRecords_t GEDCOMParser::LineageLinkageGedcom::getRootIndividuals(void) const |
|
|
{ |
|
|
GEDCOMParser::IndividualRecords_t children; |
|
|
for (GEDCOMParser::IndividualRecords_t::const_iterator iter = _individual_records.begin(); iter != _individual_records.end() ; iter++) |
|
|
{ |
|
|
if (hasChildren((*iter).second.getPtr()) == false) |
|
|
{ |
|
|
children[(*iter).second->getId()] = (*iter).second; |
|
|
} |
|
|
} |
|
|
return children; |
|
|
} |
|
|
|
|
274 |
GEDCOMParser::LineageLinkageGedcom::~LineageLinkageGedcom(void) |
GEDCOMParser::LineageLinkageGedcom::~LineageLinkageGedcom(void) |
275 |
{ |
{ |
276 |
delete _id_generator; |
delete _id_generator; |