transfert de fichiers via IP et crypté + copie ecran

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

transfert de fichiers via IP et crypté + copie ecran

Message par supercdfr »

Bonjour,

je vous propose un 'petit' programme qui permets de transmettre des fichiers via tcp/ip de manière cryptée.
Il faut changer l'adresse ip dans le CLIENT (ligne 35) pour que cela corresponde au pc sur lequel le SERVEUR est lancé (j'ai pas fait d'interface pour rentrer l'adresse ip).
Pour l'instant, mes transferts entre PCs stagnent a 20 Mo/s.
Mais au moins, la NSA ne peut pas les décoder si elles interceptent les données :twisted:

Ligne 75 : affiche_tranfert = 0 -> module image
affiche_tranfert = 1 -> module transfert

Mais bien sur, il y a un probleme.
Dans le 'module' d'affichage écran, au bout de quelques secondes, plus rien ne se récupère, et je ne sais pas pourquoi.Je n'ai aucun message d'erreur, aucun plantage.

Le code SERVEUR :

Code : Tout sélectionner

Enumeration
  #file_to_read
  #file_test
  #directory
  #show_picture
EndEnumeration

Declare determine_liste(client.l)
Declare.s key_create(ip.l)
Declare.s vect_create(ip.l)

Global wallpaper$

Structure store
  clientid.l
  in_progress.b
  thread.l
  ip_adress.l
  waited_message.s
  pause_thread.b
  *buffer_x
EndStructure
Global NewList info_store.store()

If InitNetwork() = 0
  MessageRequester("Erreur", "cannot initialise network.", 0)
  End
EndIf

Port = 6839
Global buffer_size.l = 1048576
;Global SEvent.l
Global Dim Drive_Nom.s(25),nombre_disque

UseJPEGImageEncoder()

Procedure CaptureScreen(Left.l, Top.l, Width.l, Height.l)
  hImage = CreateImage(#show_picture,Width,Height)
  hDC    = StartDrawing(ImageOutput(#show_picture))
  DeskDC = GetDC_(GetDesktopWindow_())
  BitBlt_(hDC,0,0,Width,Height,DeskDC,x,y,#SRCCOPY)
  StopDrawing()
  ReleaseDC_(GetDesktopWindow_(),DeskDC)
  ResizeImage(#show_picture,1024/2,768/2)
  SaveImage(#show_picture, "c:\Screenshot.jpg",#PB_ImagePlugin_JPEG,4)
  FreeImage(#show_picture)
EndProcedure

Procedure.l data_receipt(client_number.l)
  Protected received_size_buffer.l = 0
  Protected memory_received.l = 0
  Protected counter.l = 0
  Protected *Buffer = AllocateMemory(buffer_size)
  Protected *temporayr_buffer = AllocateMemory(buffer_size)
  
  Repeat
    FillMemory(*Buffer,buffer_size,0)
    received_size_buffer = ReceiveNetworkData(client_number, *Buffer, buffer_size)
    If received_size_buffer < 1
      counter + 1
      Goto fin_boucle_attente2
    EndIf
    If (memory_received + received_size_buffer) > buffer_size
      memory_received = 0
    EndIf
    CopyMemory(*Buffer,*temporayr_buffer + memory_received,received_size_buffer)
    memory_received + received_size_buffer
    fin_boucle_attente2:
    counter + 1
    If counter > 1000
      Break
    EndIf
  Until memory_received = buffer_size Or counter >= 1000
  
  FillMemory(*Buffer,buffer_size,0)
  CopyMemory(*temporayr_buffer,*Buffer,buffer_size)
  FreeMemory(*temporayr_buffer)
  
  determine_liste(client_number)
  FillMemory(info_store()\buffer_x , buffer_size , 0)
  CopyMemory(*Buffer , info_store()\buffer_x , buffer_size)
  FreeMemory(*Buffer)
  
  ProcedureReturn memory_received
EndProcedure

Procedure send_message(id_du_serveur.l,message$)
  Protected *Buffer_envoi = AllocateMemory(buffer_size)
  nombre_multiplication.l = Len(message$) / buffer_size
  If Len(message$) % buffer_size = 0
    nombre_multiplication - 1
  EndIf
  For i_envoi.l = 0 To nombre_multiplication
    FillMemory(*Buffer_envoi,buffer_size,0)
    If i_envoi = 0
      PokeQ(*Buffer_envoi, Len(message$))
      PokeS(*Buffer_envoi + 8, Mid(message$,1,buffer_size-8) )
    Else
      PokeS(*Buffer_envoi, Mid(message$,(i_envoi * buffer_size) - 7,buffer_size) )
    EndIf
    SendNetworkData(id_du_serveur, *Buffer_envoi,buffer_size)
  Next i_envoi
  FreeMemory(*Buffer_envoi)
  *Buffer_envoi = 0
EndProcedure

Procedure GetAllDrives()
  MaskDrive = GetLogicalDrives_()
  Mask      = 1                 
  lpFileSystemNameBuffer.s = Space(256)
  nombre_disque=0
  For i.l = 65 To 97
    If MaskDrive & Mask
      wNom$=Chr(i)+":\"
      wNom2$ = Chr(i) + ":"
      wType=GetDriveType_(WNom$)
      If wtype=#DRIVE_FIXED
        nombre_disque=nombre_disque+1
        Drive_Nom(nombre_disque)= wNom2$
      EndIf
    EndIf
  Mask << 1
  Next i
EndProcedure

Procedure.s enumere_repertoire(client_number,Directory$)
  Protected Dim files_i_directory.s(10000)
  Protected i_enumere.l = 0
  Protected string_to_send.s = "<directory_send>"
  Protected start_number.b
  
  determine_liste(client_number)
  
  FillMemory(info_store()\buffer_x,buffer_size)
  
  start_enumere_repertoire:
  If ExamineDirectory(#directory, Directory$, "*.*")
    While NextDirectoryEntry(#directory)
      If DirectoryEntryType(#directory) = #PB_DirectoryEntry_File ; si fichier
        files_i_directory(i_enumere) = DirectoryEntryName(#directory)
        i_enumere + 1
      Else ; if directory
        If start_number = 0 And DirectoryEntryName(#directory) <> "."
          string_to_send + "?d.."
          start_number = 1
        EndIf
        If DirectoryEntryName(#directory) <> "."
          string_to_send + "?d" + DirectoryEntryName(#directory)
        EndIf  
      EndIf
    Wend
    FinishDirectory(#directory)

    For x_enumere = 0 To i_enumere-1
      string_to_send + "?f" + files_i_directory(x_enumere) + "|" + Str(FileSize(Directory$ + files_i_directory(x_enumere)))
    Next x_enumere
    send_message(client_number,string_to_send)
    ProcedureReturn string_to_send
  Else ; cannot load directory
    send_message(client_number,"<diretory_cannot_be_read><diretory_cannot_be_read>")
    ProcedureReturn string_to_send
  EndIf
EndProcedure

Procedure code_fichier(file_number.l, file_source_path.s ,client_id.l , s_fullname.s , special.l = 0)
  size_of_file_to_received.l = FileSize(file_source_path)
  If special = 0
    message$ = "<FILE>" + s_fullname + "<FILE><SIZE>" + Str(size_of_file_to_received) + "<SIZE>"
  Else
    message$ = "<here_is_the_picture>" + Str(size_of_file_to_received) + "<here_is_the_picture>"
  EndIf
  
  total_file_size = Len(message$) + size_of_file_to_received
  header_size = Len(message$)
  ReadFile(file_number,file_source_path)
  For i = 0 To (total_file_size/buffer_size)
    FillMemory(info_store()\buffer_x,buffer_size,0)
    If i = 0
      PokeQ(info_store()\buffer_x,header_size )
      PokeS(info_store()\buffer_x + 16,message$,header_size)
      *CipheredString  = AllocateMemory(buffer_size - header_size - 16)
      FillMemory(*CipheredString,buffer_size - header_size - 16,0)
      ReadData(file_number, *CipheredString, buffer_size - header_size - 16)
      If FileSize(file_source_path) > buffer_size
        p1.s = key_create(info_store()\ip_adress)
        p2.s = vect_create(info_store()\ip_adress)
        AESEncoder(*CipheredString, info_store()\buffer_x + header_size + 16, buffer_size - header_size - 16, @p1, 256, @p2 )
        p1=Space(64)
        p2=Space(64)
      Else
        If FileSize(file_source_path) < 16
          p1.s = key_create(info_store()\ip_adress)
          p2.s = vect_create(info_store()\ip_adress)
          AESEncoder(*CipheredString, info_store()\buffer_x + header_size + 16, 16 , @p1, 256, @p2 )
          p1=Space(64)
          p2=Space(64)
        Else
          p1.s = key_create(info_store()\ip_adress)
          p2.s = vect_create(info_store()\ip_adress)
          AESEncoder(*CipheredString, info_store()\buffer_x + header_size + 16, FileSize(file_source_path), @p1, 256, @p2 )
          p1=Space(64)
          p2=Space(64)
        EndIf
      EndIf
      crc32 = CRC32Fingerprint(info_store()\buffer_x + header_size + 16,buffer_size - header_size - 16)
      PokeQ(info_store()\buffer_x + 8,crc32)
      FreeMemory(*CipheredString)
    Else
      *CipheredString   = AllocateMemory(buffer_size - 8)
      ReadData(file_number, *CipheredString,buffer_size - 8)
      p1.s = key_create(info_store()\ip_adress)
      p2.s = vect_create(info_store()\ip_adress)
      AESEncoder(*CipheredString, info_store()\buffer_x + 8, buffer_size - 8, @p1, 256, @p2 )
      p1=Space(64)
      p2=Space(64)
      crc32 = CRC32Fingerprint(info_store()\buffer_x + 8, buffer_size - 8)
      PokeQ(info_store()\buffer_x,crc32)
      FreeMemory(*CipheredString)
    EndIf
    CRC_error_return:
    SendNetworkData(client_id, info_store()\buffer_x,buffer_size)
    FillMemory(info_store()\buffer_x,buffer_size,0)
    info_store()\waited_message = "<received_block><received_block>"
    info_store()\pause_thread = 1
    While info_store()\pause_thread = 1
      Delay(1)
    Wend
  Next i
EndProcedure

Procedure Scan_Directory(source.s, start_name.s, destination.s, client_id.l,  rek = 0)
  determine_liste(client_id)
  
  If Right(source, 1) <> "\"
    source + "\"
  EndIf
  If ExamineDirectory(rek, source, "*")
    While NextDirectoryEntry(rek)
      s_name.s = DirectoryEntryName(rek) : s_type = DirectoryEntryType(rek)
      Select s_type         
        Case #PB_DirectoryEntry_File
          s_fullname2.s = ReplaceString(source + s_name, destination + "\","")
          s_fullname.s = start_name + "\" + s_fullname2
          
          If IsFile(#file_to_read)
            Debug "file already open !"
          ElseIf code_fichier(#file_to_read, source + s_name, client_id , s_fullname) = 1
            ProcedureReturn 1
          EndIf
          CloseFile(#file_to_read)
      
        Case #PB_DirectoryEntry_Directory
          If s_name <> "." And s_name <> ".."
            If Scan_Directory(source + s_name, start_name, destination, client_id, rek + 1) = 1
              ProcedureReturn 1
            EndIf
          EndIf     
      EndSelect
    Wend
    FinishDirectory(rek)
  EndIf
EndProcedure

Procedure reception_donnee(client_number.l)
  Protected file_number.l
  Protected counter_erreur.l = 0
  Protected received_size_buffer.l
  Protected val_test.l = 0
  
  determine_liste(client_number)
    
  size_to_received.l = 0
  received_size.l = 0
  received_size_buffer.l = 0
  final_size.l
  
  ; prepare si fichier a receptionner
  For i_receiptdata = 0 To 1000
    If Not IsFile(i_receiptdata)
      file_number = i_receiptdata
      Break
    EndIf
  Next i_receiptdata

  counter_erreur= 0
  suite_reception_donnee:
  
  received_size_buffer = data_receipt(client_number)
  
  Debug PeekS(info_store()\buffer_x + 8 , 50)
  
  If counter_erreur > 10
    If IsFile(file_number)
      CloseFile(file_number)
    EndIf
    ProcedureReturn
  EndIf
  
  If received_size_buffer = -1
    Delay(10)
    counter_erreur + 1
    Goto suite_reception_donnee
  EndIf

  size_to_received = PeekQ(info_store()\buffer_x)
  CopyMemory(info_store()\buffer_x+8,info_store()\buffer_x,received_size_buffer-8)
  ; si <STRING>
  If FindString(PeekS(info_store()\buffer_x) , "<STRING>",1) = 1
    Debug "********************************"
    Debug "<STRING>"
    Debug "********************************"
    CopyMemory(info_store()\buffer_x+8,info_store()\buffer_x,received_size_buffer-Len("<STRING>") )
    received_size = received_size_buffer-Len("<STRING>")
    Debug "client " + Str(client_number) + " send : " + PeekS(info_store()\buffer_x)
    FillMemory(info_store()\buffer_x,buffer_size)
      
  ; si <FILE>
  ElseIf FindString(PeekS(info_store()\buffer_x+8),"<FILE>") = 1
    Debug "********************************"
    Debug "<FILE>"
    Debug "********************************"
    
    EOF_waiting.b = 0
    path$ = StringField(PeekS(info_store()\buffer_x + 8),2,"<FILE>")
    path_1$ = Mid(path$ , 1,2)
    placestring = 2
    While StringField(path$ , placestring + 1, "\") <> ""
      path_1$ + "\" + StringField(path$ , placestring, "\")
      CreateDirectory(path_1$)
      placestring + 1
    Wend
    Debug "path : " + path_1$
    
    Debug CreateFile(file_number,StringField(PeekS(info_store()\buffer_x + 8),2,"<FILE>") )
    size_to_received = Val(StringField(PeekS(info_store()\buffer_x + 8),2,"<SIZE>"))
    received_size2.l = FindString( PeekS(info_store()\buffer_x + 8) , "<SIZE>", FindString( PeekS(info_store()\buffer_x + 8),"<SIZE>") + 4) + 5
    size_to_remove = 16
    final_size = 0
    
    Repeat
      crc32 = PeekL(info_store()\buffer_x)
      CopyMemory(info_store()\buffer_x + 8 + received_size2,info_store()\buffer_x,buffer_size - received_size2 - size_to_remove)    
      crc32_calculate.l = CRC32Fingerprint(info_store()\buffer_x,buffer_size - size_to_remove - received_size2)
      rajout_repertoire.s = ""
      received_size = received_size_buffer
      If crc32 <> crc32_calculate
        send_message(client_number,"<ERREUR_CRC><ERREUR_CRC>")
        Break
      EndIf
      
      *DecipheredString = AllocateMemory(received_size - size_to_remove - received_size2 + 1)
      p1.s = key_create(info_store()\ip_adress)
      p2.s = vect_create(info_store()\ip_adress)
      AESDecoder(info_store()\buffer_x, *DecipheredString, received_size - size_to_remove - received_size2, @p1, 256, @p2)
      p1=Space(64)
      p2=Space(64)
      If final_size + received_size - size_to_remove - received_size2 <= size_to_received 
        WriteData(file_number,*DecipheredString,received_size - size_to_remove - received_size2)
      Else
        WriteData(file_number,*DecipheredString,size_to_received - final_size)
        EOF_waiting = 1
      EndIf
      FreeMemory(*DecipheredString)
      FillMemory(info_store()\buffer_x,buffer_size)
      
      final_size + received_size - size_to_remove - received_size2
      send_message(client_number,"<received_block><received_block>")
      
      FillMemory(info_store()\buffer_x,buffer_size)
      received_size_buffer = data_receipt(client_number)
      
      received_size2 = 0
      size_to_remove = 8
    Until EOF_waiting = 1
    
    send_message(client_number,"<END>file<END>")
    recuperation_fini = 1
    CloseFile(file_number)
    FillMemory(info_store()\buffer_x,buffer_size)
   
  ElseIf FindString(PeekS(info_store()\buffer_x) , "<i_want_the_file>",1) = 1
    Debug "********************************"
    Debug "<i_want_the_file>"
    Debug "********************************"
    Debug "client " + Str(client_number) + " want the file : " + StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_file>")
    s_fullname.s = GetFilePart( StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_file>") )
    If IsFile(#file_to_read)
      Debug "file already open !"
    EndIf
    If code_fichier(#file_to_read, StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_file>") , client_number , s_fullname) = 1
      Debug "STOP file"
    EndIf
    CloseFile(#file_to_read)    
    
  ElseIf FindString(PeekS(info_store()\buffer_x) , "<initial_list>",1) = 1
    Debug "********************************"
    Debug "<initial_list>"
    Debug "********************************"
    Debug "client " + Str(client_number) + " ask the directory <initial_list>"
    GetAllDrives()
    drive_tempo.s = "<initial_list>"
    For i=1 To nombre_disque
      drive_tempo = drive_tempo + "|" + Drive_Nom(i)
    Next i
    Debug "go"
    message_a_envoyer.s = RemoveString(drive_tempo,"<initial_list>")
    
    Debug "message size " + Str(Len(message_a_envoyer))
    If Len(message_a_envoyer) < 16
      message_a_envoyer = RSet(message_a_envoyer , 16 , " ")
    EndIf
    *CipheredString   = AllocateMemory(Len(message_a_envoyer)+1)
      
    determine_liste(client_number)
    p1.s = key_create(info_store()\ip_adress)
    p2.s = vect_create(info_store()\ip_adress)
    AESEncoder(@message_a_envoyer, *CipheredString, Len(message_a_envoyer), @p1, 256, @p2 )
    p1=Space(64)
    p2=Space(64)
    send_message(client_number,"<initial_list>" + PeekS(*CipheredString) + "<initial_list>")
    FreeMemory(*CipheredString)
      
  ; liste repertoire
  ElseIf FindString(PeekS(info_store()\buffer_x) , "<directory_listing>",1) = 1
    Debug "********************************"
    Debug "<directory_listing>"
    Debug "********************************"
    enumere_repertoire(client_number, StringField(PeekS(info_store()\buffer_x),2,"<directory_listing>"))
    FillMemory(info_store()\buffer_x,buffer_size)

  ; enumere repertoire pour renvoi
  ElseIf FindString(PeekS(info_store()\buffer_x) , "<i_want_the_directory>",1) = 1
    Debug "********************************"
    Debug "<i_want_the_directory>"
    Debug "********************************"
    If Scan_Directory(StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_directory>") ,StringField(PeekS(info_store()\buffer_x),2,"<will_be_sent_in>") , StringField(PeekS(info_store()\buffer_x),2,"<i_want_the_directory>"), client_number, 0) = 1
      Debug "ARRETE TRANSFERT"
    EndIf
    
  ; renvoi l'image
  ElseIf FindString(PeekS(info_store()\buffer_x) , "<ask_picture>",1) = 1
    Debug "********************************"
    Debug "<ask_picture>"
    Debug "********************************"
    CaptureScreen(0,0,1024,768)
    If code_fichier(#file_to_read, "c:\Screenshot.jpg" , client_number , "" , 1) = 1
      Debug "STOPPE FICHIER"
    EndIf
    CloseFile(#file_to_read)
    info_store()\waited_message = "<picture_received><picture_received>"
    info_store()\pause_thread = 1
    While info_store()\pause_thread = 1
      Delay(1)
    Wend
  Else
    Debug "peeks inconnu " + PeekS(info_store()\buffer_x)
  EndIf

  
  quittage:
  If IsFile(file_number)
    CloseFile(file_number)
  EndIf
  Debug "clear info_store"
  determine_liste(client_number)
  FreeMemory(info_store()\buffer_x)
  DeleteElement( info_store() )
EndProcedure

Procedure test_if_no_more_client()
  ForEach info_store()
    If info_store()\in_progress = 1
      ProcedureReturn
    EndIf
  Next
  SystemParametersInfo_ ( #SPI_SETDESKWALLPAPER , 0, wallpaper$, #SPIF_UPDATEINIFILE | #SPIF_SENDWININICHANGE ) ; retire papier peinds
EndProcedure

Procedure determine_liste(client.l)
  Protected adresse.s
  ForEach info_store()
    If client = info_store()\clientid
      ProcedureReturn
    EndIf
  Next
  AddElement( info_store() )
  info_store()\clientid = client
  info_store()\ip_adress = GetClientIP(client)
  info_store()\buffer_x = AllocateMemory(buffer_size)
EndProcedure

Procedure.s key_create(ip.l)
  message_temp.s
  While Len(message_temp) < 64
    message_temp + Str( ip )
  Wend
  ProcedureReturn Mid(message_temp,1,32)
EndProcedure

Procedure.s vect_create(ip.l)
  message_temp.s
  While Len(message_temp) < 64
    message_temp + Str( ip )
  Wend
  ProcedureReturn Mid(message_temp,33,32)
EndProcedure


If CreateNetworkServer(0, Port)
  Repeat
    Delay(1)
    SEvent = NetworkServerEvent()
    If SEvent
      ClientID = EventClient()
      
      If SEvent =  #PB_NetworkEvent_Disconnect
        Debug "end of connexion for client " + Str(ClientID)
        test_if_no_more_client()
        Goto fin_boucle
      EndIf
      
      determine_liste(ClientID)
      If info_store()\in_progress = 1 And info_store()\thread <> 0 And info_store()\pause_thread = 1
        Goto suite_boucle_p
      ElseIf info_store()\in_progress = 1 And info_store()\thread <> 0
        Goto fin_boucle
      EndIf
      
      suite_boucle_p:
      If SEvent = #PB_NetworkEvent_Connect
        Debug "New connexion of " + Str(ClientID)
        wallpaper$ = Space(260)
        SystemParametersInfo_ ( #SPI_GETDESKWALLPAPER , Len(wallpaper$), wallpaper$,  0 )
        SystemParametersInfo_ ( #SPI_SETDESKWALLPAPER , 0, "", #SPIF_UPDATEINIFILE | #SPIF_SENDWININICHANGE ) ; retire papier peinds
        determine_liste(ClientID)
        send_message(ClientID,"<client_number>" + Str(ClientID) + "<client_number>")
      ElseIf SEvent = #PB_NetworkEvent_Data
;        Debug "RECEPTION CLIENT"
        determine_liste(ClientID)
        info_store()\in_progress = 1
        If info_store()\thread = 0
          Debug "THREAD"
          info_store()\thread = CreateThread(@reception_donnee(),ClientID)
        ElseIf info_store()\pause_thread = 1
          Debug "in wait for : " + info_store()\waited_message
          received_size_buffer = data_receipt(ClientID)
          If FindString(PeekS(info_store()\buffer_x+8 , received_size_buffer-8) , info_store()\waited_message ) = 1
            info_store()\pause_thread = 0
            info_store()\waited_message = ""
          Else
            Debug "passe a autre chose"
            info_store()\pause_thread = 0
            Goto fin_boucle
          EndIf
        EndIf
        
      ElseIf SEvent =  #PB_NetworkEvent_Disconnect
        Debug "End of connexion " + Str(ClientID)
        test_if_no_more_client()
      EndIf
    EndIf
    fin_boucle:
  
  Until Quit = 1 
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
Dernière modification par supercdfr le ven. 25/juil./2014 13:57, modifié 2 fois.
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Re: transfert de fichiers via IP et crypté + copie ecran

Message par supercdfr »

Le code CLIENT :

Code : Tout sélectionner

Enumeration
  #fichier_log = 10
  #fichier_test
  #fichier_a_transferer
  #fichier_temporaire
  #fichier_image
  
  #repertoire
  #Window_transfert
  #ListView_trans_pclocal
  #Text_trans_pclocal
  #Text_trans_pcdistant
  #ListView_trans_pcdistant
  #Text_trans_message
  #ProgressBar_trans_fichier
  #ProgressBar_trans_total
  #Button_trans_envoi_file
  #Button_trans_reception_fichier
  #Button_stop_transfert
  #Text_repertoire_distant
  #Window_cad
  #Image_cad
  #image_bouton_quitter
  #Image_chargement_cad
EndEnumeration

UseJPEGImageDecoder()

If InitNetwork() = 0
  MessageRequester("Error", "can't initialise network !", 0)
  End
EndIf
Port = 6839
Global ServerID.q = OpenNetworkConnection("10.7.250.94", Port)

Global fix_buffer_size.l = 1048576
Global *Buffer = AllocateMemory(fix_buffer_size)
Global *Temporary_buffer = AllocateMemory(fix_buffer_size)
Global *send_buffer = AllocateMemory(fix_buffer_size)
Global cle_decrypt.s
Global vec_decrypt.s

Global client_number.l
Global quit.b = 0

Global file_to_send.b
Global NewList name_of_file_to_send_2.s()
Global recovery_complete.b = 1
Global Dim files_type.b(200000)

Declare send_message(id_du_serveur.l,message$)
Declare.b wait_response(server_id.l,reponse.s)
Declare read_key()
Declare empty_key()

Global start_directory.s
Global start_directory_2.s = ""

Global file_send_in_progress.b = 0
Global windows_create.b = 0

Global message_temp.s

Global start_timer.q
Global total_size_of_file_to_catch.q
Global final_size.q
Global transfert_stop.b = 0
Global number_of_directory.l
Global number_of_transfert.l

Global waiting_for_a_response.b
Global waiting_message.s

show_transfert = 1

Procedure.l data_receipt(server_id.l)
  Protected size_of_buffer_received.l = 0
  Protected received_memory.l = 0
  FillMemory(*Temporary_buffer,fix_buffer_size)
  Repeat
    FillMemory(*Buffer,fix_buffer_size)
    size_of_buffer_received = ReceiveNetworkData(server_id, *Buffer, fix_buffer_size)
    If size_of_buffer_received = -1 Or size_of_buffer_received = 0
      ; nothing
    Else
      CopyMemory(*Buffer,*Temporary_buffer + received_memory,size_of_buffer_received)
      received_memory + size_of_buffer_received
    EndIf
  Until received_memory = fix_buffer_size
  FillMemory(*Buffer,fix_buffer_size)
  CopyMemory(*Temporary_buffer,*Buffer,fix_buffer_size)
  ProcedureReturn received_memory
EndProcedure

Procedure encrypt_file(file_number.l, source_file_directory.s , local_file.s, special.l = 0, name_to_show.s = "")
  size_of_file_to_send.l = FileSize(local_file)
  message$ = "<FILE>" + source_file_directory + "<FILE><SIZE>" + Str(size_of_file_to_send) + "<SIZE>"
  complete_file_size = Len(message$) + size_of_file_to_send
  size_of_header = Len(message$)
  ReadFile(file_number,local_file)
  
  Delay(5)
  For i = 0 To (complete_file_size/fix_buffer_size)
    time_to_show.q = (1000 * i*fix_buffer_size)/(ElapsedMilliseconds()-start_timer)
    If time_to_show < 1000
      If special = 0
        SetGadgetText(#Text_trans_message, GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal)) + " " + Str(time_to_show) + " o/s")
      Else
        SetGadgetText(#Text_trans_message, name_to_show + " " + Str(time_to_show) + " o/s")
      EndIf
    ElseIf time_to_show < 1000000
      If special = 0
        SetGadgetText(#Text_trans_message, GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal)) + " " + Str(time_to_show/1000) + " Ko/s")
      Else
        SetGadgetText(#Text_trans_message, name_to_show + " " + Str(time_to_show/1000) + " Ko/s")
      EndIf
    ElseIf time_to_show < 1000000000
      If special = 0
        SetGadgetText(#Text_trans_message, GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal)) + " " + Str(time_to_show/1000000) + " Mo/s")
      Else
        SetGadgetText(#Text_trans_message, name_to_show + " " + Str(time_to_show/1000000) + " Mo/s")
      EndIf
    Else
      If special = 0
        SetGadgetText(#Text_trans_message, GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal)) + " " + Str(time_to_show/1000000000) + " Go/s")
      Else
         SetGadgetText(#Text_trans_message, name_to_show + " " + Str(time_to_show/1000000000) + " Go/s")
      EndIf
    EndIf    
    SetGadgetState(#ProgressBar_trans_fichier,i)
    FillMemory(*buffer,fix_buffer_size)
    If i = 0
      PokeQ(*buffer,size_of_header )
      PokeS(*buffer + 16,message$,size_of_header) ; modif 011
               
      *CipheredString  = AllocateMemory(fix_buffer_size - size_of_header - 16) ; Espace pour la chaîne de caractère avec son
      FillMemory(*CipheredString,fix_buffer_size - size_of_header - 16,0)
      ReadData(file_number, *CipheredString, fix_buffer_size - size_of_header - 16)
             
      If FileSize(local_file) > fix_buffer_size
        Debug "file bigger than buffer"
        read_key()
        AESEncoder(*CipheredString, *buffer + size_of_header + 16, fix_buffer_size - size_of_header - 16, @cle_decrypt, 256, @vec_decrypt )
        empty_key()
      Else
        ; prevoir si < 16
        Debug "file lowest than buffer"
        If FileSize(local_file) < 16
          read_key()
          AESEncoder(*CipheredString, *buffer + size_of_header + 16, 16 , @cle_decrypt, 256, @vec_decrypt )
          empty_key()
        Else
          read_key()
          AESEncoder(*CipheredString, *buffer + size_of_header + 16, FileSize(local_file), @cle_decrypt, 256, @vec_decrypt )
          empty_key()
        EndIf
      EndIf
      crc32 = CRC32Fingerprint(*buffer + size_of_header + 16,fix_buffer_size - size_of_header - 16)
      PokeQ(*buffer + 8,crc32)
      FreeMemory(*CipheredString)
    Else
      *CipheredString   = AllocateMemory(fix_buffer_size - 8) ; Espace pour la chaîne de caractère avec son
      ReadData(file_number, *CipheredString,fix_buffer_size - 8)
      read_key()
      AESEncoder(*CipheredString, *buffer + 8, fix_buffer_size - 8, @cle_decrypt, 256, @vec_decrypt )
      empty_key()
                
      crc32 = CRC32Fingerprint(*buffer + 8, fix_buffer_size - 8)
      PokeQ(*buffer,crc32)
      
      FreeMemory(*CipheredString)
    EndIf
    Debug "CRC32 : " + Str(crc32)
    retry_crc32_error:
    SendNetworkData(ServerID, *buffer,fix_buffer_size)
    FillMemory(*buffer,fix_buffer_size,0)
    waiting_response = wait_response(ServerID,"<received_block><received_block>")
    Debug "reponse : " + Str(waiting_response)
    If waiting_response = 3
      Debug "DECO 2"
      SetGadgetState(#ProgressBar_trans_fichier,0)
      ProcedureReturn 1
    EndIf
    If waiting_response = 2
      Delay(5)
      Goto retry_crc32_error
    EndIf
  Next i
EndProcedure

Procedure directory_listing(Directory$ , Directory_originel$)
  Protected directory_number.l
  directory_number = ExamineDirectory(#PB_Any, Directory$, "*.*") 
  If directory_number
    While NextDirectoryEntry(directory_number)
      If DirectoryEntryType(directory_number) = #PB_DirectoryEntry_File
        complete_file_size.l = Len("<FILE>" + start_directory + GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal)) + "<FILE><SIZE>" + Str(FileSize(DirectoryEntryName(directory_number) + " " + Str(DirectoryEntrySize(directory_number)))) + "<SIZE>") + (FileSize(GetGadgetText(#ListView_trans_pclocal) + GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal))))
        size_of_header.l = Len("<FILE>" + start_directory + GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal)) + "<FILE><SIZE>" + Str(FileSize(DirectoryEntryName(directory_number))) + "<SIZE>")
        If ReadFile(#fichier_a_transferer, Directory$ + "\" + DirectoryEntryName(directory_number) )
          SetGadgetText(#Text_trans_message,DirectoryEntryName(directory_number) )
          SetGadgetAttribute(#ProgressBar_trans_fichier,#PB_ProgressBar_Maximum,complete_file_size/fix_buffer_size)
          file_send_in_progress = 1
          start_timer = ElapsedMilliseconds()
          total_size_of_file_to_catch = 0
          final_size = 0
          encrypt_file(#fichier_a_transferer , start_directory + RemoveString( Directory$ + "\" + DirectoryEntryName(directory_number) , Directory_originel$)    , Directory$ + "\" +  DirectoryEntryName(directory_number) , 1 , DirectoryEntryName(directory_number) )
          SetGadgetState(#ProgressBar_trans_fichier,0)
          SetGadgetState(#ProgressBar_trans_total , number_of_transfert)
          number_of_transfert + 1
          CloseFile(#fichier_a_transferer)
          If wait_response(ServerID,"<END>file<END>") <> 1
            number_of_transfert = 0
            ProcedureReturn
          EndIf
        EndIf
      Else
        If DirectoryEntryName(directory_number)<>"." And DirectoryEntryName(directory_number) <> ".."
          directory_listing(Directory$ + "\" + DirectoryEntryName(directory_number)  , Directory_originel$)
        EndIf
      EndIf
    Wend
    FinishDirectory(directory_number)
    number_of_transfert = 0
    ProcedureReturn
  EndIf
  number_of_transfert = 0
EndProcedure

Procedure.l directory_count(Directory$)
  Protected directory_number.l
  directory_number = ExamineDirectory(#PB_Any, Directory$, "*.*") 
  If directory_number
    While NextDirectoryEntry(directory_number)
      If DirectoryEntryType(directory_number) = #PB_DirectoryEntry_File
        number_of_directory + 1
      Else
        If DirectoryEntryName(directory_number)<>"." And DirectoryEntryName(directory_number) <> ".."
          directory_count(Directory$ + "\" + DirectoryEntryName(directory_number) )
        EndIf
      EndIf
    Wend
    FinishDirectory(directory_number)
    ProcedureReturn
  EndIf
EndProcedure

Procedure OpenWindow_Window_transfert(num_thread.l)
  DisableDebugger
  OpenWindow(#Window_transfert, 507, 146, 819, 525, "Transferts", #PB_Window_TitleBar|#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EnableDebugger
  UseGadgetList(WindowID(num_thread))
  ExplorerListGadget(#ListView_trans_pclocal, 0, 45, 330, 415, "", #PB_Explorer_MultiSelect)
  TextGadget(#Text_trans_pclocal, 120, 0, 100, 20, "LOCAL PC")
  TextGadget(#Text_trans_pcdistant, 585, 0, 120, 20, "DISTANT PC")
  ListIconGadget(#ListView_trans_pcdistant, 490, 40, 325, 415, "", 150, #PB_ListIcon_MultiSelect)
  TextGadget(#Text_trans_message, 0, 460, 815, 20, "", #PB_Text_Border|#PB_Text_Center)
  ProgressBarGadget(#ProgressBar_trans_fichier, 0, 480, 815, 20, 0, 100, #PB_ProgressBar_Smooth)
  ProgressBarGadget(#ProgressBar_trans_total, -5, 500, 820, 20, 0, 100, #PB_ProgressBar_Smooth)
  ButtonGadget(#Button_trans_envoi_file, 340, 155, 140, 25, "send file(s) >>>")
  ButtonGadget(#Button_trans_reception_fichier, 340, 220, 140, 25, "<<< Receipt file(s)")
  ButtonGadget(#Button_stop_transfert, 340, 400, 140, 25, "STOP TRANSFERT")
  TextGadget(#Text_repertoire_distant, 490, 20, 325, 15, "", #PB_Text_Border|#PB_Text_Center)
  AddGadgetColumn(#ListView_trans_pcdistant,1,"Size",100)
  SetGadgetItemAttribute(#ListView_trans_pcdistant,0,#PB_Explorer_ColumnWidth,220,0)
  SetGadgetItemAttribute(#ListView_trans_pclocal,0,#PB_Explorer_ColumnWidth,220,0)
  SetGadgetItemAttribute(#ListView_trans_pclocal,0,#PB_Explorer_ColumnWidth,100,1)
  SetGadgetItemAttribute(#ListView_trans_pclocal,0,#PB_Explorer_ColumnWidth,0,2)
  SetGadgetItemAttribute(#ListView_trans_pclocal,0,#PB_Explorer_ColumnWidth,0,3)
  SetClassLong_(WindowID(#Window_transfert), #GCL_STYLE, GetClassLong_(WindowID(#Window_transfert), #GCL_STYLE) | #CS_DBLCLKS)
  windows_create = 1
  Repeat
    DisableDebugger
    event = WaitWindowEvent()
    EnableDebugger
    Gevent = EventGadget()
    If event = #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_transfert
        End
        CloseWindow(#Window_transfert)
        Quit = 1 
      EndIf
    EndIf
    
    If event = #PB_Event_Gadget And Gevent = #Button_stop_transfert
      send_message(ServerID,"<STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP><STOP><\STOP>")
      transfert_stop = 1
      SetGadgetState(#ProgressBar_trans_fichier,0)
      Goto i_will_be_back
    EndIf
    
    ; ******************************************************************************
    ; ********************************  FENETRE  ***********************************
    ; ******************************************************************************
    If (event = #WM_LBUTTONDBLCLK And Gevent = #ListView_trans_pcdistant) Or ( event = #PB_Event_Gadget And Gevent = #Button_trans_reception_fichier ) ; if double clic on  distant pc gadget
      If GetGadgetState(#ListView_trans_pcdistant) <> -1
        compteur.l = 0
        Dim multi_file_to_send.s(200000)
        counter_multi_file_to_send = 0
        For i = 0 To CountGadgetItems(#ListView_trans_pcdistant)
          If GetGadgetItemState(#ListView_trans_pcdistant,i) = 1
            If files_type(i) = 1
              multi_file_to_send(counter_multi_file_to_send) = GetGadgetItemText(#ListView_trans_pcdistant,i)
              counter_multi_file_to_send + 1
            EndIf
            compteur + 1
          EndIf
        Next i

        If files_type(GetGadgetState(#ListView_trans_pcdistant)) = 0 ; if directory
          If event = #PB_Event_Gadget And Gevent = #Button_trans_reception_fichier ; if i want a directory
            send_message(ServerID,"<i_want_the_directory>" + start_directory + GetGadgetItemText(#ListView_trans_pcdistant,GetGadgetState(#ListView_trans_pcdistant)) + "<i_want_the_directory><will_be_sent_in>" + GetGadgetItemText(#ListView_trans_pcdistant,GetGadgetState(#ListView_trans_pcdistant)) + "<will_be_sent_in>")
            start_timer = ElapsedMilliseconds()
            total_size_of_file_to_catch = 0
            final_size = 0
          Else
            If GetGadgetItemText(#ListView_trans_pcdistant,GetGadgetState(#ListView_trans_pcdistant)) <> ".."
              start_directory = start_directory + GetGadgetItemText(#ListView_trans_pcdistant,GetGadgetState(#ListView_trans_pcdistant)) + "\"
            Else
              start_directory_2 = ""
              For x_list = 1 To 255
                If StringField(start_directory,x_list,"\") = ""
                  x_list - 2
                  Break
                EndIf
              Next x_list
              For y_list = 1 To x_list
                start_directory_2 + StringField(start_directory,y_list,"\") + "\"
              Next y_list
              start_directory = start_directory_2
            EndIf
            If start_directory <> ""
              send_message(ServerID,"<directory_listing>" + start_directory + "<directory_listing>")
            Else
              send_message(ServerID,"<initial_list><initial_list>")
            EndIf
          EndIf  
        ElseIf files_type(GetGadgetState(#ListView_trans_pcdistant)) = 1 And GetGadgetText(#ListView_trans_pclocal) <> "" ; if double click on file
          If counter_multi_file_to_send = 1
            start_timer = ElapsedMilliseconds()
            total_size_of_file_to_catch = 0
            final_size = 0
            send_message(ServerID,"<i_want_the_file>" + start_directory + GetGadgetItemText(#ListView_trans_pcdistant,GetGadgetState(#ListView_trans_pcdistant)) + "<i_want_the_file>")
          Else
            y_list = 0
            For x_list = 0 To CountGadgetItems(#ListView_trans_pcdistant)
              If GetGadgetItemState(#ListView_trans_pcdistant,x_list) <> 0
                file_to_send = 1
                AddElement( name_of_file_to_send_2() )
                name_of_file_to_send_2() = GetGadgetItemText(#ListView_trans_pcdistant,x_list)
                y_list + 1
              EndIf
            Next x_list
          EndIf
        EndIf
      EndIf
    ElseIf (event = #WM_LBUTTONDBLCLK And Gevent = #ListView_trans_pclocal) Or ( event = #PB_Event_Gadget And Gevent = #Button_trans_envoi_file )
      If GetGadgetItemState(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal)) = 5 And start_directory <> ""
        For i_file = 0 To CountGadgetItems(#ListView_trans_pclocal)
          If GetGadgetItemState(#ListView_trans_pclocal,i_file) = 5
            complete_file_size.l = Len("<FILE>" + start_directory + GetGadgetItemText(#ListView_trans_pclocal,i_file) + "<FILE><SIZE>" + Str(FileSize(GetGadgetText(#ListView_trans_pclocal) + GetGadgetItemText(#ListView_trans_pclocal,i_file))) + "<SIZE>") + (FileSize(GetGadgetText(#ListView_trans_pclocal) + GetGadgetItemText(#ListView_trans_pclocal,i_file)))
            size_of_header.l = Len("<FILE>" + start_directory + GetGadgetItemText(#ListView_trans_pclocal,i_file) + "<FILE><SIZE>" + Str(FileSize(GetGadgetText(#ListView_trans_pclocal) + GetGadgetItemText(#ListView_trans_pclocal,i_file))) + "<SIZE>")
            ReadFile(#fichier_a_transferer,GetGadgetText(#ListView_trans_pclocal) + GetGadgetItemText(#ListView_trans_pclocal,i_file))
            SetGadgetText(#Text_trans_message,GetGadgetItemText(#ListView_trans_pclocal,i_file))
            SetGadgetAttribute(#ProgressBar_trans_fichier,#PB_ProgressBar_Maximum,complete_file_size/fix_buffer_size)
            file_send_in_progress = 1
            start_timer = ElapsedMilliseconds()
            total_size_of_file_to_catch = 0
            final_size = 0
            encrypt_file(#fichier_a_transferer , start_directory + GetGadgetItemText(#ListView_trans_pclocal,i_file) , GetGadgetText(#ListView_trans_pclocal) + GetGadgetItemText(#ListView_trans_pclocal,i_file))
            SetGadgetState(#ProgressBar_trans_fichier,0)
            CloseFile(#fichier_a_transferer)
            If wait_response(ServerID,"<END>file<END>") = 1
              Debug "end of file"
            Else
              Goto i_will_be_back
            EndIf
          EndIf
        Next i_file
      Else
        path$ = GetGadgetText(#ListView_trans_pclocal) + GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal))
        i_path = 1
        While StringField(path$ , i_path , "\") <> ""
          i_path + 1
        Wend
        i_path - 2
        path_final$ = ""
        For j_path = 1 To i_path
          path_final$ + StringField(path$ , j_path , "\") + "\"
        Next j_path
        
        number_of_directory = 0
        directory_count( GetGadgetText(#ListView_trans_pclocal) + GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal)) )
        SetGadgetAttribute(#ProgressBar_trans_total,#PB_ProgressBar_Maximum,number_of_directory)
        directory_listing( GetGadgetText(#ListView_trans_pclocal) + GetGadgetItemText(#ListView_trans_pclocal,GetGadgetState(#ListView_trans_pclocal)) , path_final$)
        SetGadgetState(#ProgressBar_trans_total , 0)
      EndIf
      file_send_in_progress = 0
    EndIf
    
    If file_to_send = 1 And recovery_complete = 1
      recovery_complete = 0
      ForEach name_of_file_to_send_2()
        send_message(ServerID,"<i_want_the_file>" + start_directory + name_of_file_to_send_2() + "<i_want_the_file>")
        DeleteElement( name_of_file_to_send_2() , 1)
      Next
    EndIf
    i_will_be_back:
  ForEver
EndProcedure

Procedure openwindow_CAD(num_thread)
  DisableDebugger
  OpenWindow(#Window_cad, 0, 0, (1024/2)+20, (768/2)+20, "", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
  EnableDebugger
  ImageGadget(#Image_cad, 0, 0, 1024/2, 768/2, 0, #PB_Image_Border)
  ButtonGadget(#image_bouton_quitter,500,768/2,50,20,"Quit")
  windows_create = 1
  Repeat
    DisableDebugger
    event = WaitWindowEvent(5)
    EnableDebugger
    Gevent = EventGadget()
    If event = #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_cad
        End
        CloseWindow(#Window_cad)
        Quit = 1
        ProcedureReturn
      EndIf
    EndIf
    
  ForEver
EndProcedure

Procedure.b wait_response(server_id.l,reponse.s)
  Debug "i'm waiting for : " + reponse
  Repeat
    Delay(5)
    SEvent = NetworkClientEvent(ServerID)
    If SEvent = #PB_NetworkEvent_Data
      FillMemory(*buffer,fix_buffer_size)
      data_receipt(ServerID)
      If FindString(PeekS(*buffer+8) , reponse)
        ProcedureReturn 1
      Else
        Debug "-1"
      EndIf
    ElseIf SEvent = #PB_NetworkEvent_Disconnect
      ProcedureReturn 3
    EndIf
  ForEver
EndProcedure

Procedure initial_drives(recup_init.s)
  ClearGadgetItems(#ListView_trans_pcdistant)
  drive.s
  For i=2 To 26
    drive = StringField(recup_init,i,"|")
    If drive <> ""
      AddGadgetItem(#ListView_trans_pcdistant,-1,drive)
    EndIf
  Next i
EndProcedure            

Procedure send_message(id_du_serveur.l,message$)
  Debug "i send : " + message$
  PokeQ(*send_buffer, Len(message$))
  PokeS(*send_buffer + 8, message$)
  SendNetworkData(ServerID, *send_buffer,fix_buffer_size)
  FillMemory(*send_buffer,fix_buffer_size)
EndProcedure

Procedure read_key()
  cle_decrypt = Mid(message_temp,1,32)
  vec_decrypt = Mid(message_temp,33,32)
EndProcedure

Procedure empty_key()
  cle_decrypt = Space(32)
  vec_decrypt = Space(32)
EndProcedure

windows_create = 0

If ServerID
  windows_create = 0
  If show_transfert = 1
    CreateThread(@OpenWindow_Window_transfert(),#Window_transfert)
  Else
    CreateThread(@openwindow_CAD(),#Window_transfert)
  EndIf
  While windows_create = 0
    Delay(10)
  Wend
Else
  MessageRequester("PureBasic - Client", "Server not found.", 0)
  End
EndIf

Repeat
  Delay(5)
  If file_send_in_progress = 1
    Goto infinite_loop
  EndIf
  
  ; ******************************************************************************
  ; ********************************  RESEAU  ************************************
  ; ******************************************************************************
  SEvent = NetworkClientEvent(ServerID)
  If SEvent
    Select SEvent
      Case #PB_NetworkEvent_Data
        received_size.l = data_receipt(ServerID)
        If received_size = -1
          Goto infinite_loop
        EndIf
        
        If FindString(PeekS(*buffer+8),"<client_number>")
          Debug "i m client number " + StringField(PeekS(*buffer+8),2,"<client_number>")
          client_number = Val(StringField(PeekS(*buffer+8),2,"<client_number>"))
          message_temp = ""
          
          ExamineIPAddresses(#PB_Network_IPv4)
          Resultat = NextIPAddress()
          While Len(message_temp) < 64
            message_temp + Str(Resultat)
          Wend
          message_temp = Mid(message_temp , 1 , 64)
          
          If show_transfert = 1
            send_message(ServerID,"<initial_list><initial_list>")
          Else
            Debug "firSt picture"
            ;send_message(ServerID,"<ask_picture><ask_picture>")
            picture_asked = 1
          EndIf
          Goto infinite_loop
        ElseIf FindString(PeekS(*buffer+8),"<initial_list>")
          CopyMemory(*Buffer+8,*Buffer,fix_buffer_size-8)
          temporaire.s = RemoveString(PeekS(*buffer),"<initial_list>")
          If Len(temporaire) >= 16
            read_key()
            *CipheredString   = AllocateMemory(Len(temporaire)+1)
            PokeS(*CipheredString , temporaire , Len(temporaire) )
            *DecipheredString = AllocateMemory(Len(temporaire)+1)
            AESDecoder(*CipheredString, *DecipheredString, Len(temporaire), @cle_decrypt, 256, @vec_decrypt )
            initial_drives(PeekS(*DecipheredString))
            empty_key()
            FreeMemory(*CipheredString)
            FreeMemory(*DecipheredString)
          Else
            initial_drives(temporaire)
          EndIf
  
        ElseIf FindString(PeekS(*buffer+8),"<diretory_cannot_be_read><diretory_cannot_be_read>")
          sTemporaire.s = ""
          For i = 1 To CountString(start_directory,"\")-1
            sTemporaire + StringField(start_directory,i,"\") + "\"
          Next i
          start_directory = sTemporaire
          
        ElseIf FindString(PeekS(*buffer+8),"<directory_send>")
          send_message(ServerID,"<received_block><received_block>")
          ClearGadgetItems(#ListView_trans_pcdistant)
          string_size.l = PeekQ(*buffer)
          string_tempo.s = PeekS(*buffer+8,received_size-8)
          directory_back:
          If Len(string_tempo) < string_size
            FillMemory(*buffer,fix_buffer_size)
            received_size = data_receipt(ServerID)
            If received_size = -1
              Delay(100)
              Goto directory_back
            EndIf
            string_tempo + PeekS(*buffer,received_size)
            Goto directory_back
          EndIf
          Dim files_type(200000)
          For i = 2 To 200000
            If StringField(string_tempo,i,"?") <> ""
              If Mid( StringField(string_tempo,i,"?") , 1,1) = "d"
                AddGadgetItem(#ListView_trans_pcdistant,-1,Mid( StringField(string_tempo,i,"?") , 2, Len( StringField(string_tempo,i,"?") )-1   ) )
              EndIf
              If Mid( StringField(string_tempo,i,"?") , 1,1) = "f"
                files_type(i-2) = 1
                AddGadgetItem(#ListView_trans_pcdistant,-1,StringField(Mid( StringField(string_tempo,i,"?") , 2, Len( StringField(string_tempo,i,"?") )-1   ),1,"|") + Chr(10) + StringField(Mid( StringField(string_tempo,i,"?") , 2, Len( StringField(string_tempo,i,"?") )-1   ),2,"|"));,imageid_fichier)
              EndIf
            Else
              Goto fin_next_DD
            EndIf
          Next i
          fin_next_DD:
          ; remove ".." and "."
          If GetGadgetItemText(#ListView_trans_pcdistant,0) = ".." And GetGadgetItemText(#ListView_trans_pcdistant,1) = ".."
            RemoveGadgetItem(#ListView_trans_pcdistant,0)
            For i = 1 To CountGadgetItems(#ListView_trans_pcdistant)+1
              files_type(i-1) = files_type(i)
            Next i
          EndIf
          
        ElseIf FindString(PeekS(*buffer+16),"<FILE>")
          Debug "********************************"
          Debug "<FILE>"
          Debug "********************************"
          final_size = 0
          header_size = PeekQ(*buffer)
          CopyMemory(*Buffer+8,*Buffer,fix_buffer_size-8)
          crc32 = PeekL(*buffer)
          CopyMemory(*Buffer+8,*Buffer,fix_buffer_size-16)
          add_directory.s = ""
          complete_directory_name.s = GetGadgetText(#ListView_trans_pclocal)
          If FindString(StringField(PeekS(*buffer),2,"<FILE>") , "\") And Mid ( StringField(PeekS(*buffer),2,"<FILE>"),2,1) <> ":"
            For x_finstr = 1 To CountString(StringField(PeekS(*buffer),2,"<FILE>"),"\")
              complete_directory_name + StringField( StringField(PeekS(*buffer),2,"<FILE>") , x_finstr, "\") + "\"
              CreateDirectory(complete_directory_name)
              add_directory = complete_directory_name
            Next x_finstr
          EndIf
          If add_directory = ""
            final_name_file.s = GetGadgetText(#ListView_trans_pclocal) + GetFilePart(StringField(PeekS(*buffer),2,"<FILE>"))
            temporary_file_name.s = GetGadgetText(#ListView_trans_pclocal) + GetFilePart(StringField(PeekS(*buffer),2,"<FILE>")) + ".TMP"
          Else
            final_name_file.s = GetGadgetText(#ListView_trans_pclocal) + StringField(PeekS(*buffer),2,"<FILE>")
            temporary_file_name.s = GetGadgetText(#ListView_trans_pclocal) + StringField(PeekS(*buffer),2,"<FILE>") + ".TMP"
          EndIf
          Debug complete_directory_name
          CreateFile(#fichier_temporaire,temporary_file_name )
          size_to_received = Val(StringField(PeekS(*buffer),2,"<SIZE>"))
          time_to_show.q = (1000 * final_size)/(ElapsedMilliseconds()-start_timer)
          If time_to_show < 1000
            SetGadgetText(#Text_trans_message, final_name_file + " " + Str(time_to_show) + " o/s")
          ElseIf time_to_show < 1000000
            SetGadgetText(#Text_trans_message, final_name_file + " " + Str(time_to_show/1000) + " Ko/s")
          ElseIf time_to_show < 1000000000
            SetGadgetText(#Text_trans_message, final_name_file + " " + Str(time_to_show/1000000) + " Mo/s")
          Else
            SetGadgetText(#Text_trans_message, final_name_file + " " + Str(time_to_show/1000000000) + " Go/s")
          EndIf
          SetGadgetAttribute(#ProgressBar_trans_fichier,#PB_ProgressBar_Maximum,size_to_received)
          ;size_of_buffer_received = received_size
          If crc32 <> CRC32Fingerprint(*Buffer + header_size,fix_buffer_size - 16 - header_size)
            send_message(ServerID,"<ERREUR_CRC><ERREUR_CRC>")
            Goto quittage
          EndIf
          
          send_message(ServerID,"<received_block><received_block>")
          ; j'ai tout recu
          Debug size_to_received
          Debug received_size - header_size - 16
          If size_to_received < (received_size - header_size - 16)
            read_key()
            *DecipheredString = AllocateMemory(size_to_received + 1)
            If size_to_received > 16
              AESDecoder(*buffer + header_size, *DecipheredString, size_to_received, @cle_decrypt, 256, @vec_decrypt)
              empty_key()
              WriteData(#fichier_temporaire,*DecipheredString,size_to_received)
            Else
              AESDecoder(*buffer + header_size, *DecipheredString, 16, @cle_decrypt, 256, @vec_decrypt)
              empty_key()
              WriteData(#fichier_temporaire,*DecipheredString,size_to_received)
            EndIf
            FreeMemory(*DecipheredString)
            FillMemory(*buffer,fix_buffer_size)
            CloseFile(#fichier_temporaire)
            DeleteFile(final_name_file)
            If RenameFile(temporary_file_name,final_name_file) = 0
              Debug "cannot delete " + final_name_file
              Debug "cannot rename " + temporary_file_name
            EndIf
            recovery_complete = 1
            SetGadgetState(#ProgressBar_trans_fichier,0)
            ;final_size + size_to_received
            Goto quittage            
          Else
            read_key()
            *DecipheredString = AllocateMemory(received_size - header_size - 16 + 1)
            AESDecoder(*buffer + header_size, *DecipheredString, received_size - header_size - 16, @cle_decrypt, 256, @vec_decrypt)
            empty_key()
            WriteData(#fichier_temporaire,*DecipheredString,received_size - header_size - 16)
            FreeMemory(*DecipheredString)
            final_size + received_size - header_size - 16 + 1
          EndIf
          SetGadgetState(#ProgressBar_trans_fichier,received_size - header_size - 16)
          time_to_show.q = (1000 * final_size)/(ElapsedMilliseconds()-start_timer)
          If time_to_show < 1000
            SetGadgetText(#Text_trans_message, final_name_file + " " + Str(time_to_show) + " o/s")
          ElseIf time_to_show < 1000000
            SetGadgetText(#Text_trans_message, final_name_file + " " + Str(time_to_show/1000) + " Ko/s")
          ElseIf time_to_show < 1000000000
            SetGadgetText(#Text_trans_message, final_name_file + " " + Str(time_to_show/1000000) + " Mo/s")
          Else
            SetGadgetText(#Text_trans_message, final_name_file + " " + Str(time_to_show/1000000000) + " Go/s")
          EndIf
          FillMemory(*buffer,fix_buffer_size)
          boucle_fichier:
          Debug "taille final : " + Str(final_size)
          Debug "boucle"
          If transfert_stop = 1
            transfert_stop = 0
            Goto quittage
          EndIf
          size_of_buffer_received = data_receipt(ServerID)
          crc32 = PeekL(*buffer)
          CopyMemory(*Buffer+8,*Buffer,size_of_buffer_received-8)
          Delay(5)
          send_message(ServerID,"<received_block><received_block>")
          
          Debug size_to_received
          Debug final_size
          If size_of_buffer_received + final_size - 8 >= size_to_received
            read_key()
            *DecipheredString = AllocateMemory(received_size - header_size - 8 + 1)
            AESDecoder(*buffer, *DecipheredString, received_size - header_size - 8, @cle_decrypt, 256, @vec_decrypt)
            empty_key()
            WriteData(#fichier_temporaire,*DecipheredString,size_to_received - final_size)            
            FillMemory(*buffer,fix_buffer_size)
            CloseFile(#fichier_temporaire)
            DeleteFile(final_name_file)
            If RenameFile(temporary_file_name,final_name_file) = 0
              Debug "cannot rename " + temporary_file_name
            EndIf
            recovery_complete = 1
            SetGadgetState(#ProgressBar_trans_fichier,0)
            Goto quittage
          Else
            read_key()
            *DecipheredString = AllocateMemory(received_size - 8 + 1)
            AESDecoder(*buffer, *DecipheredString, received_size - 8, @cle_decrypt, 256, @vec_decrypt)
            empty_key()
            WriteData(#fichier_temporaire,*DecipheredString,size_of_buffer_received - 8)            
            final_size + size_of_buffer_received - 8
            SetGadgetState(#ProgressBar_trans_fichier,final_size)
          EndIf
          FillMemory(*buffer,fix_buffer_size)
          Goto boucle_fichier
          quittage:
          SetGadgetText(#Text_trans_message,final_name_file )
          
        ; *******************************
        ; *******  picture receipt ******
        ; *******************************
        ElseIf FindString(PeekS(*buffer+16),"<here_is_the_picture>")
          Debug "picture receiver"
          header_size = PeekQ(*buffer)
          CopyMemory(*Buffer+8,*Buffer,fix_buffer_size-8)

          wait_end_of_picture.b = 0
          CreateFile(#fichier_image,"c:\screen2.jpg")
          size_to_received = Val(StringField(PeekS(*buffer+8),2,"<here_is_the_picture>"))
          size_to_remove = 16
          final_size = 0
    
          Repeat
            crc32 = PeekL(*buffer)
            CopyMemory(*buffer + 8 + header_size,*buffer,fix_buffer_size - header_size - size_to_remove)    
            crc32_calculer.l = CRC32Fingerprint(*Buffer,fix_buffer_size - header_size - size_to_remove)
            size_of_buffer_received = received_size
            If crc32 <> crc32_calculer
              send_message(ServerID,"<ERREUR_CRC><ERREUR_CRC>")
              Break
            EndIf
            *DecipheredString = AllocateMemory(fix_buffer_size + 1)
            read_key()
            If received_size - size_to_remove - header_size < size_to_received
              AESDecoder(*buffer, *DecipheredString, received_size - size_to_remove - header_size, @cle_decrypt, 256, @vec_decrypt)
            Else
              AESDecoder(*buffer, *DecipheredString, size_to_received, @cle_decrypt, 256, @vec_decrypt)
            EndIf
            empty_key()
            If final_size + received_size - size_to_remove - header_size < size_to_received ; taille non atteinte
              WriteData(#fichier_image,*DecipheredString,received_size - size_to_remove - header_size)
            Else
              WriteData(#fichier_image,*DecipheredString,size_to_received - final_size)
              wait_end_of_picture = 1
            EndIf
            FreeMemory(*DecipheredString)
            FillMemory(*buffer,fix_buffer_size)
            
            final_size + received_size - size_to_remove - header_size
            send_message(ServerID,"<received_block><received_block>")
            FillMemory(*buffer,fix_buffer_size)
            If wait_end_of_picture <> 1
              size_of_buffer_received = data_receipt(ServerID) ; charge la suite
            EndIf
      
            ;send_message(ServerID,"<END>file<END>")
            recovery_complete = 1
            CloseFile(#fichier_image)
            FillMemory(*buffer,fix_buffer_size)
             
            If LoadImage(#Image_chargement_cad,"c:\screen2.jpg")
              SetGadgetState(#Image_cad,ImageID(#Image_chargement_cad))
            EndIf
            
            FreeImage(#Image_chargement_cad)
            picture_asked = 0
            header_size = 0
            size_to_remove = 8
          Until wait_end_of_picture = 1
          send_message(ServerID,"<picture_received><picture_received>")
          
        Else
          Debug "unknow peeks : " + PeekS(*buffer+8)
        EndIf
        
        FillMemory(*buffer,fix_buffer_size)
      Case #PB_NetworkEvent_Disconnect
        Debug "connexion stop"
        quit=1
        
    EndSelect
  ElseIf picture_asked = 1
    compteur_image + 1
    If compteur_image = 500
      picture_asked = 0
     EndIf
  ElseIf picture_asked = 0 And show_transfert = 0
    compteur_image = 0
    Debug "ask picture"
    picture_asked = 1
    send_message(ServerID,"<ask_picture><ask_picture>")
    ;Delay(5)
  EndIf
  infinite_loop:
Until quit = 1
Répondre