/// <summary> /// Inspired by http://cgeers.com/2012/04/17/wpd-transfer-content-to-a-device/ /// </summary> /// <param name="parentObject"></param> /// <param name="sourceStream"></param> /// <param name="name"></param> /// <param name="originalFileName"></param> /// <param name="size"></param> public PortableDeviceObject Push(PortableDeviceContainerObject parentObject, Stream sourceStream, string name, string originalFileName, ulong size, PushProgressReport progressReport) { IPortableDeviceContent content; portableDeviceClass.Content(out content); IPortableDeviceValues values = GetRequiredPropertiesForPush(parentObject, name, originalFileName, size); IStream tempStream; uint optimalTransferSizeBytes = 0; content.CreateObjectWithPropertiesAndData(values, out tempStream, ref optimalTransferSizeBytes, null); var targetStream = (System.Runtime.InteropServices.ComTypes.IStream)tempStream; try { int totalBytesRead = 0; if (progressReport != null) { progressReport(totalBytesRead); } var buffer = new byte[optimalTransferSizeBytes]; int bytesRead; do { bytesRead = sourceStream.Read(buffer, 0, (int)optimalTransferSizeBytes); IntPtr pcbWritten = IntPtr.Zero; if (bytesRead < (int)optimalTransferSizeBytes) { targetStream.Write(buffer, bytesRead, pcbWritten); } else { targetStream.Write(buffer, (int)optimalTransferSizeBytes, pcbWritten); } totalBytesRead += bytesRead; if (progressReport != null) { progressReport(totalBytesRead); } } while (bytesRead > 0); targetStream.Commit(0); device.Update(ref content, parentObject); // TODO There is no IPortableDeviceDataStream in C# port to get ID, so we will make a bicycle return(Find("^" + originalFileName + "$", parentObject).First()); } finally { Marshal.ReleaseComObject(tempStream); } }
public PortableDeviceObject Push(PortableDeviceContainerObject parentObject, Stream sourceStream, string originalFileName, ulong size, PushProgressReport progressReport) { return(Push(parentObject, sourceStream, originalFileName, originalFileName, size, progressReport)); }