/// <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));
 }