/// <summary> /// File upload packet of segments to upload in separated threads /// </summary> /// <param name="AccountSrc"></param> /// <param name="AccountDst"></param> /// <param name="MailSendParam_"></param> /// <param name="MF"></param> /// <param name="FileName"></param> /// <param name="FileSegmentProgress"></param> /// <param name="FileSegmentCount"></param> /// <param name="FileSegmentToDo"></param> /// <param name="FileSegmentSize"></param> /// <param name="SegmentMode"></param> /// <param name="SegmentImageSize"></param> /// <param name="cancel"></param> public static bool FileUploadMsg(int[] AccountSrc, int[] AccountDst, List <MailSendParam> MailSendParam_, ref MailFile[] MF, string[] FileName, ref int[] FileSegmentProgress, int[] FileSegmentCount, int[] FileSegmentToDo, int FileSegmentSize, int SegmentMode, int SegmentImageSize, CancellationTokenSource cancel) { Stopwatch_ SW = new Stopwatch_(); // Assign slots to each used account to reuse as many of existing connection as possible for (int i = 0; i < AccountSrc.Length; i++) { int SmtpClientSlot = 0; HashSet <int> SmtpClientSlotUsed = new HashSet <int>(); SmtpClientSlotUsed.Clear(); for (int ii = 0; ii < MailSendParam_.Count; ii++) { if (MailSendParam_[ii].AccountSrcN == i) { SmtpClientSlotUsed.Add(MailSendParam_[ii].SmtpClientSlot); } } while (SmtpClientSlotUsed.Contains(SmtpClientSlot)) { SmtpClientSlot++; } for (int ii = 0; ii < MailSendParam_.Count; ii++) { if (MailSendParam_[ii].AccountSrcN == i) { if (MailSendParam_[ii].SmtpClientSlot < 0) { MailSendParam_[ii].SmtpClientSlot = SmtpClientSlot; SmtpClientSlot++; } } } } // Size of segment packet int TotalSize = 0; int I = 0; // If number of sending threads is 1, there is not necessary to create separate thread if (MailSendParam_.Count == 1) { MailSendParam MailSendParam___ = MailSendParam_[0]; MailSendParam___.Idx = I; MailSendParam___.ThreadNo = 1; MailSend(ref MailSendParam___, FileName, FileSegmentSize, FileSegmentCount, MailAccountList, AccountDst, SegmentMode, SegmentImageSize, cancel); } else { List <Thread> Thr = new List <Thread>(); while ((I < MailSendParam_.Count) && (I < ThreadsUpload)) { MailSendParam MailSendParam___ = MailSendParam_[I]; MailSendParam___.Idx = I; MailSendParam___.ThreadNo = Thr.Count + 1; Thread Thr_ = new Thread(() => MailSend(ref MailSendParam___, FileName, FileSegmentSize, FileSegmentCount, MailAccountList, AccountDst, SegmentMode, SegmentImageSize, cancel)); Thr_.Start(); Thr.Add(Thr_); I++; } foreach (Thread Thr_ in Thr) { Thr_.Join(); } I--; } // Encounting data size and removing segments from packet, which are sent correctly, // changing account number to next number in current group for not sent segments bool UploadedSomething = false; while (I >= 0) { if (MailSendParam_[I].Good) { UploadedSomething = true; MF[MailSendParam_[I].FileI].MapSet(MailSendParam_[I].FileSegmentNum, 1); FileSegmentProgress[MailSendParam_[I].FileI]++; TotalSize += MailSendParam_[I].FileSegmentSize; MailSendParam_.RemoveAt(I); } else { MF[MailSendParam_[I].FileI].MapSet(MailSendParam_[I].FileSegmentNum, 0); MailSendParam_[I].AccountSrcN++; if (AccountSrc[MailSendParam_[I].AccountSrcN] < 0) { MailSendParam_[I].AccountSrcN--; while (AccountSrc[MailSendParam_[I].AccountSrcN] >= 0) { MailSendParam_[I].AccountSrcN--; } MailSendParam_[I].AccountSrcN++; } MailSendParam_[I].AccountSrc = AccountSrc[MailSendParam_[I].AccountSrcN]; MailSendParam_[I].SmtpClientSlot = -1; } I--; } // Print progress after packet send attemp and transfer of the packet segments long GetDataSizeSum = 0; long GetDataSizeSegSum = 0; int FileSegmentProgressSum = 0; int FileSegmentToDoSum = 0; for (int i_ = 0; i_ < MF.Length; i_++) { GetDataSizeSum += MF[i_].GetDataSize(); GetDataSizeSegSum += MF[i_].GetDataSizeSeg(); FileSegmentProgressSum += FileSegmentProgress[i_]; FileSegmentToDoSum += FileSegmentToDo[i_]; } Console_WriteLine("Upload progress: " + FileSegmentProgressSum + "/" + FileSegmentToDoSum); Console_WriteLine("Upload speed: " + KBPS(TotalSize, SW.Elapsed())); Log(TSW.Elapsed().ToString(), LogDiffS(FileSegmentProgressSum).ToString(), FileSegmentProgressSum.ToString(), FileSegmentToDoSum.ToString(), LogDiffB(KBPS_Bytes).ToString(), KBPS_B(), GetDataSizeSum.ToString(), GetDataSizeSegSum.ToString()); // If uploaded something, return true, otherwise return false if (UploadedSomething) { return(true); } else { return(false); } }