/* * EnumFormatEtc([in] dwDirection, [out] ppenumFormatetc) * Ownership of ppenumFormatetc transfers from callee to caller so reference count on ppenumFormatetc * must be incremented before returning. Caller is responsible for releasing ppenumFormatetc. */ private int EnumFormatEtc(int dwDirection, long /*int*/ ppenumFormatetc) { // only allow getting of data - SetData is not currently supported if (dwDirection == COM.DATADIR_SET) return COM.E_NOTIMPL; // what types have been registered? TransferData[] allowedDataTypes = new TransferData[0]; for (int i = 0; i < transferAgents.length; i++) { Transfer transferAgent = transferAgents[i]; if (transferAgent != null) { TransferData[] formats = transferAgent.getSupportedTypes(); TransferData[] newAllowedDataTypes = new TransferData[allowedDataTypes.length + formats.length]; System.arraycopy(allowedDataTypes, 0, newAllowedDataTypes, 0, allowedDataTypes.length); System.arraycopy(formats, 0, newAllowedDataTypes, allowedDataTypes.length, formats.length); allowedDataTypes = newAllowedDataTypes; } } OleEnumFORMATETC enumFORMATETC = new OleEnumFORMATETC(); enumFORMATETC.AddRef(); FORMATETC[] formats = new FORMATETC[allowedDataTypes.length]; for (int i = 0; i < formats.length; i++) { formats[i] = allowedDataTypes[i].formatetc; } enumFORMATETC.setFormats(formats); OS.MoveMemory(ppenumFormatetc, new long /*int*/[] {enumFORMATETC.getAddress()}, OS.PTR_SIZEOF); return COM.S_OK; }