short UnitContainer::InsertUnit( Unit *unit ) { short rc = 0; UCNode *n = new UCNode( unit ); if ( n ) { unit->SetFlags( U_SHELTERED ); uc_units.AddTail( n ); if ( dynamic_cast<MapObject *>(this)->Owner() != unit->Owner() ) rc = 1; // if a transport is coming in, we must unload it if ( unit->IsTransport() ) { Transport *t = static_cast<Transport *>(unit); SetCrystals( Crystals() + t->Crystals() ); t->SetCrystals( 0 ); while ( Unit *u = t->GetUnit(0) ) { t->RemoveUnit( u ); InsertUnit( u ); } } uc_slots_full += unit->Weight(); } else rc = -1; return rc; }
bool CDictionary::ProcessOneArticle ( vector<CSourceLine>& L, int start, int last, bool bSimulating, ImportConflictEnum ConflictSolver, string& Messages) { size_t RealStart = start; if (L.size() == 1) return false; string S; if (GetValue(L[RealStart].m_Line,"Дескриптор",S)) RealStart++; string Lemma; const char* Field = GetTitleFieldName(); if (!GetValue(L[RealStart].m_Line,Field,Lemma)) { AddMessage (Format("Cannot read field %s\n", Field).c_str(), L[start].m_SourceLineNo+1, Messages); return false; } RealStart++; Field = GetSenseFieldName(); if (!GetValue(L[RealStart].m_Line,Field,S)) { AddMessage (Format("Cannot read field %s", Field).c_str(), L[start].m_SourceLineNo+1, Messages); return false; } BYTE MeanNum = atoi (S.c_str()); if (MeanNum == 0) { AddMessage (Format("Cannot read field %s", Field).c_str(), L[start].m_SourceLineNo+1, Messages); return false; } if ((m_MaxMeanNum == 1) && (MeanNum>1)) { AddMessage ("No different senses are possible for this dictionary", L[start].m_SourceLineNo+1, Messages); return false; } string Comments = ""; Field = GetCommFieldName(); if (RealStart+1 < L.size()) if (GetValue(L[RealStart+1].m_Line,Field,S)) { Comments = S; RealStart++; }; string Author = ""; Field = GetAuthorFieldName(); if (RealStart+1 < L.size()) if (GetValue(L[RealStart+1].m_Line,Field,S)) { Author = S; RealStart++; }; string ModifTime = ""; Field = GetTimeCreatFieldName(); if (RealStart+1 < L.size()) if (GetValue(L[RealStart+1].m_Line,Field,S)) { ModifTime = S; RealStart++; }; string UnitEditor = ""; Field = GetRedactFieldName(); if (RealStart+1 < L.size()) if (GetValue(L[RealStart+1].m_Line,Field,S)) { UnitEditor = S; RealStart++; }; Field = GetTimeCreatFieldName(); if (RealStart+1 < L.size()) if (GetValue(L[RealStart+1].m_Line,Field,S)) { ModifTime = S; RealStart++; }; WORD UnitNo = LocateUnit(Lemma.c_str(), MeanNum); if (UnitNo != ErrUnitNo) if (ConflictSolver == iceSkip) return true; else if ( (ConflictSolver == iceOverwrite) && !m_Units[UnitNo].HasEmptyArticle() && !bSimulating ) ClearUnit(UnitNo); else; else if (!bSimulating) UnitNo = InsertUnit (Lemma.c_str(), MeanNum); CTempArticle A1; A1.m_pRoss = this; if (UnitNo != ErrUnitNo) A1.ReadFromDictionary(UnitNo, false, false); string NewArticle; for (long i = RealStart+1; i < last; i++) NewArticle += L[i].m_Line + string("\n"); CTempArticle A2; try { A2.m_pRoss = this; if (!A2.SetArticleStr(NewArticle.c_str())) { long LocalLineNo = A2.m_ErrorLine - 1; if (LocalLineNo < 0) LocalLineNo = 0; AddMessage(A2.m_LastError, L[LocalLineNo+start+(RealStart-start)].m_SourceLineNo+1, Messages); if (A2.m_LastError.empty()) Messages += "an error occurred!\n"; return false; }; if ( (ConflictSolver == iceAppend) && (A1.IntersectByFields(&A2) > 0) ) { Messages += "You cannot add one entry to another, because they both contain the same fields\n"; return false; }; if (!A1.AddArticle(&A2)) { long LocalLineNo = A1.m_ErrorLine - 1; if (LocalLineNo < 0) LocalLineNo = 0; AddMessage(A1.m_LastError, L[LocalLineNo+start+(RealStart-start)].m_SourceLineNo+1, Messages); if (A1.m_LastError.empty()) Messages += "an error occurred!\n"; return false; }; if (bSimulating) return true; // запись комментария SetUnitCommentStr(UnitNo, Comments.c_str()); SetUnitAuthor(UnitNo, Author.c_str()); if (ModifTime != "") SetUnitModifTimeStr(UnitNo, ModifTime.c_str()); if (UnitEditor != "") SetUnitEditor(UnitNo, UnitEditor.c_str()); // запись кортежей A1.WriteToDictionary(); } catch (...) { long LocalLineNo = A2.m_ErrorLine - 1; if (LocalLineNo < 0) LocalLineNo = 0; AddMessage (m_LastError, L[LocalLineNo+start+(RealStart-start)].m_SourceLineNo+1, Messages); return false; } return true; };