Move upload helper to helpers

This commit is contained in:
Ilya P 2016-10-23 14:12:34 +03:00
parent 6d106b4425
commit b823c34078
3 changed files with 137 additions and 137 deletions

View file

@ -63,7 +63,7 @@
<Compile Include="Network\TcpTransport.cs" /> <Compile Include="Network\TcpTransport.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Requests\AckRequest.cs" /> <Compile Include="Requests\AckRequest.cs" />
<Compile Include="Requests\UploadHelper.cs" /> <Compile Include="Utils\UploadHelper.cs" />
<Compile Include="Session.cs" /> <Compile Include="Session.cs" />
<Compile Include="TelegramClient.cs" /> <Compile Include="TelegramClient.cs" />
<Compile Include="Utils\Helpers.cs" /> <Compile Include="Utils\Helpers.cs" />

View file

@ -1,136 +1,135 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using TeleSharp.TL; using TeleSharp.TL;
using TeleSharp.TL.Upload; using TeleSharp.TL.Upload;
using TLSharp.Core.Utils;
namespace TLSharp.Core.Utils
namespace TLSharp.Core.Requests {
{ public static class UploadHelper
public static class UploadHelper {
{ private static string GetFileHash(byte[] data)
private static string GetFileHash(byte[] data) {
{ string md5_checksum;
string md5_checksum; using (var md5 = MD5.Create())
using (var md5 = MD5.Create()) {
{ var hash = md5.ComputeHash(data);
var hash = md5.ComputeHash(data); var hashResult = new StringBuilder(hash.Length * 2);
var hashResult = new StringBuilder(hash.Length * 2);
foreach (byte t in hash)
foreach (byte t in hash) hashResult.Append(t.ToString("x2"));
hashResult.Append(t.ToString("x2"));
md5_checksum = hashResult.ToString();
md5_checksum = hashResult.ToString(); }
}
return md5_checksum;
return md5_checksum; }
}
public static async Task<TLAbsInputFile> UploadFile(this TelegramClient client, string name, StreamReader reader)
public static async Task<TLAbsInputFile> UploadFile(this TelegramClient client, string name, StreamReader reader) {
{ const long tenMb = 10 * 1024 * 1024;
const long tenMb = 10 * 1024 * 1024; return await UploadFile(name, reader, client, reader.BaseStream.Length >= tenMb);
return await UploadFile(name, reader, client, reader.BaseStream.Length >= tenMb); }
}
private static byte[] GetFile(StreamReader reader)
private static byte[] GetFile(StreamReader reader) {
{ var file = new byte[reader.BaseStream.Length];
var file = new byte[reader.BaseStream.Length];
using (reader)
using (reader) {
{ reader.BaseStream.Read(file, 0, (int)reader.BaseStream.Length);
reader.BaseStream.Read(file, 0, (int)reader.BaseStream.Length); }
}
return file;
return file; }
}
private static Queue<byte[]> GetFileParts(byte[] file)
private static Queue<byte[]> GetFileParts(byte[] file) {
{ var fileParts = new Queue<byte[]>();
var fileParts = new Queue<byte[]>();
const int maxFilePart = 512 * 1024;
const int maxFilePart = 512 * 1024;
using (var stream = new MemoryStream(file))
using (var stream = new MemoryStream(file)) {
{ while (stream.Position != stream.Length)
while (stream.Position != stream.Length) {
{ if ((stream.Length - stream.Position) > maxFilePart)
if ((stream.Length - stream.Position) > maxFilePart) {
{ var temp = new byte[maxFilePart];
var temp = new byte[maxFilePart]; stream.Read(temp, 0, maxFilePart);
stream.Read(temp, 0, maxFilePart); fileParts.Enqueue(temp);
fileParts.Enqueue(temp); }
} else
else {
{ var length = stream.Length - stream.Position;
var length = stream.Length - stream.Position; var temp = new byte[length];
var temp = new byte[length]; stream.Read(temp, 0, (int)(length));
stream.Read(temp, 0, (int)(length)); fileParts.Enqueue(temp);
fileParts.Enqueue(temp); }
} }
} }
}
return fileParts;
return fileParts; }
}
private static async Task<TLAbsInputFile> UploadFile(string name, StreamReader reader,
private static async Task<TLAbsInputFile> UploadFile(string name, StreamReader reader, TelegramClient client, bool isBigFileUpload)
TelegramClient client, bool isBigFileUpload) {
{ var file = GetFile(reader);
var file = GetFile(reader); var fileParts = GetFileParts(file);
var fileParts = GetFileParts(file);
int partNumber = 0;
int partNumber = 0; int partsCount = fileParts.Count;
int partsCount = fileParts.Count; long file_id = BitConverter.ToInt64(Helpers.GenerateRandomBytes(8), 0);
long file_id = BitConverter.ToInt64(Helpers.GenerateRandomBytes(8), 0); while (fileParts.Count != 0)
while (fileParts.Count != 0) {
{ var part = fileParts.Dequeue();
var part = fileParts.Dequeue();
if (isBigFileUpload)
if (isBigFileUpload) {
{ await client.SendRequestAsync<bool>(new TLRequestSaveBigFilePart
await client.SendRequestAsync<bool>(new TLRequestSaveBigFilePart {
{ file_id = file_id,
file_id = file_id, file_part = partNumber,
file_part = partNumber, bytes = part,
bytes = part, file_total_parts = partsCount
file_total_parts = partsCount });
}); }
} else
else {
{ await client.SendRequestAsync<bool>(new TLRequestSaveFilePart
await client.SendRequestAsync<bool>(new TLRequestSaveFilePart {
{ file_id = file_id,
file_id = file_id, file_part = partNumber,
file_part = partNumber, bytes = part
bytes = part });
}); }
} partNumber++;
partNumber++; }
}
if (isBigFileUpload)
if (isBigFileUpload) {
{ return new TLInputFileBig
return new TLInputFileBig {
{ id = file_id,
id = file_id, name = name,
name = name, parts = partsCount
parts = partsCount };
}; }
} else
else {
{ return new TLInputFile
return new TLInputFile {
{ id = file_id,
id = file_id, name = name,
name = name, parts = partsCount,
parts = partsCount, md5_checksum = GetFileHash(file)
md5_checksum = GetFileHash(file) };
}; }
} }
} }
} }
}

View file

@ -12,6 +12,7 @@ using TeleSharp.TL;
using TeleSharp.TL.Messages; using TeleSharp.TL.Messages;
using TLSharp.Core; using TLSharp.Core;
using TLSharp.Core.Requests; using TLSharp.Core.Requests;
using TLSharp.Core.Utils;
namespace TLSharp.Tests namespace TLSharp.Tests
{ {