pbTorrent - быстрый и компактный торрент-клиент.
Каталог статей
Меню сайта

Форма входа

Категории раздела
Мои статьи [4]

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Поиск

Друзья сайта
  • PureBasic
  • PureBasic форум

  • Приветствую Вас, Гость · RSS 28.04.2024, 19:59

    Главная » Статьи » Мои статьи

    Создание и редактирование torrent файлов.
    Думаю что многие из нас пользовались торрентами для скачивания файлов или их раздачи.
    Чтобы скачать файл с торрента, сначала скачиваем небольшой файлик с расширением torrent, который открывается в торрент-клиенте и после этого происходит скачивание (конечно же при условии что есть сиды, раздающие торрент).
    Что же представляет из себя торрент-файл и какие данные в нем хранятся?
    Внутренности torrent-файла – это bencode-данные.
    Bencode-формат файла позволяет хранить следующие типы данных: байт-строки, числа, списки и директивы.
    Приведу примеры кодирования данных.

    Строки:
    <длина строки>:<строка>. Пример: 10:PROgramist
    Числа:
    <ключ i><число><ключ e>. Пример: i1234e
    Списки:
    <ключ l><bencoding данные><ключ e>. Пример: 10:PROgramisti1234ee
    Директивы:
    <ключ d><строка bencoding><элемент bencoding><ключ e>. Пример: d10:PROgramist6:forevere

    Согласно спецификации, в торрент-файле должны присутствовать несколько директив:
    • announce – URL адрес трекера;
    • announce list – список, содержащий несколько URL адрес трекеров
    • create date – дата создания torrent файла в формате Unix-time;
    • comment – комментарий от создателя торрент-файла;
    • created by – название и версия программы, в которой был создан torrent-файл.;
    • info – директива для описания свойств файлов. В зависимости от типа торрент-файла (обычный – один файл или смешанный – несколько файлов) эта директива применяется по-разному. В директиву входят:
    • piece length – длина сегмента файла;
    • pieces – бинарный массив хэш сумм сегментов файлов, полученных по алгоритму SHA1,
    • private - определяет будет ли использоваться обмен между пирами и DHT. Учтите, SHA1 хэш данных этой директивы используется для идентификации торента поэтому если изменить содержимое готового торрент-файла то его не признает трекер!

    Итак, теперь мы примерно представляем как устроен торрент-файл.
    Теперь перейдем к практике - к созданию торрент-файла и к редактированию уже имеющегося.

    Для работы с торрент-файлами, были созданы несколько процедур (файл TorrentFiles.pbi).
    К сожалению, код не могу выложить на странице - поскольку здесь ограничение в 40000 знаков  поэтому рассмотрим только ключевые места кода.

    Процедура:
    TorrentFiles_CreateTorrent( *TorrentInfo.TorrentFiles_CreateInfo )

    позволяет создать новый торрент-файл. Ей передается указатель на структуру TorrentFiles_CreateInfo, в котрой содержатся данные, необходимые для создания торрент-файла.


    Код:
    Structure TorrentFiles_CreateInfo
      FileName.s         ; Путь к торрент-файлу.
      Path.s             ; Путь к файлам.
      ClientName.s       ; Название торрент-клиента (добавляется в торрент-файл).
      ProgName.s         ; Название торрент-клиента (для вывода сообщений).
      BreakThread.b      ; Признак того, что нужно завершить поток.
      Directory.b        ; Из чего создается торрент. 0 - файл; 1- папка.
      List announce.s()  ; Список анонс-серверов.
      Publisher.s
      Publisher_Url.s
      comment.s          ; Комментарий к торренту.
      pieceLength.l      ; Размер сегмента в байтах.
      private.b          ; Если 1, то торрент приватный.
      *PiecesCB          ; Адрес Callback процедуры.
      ErrorCode.b        ; Код ошибки создания torrent-файла.
      ErrorString.s
      Result.b           ; 1 - ОК; 0 - Ошибка.
    EndStructure

    Для загрузки торрент-файла, следует  использовать процедуру
    TorrentFiles_LoadTorrentFile(TorrentFile.s, *Torrent.TorrentFiles_TorrentInfo)

    Ей в первом аргументе передается путь к открываемому торрент-файлу, а во втором, указатель на структуру TorrentFiles_TorrentInfo.


    Код:
    Structure TorrentFiles_TorrentInfo_pieces ; Описание частей.
      SHA1_string.s        ; SHA1 хэш в виде строки (нижний регистр).
      SHA1_bin.a[20]       ; SHA1 хэш в бинарном виде (20 байт).
    EndStructure

    Structure TorrentFiles_TorrentInfo_file ; Информация о файлах торрента.
      length.q             ; Размер файла.
      List path.s()        ; Путь, (все папки по отдельности и в конце имя файла).
    EndStructure

    Structure TorrentFiles_TorrentInfo ; Информация из torrent-файла.
      announce.s           ; Адрес трекера.
      List  announce_list.s()  ; Если есть еще адреса трекеров, то они будут здесь.
      Publisher.s
      Publisher_Url.s
      comment.s            ; Комментарий в torrent-файле.
      created_by.s         ; Информация о создавшем torrent-файл.
      creation_date.l      ; Дата создания torrent-файла по Гринвичу (UTC).
      encoding.b           ; Кодировка файла.
      INFO_Hash.s          ; SHA1 хэш-сумма области "info" torrent-файла.
      TypeDir.b            ; Тип торрента. 1 - папка; любое другое значение - файл.
      CurrentDir_Name.s    ; Имя корневой папки с файлами торрента (только если TypeDir = 1).
      List files.TorrentFiles_TorrentInfo_file() ; Список всех файлов торрента.
      All_Size.q           ; Размер всех файлов торрента в байтах.
      piece_length.l       ; Размер части.
      Array pieces.TorrentFiles_TorrentInfo_pieces(0) ; Массив SHA1 хэш-сумм частей торрента.
      private.b            ; 1 - торрент приватный; 0 не приватный.
      ErrorCode.b          ; Признак ошибки при расшифровке torrent-файла.
      ErrorString.s        ; Описание ошибки (чаще всего - имя файла, при работе с которым произошла ошибка).
    EndStructure
    При успешной расшифровке торрент-файла, в эту структуру будут записаны данные из файла.

    Процедура:
    TorrentFiles_CreateSysFile_Torrent(TorrentFile.s, *Torrent.TorrentFiles_TorrentInfo)
    предназначена для создания торрент-файла из данных в структуре TorrentFiles_TorrentInfo.
    Она используется для сохранения данных после их редактирования.



    А теперь покажу на примерах как пользоваться этими процедурами.

    Создание торрент-файла: (файл CreateTorrent.pb).
    Код:
    XIncludeFile "TorrentFiles.pbi"

    ; Идентификаторы окон.
    Enumeration
      #CreateTorrent_Win
    EndEnumeration

    ; Идентификаторы гаджетов.
    Enumeration
      ; Гаджеты окна "Создание торрента".
     
      #CreateTorrent_Text_0
      #CreateTorrent_Radio_File
      #CreateTorrent_Radio_Dir
      #CreateTorrent_String_Path
      #CreateTorrent_Button_Path
      #CreateTorrent_Text_5
      #CreateTorrent_String_TorrentFile
      #CreateTorrent_Button_TorrentFile
      #CreateTorrent_Frame3D_0
      #CreateTorrent_Text_1
      #CreateTorrent_String_Treker
      #CreateTorrent_Text_2
      #CreateTorrent_String_Comment
      #CreateTorrent_Text_3
      #CreateTorrent_CheckBox_Private
      #CreateTorrent_Combo_Piece
      #CreateTorrent_ProgressBar
      #CreateTorrent_Button_Start
      #CreateTorrent_CurrentFile
    EndEnumeration

    ; Идентификаторы таймеров.
    Enumeration
      #CreateTorrent_Timer
    EndEnumeration

    Procedure CreateTorrentCB(File.s, Pos.f)
      Static Old_File.s, Old_Pos
      Protected Count, Temp
     
      If Old_File <> File
        Old_File = File
        If Len(File) > 40
          Count = CountString(File, "\")
          If Count > 2
            Temp=FindString(File, "\", 1)
            If Temp > 0
              Temp = FindString(File, "\", Temp+1)
              If Temp > 0
                File.s = Left(File, Temp)+"...\"+GetFilePart(File)
              EndIf
            EndIf
          EndIf
        EndIf
        If IsGadget(#CreateTorrent_CurrentFile)
          SetGadgetText(#CreateTorrent_CurrentFile, File)
        EndIf
      EndIf
     
      If Round(Pos,#PB_Round_Down) <> Old_Pos
        Old_Pos = Pos ;Round(Pos,#PB_Round_Up)
        If IsGadget(#CreateTorrent_ProgressBar)
          SetGadgetState(#CreateTorrent_ProgressBar, Old_Pos)
        EndIf
      EndIf
    EndProcedure


    Path.s : String.s : Dir.s
    Torrent.TorrentFiles_CreateInfo
    S_Temp.s


    If OpenWindow(#CreateTorrent_Win, 277, 288, 384, 374, "Cоздание торрента.",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_Invisible)
      TextGadget(#CreateTorrent_Text_0, 10, 10, 200, 15, "Путь к файлам:")
      OptionGadget(#CreateTorrent_Radio_File, 220, 10, 65, 15, "Файл")
      OptionGadget(#CreateTorrent_Radio_Dir, 295, 10, 75, 15, "Папка")
      StringGadget(#CreateTorrent_String_Path, 10, 30, 335, 20, "", #PB_String_ReadOnly)
      ButtonGadget(#CreateTorrent_Button_Path, 350, 30, 30, 20, "...")
      TextGadget(#CreateTorrent_Text_5, 10, 65, 335, 15, "Торрент файл:")
      StringGadget(#CreateTorrent_String_TorrentFile, 10, 85, 335, 20, "", #PB_String_ReadOnly)
      ButtonGadget(#CreateTorrent_Button_TorrentFile, 350, 85, 30, 20, "...")
      Frame3DGadget(#CreateTorrent_Frame3D_0, 15, 120, 355, 205, "Свойства торрента")
      TextGadget(#CreateTorrent_Text_1, 25, 140, 335, 15, "Трекеры:")
      StringGadget(#CreateTorrent_String_Treker, 25, 160, 335, 74, "", #ES_MULTILINE|#WS_VSCROLL|#ES_AUTOVSCROLL)
      TextGadget(#CreateTorrent_Text_2, 25, 245, 330, 15, "Комментарий:")
      StringGadget(#CreateTorrent_String_Comment, 25, 265, 335, 20, "")
      TextGadget(#CreateTorrent_Text_3, 165, 300, 110, 15, "Размер частей:", #PB_Text_Right)
      CheckBoxGadget(#CreateTorrent_CheckBox_Private, 25, 300, 120, 15, "Частный торрент")
      ComboBoxGadget(#CreateTorrent_Combo_Piece, 280, 295, 80, 22)
      ProgressBarGadget(#CreateTorrent_ProgressBar, 15, 350, 265, 15, 0, 100, #PB_ProgressBar_Smooth)
      ButtonGadget(#CreateTorrent_Button_Start, 295, 340, 75, 25, "Создать")
      TextGadget(#CreateTorrent_CurrentFile, 15, 335, 265, 15, "")
     
      SetWindowLongPtr_(GadgetID(#CreateTorrent_CurrentFile),#GWL_STYLE, GetWindowLongPtr_(GadgetID(#CreateTorrent_CurrentFile),#GWL_STYLE)|#SS_LEFTNOWORDWRAP)
      SetGadgetState(#CreateTorrent_Radio_File, 1)
     
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "Авто")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "16 КБ")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "32 КБ")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "64 КБ")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "128 КБ")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "256 КБ")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "512 КБ")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "1 МБ")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "2 МБ")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "4 МБ")
      AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "8 МБ")
      SetGadgetState(#CreateTorrent_Combo_Piece, 0)
     
      SetActiveGadget(#CreateTorrent_Radio_File)
      SendMessage_(WindowID(#CreateTorrent_Win), #WM_UPDATEUISTATE, $30002,0)
     
      HideWindow(#CreateTorrent_Win, 0)
      Thread_ID = 0
     
      Repeat
        Event = WaitWindowEvent()
       
        If Event = #PB_Event_Gadget And Thread_ID=0
          Select EventGadget()
            Case #CreateTorrent_Button_Path
             
              If GetGadgetState(#CreateTorrent_Radio_File) ; Файл
                Path = OpenFileRequester("","","Все файлы|*.*",0)
                If Path<>"" And FileSize(Path)>0
                  SetGadgetText(#CreateTorrent_String_Path, Path)
                EndIf
              Else  ; Папка
                Path = PathRequester("Укажите путь к папке с файлами торрента.",Dir)
                If Path<>"" And FileSize(Path)= -2
                  SetGadgetText(#CreateTorrent_String_Path, Path)
                EndIf
              EndIf
             
            Case #CreateTorrent_Button_TorrentFile
              Path = SaveFileRequester("","","Торрент-файлы (*.torrent)|*.torrent|Все файлы|*.*",0)
              If Path<>"" And SelectedFilePattern()>-1
                If SelectedFilePattern() = 0 And GetExtensionPart(Path)="" : Path+".torrent" : EndIf
                SetGadgetText(#CreateTorrent_String_TorrentFile, Path)
              EndIf
             
            Case #CreateTorrent_Radio_File, #CreateTorrent_Radio_Dir
              SetGadgetText(#CreateTorrent_String_Path, "")
             
            Case #CreateTorrent_Button_Start
              SetGadgetState(#CreateTorrent_ProgressBar, 0)
             
              ClearStructure(@Torrent, TorrentFiles_CreateInfo)
              NewList Torrent\announce()
             
              Torrent\Path = GetGadgetText(#CreateTorrent_String_Path)
              Torrent\FileName = GetGadgetText(#CreateTorrent_String_TorrentFile)
              If Torrent\Path<>"" And Torrent\FileName<>""
               
                String=GetGadgetText(#CreateTorrent_String_Treker)
                If String<>""
                  String = ReplaceString(String, Chr(13), Chr(10))
                  String = ReplaceString(String, Chr(10)+Chr(10), Chr(10))
                  If String<>""
                    String + Chr(10)
                    Temp = CountString(String, Chr(10))
                    For i=1 To Temp
                      S_Temp = StringField(String, i, Chr(10))
                      If S_Temp<>""
                        S_Temp=Trim(S_Temp)
                        S_Temp=RemoveString(S_Temp, Chr(9))
                        If S_Temp<>""
                          If AddElement(Torrent\announce())
                            Torrent\announce() =  S_Temp
                          Else
                            MessageRequester("Создание торрента.", "Ошибка выделения памяти!", #MB_OK|#MB_ICONERROR)
                            Break
                          EndIf
                        EndIf
                      EndIf
                    Next i
                  EndIf
                EndIf
                String="" : S_Temp=""
               
                Torrent\BreakThread = 0 ; Признак того, что не нужно прерывать создание торрент-файла.
                Torrent\ClientName = "MyTorrent 2.0"
                Torrent\comment = GetGadgetText(#CreateTorrent_String_Comment)
                Torrent\Directory = GetGadgetState(#CreateTorrent_Radio_Dir) & 1
                Torrent\ErrorCode = 0
                Torrent\ErrorString = ""
                Torrent\Result = 0
                Temp = GetGadgetState(#CreateTorrent_Combo_Piece)
                If Temp>0 And Temp<12
                  Torrent\pieceLength = 16384 << (Temp-1)
                Else
                  Torrent\pieceLength = 0
                EndIf
                Torrent\PiecesCB = @CreateTorrentCB()
                Torrent\private = GetGadgetState(#CreateTorrent_CheckBox_Private) & 1
                Torrent\ProgName = "MyTorrent 2.0"
               
                Thread_ID = CreateThread(@TorrentFiles_CreateTorrent(), @Torrent)
                If Thread_ID
                  AddWindowTimer(#CreateTorrent_Win, #CreateTorrent_Timer, 400)
                Else
                  MessageRequester("Создание торрента.", "Ошибка при создании потока.", #MB_OK|#MB_ICONWARNING)
                EndIf
               
              Else
                MessageRequester("Создание торрента.", "Укажите путь к файлам.", #MB_OK|#MB_ICONWARNING)
              EndIf
          EndSelect
         
         
        ElseIf Event = #PB_Event_CloseWindow
          If Thread_ID <> 0 And IsThread(Thread_ID)
            If MessageRequester("Создание торрента.", "Торрент файл в процессе создания."+Chr(10)+"Прервать?", #MB_YESNO|#MB_ICONQUESTION|#MB_DEFBUTTON2) = #IDYES
              Torrent\BreakThread = 1 ; Прерываем создание файла.
              RemoveWindowTimer(#CreateTorrent_Win, #CreateTorrent_Timer)
              For i=1 To 100
                Delay(100)
                WindowEvent()
                If IsThread(Thread_ID)=0
                  Break
                EndIf
              Next i
             
              If IsThread(Thread_ID)
                KillThread(Thread_ID)
              EndIf
              Thread_ID = 0
             
              If FileSize(Torrent\FileName)>=0
                DeleteFile(Torrent\FileName)
              EndIf
              SetGadgetText(#CreateTorrent_CurrentFile, "")
              SetGadgetState(#CreateTorrent_ProgressBar, 0)
              MessageRequester("Создание торрента.", "Торрент файл не был создан - прервано по запросу пользователя.", #MB_OK|#MB_ICONWARNING)
            EndIf
          Else
            Break
          EndIf
         
        ElseIf Event = #PB_Event_Timer
          If EventTimer() = #CreateTorrent_Timer
            If IsThread(Thread_ID) = 0 ; Поток завершился.
              RemoveWindowTimer(#CreateTorrent_Win, #CreateTorrent_Timer)
              Thread_ID = 0
              If Torrent\Result = 1 And Torrent\ErrorCode=0
                MessageRequester("Создание торрента.", "Торрент-файл успешно создан.", #MB_OK|#MB_ICONINFORMATION)
              ElseIf Torrent\ErrorCode>0
                TorrentFiles_CreateTorrent_ShowError(Torrent\ErrorCode, Torrent\ErrorString, "MyTorrent 2.0")             
              EndIf
            EndIf
          EndIf
        EndIf
       
       
       
      ForEver
      CloseWindow(#CreateTorrent_Win)
    Else
      MessageRequester("", "Ошибка при создании окна", #MB_OK|#MB_ICONWARNING)
    EndIf




    В окне выбираем файл или папку из которых нужно создать торрент и при необходимости изменяем свойства торрента, после чего, кликаем по кнопке "Создать".
    Через некоторый промежуток (зависит от размера файлов, из которых создается торрент), торрент-файл будет создан и его можно использовать по назначению.

    А теперь рассмотрим программу, редактирующую готовый торрент-файл (файл EditTorrent.pb).
    Код:
    Enumeration
      #Window_0
    EndEnumeration

    ;- Gadget Constants
    ;
    Enumeration
      #Text_0
      #String_0
      #Button_0
      #Text_1
      #Editor_0
      #Text_2
      #String_1
      #Text_3
      #String_2
      #Text_6
      #String_3
      #Text_7
      #String_5
      #Text_8
      #String_6
      #Text_9
      #String_7
      #Text_10
      #String_8
      #Frame3D_0
      #Text_12
      #String_10
      #CheckBox_0
      #Text_14
      #String_11
      #ListIcon_0
      #Button_1
    EndEnumeration

    XIncludeFile "TorrentFiles.pbi"

    Torrent.TorrentFiles_TorrentInfo
    FileName.s

    Procedure Open_Window_0()
      If OpenWindow(#Window_0, 243, 174, 428, 490, "Редактирование Torrent файла",  #PB_Window_SystemMenu | #PB_Window_Invisible | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
        TextGadget(#Text_0, 5, 15, 40, 15, "Файл:")
        StringGadget(#String_0, 50, 10, 330, 20, "")
        ButtonGadget(#Button_0, 385, 10, 30, 20, "...")
        TextGadget(#Text_1, 5, 40, 75, 15, "Трекеры:")
        EditorGadget(#Editor_0, 5, 55, 410, 65)
        TextGadget(#Text_2, 5, 135, 110, 15, "Публикатор:")
        StringGadget(#String_1, 120, 130, 295, 20, "")
        TextGadget(#Text_3, 5, 160, 110, 15, "Адрес публикатора")
        StringGadget(#String_2, 120, 155, 295, 20, "")
        TextGadget(#Text_6, 5, 185, 110, 15, "Комментарий")
        StringGadget(#String_3, 120, 180, 295, 20, "")
        TextGadget(#Text_7, 5, 210, 110, 15, "Создано:")
        StringGadget(#String_5, 120, 205, 90, 20, "")
        TextGadget(#Text_8, 225, 210, 90, 15, "Дата создания:", #PB_Text_Right)
        StringGadget(#String_6, 320, 205, 95, 20, "", #PB_String_ReadOnly)
        TextGadget(#Text_9, 5, 235, 110, 15, "Размер, байт:")
        StringGadget(#String_7, 120, 230, 90, 20, "", #PB_String_ReadOnly)
        TextGadget(#Text_10, 225, 235, 90, 15, "Размер части:", #PB_Text_Right)
        StringGadget(#String_8, 320, 230, 95, 20, "", #PB_String_ReadOnly)
        Frame3DGadget(#Frame3D_0, 5, 255, 410, 194, "При редактировании изменится идентификатор торрента 'INFO Hash'!")
        TextGadget(#Text_12, 10, 280, 65, 15, "INFO Hash:")
        StringGadget(#String_10, 80, 275, 330, 20, "", #PB_String_ReadOnly)
        CheckBoxGadget(#CheckBox_0, 300, 304, 110, 15, "Частный торрент")
        TextGadget(#Text_14, 10, 306, 94, 15, "Корневая папка:")
        StringGadget(#String_11, 108, 300, 180, 20, "")
        ListIconGadget(#ListIcon_0, 10, 330, 400, 110, "Файл", 290, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
        SendMessage_(GadgetID(#ListIcon_0), #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_LABELTIP, #LVS_EX_LABELTIP) 
        AddGadgetColumn(#ListIcon_0, 1, "Размер", 80)
        ButtonGadget(#Button_1, 330, 457, 80, 24, "Сохранить")
       
        SetActiveGadget(#Button_0)
        SendMessage_(WindowID(#Window_0), #WM_UPDATEUISTATE, $30002,0)
       
        HideWindow(#Window_0, 0)
      EndIf
    EndProcedure


    Procedure LoadTorrent(FileName.s, *Torrent.TorrentFiles_TorrentInfo)
      SetGadgetText(#String_0, FileName)
      If TorrentFiles_LoadTorrentFile(FileName, *Torrent) <> #True
        TorrentFiles_LoadTorrentFile_ShowEror(*Torrent\ErrorCode, *Torrent\ErrorString, "")
      Else
        ClearGadgetItems(#Editor_0)
        ForEach *Torrent\announce_list()
          AddGadgetItem(#Editor_0, -1, *Torrent\announce_list())
        Next
        SetGadgetText(#String_1, *Torrent\Publisher)
        SetGadgetText(#String_2, *Torrent\Publisher_Url)
        SetGadgetText(#String_3, *Torrent\comment)
        SetGadgetText(#String_5, *Torrent\created_by)
        SetGadgetText(#String_6, FormatDate("%dd.%mm.%yyyy %hh:%ii", *Torrent\creation_date))
        SetGadgetText(#String_7, Str(*Torrent\All_Size))
        SetGadgetText(#String_8, Str(*Torrent\piece_length))
        SetGadgetText(#String_10, *Torrent\INFO_Hash)
        SetGadgetText(#String_11, *Torrent\CurrentDir_Name)
        DisableGadget(#String_11, *Torrent\TypeDir!1)
        SetGadgetState(#CheckBox_0,*Torrent\private)
        ClearGadgetItems(#ListIcon_0)
        ForEach *Torrent\files()
          Count = ListSize(*Torrent\files()\path())
          If Count>0
            File.s=""
            x=0
            ForEach *Torrent\files()\path()
              x + 1
              File + *Torrent\files()\path()
              If x<Count
                File + "\"
              EndIf
            Next
            AddGadgetItem(#ListIcon_0, -1, File+Chr(10)+Str(*Torrent\files()\length))
          EndIf
        Next
      EndIf
    EndProcedure

    Procedure.b SeveTorrent(FileName.s, *Torrent.TorrentFiles_TorrentInfo)
      Protected Result.b=#False
      ClearList(*Torrent\announce_list())
      *Torrent\announce = ""
      Count = CountGadgetItems(#Editor_0)-1
      x=0
      For i=0 To Count
        String.s = GetGadgetItemText(#Editor_0, i)
        If String<>"" And RemoveString(String, " ")<>""
          If x=0
            x=1
            *Torrent\announce = String
          EndIf
          If AddElement(*Torrent\announce_list())
            *Torrent\announce_list() = String
          EndIf
        EndIf
      Next i
      *Torrent\Publisher = GetGadgetText(#String_1)
      *Torrent\Publisher_Url = GetGadgetText(#String_2)
      *Torrent\comment = GetGadgetText(#String_3)
      *Torrent\created_by = GetGadgetText(#String_5)
      If *Torrent\TypeDir = #True
        *Torrent\CurrentDir_Name = GetGadgetText(#String_11)
      EndIf
      *Torrent\private = GetGadgetState(#CheckBox_0)
     
      If TorrentFiles_CreateSysFile_Torrent(FileName, *Torrent) = #True
        Result=#True
        MessageRequester("", "Торрент файл успешно модифицирован.", #MB_OK|#MB_ICONINFORMATION)
      Else
        MessageRequester("", "Ошибка при модификации торрент файла.", #MB_OK|#MB_ICONWARNING)
      EndIf
     
      ProcedureReturn Result
    EndProcedure

    Open_Window_0()

    Repeat
      Event = WaitWindowEvent()
     
      If Event = #PB_Event_Gadget
        Select EventGadget()
          Case #Button_0 ; Открытть торрент файл.
            FileName = OpenFileRequester("","","Торрент-файлы (*.torrent)|*.torrent|Все файлы|*.*",0)
            If FileName<>"" And FileSize(FileName)>0
              LoadTorrent(FileName, @Torrent)
            EndIf
           
           
          Case #Button_1 ; Сохранить торрент файл.
           
            If FileName<>"" And FileSize(FileName)>0
              If SeveTorrent(FileName, @Torrent) = #True
                LoadTorrent(FileName, @Torrent)
              EndIf
            Else
              MessageRequester("", "Укажите путь к торрент-файлу", #MB_OK|#MB_ICONWARNING)
            EndIf
           
        EndSelect
      EndIf
     
    Until Event = #PB_Event_CloseWindow



    Выбираем торрент-файл и его данные будут доступны для редактирования.
    Только учтите, если изменить что-либо, находящееся в области 'INFO Hash', хэш торрента изменится!

    Клик по кнопке "Сохранить" вызовет процедуру TorrentFiles_CreateSysFile_Torrent(), которая сохранит изменения в торрент-файле.


    Скачать файлы к статье.

    Категория: Мои статьи | Добавил: Admin (21.02.2012)
    Просмотров: 12452 | Рейтинг: 4.2/4
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Русский торрент-клиент на бейсике © 2024
    Конструктор сайтов - uCoz