Beispiel #1
0
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;
}
Beispiel #2
0
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;
};