コード例 #1
0
ファイル: Files.cs プロジェクト: Grief-Code/kilogram
        // 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());
        }
コード例 #2
0
ファイル: Files.cs プロジェクト: mtm9999/kilogram
        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);
        }
コード例 #3
0
ファイル: Files.cs プロジェクト: mtm9999/kilogram
        // 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()));
        }
コード例 #4
0
ファイル: Files.cs プロジェクト: Grief-Code/kilogram
        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;
        }