Исходный код утилиты

This commit is contained in:
Maxim Volostnov
2026-07-14 10:21:05 +03:00
commit 5df6bfaa8d
19 changed files with 15106 additions and 0 deletions
+25
View File
@@ -0,0 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28010.2041
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Send_multimedia", "Send_multimedia\Send_multimedia.csproj", "{9C2C0CC0-55A7-481D-A6B5-FFB7DF03B7F8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9C2C0CC0-55A7-481D-A6B5-FFB7DF03B7F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9C2C0CC0-55A7-481D-A6B5-FFB7DF03B7F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C2C0CC0-55A7-481D-A6B5-FFB7DF03B7F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C2C0CC0-55A7-481D-A6B5-FFB7DF03B7F8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F22D503B-17F9-4B33-A947-01BA94C840AA}
EndGlobalSection
EndGlobal
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
</configuration>
+40
View File
@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Send_multimedia
{
class Config
{
public string path;
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,
string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,
string key, string def, StringBuilder retVal,
int size, string filePath);
public Config(string INIPath)
{
path = INIPath;
}
public void Write(string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, this.path);
}
public string Read(string Section, string Key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section, Key, "", temp,
255, this.path);
return temp.ToString();
}
}
}
+91
View File
@@ -0,0 +1,91 @@
namespace Send_multimedia
{
partial class Form1
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
this.label1 = new System.Windows.Forms.Label();
this.lab_versionPO = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// notifyIcon1
//
this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));
this.notifyIcon1.Text = "Tele2Med";
this.notifyIcon1.Visible = true;
this.notifyIcon1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseDoubleClick);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Roboto", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(172, 15);
this.label1.TabIndex = 0;
this.label1.Text = "Отправка медиа файлов ...";
//
// lab_versionPO
//
this.lab_versionPO.AutoSize = true;
this.lab_versionPO.Location = new System.Drawing.Point(1, 53);
this.lab_versionPO.Name = "lab_versionPO";
this.lab_versionPO.Size = new System.Drawing.Size(63, 13);
this.lab_versionPO.TabIndex = 1;
this.lab_versionPO.Text = "Версия ПО";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(294, 78);
this.Controls.Add(this.lab_versionPO);
this.Controls.Add(this.label1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "Form1";
this.Text = "Отправка мультимедии";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
this.Load += new System.EventHandler(this.Form1_Load);
this.Resize += new System.EventHandler(this.Form1_Resize);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.NotifyIcon notifyIcon1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label lab_versionPO;
}
}
+862
View File
@@ -0,0 +1,862 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using NReco.VideoConverter;
using System.Reflection;
namespace Send_multimedia
{
public partial class Form1 : Form
{
#region Переменные
string uniq = ""; //идентификатор арма
string typeDataBase; //тип базы данных
public string apiway = ""; //адрес куда отправляем данные
string path_file;//ссылка до папки, где лежат фото и видео осмотров
TimeSpan ts;//переменная для времени, через которое делается запрос на наличие нового файла
string link_DB; //ссылка на файл с БД
string path_folderDB = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), @"tele2med\DB"); //ссылка на папку с БД
private Config cfg; //для чтения из класса Config ini файлы
private Config configuration; //для чтения из класса Config2 ini файлы
//Server srv;
LogFiles logF = LogFiles.shared; //экземпляр класса записи логов в файл
Server srv;
System.Net.Security.RemoteCertificateValidationCallback mIgnoreBadCertificates = new System.Net.Security.RemoteCertificateValidationCallback(delegate { return true; }); //отключаем проверку доверительных сертификатов
#endregion
public Form1()
{
InitializeComponent();
srv = new Server(); //объект класса
logF.write_logLinkSRV(); //запуск цикла с записью логов
folderDB(); //проверяем есть ли папка для базы данных
Read_ini_config2();//чтение ини файла config 2
}
void folderDB()
{
if (!Directory.Exists(path_folderDB))
{
Directory.CreateDirectory(path_folderDB); //создаем папку для базы данных если ее нет
}
}
void Read_ini()
{
#region Чтение ini файла
try
{
logF.writeLog_toFile("Read_ini", "Start read", "success", "Начало чтения файла ini"); //запись лога
string Path_config = new FileInfo("config.ini").FullName.ToString(); //открытие ини файла
cfg = new Config(Path_config);
if (File.Exists("config.ini")) //Если фаил конфигурации существует
{
uniq = cfg.Read("Setting", "uniq_id"); //Читает параметр Username
apiway = cfg.Read("Setting", "apiwaycheckup");
srv.Data_ini(apiway, uniq);
}
else
{
logF.writeLog_toFile("Read_ini", "Finish read", "error", "Ошибка чтения файла ini, файл не найден"); //запись лога
}
logF.writeLog_toFile("Read_ini", "Finish read", "success", "Чтение файла ini завершено: " + "uniq = " + uniq + " apiway = " + apiway); //запись лога
}
catch (Exception ex)
{
logF.writeLog_toFile("Read_ini", "Finish read", "error", "Ошибка чтения файла ini " + ex.ToString()); //запись лога
}
#endregion
}
void Read_ini_config2() //чтение ини файла config 2
{
#region Чтение файла config2.ini
try
{
logF.writeLog_toFile("Read_ini_config2", "Start read ini_config2", "success", "Начало чтения файла config2.ini"); //запись лога
string Path_config2_ini = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), @"tele2med\config2.ini"); //ссылка на файл с ини файлом
configuration = new Config(Path_config2_ini);
if (File.Exists(Path_config2_ini)) //Если фаил конфигурации существует
{
typeDataBase = configuration.Read("Setting", "typeDB"); //Читает параметр typeDB
srv.Data_ini_config2(typeDataBase);
}
else
{
logF.writeLog_toFile("Read_ini_config2", "Finish read", "error", "Ошибка чтения файла config2.ini, файл не найден"); //запись лога
}
logF.writeLog_toFile("Read_ini_config2", "Finish read", "success", "Чтение файла config2.ini завершено: " + "typeDataBase = " + typeDataBase); //запись лога
}
catch (Exception ex)
{
logF.writeLog_toFile("Read_ini_config2", "Finish read", "error", "Ошибка чтения файла config2.ini " + ex.ToString()); //запись лога
}
#endregion
}
void choose_file()
{
#region Проверка наличия файла на отправку
DataBase valueDB = new DataBase();
//////////////////////////////////////
// запрос
string sql_select = "select top 1 * from [tab_FilesForSend] where type=0 order by id";
try
{
using (SqlConnection connection = new SqlConnection(link_DB))
{
SqlCommand command = new SqlCommand(sql_select, connection);
connection.Open();
try
{
using (SqlDataReader Reader = command.ExecuteReader())
{
while (Reader.Read())
{
valueDB.idDB = Reader["id"].ToString();
valueDB.numDB = Reader["num"].ToString();
valueDB.sessionDB = Reader["session"].ToString();
valueDB.filenameDB = Reader["filename"].ToString();
valueDB.checkup_idDB = Reader["checkup_id"].ToString();
}
}
}
catch (Exception ex)
{
logF.writeLog_toFile("choose_file", "Select data", "error", "Ошибка поиска " + ex.ToString()); //запись лога
return;
}
}
}
catch (Exception ex)
{
logF.writeLog_toFile("choose_file", "Select data", "error", "Ошибка соединения с БД " + ex.ToString()); //запись лога
}
///////////////////////////////////////
#region Существует ли файл
if (valueDB.filenameDB != null) //Проверяем, а в базе данных вообще есть файлы
{
string linkPh = Path.Combine(path_file, valueDB.filenameDB + ".jpg"); //фото
string linkVid = Path.Combine(path_file, valueDB.filenameDB + ".avi");//видео
if (File.Exists(linkPh) || File.Exists(linkVid)) //проверяем существует ли такой файл (возможно его уже кто-то удалил)
{
try
{
srv.AddFileToQueue(valueDB); //добавляем данные медиа файла в очередь
logF.writeLog_toFile("choose_file", "Add file in DB", "success", "Медиа файл добавлен в очередь: " + valueDB.filenameDB + " тип файла: " + valueDB.numDB); //запись лога
change_type(valueDB); //меняем в бд переменную на 1, чтобы понимать, что файл уже передан в очередь
}
catch (Exception ex)
{
logF.writeLog_toFile("choose_file", "Add file in DB", "error", "Произошла ошибка добавления медиа файла в очередь: " + "строка: " + valueDB.idDB + " имя: " + valueDB.filenameDB + " сессия: " + valueDB.sessionDB + " " + ex.ToString()); //запись лога
}
}
else
{
logF.writeLog_toFile("choose_file", "File.Exists", "error", "На компьютере не существует выбранный из БД файл для отправки"); //запись лога
delete_string(valueDB); //если файла нет, то удаляем эту строку из базы данных, т.к. нечего отправлять
}
}
//else //для теста!!!
//{
// logF.writeLog_toFile("choose_file", "check", "success", "В БД сейчас нет новых файлов для добавления их в очередь!!!"); //запись лога
//}
#endregion
#endregion
}
void change_type(DataBase file)
{
#region Отмечаем, что файл уже отправили в очередь
string sql_update = "update [tab_FilesForSend] set type=type+1 where id=@Id_RowsBD";
/////////////////////////////////////////////////////////
try
{
using (SqlConnection connection = new SqlConnection(link_DB))
{
SqlCommand command = new SqlCommand(sql_update, connection);
command.Parameters.AddWithValue("@Id_RowsBD", file.idDB);
connection.Open();
try
{
// выполняем запрос и получаем ответ
int count_send = command.ExecuteNonQuery();
// выводим ответ в консоль
if (count_send == 1)
{
logF.writeLog_toFile("choose_file", "change_type", "success", "type увеличен у строки: " + file.idDB + " Название файла: " + file.filenameDB); //запись лога
}
}
catch (Exception err)
{
logF.writeLog_toFile("choose_file", "change_type", "error", "Ошибка увеличения переменной type: " + " Название файла: " + file.filenameDB + " " + err.ToString()); //запись лога
}
}
}
catch (Exception ex)
{
logF.writeLog_toFile("choose_file", "change_type", "error", "Ошибка соединения с БД: " + ex.ToString()); //запись лога
}
/////////////////////////////////////////////////////////
#endregion
}
void update_type() //изменить при новом включении утилиты type из 1 в 0, необходимо для того чтобы отправить все данные даже, если утилиту экстренно выключили
{
#region Сбрасываем при включении утилиты переменную type
// запрос
string sql_delete = "update [tab_FilesForSend] set type=0 where type=1";
////////////////////////////////////////////
try
{
using (SqlConnection connection = new SqlConnection(link_DB))
{
SqlCommand command = new SqlCommand(sql_delete, connection);
connection.Open();
try
{
// выполняем запрос и получаем ответ
int count_send = command.ExecuteNonQuery();
logF.writeLog_toFile("update_type", "update", "success", "Количество затронутых строк: " + count_send); //запись лога
}
catch (Exception err)
{
logF.writeLog_toFile("update_type", "update", "error", "Во время запроса произошла ошибка: " + err.ToString()); //запись лога
}
}
}
catch (Exception ex)
{
logF.writeLog_toFile("update_type", "update", "error", "Ошибка соединения с БД: " + ex.ToString()); //запись лога
}
///////////////////////////////////////////
#endregion
}
void delete_string(DataBase file)
{
#region Удаляем строку с данными в БД, если файла уже не существует
string sql_delete = "delete from [tab_FilesForSend] where id=@Id_RowsBD";
/////////////////////////////////////////////////////
try
{
using (SqlConnection connection = new SqlConnection(link_DB))
{
SqlCommand command = new SqlCommand(sql_delete, connection);
command.Parameters.AddWithValue("@Id_RowsBD", file.idDB);
connection.Open();
try
{
// выполняем запрос и получаем ответ
int count_send = command.ExecuteNonQuery();
// выводим ответ в консоль
if (count_send == 1)
{
logF.writeLog_toFile("choose_file", "delete_string", "success", "Удалена строка в БД, т.к. файла уже не существует: " + file.idDB); //запись лога
}
}
catch (Exception err)
{
logF.writeLog_toFile("choose_file", "delete_string", "error", "Ошибка удаления строки из БД: " + err.ToString()); //запись лога
}
}
}
catch (Exception ex)
{
logF.writeLog_toFile("choose_file", "delete_string", "error", "Ошибка соединения с БД: " + ex.ToString()); //запись лога
}
/////////////////////////////////////////////////////
#endregion
}
void StartTimer() //запуск таймера
{
#region Таймер для проверки наличия нового файла в бд
logF.write_logLinkSRV(); //запуск цикла с записью логов, открываем новый файл для логов каждый день
Task.Factory.StartNew(() =>
{
while (ts.Seconds != -1)
{
Thread.Sleep(1000);
ts = ts.Subtract(new TimeSpan(0, 0, 1));
}
if (ts.Minutes == -0 && ts.Seconds == -1)
{
choose_file(); //Проверка наличия файла на отправку
ts = new TimeSpan(0, 0, 3);
StartTimer(); //запуск таймера для проверки наличия нового файла в бд
}
});
#endregion
}
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
// возвращаем отображение окна в панели
this.ShowInTaskbar = true;
//разворачиваем окно
WindowState = FormWindowState.Minimized;
}
private void Form1_Resize(object sender, EventArgs e)
{
// проверяем наше окно, и если оно было свернуто, делаем событие
if (WindowState == FormWindowState.Minimized)
{
// прячем наше окно из панели
this.ShowInTaskbar = false;
// делаем нашу иконку в трее активной
notifyIcon1.Visible = true;
}
}
private void Form1_Load(object sender, EventArgs e)
{
#region То что загружается при открытии формы
link_DB = @"Data Source=(LocalDB)\" + typeDataBase + ";AttachDbFilename=" + System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) + "\\tele2med\\DB\\DB1.mdf;Integrated Security=SSPI"; //ссылка на файл с БД
Read_ini(); //чтение ini файла
ServicePointManager.ServerCertificateValidationCallback += mIgnoreBadCertificates; //отключаем проверку доверительных сертификатов
path_file = Path.Combine(Path.GetTempPath(), "session_tele2med");//ссылка до папки, где лежат фото и видео осмотров
this.WindowState = FormWindowState.Minimized;
this.Hide();
srv.CheckAndSend(); //цикл очереди фото
update_type(); //изменить при новом включении утилиты type из 1 в 0, необходимо для того чтобы отправить все данные даже, если утилиту экстренно выключили
ts = new TimeSpan(0, 0, 5); //время, через которое делается запрос на наличие нового файла
StartTimer(); //запуск таймера для проверки наличия нового файла в бд
logF.writeLog_toFile("Form1_Load", "Start work", "success", "Утилита запущена"); //запись лога
lab_versionPO.Text = "Версия утилиты: " + Assembly.GetExecutingAssembly().GetName().Version.ToString(); //пример вывода номера сборки в текстовую надпись
#endregion
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
#region То что происходит когда закрывается форма
notifyIcon1.Visible = false;
notifyIcon1.Icon = null;
logF.writeLog_toFile("FormClosing", "Finish work", "success", "Утилита закрыта"); //запись лога
#endregion
}
}
}
namespace Send_multimedia
{
public class Server
{
#region Переменные
NetworkService networkService = NetworkService.shared;
private readonly Queue<DataBase> que = new Queue<DataBase>(); // общая очередь файлов
private bool isWorkMehodCheckAndSend = false;
string path_file = Path.Combine(Path.GetTempPath(), "session_tele2med"); // папка темп юзера, в ней хранятся данные мультимедии
string connectionString; //ссылка на файл с БД
bool IsCancel; //отмена отправки данных
string uniq = " ";
string apiway = " ";
string DateBase; //тип базы данных
LogFiles logSrv = LogFiles.shared; //экземпляр класса записи логов в файл
#endregion
public void Data_ini(string APIpath, string Uniq_ARM)//пробная отправка данных в другой класс
{
apiway = APIpath;
uniq = Uniq_ARM;
}
public void Data_ini_config2(string typeDBase)//отправка данных в другой класс
{
DateBase = typeDBase;
connectionString = @"Data Source=(LocalDB)\" + DateBase + ";AttachDbFilename=" + System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) + "\\tele2med\\DB\\DB1.mdf; Integrated Security=SSPI"; //ссылка на файл с БД
}
public void AddFileToQueue(DataBase dataFromDB) // добавить в очередь медиа файл из БД
{
try
{
que.Enqueue(dataFromDB);
}
catch (Exception ex)
{
logSrv.writeLog_toFile("choose_file", "AddPhoto", "error", "Ошибка добавления медиа файла в очередь. Название файла: " + dataFromDB.filenameDB + " " + ex.ToString()); //запись лога
}
}
public void CheckAndSend()
{
#region Цикл очереди для отправки медиафайлов
if (isWorkMehodCheckAndSend)
throw new Exception("НЕЛЬЗЯ 2 РАЗА ЗАПУСКАТЬ ЦИКЛ");
isWorkMehodCheckAndSend = true;
Task.Factory.StartNew(async () =>
{
while (!IsCancel) // цикл работает пока нет отмены
{
if (que.Any() == true) // проверяем есть ли данные для загрузки
{
var data = que.Dequeue(); // берем DataBase из очереди
switch (data.numDB)
{
case "1":
logSrv.writeLog_toFile("CheckAndSend", "Get photo", "success", "Взяли фото с очереди filenameDB: " + data.filenameDB); //запись лога
SendPhoto(data); // отправляем и ожидаем завершения отправки
break;
case "2":
logSrv.writeLog_toFile("CheckAndSend", "Get video", "success", "Взяли видео с очереди filenameDB: " + data.filenameDB); //запись лога
SendVideo(data); // отправляем и ожидаем завершения отправки
break;
case "3":
logSrv.writeLog_toFile("CheckAndSend", "Get photoDetect", "success", "Взяли детектированное фото с очереди filenameDB: " + data.filenameDB); //запись лога
SendPhotoDetect(data); // отправляем и ожидаем завершения отправки
break;
case "4":
logSrv.writeLog_toFile("CheckAndSend", "Get firstPhoto", "success", "Взяли первое фото водителя с очереди filenameDB: " + data.filenameDB); //запись лога
SendFirstPhoto(data); // отправляем и ожидаем завершения отправки
break;
}
}
else
{
await Task.Delay(5000); // спим 5 сек если медиа для отправки нет
}
}
});
#endregion
}
private async void SendPhoto(DataBase dataPhoto)
{
#region Отправка фото на сервер
try
{
logSrv.writeLog_toFile("SendPhoto", "Send photo start", "success", "Начало отправки фото: " + dataPhoto.filenameDB); //запись лога
RootObject account = new RootObject(); // ссылка на класс для приема сообщений с сервера
string photoURL = Path.Combine(@path_file, dataPhoto.filenameDB + ".jpg");
string URL_sendPhoto = Path.Combine(apiway, "upload_photo", uniq, dataPhoto.sessionDB); //url запроса
var responseBeginSession = await networkService.sendFileToServer(dataPhoto.filenameDB, photoURL, URL_sendPhoto, "upload_photo");
var resultRequestPhoto = await responseBeginSession.Content.ReadAsStringAsync();
logSrv.writeLog_toFile("upload_photo", "ReadAsStringAsync", "success", "Получен с сервера результат: " + resultRequestPhoto.ToString()); //запись лога
account = JsonConvert.DeserializeObject<RootObject>(resultRequestPhoto);
if (account.status == "success")
{
logSrv.writeLog_toFile("SendPhoto", "Send", "success", "Фото отправлено: " + dataPhoto.filenameDB); //запись лога
try
{
File.Delete(photoURL); //удалить отправленный файл с фото
logSrv.writeLog_toFile("SendPhoto", "Delete", "success", "Фото удалено с носителя: " + dataPhoto.filenameDB + " status: " + account.status + " message: " + account.message); //запись лога
}
catch (Exception ex)
{
logSrv.writeLog_toFile("SendPhoto", "Delete", "error", "Ошибка удаления фото с носителя: " + dataPhoto.filenameDB + " " + ex.ToString());
}
Delete_stringFromDB(dataPhoto);//Удаляем строку с данными в БД, т.к. файл уже отправили
}
if (account.status == "error")
{
logSrv.writeLog_toFile("SendPhoto", "Send", "error", "Фото не отправлено " + dataPhoto.filenameDB + " " + account.message); //запись лога
}
}
catch (Exception ex)
{
logSrv.writeLog_toFile("SendPhoto", "SendtoServer", "error", "Ошибка отправки фото на сервер: " + dataPhoto.filenameDB + " " + ex.ToString()); //запись лога
if (!ex.ToString().Contains("не найден"))
{
ChangeStatusPhotoInDB(dataPhoto);
}
else
{
logSrv.writeLog_toFile("SendPhoto", "delete_stringDBPhoto", "success", "Удаляем строку с этим фото: " + dataPhoto.filenameDB); //запись лога
Delete_stringFromDB(dataPhoto);//Удаляем строку с данными в БД, т.к. его нет
}
}
#endregion
}
private void ChangeStatusPhotoInDB(DataBase dataPhoto)
{
#region Сбрасываем переменную type для повторной отправки фото
logSrv.writeLog_toFile("ChangeStatusPhotoInDB", "sql_updatePhoto", "success", "Сбрасываем переменную type для повторной отправки фото: " + dataPhoto.filenameDB); //запись лога
// запрос
string sql_update = "update [tab_FilesForSend] set type=0 where id=@Id_RowsBD";
////////////////////////////////////////////
try
{
using (SqlConnection connection_update = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(sql_update, connection_update);
command.Parameters.AddWithValue("@Id_RowsBD", dataPhoto.idDB);
connection_update.Open();
try
{
// выполняем запрос и получаем ответ
int count_upPh = command.ExecuteNonQuery();
if (count_upPh == 1)
{
logSrv.writeLog_toFile("ChangeStatusPhotoInDB", "change_type", "success", "type сброшен у строки фото: " + dataPhoto.idDB + " Название файла: " + dataPhoto.filenameDB); //запись лога
}
}
catch (Exception err)
{
logSrv.writeLog_toFile("ChangeStatusPhotoInDB", "update", "error", "Во время запроса type у фото произошла ошибка: " + err.ToString()); //запись лога
}
}
}
catch (Exception err)
{
logSrv.writeLog_toFile("ChangeStatusPhotoInDB", "update", "error", "Ошибка соединения с БД: " + err.ToString()); //запись лога
}
#endregion
}
private async void SendPhotoDetect(DataBase dataPhotoDetect)
{
#region Отправка фото с лицом на сервер
try
{
logSrv.writeLog_toFile("SendPhotoDetect", "Send photo face start", "success", "Начало отправки фото с лицом: " + dataPhotoDetect.filenameDB); //запись лога
RootObject account = new RootObject(); // ссылка на класс для приема сообщений с сервера
string photoDetectURL = Path.Combine(@path_file, dataPhotoDetect.filenameDB + ".jpg");
string URL_sendPhoto = Path.Combine(apiway, "upload_photo", uniq, dataPhotoDetect.sessionDB); //url запроса
var responseBeginSession = await networkService.sendFileToServer(dataPhotoDetect.filenameDB, photoDetectURL, URL_sendPhoto, "upload_photo");
var resultRequestPhoto = await responseBeginSession.Content.ReadAsStringAsync();
logSrv.writeLog_toFile("upload_photo", "ReadAsStringAsync", "success", "Получен с сервера результат: " + resultRequestPhoto.ToString()); //запись лога
account = JsonConvert.DeserializeObject<RootObject>(resultRequestPhoto);
if (account.status == "success")
{
logSrv.writeLog_toFile("SendPhotoDetect", "Send", "success", "Фото с лицом отправлено: " + dataPhotoDetect.filenameDB); //запись лога
try
{
File.Delete(photoDetectURL); //удалить отправленный файл с фото
logSrv.writeLog_toFile("SendPhotoDetect", "Delete", "success", "Фото с лицом удалено с носителя: " + dataPhotoDetect.filenameDB + " status: " + account.status + " message: " + account.message); //запись лога
}
catch (Exception ex)
{
logSrv.writeLog_toFile("SendPhotoDetect", "Delete", "error", "Ошибка удаления фото с лицом с носителя: " + dataPhotoDetect.filenameDB + " " + ex.ToString());
}
Delete_stringFromDB(dataPhotoDetect);//Удаляем строку с данными в БД, т.к. файл уже отправили
}
if (account.status == "error")
{
logSrv.writeLog_toFile("SendPhotoDetect", "Send", "error", "Фото с лицом не отправлено " + dataPhotoDetect.filenameDB + " " + account.message); //запись лога
}
}
catch (Exception ex)
{
logSrv.writeLog_toFile("SendPhotoDetect", "SendtoServer", "error", "Ошибка отправки фото с лицом на сервер: " + dataPhotoDetect.filenameDB + " " + ex.ToString()); //запись лога
if (!ex.ToString().Contains("не найден"))
{
ChangeStatusPhotoDetectInDB(dataPhotoDetect);
}
else
{
logSrv.writeLog_toFile("SendPhotoDetect", "delete_stringDBPhoto", "success", "Удаляем строку с этим фото: " + dataPhotoDetect.filenameDB); //запись лога
Delete_stringFromDB(dataPhotoDetect);//Удаляем строку с данными в БД, т.к. его нет
}
}
#endregion
}
private void ChangeStatusPhotoDetectInDB(DataBase dataPhotoDetect)
{
#region Сбрасываем переменную type для повторной отправки фото
logSrv.writeLog_toFile("ChangeStatusPhotoDetectInDB", "sql_updatePhotoDetect", "success", "Сбрасываем переменную type для повторной отправки детектированного фото: " + dataPhotoDetect.filenameDB); //запись лога
// запрос
string sql_update = "update [tab_FilesForSend] set type=0 where id=@Id_RowsBD";
////////////////////////////////////////////
try
{
using (SqlConnection connection_update = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(sql_update, connection_update);
command.Parameters.AddWithValue("@Id_RowsBD", dataPhotoDetect.idDB);
connection_update.Open();
try
{
// выполняем запрос и получаем ответ
int count_upPh = command.ExecuteNonQuery();
if (count_upPh == 1)
{
logSrv.writeLog_toFile("ChangeStatusPhotoDetectInDB", "change_type", "success", "type сброшен у строки детектированного фото: " + dataPhotoDetect.idDB + " Название файла: " + dataPhotoDetect.filenameDB); //запись лога
}
}
catch (Exception err)
{
logSrv.writeLog_toFile("ChangeStatusPhotoDetectInDB", "update", "error", "Во время запроса сброса type у детектированного фото произошла ошибка: " + err.ToString()); //запись лога
}
}
}
catch (Exception err)
{
logSrv.writeLog_toFile("ChangeStatusPhotoDetectInDB", "update", "error", "Ошибка соединения с БД: " + err.ToString()); //запись лога
}
#endregion
}
private async void SendVideo(DataBase dataVideo)
{
#region Отправка видео на сервер
try
{
logSrv.writeLog_toFile("SendVideo", "Send video start", "success", "Начало отправки видео: " + dataVideo.filenameDB); //запись лога
RootObject account = new RootObject(); // ссылка на класс для приема сообщений с сервера
string videoURL = Path.Combine(@path_file, dataVideo.filenameDB + ".avi");
string URL_sendVideo = Path.Combine(apiway, "upload_video", uniq, dataVideo.sessionDB); //url-запрос
var responseBeginSession = await networkService.sendFileToServer(dataVideo.filenameDB, videoURL, URL_sendVideo, "upload_video");
var resultRequestVideo = await responseBeginSession.Content.ReadAsStringAsync();
logSrv.writeLog_toFile("upload_photo", "ReadAsStringAsync", "success", "Получен с сервера результат: " + resultRequestVideo.ToString()); //запись лога
account = JsonConvert.DeserializeObject<RootObject>(resultRequestVideo);
if (account.status == "success")
{
logSrv.writeLog_toFile("SendVideo", "Send", "success", "Видео успешно отправлено: " + dataVideo.filenameDB); //запись лога
try
{
File.Delete(videoURL); //удалить отправленный файл с видео .avi
logSrv.writeLog_toFile("SendVideo", "Delete", "success", "Видео удалено с носителя (т.к. отправили его на сервер): " + dataVideo.filenameDB + " status: " + account.status + " message: " + account.message); //запись лога
}
catch (Exception ex)
{
logSrv.writeLog_toFile("SendPhoto", "Delete", "error", "Ошибка удаления видео с носителя: " + dataVideo.filenameDB + " " + ex.ToString());
}
Delete_stringFromDB(dataVideo);//Удаляем строку с данными в БД, т.к. файл уже отправили
}
if (account.status == "error")
{
logSrv.writeLog_toFile("SendVideo", "Send", "error", "Ошибка отправки видео: " + dataVideo.filenameDB + " " + account.message); //запись лога
}
}
catch (Exception ex)
{
logSrv.writeLog_toFile("SendVideo", "SendtoServer", "error", "Произошла ошибка отправки файла видео: " + dataVideo.filenameDB + " " + ex.ToString()); //запись лога
if (!ex.ToString().Contains("Request Entity Too Large") && !ex.ToString().Contains("не найден") && !ex.ToString().Contains("Не удается записать данные в транспортное соединение"))//если не содержит эту ошибку
{
ChangeStatusVideoInDB(dataVideo);
}
else
{
logSrv.writeLog_toFile("SendVideo", "delete_stringDBVideo", "success", "Удаляем строку в БД с этим видео, т.к. этого файла уже нет или оно имеет очень большой вес: " + dataVideo.filenameDB); //запись лога
Delete_stringFromDB(dataVideo);//Удаляем строку с данными в БД, т.к. файл уже отправили
}
}
#endregion
}
void ChangeStatusVideoInDB(DataBase dataVideo)
{
#region Сбрасываем переменную type для повторной отправки видео
// запрос
logSrv.writeLog_toFile("changeStatusVideoInDB", "sql_updateVideo", "success", "Сбрасываем переменную type для повторной отправки видео: " + dataVideo.filenameDB); //запись лога
string sql_updateVideo = "update [tab_FilesForSend] set type=0 where id=@Id_RowsBD";
////////////////////////////////////////////
try
{
using (SqlConnection connection_updateVideo = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(sql_updateVideo, connection_updateVideo);
command.Parameters.AddWithValue("@Id_RowsBD", dataVideo.idDB);
connection_updateVideo.Open();
try
{
// выполняем запрос и получаем ответ
int count_upVid = command.ExecuteNonQuery();
if (count_upVid == 1)
{
logSrv.writeLog_toFile("changeStatusVideoInDB", "change_type", "success", "type сброшен у строки видео: " + dataVideo.idDB + " Название файла: " + dataVideo.filenameDB); //запись лога
}
}
catch (Exception err)
{
logSrv.writeLog_toFile("changeStatusVideoInDB", "update_try", "error", "Во время запроса сброса type у видео произошла ошибка: " + err.ToString()); //запись лога
}
}
}
catch (Exception err)
{
logSrv.writeLog_toFile("changeStatusVideoInDB", "update", "error", "Ошибка соединения с БД: " + err.ToString()); //запись лога
}
#endregion
}
void Delete_stringFromDB(DataBase dataForDelete)
{
#region Удаляем строку с данными в БД, т.к. файл фото уже отправили
string sql_delSendPh = "delete from [tab_FilesForSend] where id=@Id_RowsDB";
/////////////////////////////////////////////////////
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(sql_delSendPh, connection);
command.Parameters.AddWithValue("@Id_RowsDB", dataForDelete.idDB);
connection.Open();
try
{
int count_send = command.ExecuteNonQuery();// выполняем запрос и получаем ответ
if (count_send == 1)
{
logSrv.writeLog_toFile("Delete_stringFromDB", "string delete", "success", "Удалена строка в БД, т.к. фото уже отправлено: " + dataForDelete.filenameDB + " строка: " + dataForDelete.idDB); //запись лога
}
}
catch (Exception err)
{
logSrv.writeLog_toFile("Delete_stringFromDB", "string delete", "error", "Ошибка удаления строки фото из БД: " + dataForDelete.filenameDB + " строка: " + dataForDelete.idDB + " " + err.ToString()); //запись лога
}
}
}
catch (Exception ex)
{
logSrv.writeLog_toFile("Delete_stringFromDB", "string delete", "error", "Ошибка соединения с БД: " + ex.ToString()); //запись лога
}
////////////////////////////////////////////////////
#endregion
}
private async void SendFirstPhoto(DataBase dataFirstPhoto)
{
#region Отправка первого фото на сервер
try
{
logSrv.writeLog_toFile("SendFirstPhoto", "Send first photo start", "success", "Начало отправки первого фото водителя: " + dataFirstPhoto.filenameDB); //запись лога
RootObject account = new RootObject(); // ссылка на класс для приема сообщений с сервера
string firstPhotoURL = Path.Combine(@path_file, dataFirstPhoto.filenameDB + ".jpg");
string URL_sendFirstPhoto = Path.Combine(apiway, "profile_photo", dataFirstPhoto.checkup_idDB); //url запроса
var responseBeginSession = await networkService.sendFileToServer(dataFirstPhoto.filenameDB, firstPhotoURL, URL_sendFirstPhoto, "profile_photo");
var resultRequestFirstPhoto = await responseBeginSession.Content.ReadAsStringAsync();
logSrv.writeLog_toFile("upload_FirstPhoto", "ReadAsStringAsync", "success", "Получен с сервера результат: " + resultRequestFirstPhoto.ToString()); //запись лога
account = JsonConvert.DeserializeObject<RootObject>(resultRequestFirstPhoto);
if (account.status == "success")
{
logSrv.writeLog_toFile("upload_FirstPhoto", "Send", "success", "Первое фото водителя отправлено: " + dataFirstPhoto.filenameDB); //запись лога
try
{
File.Delete(firstPhotoURL); //удалить отправленный файл с фото
logSrv.writeLog_toFile("upload_FirstPhoto", "Delete", "success", "Первое фото водителя удалено с носителя: " + dataFirstPhoto.filenameDB + " status: " + account.status + " message: " + account.message); //запись лога
}
catch (Exception ex)
{
logSrv.writeLog_toFile("upload_FirstPhoto", "Delete", "error", "Ошибка удаления первого фото водителя с носителя: " + dataFirstPhoto.filenameDB + " " + ex.ToString());
}
Delete_stringFromDB(dataFirstPhoto);//Удаляем строку с данными в БД, т.к. файл уже отправили
}
if (account.status == "error")
{
logSrv.writeLog_toFile("SendPhoto", "Send", "error", "Фото не отправлено " + dataFirstPhoto.filenameDB + " " + account.message); //запись лога
}
}
catch (Exception ex)
{
logSrv.writeLog_toFile("SendPhoto", "SendtoServer", "error", "Ошибка отправки фото на сервер: " + dataFirstPhoto.filenameDB + " " + ex.ToString()); //запись лога
if (!ex.ToString().Contains("не найден"))
{
ChangeStatusPhotoInDB(dataFirstPhoto);
}
else
{
logSrv.writeLog_toFile("SendPhoto", "delete_stringDBPhoto", "success", "Удаляем строку с этим фото: " + dataFirstPhoto.filenameDB); //запись лога
Delete_stringFromDB(dataFirstPhoto);//Удаляем строку с данными в БД, т.к. его нет
}
}
#endregion
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Send_multimedia
{
public class LogFiles
{
public static LogFiles shared = new LogFiles();
string path_logFile; //ссылка на файл с логами
FileInfo fail_log; //экземпляр для записи текста в файл тхт
DateTime time_log; // время записи лога
public void write_logLinkSRV() //открываем новый файл для логов каждый день
{
#region Логи
string link_log = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), @"tele2med\LogUtility"); //создаем папку
if (!Directory.Exists(link_log))
{
Directory.CreateDirectory(link_log);
}
time_log = DateTime.Now;//текущее время для записи в логи
path_logFile = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), @"tele2med\LogUtility", time_log.ToString("dd.MM.yyyy") + ".log");//ссылка на файл с логами
fail_log = new FileInfo(path_logFile);
if (!File.Exists(path_logFile))
{
using (StreamWriter sw = fail_log.CreateText())
{
sw.WriteLine("DateTime, Funсtion, Step, Result, Comment");
}
}
#endregion
}
public void writeLog_toFile(string Funсtion, string Step, string Result, string Comment)
{
#region Запись лога
try
{
time_log = DateTime.Now;//текущее время для записи в логи
using (StreamWriter sw = new StreamWriter(path_logFile, true, System.Text.Encoding.GetEncoding(866))) //запись логов
{
sw.WriteLine(time_log + ", " + Funсtion + ", " + Step + ", " + Result + ", " + Comment);
}
}
catch { }
#endregion
}
}
}
+29
View File
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Send_multimedia
{
public class DataBase
{
public string idDB { get; set; }
public string uniq_idDB { get; set; }
public string checkup_idDB { get; set; }
public string sessionDB { get; set; }
public string datetimeDB { get; set; }
public string typeDB { get; set; }
public string numDB { get; set; }
public string filenameDB { get; set; }
}
public class RootObject
{
public string status { get; set; }
public string message { get; set; }
public string result_auto { get; set; }
public string key_id { get; set; }
}
}
@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Globalization;
using System.Net;
using System.IO;
using System.Net.Http.Headers;
namespace Send_multimedia
{
public class NetworkService
{
public static NetworkService shared = new NetworkService();
HttpClient httpClient = new HttpClient();
LogFiles logFile = LogFiles.shared; //экземпляр класса записи логов в файл
private Stream stream = new MemoryStream();
public async Task<HttpResponseMessage> sendFileToServer(string fileName, string fileURL, string url, string nameMethod)
{
try
{
// считываем данные файла в массив байтов
byte[] fileToBytes;
using (FileStream stream = File.Open(@fileURL, FileMode.Open))
{
fileToBytes = new byte[stream.Length];
await stream.ReadAsync(fileToBytes, 0, (int)stream.Length);
}
// формируем отправляемое содержимое
var content = new ByteArrayContent(fileToBytes);
// Отправляем файл
var response = await httpClient.PostAsync(url, content);
logFile.writeLog_toFile(nameMethod, "PostAsync", "success", "Запрос " + nameMethod + " отправлен на сервер"); //запись лога
return response;
}
catch (Exception e)
{
logFile.writeLog_toFile(nameMethod, "Send data", "error", "Не удалось отправить запрос на сервер: " + e.ToString()); //запись лога
var response = new HttpResponseMessage();
response.Content = new StringContent(e.ToString());
return response;
}
}
}
}
@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Send_multimedia
{
static class Program
{
static readonly string guid = Marshal.GetTypeLibGuidForAssembly(Assembly.GetExecutingAssembly()).ToString();
static readonly TimeSpan Timeout = TimeSpan.FromMilliseconds(200);
static bool isFirstInstance;
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{
using (var mutex = new Mutex(true, guid, out isFirstInstance))
{
if (isFirstInstance || mutex.WaitOne(Timeout))
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try { Application.Run(new Form1()); }
finally { mutex.ReleaseMutex(); }
}
}
}
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Общие сведения об этой сборке предоставляются следующим набором
// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
// связанные со сборкой.
[assembly: AssemblyTitle("Send_multimedia")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Send_multimedia")]
[assembly: AssemblyCopyright("Copyright © 2019-2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
[assembly: ComVisible(false)]
// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
[assembly: Guid("9c2c0cc0-55a7-481d-a6b5-ffb7df03b7f8")]
// Сведения о версии сборки состоят из следующих четырех значений:
//
// Основной номер версии
// Дополнительный номер версии
// Номер сборки
// Редакция
//
// Можно задать все значения или принять номер сборки и номер редакции по умолчанию.
// используя "*", как показано ниже:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.3.0.1")]
[assembly: AssemblyFileVersion("1.3.0.1")]
@@ -0,0 +1,73 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Send_multimedia.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Send_multimedia.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Icon, аналогичного (Значок).
/// </summary>
internal static System.Drawing.Icon tele2med_ {
get {
object obj = ResourceManager.GetObject("tele2med_", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
}
}
@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="tele2med_" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\tele2med_.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>
@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Send_multimedia.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.6.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 393 KiB

@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9C2C0CC0-55A7-481D-A6B5-FFB7DF03B7F8}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Send_multimedia</RootNamespace>
<AssemblyName>Send_multimedia</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="NReco.VideoConverter, Version=1.1.3.0, Culture=neutral, PublicKeyToken=395ccb334978a0cd, processorArchitecture=MSIL">
<HintPath>..\packages\NReco.VideoConverter.1.1.3\lib\net20\NReco.VideoConverter.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Config.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="LogFiles.cs" />
<Compile Include="Model.cs" />
<Compile Include="NetworkService.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\tele2med_.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net461" />
<package id="NReco.VideoConverter" version="1.1.3" targetFramework="net461" />
</packages>
Binary file not shown.

After

Width:  |  Height:  |  Size: 393 KiB