// upload public async Task<InputFile> UploadFile(string filename, Stream stream, FileUploadProcessHandler handler) { TLApi api = await session.GetFileSessionMain(); long fileId = Helpers.GenerateRandomLong(); MD5 hash = new MD5(); if(stream.Length < 128*1024) { handler(0.0f); byte[] data = new byte[stream.Length]; stream.Read(data, 0, (int) stream.Length); bool result = await api.upload_saveFilePart(fileId, 0, data); //while(result != true) { // result = await api.upload_saveFilePart(fileId, 0, data); //} hash.Update(data); handler(1.0f); return TL.inputFile(fileId, 1, filename, hash.FinalString()); } bool big = stream.Length > 10*1024*1024; float allStreamLength = stream.Length; int chunkSize = 128*1024; int chunkCount = (int) (stream.Length/chunkSize); int lastChunkSize = (int) (stream.Length - chunkSize*chunkCount); int allChunksCount = chunkCount + (lastChunkSize != 0 ? 1 : 0); for(int i = 0; i < chunkCount; i++) { handler((float) i*(float) chunkSize/allStreamLength); byte[] data = new byte[chunkSize]; stream.Read(data, 0, chunkSize); bool result = big ? await api.upload_saveBigFilePart(fileId, i, allChunksCount, data) : await api.upload_saveFilePart(fileId, i, data); //while(result != true) { // result = await api.upload_saveFilePart(fileId, i, data); //} hash.Update(data); } if(lastChunkSize != 0) { handler((float) chunkCount*(float) chunkSize/allStreamLength); byte[] lastChunkData = new byte[lastChunkSize]; stream.Read(lastChunkData, 0, lastChunkSize); bool lastChunkResult = big ? await api.upload_saveBigFilePart(fileId, chunkCount, allChunksCount, lastChunkData) : await api.upload_saveFilePart(fileId, chunkCount, lastChunkData); //while(lastChunkResult != true) { // lastChunkResult = await api.upload_saveFilePart(fileId, chunkCount, lastChunkData); //} hash.Update(lastChunkData); } handler(1.0f); return TL.inputFile(fileId, allChunksCount, filename, hash.FinalString()); }
public async Task <string> DownloadVideo(Video arg, FileUploadProcessHandler handler) { if (arg.Constructor == Constructor.videoEmpty) { return(null); } VideoConstructor video = (VideoConstructor)arg; TLApi api = await session.GetFileSession(video.dc_id); InputFileLocation inputFile = TL.inputVideoFileLocation(video.id, video.access_hash); string videoPath = GetVideoPath(video); string tempVideoPath = videoPath + ".tmp"; int allSize = video.size; int chunkSize = 128 * 1024; int chunksCount = allSize / chunkSize; int lastChunkSize = allSize - chunkSize * chunksCount; int allChunksCount = chunksCount + (lastChunkSize != 0 ? 1 : 0); using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) { if (storage.FileExists(videoPath)) { return(videoPath); } using (Stream stream = new IsolatedStorageFileStream(tempVideoPath, FileMode.OpenOrCreate, FileAccess.Write, storage)) { for (int i = 0; i < chunksCount; i++) { handler((float)i * (float)chunkSize / (float)allSize); Upload_fileConstructor chunk = (Upload_fileConstructor)await api.upload_getFile(inputFile, i *chunkSize, chunkSize); stream.Write(chunk.bytes, 0, chunk.bytes.Length); } if (lastChunkSize != 0) { handler((float)chunksCount * (float)chunkSize / (float)allSize); Upload_fileConstructor lastChunk = (Upload_fileConstructor)await api.upload_getFile(inputFile, chunksCount *chunkSize, lastChunkSize); stream.Write(lastChunk.bytes, 0, lastChunk.bytes.Length); } handler(1.0f); } if (storage.FileExists(videoPath)) { storage.DeleteFile(videoPath); } storage.MoveFile(tempVideoPath, videoPath); } return(videoPath); }
// upload public async Task <InputFile> UploadFile(string filename, Stream stream, FileUploadProcessHandler handler) { TLApi api = await session.GetFileSessionMain(); long fileId = Helpers.GenerateRandomLong(); MD5 hash = new MD5(); if (stream.Length < 128 * 1024) { handler(0.0f); byte[] data = new byte[stream.Length]; stream.Read(data, 0, (int)stream.Length); bool result = await api.upload_saveFilePart(fileId, 0, data); //while(result != true) { // result = await api.upload_saveFilePart(fileId, 0, data); //} hash.Update(data); handler(1.0f); return(TL.inputFile(fileId, 1, filename, hash.FinalString())); } bool big = stream.Length > 10 * 1024 * 1024; float allStreamLength = stream.Length; int chunkSize = 128 * 1024; int chunkCount = (int)(stream.Length / chunkSize); int lastChunkSize = (int)(stream.Length - chunkSize * chunkCount); int allChunksCount = chunkCount + (lastChunkSize != 0 ? 1 : 0); for (int i = 0; i < chunkCount; i++) { handler((float)i * (float)chunkSize / allStreamLength); byte[] data = new byte[chunkSize]; stream.Read(data, 0, chunkSize); bool result = big ? await api.upload_saveBigFilePart(fileId, i, allChunksCount, data) : await api.upload_saveFilePart(fileId, i, data); //while(result != true) { // result = await api.upload_saveFilePart(fileId, i, data); //} hash.Update(data); } if (lastChunkSize != 0) { handler((float)chunkCount * (float)chunkSize / allStreamLength); byte[] lastChunkData = new byte[lastChunkSize]; stream.Read(lastChunkData, 0, lastChunkSize); bool lastChunkResult = big ? await api.upload_saveBigFilePart(fileId, chunkCount, allChunksCount, lastChunkData) : await api.upload_saveFilePart(fileId, chunkCount, lastChunkData); //while(lastChunkResult != true) { // lastChunkResult = await api.upload_saveFilePart(fileId, chunkCount, lastChunkData); //} hash.Update(lastChunkData); } handler(1.0f); return(TL.inputFile(fileId, allChunksCount, filename, hash.FinalString())); }
public async Task<string> DownloadVideo(Video arg, FileUploadProcessHandler handler) { if(arg.Constructor == Constructor.videoEmpty) { return null; } VideoConstructor video = (VideoConstructor) arg; TLApi api = await session.GetFileSession(video.dc_id); InputFileLocation inputFile = TL.inputVideoFileLocation(video.id, video.access_hash); string videoPath = GetVideoPath(video); string tempVideoPath = videoPath + ".tmp"; int allSize = video.size; int chunkSize = 128*1024; int chunksCount = allSize/chunkSize; int lastChunkSize = allSize - chunkSize*chunksCount; int allChunksCount = chunksCount + (lastChunkSize != 0 ? 1 : 0); using(IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) { if (storage.FileExists(videoPath)) return videoPath; using(Stream stream = new IsolatedStorageFileStream(tempVideoPath, FileMode.OpenOrCreate, FileAccess.Write, storage)) { for (int i = 0; i < chunksCount; i++) { handler((float)i * (float)chunkSize / (float)allSize); Upload_fileConstructor chunk = (Upload_fileConstructor) await api.upload_getFile(inputFile, i*chunkSize, chunkSize); stream.Write(chunk.bytes, 0, chunk.bytes.Length); } if(lastChunkSize != 0) { handler((float)chunksCount * (float)chunkSize / (float)allSize); Upload_fileConstructor lastChunk = (Upload_fileConstructor) await api.upload_getFile(inputFile, chunksCount*chunkSize, lastChunkSize); stream.Write(lastChunk.bytes, 0, lastChunk.bytes.Length); } handler(1.0f); } if(storage.FileExists(videoPath)) { storage.DeleteFile(videoPath); } storage.MoveFile(tempVideoPath, videoPath); } return videoPath; }