private IStream CreateAndOpenFile(string fileName, long fileSize) { string targetFolder, rawFileName; PortableDeviceFolder parentFolder; PortableDeviceFile result; IStream stream; stream = null; targetFolder = GetDirectoryNameUnsafe(fileName); rawFileName = fileName.Split('\\').Last();//Path.GetFileName(fileName); parentFolder = GetFolder(targetFolder); if (parentFolder != null) { //parentFolder.RefreshContent(); //result = parentFolder.Files.Where(x => x.Name.ToLower() == rawFileName.ToLower()).FirstOrDefault() as PortableDeviceFile; //if (result == null) //{ IPortableDeviceProperties deviceProperties; parentFolder.content.Properties(out deviceProperties); IPortableDeviceValues deviceValues = (IPortableDeviceValues) new PortableDeviceTypesLib.PortableDeviceValues(); deviceValues.SetStringValue(ref PortableDeviceConstants.WPD_OBJECT_PARENT_ID, parentFolder.Id); deviceValues.SetStringValue(ref PortableDeviceConstants.WPD_OBJECT_NAME, rawFileName); deviceValues.SetStringValue(ref PortableDeviceConstants.WPD_OBJECT_ORIGINAL_FILE_NAME, rawFileName); deviceValues.SetUnsignedLargeIntegerValue(ref PortableDeviceConstants.WPD_OBJECT_SIZE, (ulong)fileSize); // deviceValues.SetGuidValue(ref PortableDeviceConstants.WPD_OBJECT_CONTENT_TYPE, ref PortableDeviceConstants.WPD_CONTENT_TYPE_GENERIC_FILE); //string objectId = string.Empty; parentFolder.parentDevice.Connect(); //parentFolder.content.CreateObjectWithPropertiesOnly(deviceValues, ref objectId); parentFolder.content.CreateObjectWithPropertiesAndData(deviceValues, out stream, 0, null); //parentFolder.parentDevice.Disconnect(); //} //else // throw new Exception("File already exists"); } else { throw new Exception("Unable to find folder for creating file"); } return(stream); }
private void GetRequiredPropertiesForAllType(string sourcePath, string parentFolderId, out IPortableDeviceValues values) { values = (IPortableDeviceValues) new PortableDeviceTypesLib.PortableDeviceValues(); values.SetStringValue(ref GlobalVar.WPD_OBJECT_NAME, Path.GetFileNameWithoutExtension(sourcePath)); //File name without extension values.SetStringValue(ref GlobalVar.WPD_OBJECT_ORIGINAL_FILE_NAME, Path.GetFileName(sourcePath)); //Full file name values.SetStringValue(ref GlobalVar.WPD_OBJECT_PARENT_ID, parentFolderId); //ParentID values.SetUnsignedLargeIntegerValue(ref GlobalVar.WPD_OBJECT_SIZE, (ulong)(new FileInfo(sourcePath).Length)); //File size }
/// <summary> /// データ送信を伴うMTPオペレーションを実行する /// </summary> /// <param name="device"></param> /// <param name="code"></param> /// <param name="param"></param> /// <param name="data"></param> /// <returns></returns> private static MtpResponse executeDataWriteCommand(PortableDevice device, ushort code, uint[] param, byte[] data, bool noReadResponseParam) { int ret = 1; string context; uint writtenSize; uint responseCode; uint[] responseParam; IPortableDeviceValues spResults; // MTPコマンドとパラメータを構築する IPortableDeviceValues mtpCommand = createMtpCommand(code, WpdProperty.WPD_COMMAND_MTP_EXT_EXECUTE_COMMAND_WITH_DATA_TO_WRITE); IPortableDevicePropVariantCollection mtpCommandParam = null; if (param != null) { mtpCommandParam = createMtpCommandParameter(param); mtpCommand.SetIPortableDevicePropVariantCollectionValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_OPERATION_PARAMS, mtpCommandParam); } // 送信するデータのサイズを設定する mtpCommand.SetUnsignedLargeIntegerValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_TRANSFER_TOTAL_DATA_SIZE, (ulong)data.Length); // リクエストを送信 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)); } // contextを取得する spResults.GetStringValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_TRANSFER_CONTEXT, out context); Marshal.ReleaseComObject(spResults); // データ送信用のコマンドを構築する mtpCommand = (IPortableDeviceValues) new PortableDeviceTypesLib.PortableDeviceValues(); mtpCommand.SetGuidValue(ref WpdProperty.WPD_PROPERTY_COMMON_COMMAND_CATEGORY, ref WpdProperty.WPD_COMMAND_MTP_EXT_WRITE_DATA.fmtid); mtpCommand.SetUnsignedIntegerValue(ref WpdProperty.WPD_PROPERTY_COMMON_COMMAND_ID, WpdProperty.WPD_COMMAND_MTP_EXT_WRITE_DATA.pid); mtpCommand.SetStringValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_TRANSFER_CONTEXT, context); mtpCommand.SetUnsignedIntegerValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_TRANSFER_NUM_BYTES_TO_WRITE, (uint)data.Length); mtpCommand.SetBufferValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_TRANSFER_DATA, ref data[0], (uint)data.Length); // データを送信する device.SendCommand(0, mtpCommand, out spResults); Marshal.ReleaseComObject(mtpCommand); // データ送信の結果を取得する spResults.GetErrorValue(ref WpdProperty.WPD_PROPERTY_COMMON_HRESULT, out ret); if (ret != 0) { // エラーなら終了 Marshal.ReleaseComObject(spResults); if (mtpCommandParam != null) { Marshal.ReleaseComObject(mtpCommandParam); } return(new MtpResponse(0, null, null)); } // デバイスが受け取ったデータサイズを取得する spResults.GetUnsignedIntegerValue(ref WpdProperty.WPD_PROPERTY_MTP_EXT_TRANSFER_NUM_BYTES_WRITTEN, out writtenSize); Marshal.ReleaseComObject(spResults); // DataEndTransfer(レスポンス)を送信する sendEndDataTransfer(device, context, out responseCode, out responseParam, noReadResponseParam); return(new MtpResponse((ushort)responseCode, responseParam, null)); }
public uint ExecuteWriteData(uint code, byte[] data, params uint[] parameters) { // source: http://msdn.microsoft.com/en-us/library/windows/desktop/ff384843(v=vs.85).aspx // and view-source:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_26860397.html // error codes http://msdn.microsoft.com/en-us/library/windows/desktop/dd319335(v=vs.85).aspx //byte[] imgdate = new byte[8]; IPortableDeviceValues commandValues = (IPortableDeviceValues) new PortableDeviceTypesLib.PortableDeviceValuesClass(); IPortableDeviceValues pParameters = (IPortableDeviceValues) new PortableDeviceTypesLib.PortableDeviceValues(); IPortableDevicePropVariantCollection propVariant = (IPortableDevicePropVariantCollection) new PortableDeviceTypesLib.PortableDevicePropVariantCollection(); IPortableDeviceValues pResults; //commandValues.SetGuidValue(ref PortableDevicePKeys.WPD_PROPERTY_COMMON_COMMAND_CATEGORY, ref command.fmtid); commandValues.SetGuidValue(PortableDevicePKeys.WPD_PROPERTY_COMMON_COMMAND_CATEGORY, PortableDevicePKeys.WPD_COMMAND_MTP_EXT_EXECUTE_COMMAND_WITH_DATA_TO_WRITE.fmtid); commandValues.SetUnsignedIntegerValue(PortableDevicePKeys.WPD_PROPERTY_COMMON_COMMAND_ID, PortableDevicePKeys.WPD_COMMAND_MTP_EXT_EXECUTE_COMMAND_WITH_DATA_TO_WRITE.pid); commandValues.SetBufferValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_TRANSFER_DATA, ref data[0], (uint)data.Length); foreach (uint parameter in parameters) { tag_inner_PROPVARIANT vparam = new tag_inner_PROPVARIANT(); UintToPropVariant(parameter, out vparam); propVariant.Add(ref vparam); } commandValues.SetIPortableDevicePropVariantCollectionValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_OPERATION_PARAMS, propVariant); commandValues.SetUnsignedLargeIntegerValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_TRANSFER_TOTAL_DATA_SIZE, (ulong)data.Length); commandValues.SetUnsignedIntegerValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_OPERATION_CODE, (uint)code); // According to documentation, first parameter should be 0 (see http://msdn.microsoft.com/en-us/library/dd375691%28v=VS.85%29.aspx) this.portableDeviceClass.SendCommand(0, commandValues, out pResults); try { int pValue = 0; pResults.GetErrorValue(PortableDevicePKeys.WPD_PROPERTY_COMMON_HRESULT, out pValue); if (pValue != 0) { return((uint)pValue); } //uint mtperror; //pResults.GetUnsignedIntegerValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_RESPONSE_CODE, out mtperror); //if (mtperror != 0) // return mtperror; } catch (Exception) { } string tmpTransferContext = string.Empty; pResults.GetStringValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_TRANSFER_CONTEXT, out tmpTransferContext); pParameters.Clear(); pResults.Clear(); pParameters.SetGuidValue(PortableDevicePKeys.WPD_PROPERTY_COMMON_COMMAND_CATEGORY, PortableDevicePKeys.WPD_COMMAND_MTP_EXT_WRITE_DATA.fmtid); pParameters.SetUnsignedIntegerValue(ref PortableDevicePKeys.WPD_PROPERTY_COMMON_COMMAND_ID, PortableDevicePKeys.WPD_COMMAND_MTP_EXT_WRITE_DATA.pid); pParameters.SetStringValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_TRANSFER_CONTEXT, tmpTransferContext); pParameters.SetBufferValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_TRANSFER_DATA, ref data[0], (uint)data.Length); pParameters.SetUnsignedIntegerValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_TRANSFER_NUM_BYTES_TO_WRITE, (uint)data.Length); pParameters.SetIPortableDevicePropVariantCollectionValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_OPERATION_PARAMS, propVariant); portableDeviceClass.SendCommand(0, pParameters, out pResults); try { int pValue = 0; pResults.GetErrorValue(PortableDevicePKeys.WPD_PROPERTY_COMMON_HRESULT, out pValue); if (pValue != 0) { return((uint)pValue); } //uint mtperror; //pResults.GetUnsignedIntegerValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_RESPONSE_CODE, out mtperror); //if (mtperror != 0) // return mtperror; } catch (Exception) { } pParameters.Clear(); pResults.Clear(); { pParameters.SetGuidValue(PortableDevicePKeys.WPD_PROPERTY_COMMON_COMMAND_CATEGORY, PortableDevicePKeys.WPD_COMMAND_MTP_EXT_END_DATA_TRANSFER.fmtid); pParameters.SetUnsignedIntegerValue(ref PortableDevicePKeys.WPD_PROPERTY_COMMON_COMMAND_ID, PortableDevicePKeys.WPD_COMMAND_MTP_EXT_END_DATA_TRANSFER.pid); pParameters.SetStringValue(PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_TRANSFER_CONTEXT, tmpTransferContext); } portableDeviceClass.SendCommand(0, pParameters, out pResults); try { int tmpResult = 0; pResults.GetErrorValue(ref PortableDevicePKeys.WPD_PROPERTY_COMMON_HRESULT, out tmpResult); if (tmpResult != 0) { return((uint)tmpResult); } uint mtperror; pResults.GetUnsignedIntegerValue(ref PortableDevicePKeys.WPD_PROPERTY_MTP_EXT_RESPONSE_CODE, out mtperror); if (mtperror != 0) { return(mtperror); } } catch { } return(0); }