////TODO: ĂȂB

/**
 * t@CRp[^w肵āARNVɒʒmA_v^쐬܂B
 * r킪S_FALSEԂꍇA
 * 1NULLłȂv_pCollection1set_Item܂B
 * NULLł΁Aremove_Item܂B
 * lɁA2NULLłȂv_pCollection2set_Item܂B
 * NULLł΁Aremove_Item܂B
 * v_pCollection1Av_pCollection2́AꂩA͑osvłNULLwł܂B
 * ŕAIFileInfoComparatorAINamedFileInfoComparator̂ꂩĂȂ΂Ȃ܂B
 * ĂꍇINamedFileInfoComparatorp܂B
 * @param v_pComparator r@
 * @param v_pCollection1 ̃t@Co^RNVAsvȂNULL
 * @param v_pCollection2 Ẽt@Co^RNVAsvȂNULL
 * @param v_ppFileInfoComparator OA_v^r@i[|C^
 * @return ܂͎s\HRESULT
 */
extern "C" HRESULT __stdcall CreateFileInfoDiffAdaptorObject(IFileInfoComparator* v_pComparator, IFileInfoCollection* v_pCollection1, IFileInfoCollection* v_pCollection2, INamedFileInfoComparator** v_ppFileInfoComparator) throw();
//FIXME: fbhbN̉\B


/**
 * t@C̏ԃtO
 */
typedef enum FILE_CHANGE_STATE_
{
	FILE_CHANGE_STATE_NOCHANGE = 0,
	FILE_CHANGE_STATE_MODIFIED = 1, // ύXꂽ
	FILE_CHANGE_STATE_CREATED = 2,  // 쐬ꂽ
	FILE_CHANGE_STATE_REMOVED = 4   // 폜ꂽ
} FILE_CHANGE_STATE;

/**
 * t@C̏ԃtOύXۂɗp鉉Z^Cv
 */
typedef enum FILE_CHANGE_STATE_OPE_
{
	FILE_CHANGE_STATE_OPE_COPY = 0,
	FILE_CHANGE_STATE_OPE_OR = 1,
	FILE_CHANGE_STATE_OPE_AND = 2
} FILE_CHANGE_STATE_OPE;

/**
 * t@CACeo^܂͏㏑ƂɁÁA폜ƂɁȀԕωg[X܂B
 * 폜ꂽACéARNV̍폜pRNVɈړ܂B
 * ̍폜RNV́AsweepRemovedItemsɂĎ擾ł܂B
 * sweepRemovedItemsĂяoƁA폜RNV͋ɂȂ܂B
 * 폜RNVɂACeĂѓo^ƁA폜RNVʏ̃RNVɈړA
 * ԕωp܂B
 */
class __declspec(novtable, uuid("5CA466B2-06C2-45ca-B891-D4C6E0C888DB")) IFileInfoChangeCollection : public IFileInfoCollection
{
public:

	/**
	 * ꂩo^t@CɃZbgXe[gw肵܂B
	 * @param v_state Xe[g
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall set_State(const FILE_CHANGE_STATE v_state) throw() = 0;

	/**
	 * ꂩo^t@Cɘ_aŃZbgXe[g擾܂B
	 * v_state0̏ꍇ́AXe[g͕ω܂B
	 * @param v_pState Xe[gi[|C^
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall get_State(FILE_CHANGE_STATE* v_pState) throw() = 0;

	/**
	 * ꂩo^t@CɃZbgXe[g̉Z@w肵܂B
	 * @param v_state Xe[g̉Z@
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall set_StateOpe(const FILE_CHANGE_STATE v_state) throw() = 0;

	/**
	 * ꂩo^t@CɃZbgXe[g̉Z@擾܂B
	 * @param v_pState Xe[g̉Z@i[|C^
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall get_StateOpe(FILE_CHANGE_STATE* v_pState) throw() = 0;

	/**
	 * ꂩo^t@CɃZbg܂͏㏑ʒmw肵܂B
	 * @param v_pTimestamp Zbgʒm
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall set_Timestamp(const FILETIME* v_pTimestamp) throw() = 0;

	/**
	 * ꂩo^t@CɃZbg܂͏㏑ʒm擾܂B
	 * @param v_pTimestamp Zbgʒm󂯎|C^
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall get_Timestamp(FILETIME* v_pTimestamp) throw() = 0;

	/**
	 * ێĂt@CŎw肵rbg}XNAׂẴACe
	 * Xe[gw肵ƉZɂZbgȂ܂B
	 * v_state0̏ꍇ́AXe[gȂ̂ɂĂΏۂƂ܂B
	 * @param v_state Xe[g̃rbg}XN
	 * @param v_applyState VXe[g
	 * @param v_op Iy[V
	 * @param v_pSpan ̎ȑOΏۂƂ܂BNULL̏ꍇ́A͖܂B
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall applyState(FILE_CHANGE_STATE v_state, FILE_CHANGE_STATE v_applyState, FILE_CHANGE_STATE_OPE v_op, const FILETIME* v_pSpan) throw() = 0;

	/**
	 * ێĂLȃt@CRNVAw肵rbg}XNAׂẴACeRs[܂B
	 * v_state0̏ꍇ́AXe[gȂ̂ɂĂΏۂƂ܂B
	 * @param v_pFileInfoCollection Rs[̃|C^
	 * @param v_state Xe[g̃rbg}XN
	 * @param v_pSpan ̎ȑOΏۂƂ܂BNULL̏ꍇ́A͖܂B
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall copyItems(IFileInfoCollection** v_pFileInfoCollection, FILE_CHANGE_STATE v_state, const FILETIME* v_pSpan) throw() = 0;

	/**
	 * ێĂ폜ς݃RNVŁAw肵ȑÕACe܂B
	 * ꂽRNVv_pFileInfoCollectionɊi[܂B
	 * RNV̌X̃ACeIFileInfoɃANZX邱Ƃł܂A͍폜ȌłB
	 * svłNULLwł܂B
	 * @param v_pFileInfoCollection Rs[̃|C^
	 * @param v_state Xe[g̃rbg}XN
	 * @param v_pSpan ̎ȑOΏۂƂ܂BNULL̏ꍇ́A͖܂B
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall sweepRemovedItems(IFileInfoCollection** v_pFileInfoCollection, FILE_CHANGE_STATE v_state, const FILETIME* v_pSpan) throw() = 0;

	/**
	 * 폜ς݃RNVێĂ擾܂B
	 * @param v_pCount 폜ς݃RNV̌
	 * @return ܂͎s\HRESULT
	 */
	virtual HRESULT __stdcall get_RemovedItemCount(ULONG* v_pCount) throw() = 0;
};

/**
 * t@C̕ωg[XRNV\z܂B
 * ԂŁAXe[g0AIy[V[h0Aʒm1601-1-1 00:00:00̃IuWFNg쐬܂B
 * IFileInfoReceiverĂAset_Item̌ĂяoƓłB
 * lɁAIFileInfoCollectionComparableĂ܂B
 * //TODO: IPersistStreamInit邱ƁB
 * @param v_ppFileInfoChangeCollection RNVi[|C^
 * @return ܂͎s\HRESULT
 */
extern "C" HRESULT CreateFileInfoChangeCollectionObject(IFileInfoChangeCollection** v_ppFileInfoChangeCollection) throw();
