/// <summary> /// データ転送が無いオペレーションを実行する /// </summary> /// <param name="device"></param> /// <param name="code"></param> /// <param name="param"></param> /// <returns></returns> private static MtpResponse executeNoDataCommand(PortableDevice device, ushort code, uint[] param) { IPortableDeviceValues spResults; int ret; uint responseCode; uint[] responseParam; // MTPコマンドとパラメータを構築する IPortableDeviceValues mtpCommand = createMtpCommand(code, WpdProperty.WPD_COMMAND_MTP_EXT_EXECUTE_COMMAND_WITHOUT_DATA_PHASE); IPortableDevicePropVariantCollection mtpCommandParam = null; if (param != null) { mtpCommandParam = createMtpCommandParameter(param); mtpCommand.SetIPortableDevicePropVariantCollectionValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_OPERATION_PARAMS, mtpCommandParam); } // リクエストを送信 device.SendCommand(0, mtpCommand, out spResults); // コマンドとパラメータは以後不要なので解放 if (mtpCommandParam != null) { Marshal.ReleaseComObject(mtpCommandParam); } Marshal.ReleaseComObject(mtpCommand); // リクエストの結果を取得する spResults.GetErrorValue(ref WpdProperty.WPD_PROPERTY_COMMON_HRESULT, out ret); if (ret != 0) { // エラーなら終了 Marshal.ReleaseComObject(spResults); return(new MtpResponse(0, null, null)); } // レスポンスコードを取得する spResults.GetUnsignedIntegerValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_RESPONSE_CODE, out responseCode); // レスポンスパラメータを取得する responseParam = null; if (responseCode == 0x2001) { IPortableDevicePropVariantCollection resultValues = (IPortableDevicePropVariantCollection) new PortableDeviceTypesLib.PortableDevicePropVariantCollection(); spResults.GetIPortableDevicePropVariantCollectionValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_RESPONSE_PARAMS, out resultValues); uint count = 1; resultValues.GetCount(ref count); responseParam = new uint[count]; for (uint i = 0; i < count; i++) { tag_inner_PROPVARIANT value = new tag_inner_PROPVARIANT(); resultValues.GetAt(i, ref value); responseParam[i] = getUintValue(value); } Marshal.ReleaseComObject(resultValues); } Marshal.ReleaseComObject(spResults); return(new MtpResponse((ushort)responseCode, responseParam, null)); }
public static IEnumerable <string> ToStrings(this IPortableDevicePropVariantCollection col) { uint count = 0; col.GetCount(ref count); for (uint i = 0; i < count; i++) { PROPVARIANT val = new PROPVARIANT(); col.GetAt(i, ref val); yield return(PropVariant.FromValue(val)); } }
public static IEnumerable <TEnum> ToEnum <TEnum>(this IPortableDevicePropVariantCollection col) where TEnum : struct // enum { uint count = 0; col.GetCount(ref count); for (uint i = 0; i < count; i++) { PROPVARIANT val = new PROPVARIANT(); col.GetAt(i, ref val); yield return(GetEnumFromAttrGuid <TEnum>(PropVariant.FromValue(val))); } }
public static IEnumerable <TEnum> ToEnum <TEnum>(this IPortableDevicePropVariantCollection col) where TEnum : struct // enum { uint count = 0; col.GetCount(ref count); for (uint i = 0; i < count; i++) { PropVariantFacade val = new PropVariantFacade(); col.GetAt(i, ref val.Value); yield return(GetEnumFromAttrGuid <TEnum>(val.ToGuid())); } }
public static IEnumerable <string> ToStrings(this IPortableDevicePropVariantCollection col) { uint count = 0; col.GetCount(ref count); for (uint i = 0; i < count; i++) { using (PropVariantFacade val = new PropVariantFacade()) { col.GetAt(i, ref val.Value); yield return(val.ToString()); } } }
/// <summary> /// EndDataTransferを送信する /// </summary> /// <param name="device"></param> /// <param name="context"></param> /// <returns></returns> private static void sendEndDataTransfer(PortableDevice device, string context, out uint responseCode, out uint[] responseParam) { IPortableDeviceValues mtpEndDataTransfer = (IPortableDeviceValues) new PortableDeviceTypesLib.PortableDeviceValues(); mtpEndDataTransfer.SetGuidValue(ref WpdProperty.WPD_PROPERTY_COMMON_COMMAND_CATEGORY, ref WpdProperty.WPD_COMMAND_MTP_EXT_END_DATA_TRANSFER.fmtid); mtpEndDataTransfer.SetUnsignedIntegerValue(ref WpdProperty.WPD_PROPERTY_COMMON_COMMAND_ID, WpdProperty.WPD_COMMAND_MTP_EXT_END_DATA_TRANSFER.pid); mtpEndDataTransfer.SetStringValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_TRANSFER_CONTEXT, context); IPortableDeviceValues spResults; device.SendCommand(0, mtpEndDataTransfer, out spResults); Marshal.ReleaseComObject(mtpEndDataTransfer); int ret = 1; spResults.GetErrorValue(ref WpdProperty.WPD_PROPERTY_COMMON_HRESULT, out ret); if (ret != 0) { Marshal.ReleaseComObject(spResults); responseCode = 0; responseParam = null; return; } // レスポンスコード spResults.GetUnsignedIntegerValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_RESPONSE_CODE, out responseCode); // パラメータ responseParam = null; if (responseCode == 0x2001) { IPortableDevicePropVariantCollection resultValues = (IPortableDevicePropVariantCollection) new PortableDeviceTypesLib.PortableDevicePropVariantCollection(); spResults.GetIPortableDevicePropVariantCollectionValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_RESPONSE_PARAMS, out resultValues); uint count = 1; resultValues.GetCount(ref count); responseParam = new uint[count]; for (uint i = 0; i < count; i++) { tag_inner_PROPVARIANT value = new tag_inner_PROPVARIANT(); resultValues.GetAt(i, ref value); responseParam[i] = getUintValue(value); } Marshal.ReleaseComObject(resultValues); } Marshal.ReleaseComObject(spResults); }
public static Guid[] ToGuid(this IPortableDevicePropVariantCollection col) { uint count = 0; col.GetCount(ref count); var result = new Guid[count]; for (uint i = 0; i < count; i++) { PROPVARIANT val = new PROPVARIANT(); col.GetAt(i, ref val); result[i] = PropVariant.FromValue(val); } return(result); }
public static TEnum[] ToArray <TEnum>(this IPortableDevicePropVariantCollection col) where TEnum : struct // enum { uint count = 0; col.GetCount(ref count); var result = new TEnum[count]; for (uint i = 0; i < count; i++) { PROPVARIANT val = new PROPVARIANT(); col.GetAt(i, ref val); result[i] = GetEnumFromAttrGuid <TEnum>(PropVariant.FromValue(val)); } return(result); }
public static void WriteObject(IPortableDevicePropVariantCollection collection) { Trace.WriteLine("###############################"); uint num = 0; collection.GetCount(ref num); for (uint index = 0; index < num; index++) { using (PropVariantFacade val = new PropVariantFacade()) { collection.GetAt(index, ref val.Value); Trace.WriteLine($"##### {val.ToString()}"); } } }