int MainObjectArrayPtr::MainObjectArray::PutElement( ObjectNumber p_MainObjectNumber, ArrayIndex p_ElementIndex, ModifiableElement p_Element) { MainObjectEntry BPAQuantumNumber; BigPointerBlockPtr BigPointerBlock; LittlePointerBlockPtr LittlePointerBlock; LeafBlockPtr ElementBlock; ArrayIndex BigPointerIndex; ArrayIndex LittlePointerIndex; QuantumNumber LPAQuantumNumber; ItemReference ElementRef; ItemReference NewElementRef; ModifiableElement Element; QFreeSpaceEntry SpaceAvailable; QuantumNumber NewQuantum; QuantumNumber PossibleQuantum; LeafBlockPtr NewElementBlock; ArrayIndex FreeSpace; ArrayIndex ActualFreeSpace; ArrayIndex NewItemNumber; ObjectNumber LeafObjectNumber; qfassert (p_Element.GetSize() < MaxItemSize); BigPointerIndex = p_ElementIndex / ItemReferencesPerBlock; BPAQuantumNumber = Get(p_MainObjectNumber); BigPointerBlock = m_QuantumFile->MakeBigPointerBlockPtr(BPAQuantumNumber); LPAQuantumNumber = BigPointerBlock->GetBigArrayElement(BigPointerIndex); LittlePointerBlock = m_QuantumFile->MakeLittlePointerBlockPtr(LPAQuantumNumber); LittlePointerIndex = p_ElementIndex % ItemReferencesPerBlock; ElementRef = LittlePointerBlock->GetLittleArrayElement(LittlePointerIndex); if (ElementRef.IsReference()) { ElementBlock = m_QuantumFile->MakeLeafBlockPtr(ElementRef.GetQuantumNumber()); ElementBlock->DeleteItem(ElementRef.GetItemNumber()); } if (p_Element.GetSize() == 0) // nothing to store { ElementRef.SetQuantumNumber(NoQuantum); ElementRef.SetItemNumber(NoItem); LittlePointerBlock->SetLittleArrayElement(LittlePointerIndex,ElementRef); return 0; } NewQuantum = NoQuantum; PossibleQuantum = BigPointerBlock->GetLastQuantumAddedTo(); if (PossibleQuantum != NoQuantum) { SpaceAvailable = m_QuantumFile->QGetFreeSpace(PossibleQuantum); FreeSpace = SpaceAvailable.m_FreeSpaceCode * FreeSpaceConversion; if (SpaceAvailable.m_FreeSpaceCode != AvailableQuantum && FreeSpace > p_Element.GetSize()) { NewElementBlock = m_QuantumFile->MakeLeafBlockPtr(PossibleQuantum); ActualFreeSpace = NewElementBlock->CalculateFreeSpace(); if (ActualFreeSpace > p_Element.GetSize()) NewQuantum = PossibleQuantum; } } if (NewQuantum == NoQuantum) { NewQuantum = m_QuantumFile->FindSpaceForItem(p_MainObjectNumber, p_Element.GetSize()); NewElementBlock = m_QuantumFile->MakeLeafBlockPtr(NewQuantum); LeafObjectNumber = NewElementBlock->GetMainObjectNumber(); qfassert(LeafObjectNumber == p_MainObjectNumber); } BigPointerBlock->SetLastQuantumAddedTo(NewQuantum); NewElementRef.SetQuantumNumber(NewQuantum); NewItemNumber = NewElementBlock->AddItem(p_Element, VARIABLE_LENGTH_STRING, p_ElementIndex); NewElementRef.SetItemNumber(NewItemNumber); LeafObjectNumber = NewElementBlock->GetMainObjectNumber(); qfassert(LeafObjectNumber == p_MainObjectNumber); NewElementBlock->UpdateFreeSpace(); LittlePointerBlock->SetLittleArrayElement(LittlePointerIndex,NewElementRef); return 0; }