Block::Block(const Block& block) { // Declare necessary variables Unit* pUnit; Unit* pNewUnit; // Initialize pimpl object _pPimpl = new BlockPimpl; assert(_pPimpl); // Get Block Data this->SetPosition (block.GetPosition ()); this->SetSize (block.GetSize ()); this->SetStartPoint (block.GetStartPoint ()); // Get Unit Data pUnit = block.FirstUnit(); if (pUnit == NULL) { return; } do { pNewUnit = new Unit(*pUnit); if (pNewUnit == NULL) { continue; } this->InsertUnit(pNewUnit); } while ((pUnit = block.NextUnit()) != NULL); }
//--------------------------------------------------------------------------- // ----- Methods :: File Serialize (XML) ----- // //--------------------------------------------------------------------------- bool Strip::Save (const TCHAR* lpszFileName) { // ----- Initialize & Declare ----- // FILE* stream = _tfopen(lpszFileName, _T("wb") CHARSET); if (stream == NULL || _pPimpl == NULL) { return false; } TiXmlDocument doc; TiXmlDeclaration* pDecl; TiXmlElement* pRoot; TiXmlElement* pBlockNode; TiXmlElement* pUnitNode; TiXmlElement* pBallNode; Block* pBlockObject; Unit* pUnitObject; Ball* pBallObject; int vectorBlockSize; int vectorUnitCountX; int vectorUnitCountY; int vectorBallSize; pDecl = new TiXmlDeclaration("1.0", "euc-kr", ""); doc.LinkEndChild(pDecl); // ----- Set a Strip Data ----- // pRoot = new TiXmlElement(ROOT_NAME_STRIP); pRoot->SetDoubleAttribute(ATTR_NAME_WIDTH, _pPimpl->dWidth); pRoot->SetDoubleAttribute(ATTR_NAME_HEIGHT, _pPimpl->dHeight); doc.LinkEndChild(pRoot); // ----- Insert a Block Data ----- // pBlockObject = FirstBlock(); if (pBlockObject != NULL) { do { pBlockNode = new TiXmlElement(NODE_NAME_BLOCK); pBlockNode->SetDoubleAttribute(ATTR_NAME_COLUMN, pBlockObject->GetColumn ()); pBlockNode->SetDoubleAttribute(ATTR_NAME_ROW, pBlockObject->GetRow ()); pBlockNode->SetDoubleAttribute(ATTR_NAME_WIDTH, pBlockObject->GetWidth ()); pBlockNode->SetDoubleAttribute(ATTR_NAME_HEIGHT, pBlockObject->GetHeight ()); pBlockNode->SetDoubleAttribute(ATTR_NAME_START_X, pBlockObject->GetStartX ()); pBlockNode->SetDoubleAttribute(ATTR_NAME_START_Y, pBlockObject->GetStartY ()); // ----- Insert a Unit (in Block) Data ----- // pUnitObject = pBlockObject->FirstUnit(); if (pUnitObject != NULL) { do { pUnitNode = new TiXmlElement(NODE_NAME_UNIT); pUnitNode->SetDoubleAttribute(ATTR_NAME_COLUMN, pUnitObject->GetColumn ()); pUnitNode->SetDoubleAttribute(ATTR_NAME_ROW, pUnitObject->GetRow ()); pUnitNode->SetDoubleAttribute(ATTR_NAME_START_X, pUnitObject->GetStartX ()); pUnitNode->SetDoubleAttribute(ATTR_NAME_START_Y, pUnitObject->GetStartY ()); pUnitNode->SetDoubleAttribute(ATTR_NAME_CENTER_X, pUnitObject->GetCenterX ()); pUnitNode->SetDoubleAttribute(ATTR_NAME_CENTER_Y, pUnitObject->GetCenterY ()); pUnitNode->SetDoubleAttribute(ATTR_NAME_WIDTH, pUnitObject->GetWidth ()); pUnitNode->SetDoubleAttribute(ATTR_NAME_HEIGHT, pUnitObject->GetHeight ()); // ----- Insert a Ball (in Unit) Data ----- // pBallObject = pUnitObject->FirstBall(); if (pBallObject != NULL) { do { pBallNode = new TiXmlElement(NODE_NAME_BALL); pBallNode->SetDoubleAttribute(ATTR_NAME_DIAMETER, pBallObject->GetDiameter ()); pBallNode->SetDoubleAttribute(ATTR_NAME_CENTER_X, pBallObject->GetCenterX ()); pBallNode->SetDoubleAttribute(ATTR_NAME_CENTER_Y, pBallObject->GetCenterY ()); pBallNode->SetDoubleAttribute(ATTR_NAME_BALL_STATUS, pBallObject->GetStatus ()); pUnitNode->LinkEndChild(pBallNode); } while ((pBallObject = pUnitObject->NextBall()) != NULL); } pBlockNode->LinkEndChild(pUnitNode); } while ((pUnitObject = pBlockObject->NextUnit()) != NULL); } pRoot->LinkEndChild(pBlockNode); } while ((pBlockObject = NextBlock()) != NULL); } // ----- Save and Close ----- // doc.SaveFile(stream); fclose(stream); return true; }