#include Nuker::Nuker(ComPointer &graphBuilder) : mGraphBuilder(graphBuilder) { mGraphBuilder->AddRef(); // make sure this does what you want (ie) we don't want the } // graphBuilder to be destroyed when the constructor fires Nuker::~Nuker() { } bool Nuker::nukeFilter(ComPointer &baseFilter,bool nukeDownstream,bool isDeviceFilter) { ComPointer enumPins; ComPointer pin; ULONG fetched=0; PIN_INFO pinInfo; if(!baseFilter.isOkay())return false; if(!ComResult(baseFilter->EnumPins((IEnumPins**)enumPins)).success()) message("[Nuker::nukeFilter]baseFilter->EnumPins((IEnumPins**)enumPins) failed."); enumPins->Reset(); while(ComResult(enumPins->Next(1,(IPin**)pin,&fetched)).success()) { ComPointer toPin; if(!pin.isOkay())break; if(ComResult(pin->ConnectedTo((IPin**)toPin)).success()&&toPin.isOkay()) { if(!ComResult(toPin->QueryPinInfo(&pinInfo)).success()) message("[Nuker::nukeFilter]toPin->QueryPinInfo(&pinInfo) Failed."); if(PINDIR_INPUT==pinInfo.dir && nukeDownstream) { ComPointer pinFilter(pinInfo.pFilter); nukeFilter(pinFilter,nukeDownstream,isDeviceFilter); // have to do something with first argument mGraphBuilder->Disconnect(toPin); mGraphBuilder->Disconnect(pin); if(!isDeviceFilter) { if(!ComResult(mGraphBuilder->RemoveFilter(pinInfo.pFilter)).success()) { message("[Nuker::nukeFilter] mGraphBuilder->RemoveFilter(pinInfo.pFilter)."); } } } } } return true; }