; -------------------------- Стуктура с глобальными переменными программы -----------------------------------. Structure SubProgramStatus_Setting MainWinX.w MainWinY.w MainWinW.w MainWinH.w SplitterPos.w TabPos.b MainWinState.l MainWinVisible.l Speed_CoboBoxState.a ShowDomainsName.a TorrentFilePath.s ; Путь к торрент файлу, который был открыт последним (CreateTorrent). TorrentDirPath.s ; Путь к файлу или папке с файлами, из которых был создан торрент (CreateTorrent). TorrentSavePath.s ; Путь к файлам последнего загруженного торрента (LoadTorrent). TorrentListIcon_Width.w[14] ; Ширина колонок в списке торрентов #MainWin_ListIcon_Torrent. ListIcon_Tracker_Width.w[5] ; Ширина колонок в списке трекеров #MainWin_Panel_Info_ListIcon_Tracker. ListIcon_Peer_Width.w[11] ; Ширина колонок в списке пиров #MainWin_Panel_Info_ListIcon_Peer. ListIcon_Files_Width.w[8] ; Ширина колонок в списке файлов #MainWin_Panel_Info_ListIcon_Files. ListIcon_Piece_Width.w[7] ; Ширина колонок в списке частей #MainWin_Panel_Info_ListIcon_Piece. TorrentListIcon_ORDERARRAY.l[14] ; Позиции столбцов в списке торрентов #MainWin_ListIcon_Torrent. ListIcon_Tracker_ORDERARRAY.l[5] ; Позиции столбцов в списке трекеров #MainWin_Panel_Info_ListIcon_Tracker. ListIcon_Peer_ORDERARRAY.l[11] ; Позиции столбцов в списке пиров #MainWin_Panel_Info_ListIcon_Peer. ListIcon_Files_ORDERARRAY.l[8] ; Позиции столбцов в списке файлов #MainWin_Panel_Info_ListIcon_Files. ListIcon_Piece_ORDERARRAY.l[7] ; Позиции столбцов в списке частей #MainWin_Panel_Info_ListIcon_Piece. EndStructure Structure SubProgramStatus_LoadTorrent Mutex.i List Hash_TorrentList.s() EndStructure Structure Program_ThreadInfo OutText_ThreadID.i UpdateTracker_ThreadID.i DomainsPeer_ThreadID.i ; Поток получения доменного имени пира и присвоения номера флага-иконки в таблице пиров на панели информации. Network_ThreadID.i Network_ConnectPeer_ThreadID.i ; Поток установки соединения с пирами. EndStructure Structure ProgramStatus_Network_TrackerTaskList ; Список заданий на запросы трекерам. INFO_Hash.s ; Хэш торрента. Server.s ; Адрес сервера трекера. Status.a ; #Tracker_Started или #Tracker_Stopped в зависимости от того, какоед действие нужно выполнить. Active.a ; Число, не равное нулю, если задание в процессе выполенния. EndStructure Structure ProgramStatus_Network_DomainsPeer INFO_Hash.s ; Хэш торрента. IP_Peer.s ; IP адрес пира. IP.l ; IP адрес в виде числа. Active.a ; Число, не равное нулю, если задание в процессе выполенния. EndStructure Structure ProgramStatus_Network_ConnectPeer INFO_Hash.s ; Хэш торрента. IP_Peer.s ; IP адрес пира. Port.u ; Порт пира. Active.a ; Число, не равное нулю, если задание в процессе выполенния. EndStructure Structure ProgramStatus_Network_ConnectPeer_ResiltID INFO_Hash.s ; Хэш торрента. IP_Peer.s ; IP адрес пира. Port.u ; Порт пира. ConnectID.i ; Идентификатор связи с пиром или нуль, если связь не удалось установить. EndStructure Structure ProgramStatus_Network_WSA ; Адреса функций из ws2_32.dll. LibID.i *WSACreateEvent *WSACloseEvent *WSAEventSelect *WSAWaitForMultipleEvents *WSAEnumNetworkEvents EndStructure ; Ожидание соединений пиров на асинхронных сокетах. Structure Core_Network_ConnectPeer_WainConnect Extends ProgramStatus_Network_ConnectPeer_ResiltID Time_Conn.l ; Время в формате Date() в котороге установлена связь, точнее, выполена функция connect_(). hEvent.i ; Событие для отслеживания подключения пира через асинхронный сокет. EndStructure Structure ProgramStatus_Network WSA.ProgramStatus_Network_WSA peer_id.s ; Идентификатр торрент-клиента в сети. peer_id_bin.a[20] ; Идентификатр торрент-клиента в сети в ASCII формате. Key.l ; Идентификатор для трекеров. Key_Hex.s TrackerTask_Mutex.i TrackerTask_Semaphore.i TrackerTask_EndThread.a ; Если тут 1 (обычно при завершении работы программы), то проток выполнения заданий должен завершится после обработки всех заданий. List TrackerTask_List.ProgramStatus_Network_TrackerTaskList() ; Задания для обновления трекеров. DomainsPeer_Mutex.i DomainsPeer_Semaphore.i List DomainsPeer_TaskList.ProgramStatus_Network_DomainsPeer() ; Задания получения доменного имени и номера флажка для конкретного пира. ConnectPeer_CountPeerConnect.l ; Со сколькими пирами установлен конект и ожидается соединение. ConnectPeer_Mutex.i ConnectPeer_Semaphore.i ; Установка соединений с пирами. List ConnectPeer_List.ProgramStatus_Network_ConnectPeer() ; Список пиров к которым нужно подключиться. List ConnectPeer_ResiltID_List.ProgramStatus_Network_ConnectPeer_ResiltID() ; Результат подключения к пиру. List TestConnect.Core_Network_ConnectPeer_WainConnect() ; Список пиров которым был отправлен запрос на устанавку соединения, но соединение пока не установлено. EndStructure Structure TabControl_Info hPanel.i ; Хендл панели. *OldFunc ; Функция панели. tabToHideID.a ; Номер скрытого пункта панели. CountPage.a ; Число пунктов панели. Page_hWnd.i[10] ; Хендлы подложен пунктов панели. hMiscInfo_Scroll.i ; Хендл области прокрутки во вкладке "Общая информация" EndStructure Structure String_2 String_1.s String_2.s EndStructure Structure ProgramStatus_Tray_BalloonList Title.s Message.s Icon.l EndStructure Structure ProgramStatus_Tray ; Все что связанно с трем. Balloon_Old_Visible.a Balloon_Visible.a ; Отображается ли Balloon. Balloon_Mutex.i ; Для разграничевания доступа к BalloonList() из нескольких потоков. List BalloonList.ProgramStatus_Tray_BalloonList() ; Список сообщений, выводимый в Balloon-окне. EndStructure Structure ProgramStatus_Draw Brush_ProgressBar_TableTorrent.i ; Кисть для прорисовки прогресс-бара таблицы торрентов. Pen_MapPiece.i ; Перо для прорисовки текущих частей файлов. Brush_MapPiece.i ; Кисть для прорисовки текущих частей файлов. Brush_Full_Piece.i ; Кисть для прорисовки текущих загруженных частей. Brush_Piece.i ; Кисть для прорисовки запрошенных, но еще не загруженных частей. HOLLOW_BRUSH.i ; Прозрачная кисть. Gray_BRUSH.i ; Серая кисть. *DrawThemeParentBackground EndStructure Structure ProgramStatus DirIconID.i ; Идентификатор иконки папки.(16x16). PanelInfo.TabControl_Info LoadTorrent.SubProgramStatus_LoadTorrent Setting.SubProgramStatus_Setting Thread.Program_ThreadInfo Network.ProgramStatus_Network TrayInfo.ProgramStatus_Tray Draw.ProgramStatus_Draw ProgFullFileName.s ; Полный (абсолютный) путь к программе. ProgFilePath.s ; Путь к папке из которой запущена программа. Prog_FileName.s ; Имя исполняемого файла программы. ProgEndSate.b ; Если прога завершает работу, значение будет ненулевым. Dir_Files.s ; Папка по умолчанию для файлов торрента. Dir_SysFiles.s ; Путь к системной папке программы. FontDefault.i ; Идентификатор шрифта по умолчанию. hTorrentListIcon.i ; Хендл ListIcon со всеми торрентами. hImageList_TorrentListIcon.i ; ImageList списка торрентов. hHeader_TorrentListIcon.i ; Хендл заголовка ListIcon со всеми торрентами. hRebar.i TorrentListIcon_Mutex.i ; Доступ к таблице. Создание пунктов, модификация, стирание. Panel_Info_Page.b ; Номер текущей вкладки панели информации. List_Torrent_Pos.l ; Номер торрента, выделеный в списке. Torrent_All_Pause.b ; Все торренты в состоянии паузы = #True. Panel_Info_Mutex.i ; Вывод данных на панель информации. SaveTorrentData_Mutex.i ListIcon_Files_Mutex.i ; Для доступа к таблице на вкладце "Файлы". Ипользуется чтобы не возникло конфликтов при совместном доступе к массиву из потока и CallBack процедуры таблицы. ListIcon_Piece_Mutex.i ; Для доступа к таблице на вкладце "Части". Ипользуется чтобы не возникло конфликтов при совместном доступе к массиву из потока и CallBack процедуры таблицы. OS_Version.l Panel_Info_Semaphore.i Font_SpeedGraph.i ; Шрифт для вкладки "Скорость" панели информации. Torrent_ImageList.l[10] Torrent_Flags_ImageList.l[110] hImageList_ListIcon_Files.i Panel_Info_MiscInfo_ImageWidth.w Panel_Info_MiscInfo_ImageHeight.w CurrentDate.l ; Текущее время с точностью до секунд. List Label.String_2() ; Это для задания метки торрента. Содержим список выделеных торрентов. String_1 - хэш торрента, а String_2 - его метка. EndStructure ;- ProgramMiscInfo Global G_ProgramMiscInfo.ProgramStatus G_ProgramMiscInfo\ProgFullFileName = ProgramFilename() G_ProgramMiscInfo\ProgFilePath = GetPathPart(G_ProgramMiscInfo\ProgFullFileName) G_ProgramMiscInfo\Prog_FileName = GetFilePart(G_ProgramMiscInfo\ProgFullFileName) G_ProgramMiscInfo\Dir_Files = G_ProgramMiscInfo\ProgFilePath + #DirProgFiles G_ProgramMiscInfo\Dir_SysFiles = G_ProgramMiscInfo\ProgFilePath + #DirSysFiles ; ----------------------------- Структура настроек программы ------------------------------------------------ Structure ProgSetting_Misc MinimazeTray.a CloseTray.a BalloonTray.a HideShowTray.a EndStructure Structure ProgSetting_Lan Port.u RandomPort.a MaxConnect.u MaxPeer.u SlotTorrent.u EndStructure Structure ProgSetting_Torrent MaxActiveTorrent.u MaxLoad.u Serial_LoadPiece.a EndStructure Structure ProgSetting Misc.ProgSetting_Misc Lan.ProgSetting_Lan Torrent.ProgSetting_Torrent TreePos.a EndStructure ;- ProgramSetting Global G_ProgramSetting.ProgSetting ; ----------------------------- Структура с данными всех торренов ------------------------------------------- Structure Sub_TorrentInfo_TorrentList_MapFile_Files ; Карта частей и относящихся к ним файлов. FileName.s ; Имя и путь к файлу (относительный, хранящийся в торрент файле, без корневой папке в многофайловом торренте). SizeFile.q ; Размер файла в байтах (из торрент файла). Priorityt.a ; Приоритет файла. RealFileSize.q ; Текущий реальный размер файла (сколько байт файла присудствует на диске на данный момент). TestFile.b ; Если файл на диске есть, то 1, иначе 0 или другое число. PieceStart.l ; Номер начальной части. PieceEnd.l ; Номер конечной части. ShiftStart.l ; Смещение от начала части. Число может быть рано нулю или положительным, если в "PieceStart" указана часть, концвка которой пренадлежит файлу. Нужно отнять число от размера части чтобы определить начало файла в части. ShiftEnd.l ; Положительное число, не больше размера части, определяющее сколько байт пренадлежыт файлу в части, указанной в "PieceEnd". AddressStart.q ; Начальный адрес данных файла в общеадресном пространстве торрента. AddressEnd.q ; Конечный адрес данных файла в общеадресном пространстве торрента. FileID.i ; Это в основной программе не используется и нужно для процедуры обмена данными с пирами. WriteStatus.a ; Это в основной программе не используется и нужно для определения откыт ли байт для записи (#True) или только чтения (лубое читсло, не #True). EndStructure Structure Sub_TorrentInfo_TorrentList_MapFile ; Карта соответсвия частей и файлов. Array MapPiece.a(0) ; В массиве каждый бит обозначает присутсвие или отсутствие части (куска) на диске. 0 - части нет или присутсвует частично; 1 - часть есть вся. Array MapFiles.Sub_TorrentInfo_TorrentList_MapFile_Files(0) EndStructure Structure Sub_TorrentInfo_TorrentList_DataFile ; Данные торрента. Path.s ; Путь к файлам с торрентом. Если в торренте папка, то включено также содержимое "CurrentDir_Name", т. е. полный абсолютный путь к папке. Torrent_FileSize.q ; Размер всех загружаемых файлов торрента. Он может быть меньше реального размера торранта и отображает только размер выбранных файлов. CountPiece.l ; Число частей. CurrentCountPiece.l ; Сколько частей торрента в данный момент присутситвует. CurrentFileSize.q ; Текущий размер всех файлов торрента (сколько есть на диске). MapFile.Sub_TorrentInfo_TorrentList_MapFile ; Карта соответсвия частей и файлов. SysFileName.s ; Имя торрент файла, находящегося в системной папке торрента. EndStructure Structure Sub_TorrentInfo_TorrentList_Network_Peer_Table ; Информация о пире, отображаемая в таблице "Пиры" панели информации. Domains.s ; Доменный адрес пира. Flag.w ; Номер флага страны (пределяется по доменному имени) откуда пир. Нужно для отображения флажка в таблице "Пиры", панели информации. Local.s ; Текстовое сообщение, отображающееся в таблице и указывающее на страну, откуда пир. Client.s ; Название клиента пира. PeerFlags.s{10} ; Сткрока с флагами пира. Request.s{16} ; Запросы пиру и от него. Percent.w ; Сколько прорцентов есть у пира. InBytes.q ; Сколько байт было принято от пира. OutBytes.q ; Сколько байт было отдано пиру. All_Upload.q ; Сколько в общем отдано байт этому пиру. All_Download.q ; Сколько в общем загруженно байт от этого пира. In_Speed_Peer.l ; Текущая входящая скорость пира. EndStructure Structure Sub_TorrentInfo_TorrentList_Network_Peer ; Список пиров трекера. Peer_id.s ; Двадцатибайтная строка, идентифицирующая клиента (в компактном режиме отсутвует). IP$ ; IP пира (строка). ip.l ; IP пира (число). Port.u ; Порт пира. NumTracker.l ; Номер трекера, к которому пренадлежит пир. Нужно для правильного формирования статискики (скачанно, отданно) для трекера. Active.b ; Если в поле #True, то происходит обмен данными с пиром (скачивание от него и отдача ему). Если в поле -1, то нуэно удалить запись о пире. Out_Table.Sub_TorrentInfo_TorrentList_Network_Peer_Table ; Информация о пире, отображаемая в таблице "Пиры" панели информации. EndStructure Structure Sub_TorrentInfo_TorrentList_Network_Tracker ; Состояние трекеров торрента. NumTracker.l ; Уникальный номер трекера (для этого (текущего) торрента). Address.s ; Адрес сервера трекера. ErrorString.s ; В случае, ошибки, тут будет укана ее причина. TrackerID.s ; Идентификатор трекера. Command.b ; Команда трекеру. Old_Command.b ; Педыдущая команда трекеру. Только #Tracker_Started или #Tracker_Stopped. Используется для правильного формирования команд, к примеру, если трекеру успешно была переана команда #Tracker_Started, то при завершении работу программы, ему обязательно нужно отправить #Tracker_Stopped. Uploaded.q ; Общий объем отданных байт до этого момента после отправки события #Tracker_Started. Downloaded.q ; Общий объем скаченный до этого момента после отправки события #Tracker_Started. Left.q ; Количество в байтах, которое клиент ещё должен скачать, десятичное число в кодировке ASCII. UpdateTime.l ; Время в секундах до обновления данных (повторного запроса трекеру). Interval.l ; Через какой промежуток времени в секундах, нужно выполнять регулярные запросы трекеру. Min_Interval.l ; Минимальный промежуток времени в секундах, нужно выполнять регулярные запросы трекеру. CountNoConnect.a ; Число неудачных попыток (следующих одна за другой), при которых блокируется дальнейшие запросы трекеру. Complete.l ; Сколько сидов. Incomplete.l ; Скольтко личеров. Error.a Warning_Message_Err.a ; Установлено в 1, если сервер трекера вернул ошибку в поле "Failure Reason" или "Warning Message". EndStructure Structure Sub_TorrentInfo_TorrentList_Network Error_Tracker.b ; Устанавливается в 1 если ко всем трекерам не получилось подключится. Используется, например, для смены иконки на красную в списке торрентов. EnumTracker.l ; Счетчик для уникальной нумерации трекеров. List Tracker.Sub_TorrentInfo_TorrentList_Network_Tracker() List PeerList.Sub_TorrentInfo_TorrentList_Network_Peer() ; Список пиров, полученых с этого трекера. Array AccessiblyPiece.a(0) ; Доступные части, т. е. они есть у пиров к котрым подключен клиент - "логическое И" имеющихся частей подключенных клиентов. В массиве каждый бит обозначает присутсвие или отсутствие части (куска). 0 - части нет или присутсвует частично; 1 - часть есть вся. EndStructure Structure Sub_TorrentInfo_TorrentList_Network_IO ; Все что связанно с обменом через сеть конкретного торрента. ReceiveBytes.q ; Количество загруженных байт. SendBytes.q ; Количество отправленных байт. Limit_In.l ; Лимит приёма. Limit_Out.l ; Лимит отдачи. Excess.q ; Лишние данные. RemainsTime.l ; Сколько времени (в секундах) осталось до конца загрузки.. RatioDistribution.f ; Коэффициент раздачи. InSpeed.l ; Входящая скорость в байтах. OutSpeed.l ; Исходящая скорость в байтах. AllSeeds.l ; Всего сидов. Seeds.l ; Подключенные сиды, которые отдают файл клиенту. AllPeers.l ; Всего пиров. ActivePeers.l ; Активные пиры Available.f ; Сколько доступно. EndStructure Structure Sub_TorrentInfo_TorrentList_BlockInfo ; Информация об загружаемых блоках (только при скачивании) текущего торрента. Piece.l ; Номер части. Size.l ; Размер части. CountAvailable.l ; У скольких пиров есть эта часть. CountBlock.l ; Число блоков (размер массива). Array BlockInfo.a(0) ; Состояние блоков. 0 - нет, 1-запрошен, но пока не получен, 2-есть. EndStructure Structure Sub_TorrentInfo_TorrentList TorrentFile.TorrentFiles_TorrentInfo Torrent.Sub_TorrentInfo_TorrentList_DataFile Network.Sub_TorrentInfo_TorrentList_Network Network_IO.Sub_TorrentInfo_TorrentList_Network_IO TorrentStatus.b ; Состояние торрента. Label.s ; Метка торрента. AddDate.l ; Дата добавления торрента. ActiveTimeSec.l ; Время активности торреена (в секундах). TorrentName.s ; Имя торрента, отображаемое в таблице. Number.l ; Номер торрента в таблице торрентов (в текущей версии нереализовано, это на будующее). DelStatus.a ; Если торрент удаляется то тут будет #True Average_InSpeed.l ; Средняя входящая скорость торрента. Average_OutSpeed.l ; Средняя изходящая скорость торрента. List Average_InSpeed_List.l() ; Средняя входящая скорость торрента. List Average_OutSpeed_List.l() ; Средняя изходящая скорость торрента. List BlockList.Sub_TorrentInfo_TorrentList_BlockInfo() ; Информация об загружаемых блоках (только при скачивании) текущего торрента. EndStructure Structure Sub_TorrentInfo_Info_Speed ; Всё что связанно с со скоростьтю всех торрентов. InSpeed.l ; Текущая входящая скорость за секунду. OutSpeed.l ; Текущая исходящая скорость за секунду. Average_InSpeed.l ; Средняя входящая скорость. Average_OutSpeed.l ; Средняя изходящая скорость. List Average_InSpeed_List.l() ; Средняя входящая скорость. List Average_OutSpeed_List.l() ; Средняя изходящая скорость. In_Speed.q ; Сколько скачано байт за текущее время работы клиента. Out_Speed.q ; Сколько отданно байт за текущее время работы клиента. All_InBytes.q ; Сколько скачано байт за все время работы клиента. All_OutBytes.q ; Сколько отданно байт за все время работы клиента. List Speed_In.l() ; Список входящих скоростей для графика скорости. List Speed_Out.l() ; Список изходящих скоростей для графика скорости. EndStructure Structure Sub_TorrentInfo_Info ; Общая информация для всех торрентов. Speed.Sub_TorrentInfo_Info_Speed PeerProc_Percent.w ; Текущая загрузка в процентах процедуры обмена данными с пирами. PortIconState.a ; Тип иконки, отображаемолй в строке состояния и показывающей есть ли входящие соединения. hToolTip_PortIcon.i ; Идентификатор всплывающего окна для иконки порта в строке состояния. AddPeer_INFO_Hash.s ; Хеш торрента, в который нужно добавить пира. EndStructure Structure Sub_TorrentInfo_Table ; Список процентов для таблицы (#MainWin_ListIcon_Torrent). INFO_Hash.s ; SHA1 хеш-сумма области "info" torrent-файла. Percent.w ; Текущий процент (0 - 1000) и при отображении, нужно поделить на 10. Old_Percent.w EndStructure Structure TorrentInfo Info.Sub_TorrentInfo_Info Mutex.i ; Использует если надо полный доступ, кроме списка "Table". List TorrentList.Sub_TorrentInfo_TorrentList() ; Полная информация о торренте. Mutex_Table.i ; Контроль доступа к списку "Table". List Table.Sub_TorrentInfo_Table() EndStructure ;- G_TorrentList Global G_TorrentList.TorrentInfo ;- Out_GUI ; ------------------------------ Out_GUI.pbi ------------------------------------------------ Structure OutTextTableTorrent ; Вывод данных в таблицу торрентов. TorrentName.s TorrentStatus.b All_Size.q Seeds.l AllSeeds.l ActivePeers.l AllPeers.l InSpeed.l OutSpeed.l RemainsTime.l SendBytes.q Label.s Available.f RatioDistribution.f AddDate.l Percent.w INFO_Hash.s EndStructure ; ------------------------------ "Общая информация". Structure OutData_Panel_Info_MiscInfo ; Вывод данных во вкладку панели "Общая информация". Network_IO.Sub_TorrentInfo_TorrentList_Network_IO Percent.f ; Сколько процентов данных есть на диске. AddDate.l ; Дата добавления торрента. ActiveTimeSec.l ; Время активности торреена (в секундах). Path.s ; Путь к файлам с торрентом. Если в торренте папка, то включено также содержимое "CurrentDir_Name", т. е. полный абсолютный путь к папке. CountPiece.l ; Число частей. piece_length.l ; Размер части. All_Size.q INFO_Hash.s Comment.s Publisher.s Publisher_Url.s TorrentStatus.b CurrentFileSize.q ; Текущий размер всех файлов торрента (сколько есть на диске). Array MapPiece.a(0) Array AccessiblyPiece.a(0) ; Доступные части, т. е. они есть у пиров к котрым подключен клиент - "логическое И" имеющихся частей подключенных клиентов. В массиве каждый бит обозначает присутсвие или отсутствие части (куска). 0 - части нет или присутсвует частично; 1 - часть есть вся. EndStructure ; ------------------------------ "Трекеры" Structure OutData_Panel_Info_TrackerInfo_List ; Состояние трекеров торрента Address.s ; Адрес сервера трекера. ErrorString.s ; В случае, ошибки, тут будет укана ее причина. UpdateTime.l ; Время в секундах до обновления данных (повторного запроса трекеру). Complete.l ; Сколько сидов. Incomplete.l ; Скольтко личеров. EndStructure Structure OutData_Panel_Info_TrackerInfo ; Вывод данных в таблицу "Трекеры" панели. TorrentStatus.b ; Состояние торрента (закачка, раздача, пауза, остановлен и т. д.). List TrackerList.OutData_Panel_Info_TrackerInfo_List() EndStructure ; ------------------------------ "Пиры". Structure OutData_Panel_Info_PeerInfo_List NumFlag.w ; Номер флага для отображения в таблице. PeerAddress.s ; IP или доменное имя пира. Local.s ; Поле "Локализация" (страна, откуда пир). Client.s ; Название торрент-клиента пира. PeerFlags.s{10} ; Сткрока с флагами пира. Request.s{16} ; Запросы пиру и от него. Percent.w ; Сколько прорцентов есть у пира. InBytes.q ; Сколько байт было принято от пира. OutBytes.q ; Сколько байт было отдано пиру. All_Upload.q ; Сколько в общем отдано байт этому пиру. All_Download.q ; Сколько в общем загруженно байт от этого пира. In_Speed_Peer.l ; Текущая входящая скорость пира. EndStructure Structure OutData_Panel_Info_PeerInfo ; Вывод данных в таблицу "Пиры" панели. List Peer.OutData_Panel_Info_PeerInfo_List() EndStructure ; ; ----------------------------- "Файлы". ;- Core.pbi ; ------------------------ Core.pbi --------------------------------------------------------- Structure Core_Torrent_List_Network_Peer_Status ; Состояние пира, в т. ч. данные о том, сколько у него есть частей торрента. Данные обновляются при обмене сообщениями. Choke.a ; #True - заблокирован; #False - незаблокирован. Interested.a ; #True - заинтерисован; #False - незаинтерисован. EndStructure Structure Core_Torrent_List_Network_Peer_Queue ; Очередь данных для передачи пиру. Len.l ; Размер данных. *Point ; Указатель на данные в памяти. Естессно нужно освобождать память при удалении элемента. EndStructure Structure Core_Torrent_List_Network_Peer ; Список пиров трекера. Peer_id.s ; Двадцатибайтная строка, идентифицирующая клиента (в компактном режиме отсутвует). IP$ ; IP пира (строка). ip.l ; IP пира (число). Port.u ; Порт пира. NumTracker.l ; Номер трекера, к которому пренадлежит пир. Нужно для правильного формирования статискики (скачанно, отданно) для трекера. Active.b ; Если в поле #True, то происходит обмен данными с пиром (скачивание от него и отдача ему). Если в поле -1, то нуэно удалить запись о пире. ConnectID.i ; Идентификатор соединения, если установлена связь с пиром, или 0, если связи нет. Connect_Status.a ; По умолчанию #Null - конекта нет. Если с пиром клиент сам установил связь, то будет #Peer_OutConnect, а если это входящее соединение, то будет #Peer_InConnect. Peer_ConnectStatus.a ; #True если с пиром был устновлен коннект в течение этой сесии, естесно что устанавливается только после "рукопожатия". Обнулять лишь при остановке торрента, а не при дисконекте пира. Err_ConnectCount.l ; Число попыток подряд безуспешных попыток соединения. Time_Connect.l ; Тут хранится время в которое произошел конект (или ошибка конекта) с пиром. Time_UploadNoConnect.l ; Только если торрент сидитируется. Если пир разорвал связь или она была разорвата по неактивности пира, то в этой переменой будет время когда можно будет устанавливать конекты с пиром. TimeOut.u ; Сколько прошло времени (в секундах) после последнего обращения к пиру. Если прошло больше 2-ух минут (120 секунд), то нужнро разорвать связь с пиром. InDataTime.l ; Подсчет времени после последнего приема данных от пира. Нужно для закрытия связи с неактивными пирами. Peer_Interested_Time.l ; Счетчик для регулярного напоминания пиру что он нам интересен. Peer_Status. Core_Torrent_List_Network_Peer_Status ; Отношение пира к этому клиенту. MyStatus. Core_Torrent_List_Network_Peer_Status ; Отношение этого клиента к пиру. Array MapPiece.a(0) ; В массиве каждый бит обозначает присутсвие или отсутствие части (куска). 0 - части нет или присутсвует частично; 1 - часть есть вся. PosQueue.l ; Позиция передачи байт в первом элементе списка. List QueueList.Core_Torrent_List_Network_Peer_Queue() Receive_Pos.l ; Позиция принятых данных. Receive_Len.l ; Размер области памяти. Receive_Info_Len.l ; Текущая длина информационного сообщения. *ReceivePoint ; Память под принятые данных от этого пира. InSpeed.l ; Текущая входящая скорость за секунду этого пира. OutSpeed.l ; Текущая изходящая скорость за секунду этого пира. Average_InSpeed.l ; Средняя входящая скорость пира. Average_OutSpeed.l ; Средняя изходящая скорость пира. List Average_InSpeed_List.l() ; Средняя входящая скорость пира. List Average_OutSpeed_List.l() ; Средняя иcходящая скорость пира. List Average_In_Speed_Peer_List.l() ; Средняя входящая скорость пира. Total_InBytes.q ; Общее число байт, полученое от этого пира. Total_OutBytes.q ; Общее число байт, переданое этому пиру. InCon.a ; Если #True, то пир установил входящее соединение. CountIn_Request.u ; Число входящих запросов за секунду от пира. CountOut_Request.u ; Число исходящих запрсов за секунду пиру. CountHave.l ; Число получкнных Have сообщений за секунду. Нужно для вычисления скорости пира. PeerDown.a ; Пир чего-то от нас качает. PeerUp.a ; Пир чего-то нам соизволит отдать, низкий поклон ему за это. CurrentRequest.w ; Текущее число невыполненых запросов для пира. MaxRequest.w ; Максимально разрешенное число невыполненых запросов для этого пира. Это чтобы не запрашивать много у пиров, котрые пичти не отдают. EndStructure Structure Core_Torrent_List_Network_Tracker ; Состояние трекеров торрента. NumTracker.l ; Уникальный номер трекера (для этого (текущего) торрента). Uploaded.q ; Общий объем отданных байт до этого момента после отправки события #Tracker_Started. Downloaded.q ; Общий объем скаченный до этого момента после отправки события #Tracker_Started. EndStructure Structure Core_Torrent_List_Network List Tracker. Core_Torrent_List_Network_Tracker() List PeerList. Core_Torrent_List_Network_Peer() ; Список пиров, полученых с этого трекера. CountActivePeer.l ; Текущее число активных пиров. CountUploadPeer.l ; Число пиров котоорым сейчас раздается этот торрент (для регулирования слотов раздачи). EndStructure Structure Core_TorrentList_Network_IO ; Все что связанно с обменом через сеть конкретного торрента. Excess.q ; Лишние данные.. InSpeed.l ; Входящая скорость в байтах. OutSpeed.l ; Исходящая скорость в байтах. AllSeeds.l ; Всего сидов. Seeds.l ; Подключенные сиды, которые отдают файл клиенту. AllPeers.l ; Всего пиров. ActivePeers.l ; Активные пиры Available.f ; Сколько доступно. EndStructure Structure Core_Torrent_List_Buffer ; Буфер уже прочитанных частей файла и провереных с помощью SHA1. Piece.l ; Номер части. *Point ; Указатель на область памяти, где хранится часть файла. EndStructure Structure Core_Torrent_List_GetPieces_Array begin.l ; Смещение относительно начала части. length.l ; Длина блока. CurrentTime.l ; Время (Date()) на момент запроса. Нужно для сброса по таймауту через 60 секунд если за это время не были получены данные. ConnectID.i ; ID связи с пиром, которому был отправлен запрос и он должен прислать запрошенные данные. *Point ; Указатель на полученные данные. EndStructure Structure Core_Torrent_List_GetPieces ; Запросы блоков, частей этого торрента. Piece.l ; Номер части. Time.l ; Время запроса части или получения очередного блока. Нужно для того, чтобы не "висели" части, которых пока что невозможно загрузить от текущих пиров. Array PiecesInfo.Core_Torrent_List_GetPieces_Array(0) EndStructure Structure Core_Torrent_List TorrentStatus.b ; Состояние торрента. INFO_Hash.s ; SHA1 хеш-сумма области "info" torrent-файла. INFO_HashBin.a[20] piece_length.l ; Размер части. All_Size.q ; Размер всех файлов торрента в байтах. TorrentName.s ; Имя торрента, отображаемое в таблице. Endgame_Mode.a ; Признак того что торрент находится в режиме "endgame mode" (#True), который включается при окончании скачивания. Network_IO.Core_TorrentList_Network_IO Torrent.Sub_TorrentInfo_TorrentList_DataFile Network.Core_Torrent_List_Network Array SHA1_pieces.s(0) ; SHA1 хеши частей торрента. File_Max_CountList.l ; Максимально допустимое число элементов для этого торрента. List File_PieceBuffer.Core_Torrent_List_Buffer() ; Буфер уже прочитанных частей файла и провереных с помощью SHA1. GetPieces_Count.l ; Максимальное число, одновременно скачиваемых частей. Current_CountBlockDownload.l ; Текущее число загружаемых блоков (запрошены, но еще не полностью скачаны). List GetPieces_List.Core_Torrent_List_GetPieces() ; Список запросов блоков, частей этого торрента. EndStructure Structure Core_Torrent_Info ; Общая информация для всех торрентов. InSpeed.l ; Текущая входящая скрость всех торрентов. OutSpeed.l ; Текущая исходящая скорость всех торрентов. Current_CountConnect.l ; Текущее количество конектов с пирами. Current_Time.l ; Текущее время в формате Date(). EndStructure Structure Core_Torrent ; Копия данных всех торрентов. Info.Core_Torrent_Info List TorrentList.Core_Torrent_List() List PeerProcList.u() ; Загрузка процедуры пиров. EndStructure ;- Tracker.pbi ; ------------------------ Tracker.pbi ------------------------------------------------------ Structure Tracker_Bencode_Info_PeerList Peer_id.s ; Двадцатибайтная строка, идентифицирующая клиента. IP.s ; IP пира. Port.u ; Порт пира. EndStructure Structure Tracker_Bencode_Info ; Ответ трекера, содержащий иформацию о трекре и пирах. Complete.l ; Сколько сидов. Incomplete.l ; Скольтко личеров. Downloaded.l ; Число завершенных закачек. Interval.l ; Интервал в секундах, для регулярных запросов трекеру. Min_interval.l ; Минимальный интервал, через которых можно отправить повторных запрос трекеру. Tracker_ID.s ; Идентификатор трекера, тоторый он сам же и возвращает при запросе к нему. Failure_Reason.s ; Текстовое сообщение об ошибке, сообщающее о том, почему запрос не удался (строка). Warning_Message.s ; (новый, опциональный) Похож на 'failure reason', но ответ будет полным. Предупреждение отображается также, как и ошибка. List Peersld.Tracker_Bencode_Info_PeerList() EndStructure Structure Tracker_SetTracker ; Даные для запроса трекеру. Tracker.s ; Адрес сайта-трекера. port.u ; Номер порта, на котором клиент принимает соединения. Обычно скачивающий агент открывает порт 6881, и если этот порт занят, пробует открыть порт 6882, затем 6883 и т.д., и прекращает попытки эти попытки после порта 6889. uploaded.q ; Общий объем отданных байт до этого момента. downloaded.q ; Общий объем скаченный до этого момента. left.q ; Количество в байтах, которое клиент ещё должен скачать, десятичное число в кодировке ASCII. Обратите внимание, что это значение не может быть вычислено из скаченного объёма и общего размера файла, поскольку возможно возобновление незавершенного скачивания, и существует вероятность того, что некоторое количество скаченных данных не прошло проверку на целостность и должно быть скачено повторно. event.a ; Это необязательное поле, которое содержит статус скачивания - started, completed, или stopped (или empty, которое равносильно отсутствию поля). Если поле опущено, то передаваемое сообщение - одно из тех, которые передаются регулярно через определённые промежутки времени. Сообщение со статусом started передаётся тогда, когда скачивание впервые начато; со статусом completed передаётся - когда скачивание завершено. Статус completed не отправляется, если весь файл присутствовал с самого начала. Скачивающие агенты отправляют сообщение stopped, когда они прерывают скачивание. info_hash.a[20] ; 20-байтный SHA1 хэш поля info в формате Bencode соответствующего торрент-файла. Это значение почти наверняка должно быть замаскировано(escaped). trackerid.s numwant.u ; Число пиров, которые надо запросить у трекера. Compact.b ; Если #True, то трекер должен присылать компактные ответы. — по 6 байт на одного пира. Первые четыре байта — это хост (в сетевом порядке байтов), последние два байта — порт (опять же, в сетевом порядке байтов). Key.s ; Дополнительный идентификатор торрент-клиента. no_peer_id.a ; Говорит о том, что трекер может пренебречь полем 'peer id' в хэш-таблице 'peers'. Этот параметр игнорируется, если включен компактный режим. EndStructure ; Работа с UDP трекером. ; http://www.bittorrent.org/beps/bep_0015.html ; connect request: ; Offset Size Name Value ; 0 64-bit integer connection_id 0x41727101980 ; 8 32-bit integer action 0 // connect ; 12 32-bit integer transaction_id ; 16 Structure UDP_Tracker_ConnectRequest ; Первоначальный запрс трекеру. Connection_ID.q Action.l Transaction_ID.l EndStructure ; connect response: ; Offset Size Name Value ; 0 32-bit integer action 0 // connect ; 4 32-bit integer transaction_id ; 8 64-bit integer connection_id ; 16 Structure UDP_Tracker_ConnectResponse ; Первоначальный ответ трекера. Action.l Transaction_ID.l Connection_ID.q EndStructure ; announce request: ; Offset Size Name Value ; 0 64-bit integer connection_id ; 8 32-bit integer action 1 // announce ; 12 32-bit integer transaction_id ; 16 20-byte string info_hash ; 36 20-byte string peer_id ; 56 64-bit integer downloaded ; 64 64-bit integer left ; 72 64-bit integer uploaded ; 80 32-bit integer event 0 // 0: none; 1: completed; 2: started; 3: stopped ; 84 32-bit integer IP address 0 // Default ; 88 32-bit integer key ; 92 32-bit integer num_want -1 // Default ; 96 16-bit integer port ; 98 Structure UDP_Tracker_AnnounceRequest ; Запрос анонса от трекера. Connection_ID.q Action.l Transaction_ID.l Info_Hash.a[20] Peer_ID.a[20] Downloaded.q Left.q Uploaded.q Event.l IP_Address.l Key.l Num_Want.l Port.u EndStructure ; announce response: ; Offset Size Name Value ; 0 32-bit integer action 1 // announce ; 4 32-bit integer transaction_id ; 8 32-bit integer interval ; 12 32-bit integer leechers ; 16 32-bit integer seeders ; 20 + 6 * n 32-bit integer IP address ; 24 + 6 * n 16-bit integer TCP port ; 20 + 6 * N ; Structure UDP_Tracker_Announce_Peer ; Список пиров. ; IP.l ; Port.u ; EndStructure Structure UDP_Tracker_Announce ; Ответ на запрос аносна у трекера. Action.l Transaction_ID.l Interval.l Leechers.l Seeders.l ;List PeerList.UDP_Tracker_Announce_Peer() EndStructure ; scrape request: ; Offset Size Name Value ; 0 64-bit integer connection_id ; 8 32-bit integer action 2 // scrape ; 12 32-bit integer transaction_id ; 16 + 20 * n 20-byte string info_hash ; 16 + 20 * N Structure UDP_Tracker_ScrapeRequest ; Scrape запрос трекеру. connection_id.q action.l transaction_id.l info_hash.a[20] ; Для упрощения, за один запрос, получаем инфу только по одному торренту. EndStructure ; scrape response: ; Offset Size Name Value ; 0 32-bit integer action 2 // scrape ; 4 32-bit integer transaction_id ; 8 + 12 * n 32-bit integer seeders ; 12 + 12 * n 32-bit integer completed ; 16 + 12 * n 32-bit integer leechers ; 8 + 12 * N Structure UDP_Tracker_ScrapeResponse ; Scrape ответ трекера. action.l transaction_id.l seeders.l completed.l leechers.l ; Дальше следует информация об пирах. EndStructure ; error response: ; Offset Size Name Value ; 0 32-bit integer action 3 // error ; 4 32-bit integer transaction_id ; 8 string message Structure UDP_Tracker_Error_Response ; Ответ трекера в случае возникновения ошибки action.l transaction_id.l ;*string_message EndStructure ;- Peer.pbi ; ------------------------ Peer.pbi ------------------------------------------------------ Structure Peer_Handshake ; Рукопожатие" пиров. INFO_Hash.a[20] ; Хэн торрента. Client.a[20] ; Имя торрент-клиента. EndStructure ; ----------------------------------------- Разное ------------------------------------------ Structure DomainsInfo ; Идентификация места расположения пира по IP адресу. Domain.s ; Домер высшего уровня, например "ru". IP.l ; IP адрес пира. ;IP_Text.s ImageListIndex.l ; Индекс иконки-флажка, соответсвующего стране откуда пир вышел в интернет. Comment.s ; Комментарий. Обычно описание страны, например "Россия". EndStructure Macro pad(number,bytes) CompilerIf #PB_Compiler_Processor=#PB_Processor_x64 _#number#.b[bytes] CompilerEndIf EndMacro Structure NOTIFYICONDATA_95 cbSize.l pad(0,4) hwnd.i uID.l uFlags.l uCallbackMessage.i hIcon.i szTip.c[64] EndStructure Structure NOTIFYICONDATA_2K Extends NOTIFYICONDATA_95 szTipEx.c[64] dwState.l dwStateMask.l szInfo.c[256] StructureUnion uTimeout.i uVersion.i EndStructureUnion szInfoTitle.c[64] dwInfoFlags.l pad(1,4) EndStructure Structure My_PB_Gadget_VT GadgetType.l SizeOf.l GadgetCallback.i FreeGadget.i GetGadgetState.i SetGadgetState.i GetGadgetText.i SetGadgetText.i AddGadgetItem2.i AddGadgetItem3.i RemoveGadgetItem.i ClearGadgetItemList.i ResizeGadget.i CountGadgetItems.i GetGadgetItemState.i SetGadgetItemState.i GetGadgetItemText.i SetGadgetItemText.i OpenGadgetList2.i GadgetX.i GadgetY.i GadgetWidth.i GadgetHeight.i HideGadget.i AddGadgetColumn.i RemoveGadgetColumn.i GetGadgetAttribute.i SetGadgetAttribute.i GetGadgetItemAttribute2.i SetGadgetItemAttribute2.i SetGadgetColor.i GetGadgetColor.i SetGadgetItemColor2.i GetGadgetItemColor2.i SetGadgetItemData.i GetGadgetItemData.i EndStructure Structure My_PB_Gadget Gadget.i *VT.PB_Gadget_VT UserData.i OldCallback.i Daten.l[4] EndStructure Structure My_Gadget_Info OldCallback.i DestroyProc.i PBID.i EndStructure CompilerIf #PB_Compiler_Processor = #PB_Processor_x64 And #PB_Compiler_OS <> #PB_OS_Windows ; On Linux x64, a long is 8 byte (unlike Windows x64) ; Structure zstream *next_in.BYTE avail_in.l pad.l total_in.i ; uLong *next_out.BYTE avail_out.l pad2.l total_out.i ; uLong *msg.BYTE *state zalloc.i zfree.i opaque.i data_type.l pad3.l adler.i ; uLong reserved.i ; uLong EndStructure CompilerElse Structure zstream *next_in.BYTE avail_in.l total_in.l ; uLong *next_out.BYTE avail_out.l total_out.l ; uLong *msg.BYTE *state zalloc.i zfree.i opaque.i data_type.l adler.l ; uLong reserved.l ; uLong ; without this, the inflateInit2() fails with a version error CompilerIf #PB_Compiler_Processor = #PB_Processor_x64 alignment.l CompilerEndIf EndStructure CompilerEndIf Structure WSANETWORKEVENTS ; Для функции WinAPI WSAEnumNetworkEvents(). lNetworkEvents.l iErrorCode.l[#FD_MAX_EVENTS] EndStructure Structure GetIcon_Extension ; Структура для функции GetIcon_Extension, хранящая иконки (16x16), связанные с расширением файлов Part.s ; Расширение файла IconID.l ; Идентификатор иконки, связанной с расширением EndStructure Structure Int_2 Int_1.i Int_2.i EndStructure CompilerIf Defined(Pointer, #PB_Structure)=0 Structure Pointer *P EndStructure CompilerEndIf Import "" PB_Gadget_Objects PB_Gadget_Globals PB_Object_GetThreadMemory(*PB_Object) PB_Object_GetOrAllocateID(*PB_Object, ID) PB_Gadget_RegisterGadget(ID, *Gadget, hwnd, *vt.My_PB_Gadget_VT) PB_Gadget_SendGadgetCommand(hwnd, EventType) EndImport Import "window.lib" PB_Window_ProcessEvent(a,b,c,d) ;As "_PB_Window_ProcessEvent_UNICODE@16" PB_Window_Icon PB_Window_Cursor PB_Window_Objects EndImport ImportC "zlib.lib" CompilerIf #PB_Compiler_Processor = #PB_Processor_x86 inflateInit2(*strm, WindowBits.i, v, ss) As "_inflateInit2_@16" inflate(*strm, flush.i) As "_inflate@8" inflateEnd(*strm) As "_inflateEnd@4" CompilerElse inflateInit2(*strm, WindowBits.i, v, ss) As "inflateInit2_" inflate(*strm, flush.i) As "inflate" inflateEnd(*strm) As "inflateEnd" CompilerEndIf EndImport ; IDE Options = PureBasic 5.11 (Windows - x86) ; Folding = - ; EnableXP