ALERROR CEffectCreator::CreateSimpleFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc, const CString &sUNID, CEffectCreator **retpCreator) // CreateSimpleFromXML // // Creates the creator from an XML element { ALERROR error; CEffectCreator *pCreator; // Create the effect based on the tag if (error = CreateFromTag(pDesc->GetTag(), &pCreator)) { Ctx.sError = strPatternSubst(CONSTLIT("Invalid painter tag: %s"), pDesc->GetTag()); return error; } if (pCreator == NULL) return ERR_MEMORY; pCreator->m_sUNID = sUNID; // Type-specific creation if (error = pCreator->OnEffectCreateFromXML(Ctx, pDesc, sUNID)) return error; // Done *retpCreator = pCreator; return NOERROR; }
ALERROR CEffectCreator::CreateTypeFromXML (SDesignLoadCtx &Ctx, CXMLElement *pDesc, CEffectCreator **retpCreator) // CreateTypeFromXML // // Creates the class only. This is used by the main Design load code when we use // the full <EffectType> definition. { ALERROR error; CEffectCreator *pCreator; // Create the effect based on the child tag CXMLElement *pEffect = pDesc->GetContentElementByTag(EFFECT_TAG); if (pEffect == NULL) { Ctx.sError = CONSTLIT("<EffectType> must have an <Effect> sub-element."); return ERR_FAIL; } // If we've got no sub elements, then its a null creator if (pEffect->GetContentElementCount() == 0) pCreator = new CNullEffectCreator; // If we've got a single element, then we create a simple creator else if (pEffect->GetContentElementCount() == 1) { const CString &sTag = pEffect->GetContentElement(0)->GetTag(); if (error = CreateFromTag(sTag, &pCreator)) { Ctx.sError = strPatternSubst(CONSTLIT("Invalid effect tag: %s"), sTag); return error; } } // Otherwise we have a group else pCreator = new CEffectGroupCreator; // Done *retpCreator = pCreator; return NOERROR; }