_uc_ExoSeeKerneL.pas

unit _uc_ExoSeeKerneL;



// be cafull of VCL interaction !!! , only read !!! , synchronize when write !!!!


interface

uses windows,SysUtils,classes,scktcomp,Forms,ComCtrls,_uf_rcvFile,FileCtrl;

type

 
 TEXOSEE_KERNEL_THREAD = class(TServerClientThread)
 private
   _X_PROTO_CODE          : String[8];
   _SS_THREAD_ACTIVE_TASK : String[20];

   _SS_STR_LOG            : String;
   _UpLoad_Item           :TListItem;
   _Active_file           :string;
   _SS_FX_DATA_FILE       :TFileStream;
   _SS_IS_PANIK_ERROR    :Boolean;
   _SS_IS_CANCELED       :boolean;


   _vSS__FILE_UPLOAD_DEC_SIZA         : Int64;


   _vSS__FILE_RCV_DONE_OK             : Boolean;
   _vSS__FILE_RCV_IS_OTO_ACCEPT       : Boolean;
   _vSS__FILE_RCV_FILENAME            : String;
   _vSS__FILE_RCV_FILESIZE            : Int64;
   _vSS__FILE_RCV_READEN              : Int64;
   _vSS__FILE_RCV_LOCAL_SAVA_FILENAME : String;

   sDebug : string;


    FRcvForm : T_FRcvFile;

   procedure _ssGo_IncominBuilder_MAIN;

   procedure _ssGo_ExpLorer_MAIN;
   function _ssGo_ExpLorer_TheLocalPATH(_FullPath: string): string;
   function _ssGo_ExpLorer_TheMainROOTS(okPrivs, okXtra: boolean; xtra,_nik: string): string;

   procedure _ssGo_FileUpload_MAIN;
   procedure _ssGo_FileUpload_INITIALIZATION;
   procedure _ssGo_FileUpload_SHAWA_BB;

   procedure ssGo_FileRcv_MAIN;
   procedure ssGo_FileRcv_RcvACCEPT;
   procedure ssGo_FileRcv_OkACCEPTED;
   procedure ssGo_FileRcv_SHAWA;
   procedure ssGo_FileRcv_TERMINATED;



  
 protected
   procedure ClientExecute; override;
   procedure _DoInstantLoG;

 public
   _Wsk :TWinSocketStream;

   _SS_REMOTE_USER_SOCKET_IP : String[15];
   _SS_REMOTE_USER_NICKNAME  : String[16];
   _SS_REMOTE_USER_PC_ID     : String[10];


   _SS_STATUS_CODE : Byte;

   _sData:String;
   nComNode:TTreeNode;


   procedure _Syn2LoG(sss: String);
   procedure On_terminated(Sender: TObject);

end;






implementation

uses Unit1,_uc_funcs,_uc_refs_consts,_uc_refs_vars,_uc_crypto,_uc_cs_new1ini,_uc_GuiLanG;


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD._Syn2LoG(sss: String);
begin
_SS_STR_LOG:=sss;
Synchronize(_DoInstantLoG);
end;

//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD._DoInstantLoG;
begin

_FXOC_MAIN.TheLOGGER.Log(_SS_STR_LOG,0);
//Application.ProcessMessages;

end;


//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD.On_terminated(Sender: TObject);
begin

//dec(_ACTIVE_TOTAL_THREADS_COUNT);

if (_FXOC_MAIN.izDebugerON.Checked) then _FXOC_MAIN.TheLOGGER.Log('sDebug:'+sDebug);

//TLogger.Log(ret+sep+ret+'TEXOSEE_KERNEL_terminated_:'+IntToStr(_SS_STATUS_CODE)+' >> '+_SS_ACTIVE_TASK+ret+_sData);

(*   *)

  case _SS_STATUS_CODE of    // add user + reason
     //1 : _do_LoG('1/NoComInHome',1,false);
     2 : _FXOC_MAIN.TheLOGGER.Log(format(___ccc__0102__LanUserRejected,[_SS_REMOTE_USER_NICKNAME]),1);
     3 : _FXOC_MAIN.TheLOGGER.Log(format(___ccc__0101__BannedRejected,[_SS_REMOTE_USER_NICKNAME]),1);
    10 : set_newUser_ini_DataNode(_SS_REMOTE_USER_SOCKET_IP,_sData,nComNode); // new1boyaNode is OK ( found )

    //11 : _log('1xpNotInisDDkrK',1,false);
   // 12 : _log('1xp_roots_ok',1,false);
 13,15 : _FXOC_MAIN.TheLOGGER.Log(format(___ccc__0103__XtraFolder4UserNotSet,[_SS_REMOTE_USER_NICKNAME]),1);  // folder not set
    16 : _FXOC_MAIN.TheLOGGER.Log(___ccc__0104__XtraFolderNotAllowed4+_SS_REMOTE_USER_NICKNAME,1); // not allowed


   // 20 : _do_LoG('xpL_..',1,false); // IN ADVANCED ADD USER browsing path

  //  30 : _log(_XData,0);  // cs_filter ok ini


    99 : if (_SS_THREAD_ACTIVE_TASK<>'') then _FXOC_MAIN.TheLOGGER.Log('_T_THREADS_MANAGER_ERROR_['+_SS_THREAD_ACTIVE_TASK+']',1); // +_ActiveERROR

  end;
 // Application.ProcessMessages;



end;

//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD.ClientExecute;
begin


inc(_SERVER_ACTIVE_TOTAL_THREADS_COUNT);

try //--------1


   _Wsk := TWinSocketStream.Create(ClientSocket, 10000);
   try //--------2
   _SS_REMOTE_USER_SOCKET_IP:=ClientSocket.RemoteAddress;
  

                  if _Wsk.WaitForData(10000) then
                  begin
                  _X_PROTO_CODE:=TCrypto._SimSim(ClientSocket.ReceiveText);   // 10sec to begin
                 
                       if (_X_PROTO_CODE[1]=#0)and(_X_PROTO_CODE[4]='ë') then  //  #9=ë !!! for tab9 be in packets
                       begin

                           case _X_PROTO_CODE[2] of
                           'A'  : _ssGo_IncominBuilder_MAIN;
                           'B'  : _ssGo_ExpLorer_MAIN;
                           'G'  : _ssGo_FileUpload_MAIN;

                           'I'  : ssGo_FileRcv_MAIN;

                           else _Syn2LoG('x[?]. REJECTED! ->'+_X_PROTO_CODE);
                           end;

                       end
                       else
                       begin
                       _Syn2LoG('Unknown_cmd_from_('+_SS_REMOTE_USER_SOCKET_IP+') REJECTED!');
                       end;

                  end
                  else begin //
                       _Syn2LoG('Unknown_('+_SS_REMOTE_USER_SOCKET_IP+') REJECTED!');
                       end;




   finally
   // no !! DO_LING here >>> it cuts last bytes
   ClientSocket.Close; //    will charge after all sent
   _Wsk.Free;
   end; //--------2


Except
_SS_STATUS_CODE :=99;
    (*
    on E: Exception do
    begin
     if not(ExceptObject is EAbort) then
      begin
      //_Syn2LoG('TXCEPT : '+E.Message);
      _SS_STATUS_CODE :=99;
      end;
    end;
    *)
end;



end;


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//----------------------------------------_ssGo_IncominBuilder_MAIN-------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------


procedure TEXOSEE_KERNEL_THREAD._ssGo_IncominBuilder_MAIN;
var
sIncomComADR:string;
begin

_SS_THREAD_ACTIVE_TASK:='_builder_ini0'; // a must to catch kk maker

ClientSocket.SendText(#0+'A'+#0+'a'); // direct no barzat  '

_SS_THREAD_ACTIVE_TASK:='_builder_ini1'; // a must to catch kk maker

  if _Wsk.WaitForData(5000) then   // user loging...  data coming
  begin
  _sData:=TCrypto._SimSim(ClientSocket.ReceiveText);

// if ok >> send mySdata else >> send reject code...its waiting there !
  _SS_THREAD_ACTIVE_TASK:='_builder_ini2'; // a must to catch kk maker

  // check if user com is in my home  by IDX ( com full url )
  sIncomComADR:=copy(_sData,pos(':G',_sData)+2,(pos('G;',_sData)-pos(':G',_sData))-2);
  nComNode:=is_COMMUNITY_in_HOME(sIncomComADR);

  _SS_THREAD_ACTIVE_TASK:='_builder_ini3'; // a must to catch kk maker
  if (nComNode=nil)or(nComNode._EXO_NODE_IS_STOPING) then  // fixed is com stopping
                       begin
                       ClientSocket.SendText(TCrypto.kozkozo('1NoComInHome')); // no coded
                       _SS_STATUS_CODE:=1;
                       exit;
                       end;

  // ignore if lan & i dont want them
  if (_VV_LOCAL_CONFIG_I_ACCEPT_NO_LAN) and (_sData[3]='L') then    //1+2(:A)
                      begin
                       ClientSocket.SendText(TCrypto.kozkozo('2NoAxLAN')); // coded ! kozkozo
                       _SS_STATUS_CODE:=2;
                      end;

  _SS_THREAD_ACTIVE_TASK:='_builder_ini4'; // a must to catch kk maker
  // ignore if userID in black list
  if (pos(copy(_sData,pos(':F',_sData)+2,(pos('F;',_sData)-pos(':F',_sData))-2), _VV_LOCAL_CONFIG_BANNED_USERS_LIST)>0)then
                      begin
                      ClientSocket.SendText(TCrypto.kozkozo('3Banned')); // coded ! kozkozo
                      _SS_STATUS_CODE:=3;
                      end;

   _SS_THREAD_ACTIVE_TASK:='_builder_ini5'; // a must to catch kk maker
  if (_SS_STATUS_CODE in [2,3])then //grab nik for log and EXIT
  begin
  _SS_REMOTE_USER_NICKNAME:=copy(_sData,pos(':B',_sData)+2,(pos('B;',_sData)-pos(':B',_sData))-2);
  exit;
  end;


_SS_THREAD_ACTIVE_TASK:='_builder_ini6'; // a must to catch kk maker
 //--------is ok till here .... give my info too   (kozkoz here)
ClientSocket.SendText(TCrypto.kozkozo(':A'+_VV_LOCAL_USER_MY8_BOOLEANS+'A;'+ // all my bools , lan/wan...status....etc
                                      ':B'+_VV_LOCAL_USER_NIKO+'B;'+
                                      ':C'+_VV_LOCAL_USER_COUNTRY_CODE+'C;'+
                                      ':D'+_VV_LOCAL_USER_MESSAGE+'D;'+
                                      ':E_E;'+
                                      ':F'+_VV_LOCAL_USER_PC_ID+'F;'  // com is as needed
                                      //':G'+_comADRiDX+'G;' // com no need to send , i only accepted
                                      )); // send my data


  _SS_THREAD_ACTIVE_TASK:='_builder_ini7'; // a must to catch kk maker

  _SS_STATUS_CODE:=10;

  // wait while he'll recive what sent above
  //_Wsk.WaitForData(5000);   hmmmm no need
  end;



end;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//----------------------------------------------_ssGo_ExpLorer_MAIN-------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------

procedure TEXOSEE_KERNEL_THREAD._ssGo_ExpLorer_MAIN;
var
_xRcvData:String;
_s,_z,_uID,_SekReq,_ReqfullPath,_xtraPath:string;
_nBB:byte;
_typ:char;
_xStRm:TMemoryStream;
Buf: PByteArray;
SIZA,i:integer;

_XpUser_Node :TTreeNode;
BufSize,poz, SndLen: Integer;
_canPrivs,_canXtra:boolean;
begin



_SS_THREAD_ACTIVE_TASK:='_explorer'; // a must to catch kk maker
ClientSocket.SendText(#0+'B'+#0+'b'); // direct no barzat  '




  if _Wsk.WaitForData(5000) then   // user log ing...
  begin

  _canPrivs :=false;
  _canXtra  :=false;

  _xRcvData:=TCrypto._SimSim(ClientSocket.ReceiveText);


//'<I'+_XpNode._EXO_NODE_USER_ID+'I>'+
//'<N'+_XpNode._EXO_NODE_PATH_NB+'N>'+
//'<P'+_XpNode._EXO_NODE_PATH_TX+'P>'+

//TLogger.Log('_xRcvData('+_xRcvData+')');


  // check if user id first
  _uID:=copy(_xRcvData,pos('<I',_xRcvData)+2,(pos('I>',_xRcvData)-pos('<I',_xRcvData))-2);

  _XpUser_Node :=_is_UserID_in_The_NETWORKS_Tree(_uID); // added fix com stopping
  if (_XpUser_Node=nil) then begin
                           ClientSocket.SendText(TCrypto.kozkozo('1NotInisDDkrK')); // no coded
                           _SS_STATUS_CODE:=11;
                           exit;
                           end;



     _nBB :=strtointdef('$'+copy(_xRcvData,pos('<N',_xRcvData)+2,(pos('N>',_xRcvData)-pos('<N',_xRcvData))-2),-1);
  _SekReq :=copy(_xRcvData,pos('<P',_xRcvData)+2,(pos('P>',_xRcvData)-pos('<P',_xRcvData))-2);
     _typ :=copy(_xRcvData,pos('<T',_xRcvData)+2,(pos('T>',_xRcvData)-pos('<T',_xRcvData))-2)[1];

_SS_REMOTE_USER_NICKNAME:=_XpUser_Node.Text;//grab nikname , node till he its ok


  case _nBB of

         0 : begin  // 00 = shared_roots kozkozo

                if pos(_uID,_VV_LOCAL_USER_FAVORITES_LIST)>0 then  //check if fav+++
                begin

                     for i:=0 to _TV_NODE_OF_FAVORITES.Count-1 do
                     begin
                     _z:=_TV_NODE_OF_FAVORITES.Item[i]._EXO_NODE_COM_IDX;  // 1C080B2CD3xxA01000000%1Ismail%2F:\_Pc-Set\_Drivers%3
                     if  copy(_z,1,10)=_uID then begin
                                                 _canPrivs :=_z[13+1]='1';
                                                 _canXtra  :=_z[13+3]='1';
                                                 //_z:=_FMAIN._favies.Items[i]._Str; // re-use _z
                                                 if _canXtra then
                                                 _xtraPath:=copy(_z,pos('%2',_z)+2,pos('%3',_z)-pos('%2',_z)-2);
                                                 break;
                                                 end;
                     end;

                end;


             _s:=_ssGo_ExpLorer_TheMainROOTS(_canPrivs,_canXtra,_xtraPath,_SS_REMOTE_USER_NICKNAME);


             SIZA :=length(_s);
             _Wsk.Write(SIZA, SizeOf(SIZA)); // it sends size - offset !!! ,

             ClientSocket.SendText(_s);
             _SS_STATUS_CODE:=12;
             end;
            

    1..255 : begin

                 case _typ of
                    '0' : _ReqfullPath:=EXPLORER_PUBLIC_ROOTS[_nBB-1]+_SekReq;  // pub
                    '1' : _ReqfullPath:=EXPLORER_PRIVATE_ROOTS[_nBB-1]+_SekReq;  // priv
                    '2' : begin                                             // xtra
                          _xtraPath:=_GimeFavUserXtraFolder(_uID);
                          if _xtraPath<>'' then _ReqfullPath:=_xtraPath+_SekReq 
                                           else begin
                                                _SS_STATUS_CODE:=13;
                                                ClientSocket.SendText(TCrypto.kozkozo('2xtraNotSet')); //
                                                exit;
                                                end;

                          end;
                 end;


             _ReqfullPath:=stringreplace(_ReqfullPath,'\\','\',[rfReplaceAll]); // clean here

             // if folder exist
            // _log(ret+'_ReqfullPath >> '+_ReqfullPath,0);
             // !!!!! 8KB bug !!!!!   >> reUse _uID for stream



             _s:=_ssGo_ExpLorer_TheLocalPATH(_ReqfullPath);

             _xStRm:=TMemoryStream.Create;
             _xStRm.Write(pointer(_s)^,length(_s));
             _xStRm.Position:=0;


             SIZA :=_xStRm.Size;
             _Wsk.Write(SIZA, SizeOf(SIZA)); // it sends size - offset !!! , waitng there

             if SIZA < MAX_BUFFER_EXPLOLRER_BROWSING then BufSize := SIZA
             else BufSize := MAX_BUFFER_EXPLOLRER_BROWSING;

             GetMem(Buf, BufSize);
             Try //--------4

                     while (SIZA>0) and (ClientSocket.Connected) do
                     begin

                     if SIZA > BufSize then SndLen := BufSize else SndLen := SIZA;
                     _xStRm.Read(Buf^, SndLen);
                     poz := 0;

                        while (poz < SndLen) do
                        begin
                        Inc(poz, _Wsk.Write(Buf^[poz],SndLen) );
                        end;

                     Dec(SIZA, SndLen);

                     if _THE_EXOSEE_APPLICATION_IS_TERMINATED then break;

                     end;

              finally FreeMem(Buf); end; //--------4    freemem(...,BufSize) was in >=17-pr3



             _xStRm.Free;

             end;


  end;


  end;
(**)
end;

//------------------------------------------------------------------------------
function TEXOSEE_KERNEL_THREAD._ssGo_ExpLorer_TheMainROOTS(okPrivs,okXtra:boolean;xtra,_nik:string):string;
var
i:integer;
begin

(*   *)
 // 0  pubs
 // 1  pub+privs
 // 2  pub+xtra
 // 3  pubs+privs+xtra



   for i:=0 to EXPLORER_PUBLIC_ROOTS.Count-1 do
   begin
   result:=result+'<R>'+inttohex(i+1,2)+_folder_lastName(EXPLORER_PUBLIC_ROOTS[i])+ret;
   end;



   if okPrivs then // pub + privs
   begin
     for i:=0 to EXPLORER_PRIVATE_ROOTS.Count-1 do
     begin
     result:=result+'<V>'+inttohex(i+1,2)+_folder_lastName(EXPLORER_PRIVATE_ROOTS[i])+ret;
     end;
   end;


   if okXtra then // pub + xtra
   begin
   if DirectoryExists(xtra) then
   result:=result+'<X>77'+_folder_lastName(xtra)+ret    // 77 = any>0 to be accepted there , it will be detected by 'T'
   else _Syn2LoG(format(___ccc__0103__XtraFolder4UserNotSet,[_nik]));
   end;

result:=result+'<Z>'+ret;

end;

//------------------------------------------------------------------------------
function TEXOSEE_KERNEL_THREAD._ssGo_ExpLorer_TheLocalPATH(_FullPath:string):string;    // no nik needed here
var
i:integer;
zz:TSearchRec;
_fSiZe64:Int64;
begin



if not DirectoryExists(_FullPath) then
begin
Result:='<!>'+ret; // ADD FOLDER  + mark
_Syn2LoG(format(___ccc__0046__CheckPubFolder,[_FullPath]));
exit;
end;


        i:= FindFirst(_FullPath+'*.*',faanyfile,zz);
        while i = 0 do
        begin
            if (zz.Name <> '.') and (zz.Name <> '..')then
            begin
            if (zz.attr and fadirectory >0 ) then
            Result:=Result+'<d>'+zz.name+ret // ADD FOLDER  + mark
            else
               begin  // a file
               _fSiZe64 :=Int64(zz.FindData.nFileSizeHigh) shl 32 + Int64(zz.FindData.nFileSizeLow);
               Result:=Result+format('<f>%s?%d',[zz.name,_fSiZe64])+ret;// !!!!! no octos to speed // add file + mark
               end;
            end;
       // Application.processmessages;
        i:= FindNext(zz);
        end;
        FindClose(zz);

result:=result+'<Z>';  // 'Z' to be sorted last '<' is a must to accept there even for 0 files or 0 folders !!

//_log(format('%d folders - %d files',[d,f]),0);
//_log(result,0);

end;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD._ssGo_FileUpload_MAIN;
var
c:char;
s,rooty:string;
RN:Byte;
t:TTreeNode;
ofs,BuffSizo,sentL,pozo:Int64;
pBuf: PByteArray;
_Is_it_OK : boolean;
begin


_SS_THREAD_ACTIVE_TASK:='_DlvExplorer'; // a must to catch kk maker

if _VV_LOCAL_CONFIG_ACTIVE_UPLOADS>=(_VV_LOCAL_CONFIG_MAX_UPLOADS) then c:='0' else c:='1';
ClientSocket.SendText(#0+'G'+c+'g'); // direct no barzat  '

// was above in beta02-A  ( the bug )
inc(_VV_LOCAL_CONFIG_ACTIVE_UPLOADS);  // >> ++
//inc(_ACTIVE_TOTAL_UPLOADS_COUNT);
//Synchronize(_total_Uploads_Show);


  if c='1' then
  begin
  _Is_it_OK:=True;

  if _Wsk.WaitForData(5000) then   // user loging...
  begin
  s:=TCrypto._SimSim(ClientSocket.ReceiveText);

                         // '_DW_A_00_0000000000_1111111111111111_%s',[_tp,_pn,_VV_LOCAL_USER_PC_ID,_data_file.Size,_full_file]);

                         _SS_REMOTE_USER_PC_ID:=copy(s,10,10);
                         t:=_is_UserID_in_The_NETWORKS_Tree(_SS_REMOTE_USER_PC_ID);    // read id ( fixed com stopping )


                         _SS_THREAD_ACTIVE_TASK:=_SS_THREAD_ACTIVE_TASK+'_01'; // BugDetection
                         if (t<>nil)then
                         begin  //--------adding----------------
                             if t.ImageIndex=3 then  // direct kik
                             begin
                             _vSS__FILE_UPLOAD_DEC_SIZA:=-777; //(-777) >> send no fw-access  >> go to end
                             _Wsk.Write(_vSS__FILE_UPLOAD_DEC_SIZA, SizeOf(_vSS__FILE_UPLOAD_DEC_SIZA)); // it sends NO-ACCESS !!! , waitng there   >> then go to end
                             end
                             else
                             begin
                             _SS_REMOTE_USER_NICKNAME:=t.Text; // set nik

                             RN:=StrToIntDef('$'+copy(s,7,2),0); // pn
                             if RN>0 then dec(RN);

                             _SS_THREAD_ACTIVE_TASK:=_SS_THREAD_ACTIVE_TASK+'_02'; // BugDetection

                               case s[5] of
                                   '0' : rooty:=EXPLORER_PUBLIC_ROOTS[RN]; //pub
                                   '1' : rooty:=EXPLORER_PRIVATE_ROOTS[RN]; //priv
                                   '2' : begin                         //xtra    2 fix
                                            if pos(_SS_REMOTE_USER_PC_ID,_VV_LOCAL_USER_FAVORITES_LIST)=0 then _Is_it_OK:=false
                                            else begin
                                                 rooty:=_GimeFavUserXtraFolder(_SS_REMOTE_USER_PC_ID);
                                                 if (rooty<>'') and (is_fav_allowed_2_do(_SS_REMOTE_USER_PC_ID,3))
                                                 then  _Is_it_OK:=true;
                                                 end;
                                         end;
                               end;


                             _SS_THREAD_ACTIVE_TASK:=_SS_THREAD_ACTIVE_TASK+'_03'; // BugDetection

                             if not _Is_it_OK then begin     // we exit !!!
                                                   if _VV_LOCAL_CONFIG_MAX_UPLOADS>0 then dec(_VV_LOCAL_CONFIG_ACTIVE_UPLOADS);  // >> --
                                                   //dec(_ACTIVE_TOTAL_UPLOADS_COUNT);
                                                   //Synchronize(_total_Uploads_Show);
                                                   if rooty='' then _SS_STATUS_CODE:=15 // folder not set
                                                               else _SS_STATUS_CODE:=16; // not allowed
                                                   exit;
                                                   end;

                         // '_DW_A_00_0000000000_1111111111111111_%s',[_tp,_pn,_VV_LOCAL_USER_PC_ID,_data_file.Size,_full_file]);
                         //  _DW_0_03_1E45355311_0000000000000000_\[Movie DVD] - Assault on Precinct 13 (2005) R [Action].rar

                             _Active_file :=copy(s,38,length(s)-37);  // file
                                     ofs  :=StrToIntDef('$'+copy(s,21,16),0); //ofs



                             _Active_file:=rooty+_Active_file;// full file_name_now
                             _Active_file:=stringreplace(_Active_file,'\\','\',[rfReplaceAll]); // a must clean here
                             //_log('>>>>'+_Active_file,0);

                             _SS_THREAD_ACTIVE_TASK:=_SS_THREAD_ACTIVE_TASK+'_04'; // BugDetection

                                     if  FileExists(_Active_file) then  // // file exists here
                                     begin
                                     _SS_FX_DATA_FILE:=TFileStream.Create(_Active_file,fmOpenRead or fmShareDenyWrite);
                                     Try //--------3

                                        _SS_FX_DATA_FILE.Position := ofs;      // resume
                                        _vSS__FILE_UPLOAD_DEC_SIZA:= _SS_FX_DATA_FILE.Size-ofs;
                                       
                                        //* error -1
                                        sDebug:='ofs:'+IntToStr(ofs)+ret+
                                                '_SS_FX_DATA_FILE.Size:'+IntToStr(_SS_FX_DATA_FILE.Size)+ret+
                                                IntToStr(_vSS__FILE_UPLOAD_DEC_SIZA);

                                        Synchronize(_ssGo_FileUpload_INITIALIZATION); // creation of timer KBS in it
                                        _UpLoad_Item.itm_int1:=_vSS__FILE_UPLOAD_DEC_SIZA; // a must for upload %


                                        _Wsk.Write(_vSS__FILE_UPLOAD_DEC_SIZA, SizeOf(_vSS__FILE_UPLOAD_DEC_SIZA)); // it sends size - offset !!! , waitng there

                                        if (_vSS__FILE_UPLOAD_DEC_SIZA < MAX_BUFFER_EXPLOLRER_DOWNLOADING) then BuffSizo := _vSS__FILE_UPLOAD_DEC_SIZA
                                        else BuffSizo := MAX_BUFFER_EXPLOLRER_DOWNLOADING;

                                        GetMem(pBuf, BuffSizo);
                                        Try //--------4

                                                while (_vSS__FILE_UPLOAD_DEC_SIZA>0) and (ClientSocket.Connected) do
                                                begin

                                                if (_vSS__FILE_UPLOAD_DEC_SIZA>BuffSizo) then sentL := BuffSizo else sentL := _vSS__FILE_UPLOAD_DEC_SIZA;
                                                _SS_FX_DATA_FILE.Read(pBuf^, sentL);
                                                pozo := 0;



                                                   while (pozo < sentL) do
                                                   begin
                                                   try
                                                   Inc(pozo, _Wsk.Write(pBuf^[pozo],sentL));
                                                   Except pozo:=0; end;  // kk detected !! >> confirm 0

                                                   // if writing 0 then exit soon !
                                                   if (pozo=0) then begin _SS_IS_PANIK_ERROR:=true; break; end;

                                                   //Write error 64, Le nom réseau spécifié n'est plus disponible
                                                   end;

                                                Dec(_vSS__FILE_UPLOAD_DEC_SIZA, sentL);
                                                Synchronize(_ssGo_FileUpload_SHAWA_BB);


                                                if (_SS_IS_CANCELED) or (_SS_IS_PANIK_ERROR) or (_THE_EXOSEE_APPLICATION_IS_TERMINATED) then break;

                                                end;

                                         finally FreeMem(pBuf); end; //--------4    freemem(...,BufSize) bugs!!! was in >=17-pr3

                                     finally _SS_FX_DATA_FILE.Free; end; //--------3
                                     end;// end of file ok


                             if (_UpLoad_Item<>nil)and(_SS_IS_PANIK_ERROR) then _UpLoad_Item._Pozo:=44; // aborted
                             //Synchronize(_upload_item_terminated);

                             end;  // ok


                         end; // node  no nil
   end;   // 5000 ok

  end;  // c=1 ok


if _VV_LOCAL_CONFIG_ACTIVE_UPLOADS>0 then dec(_VV_LOCAL_CONFIG_ACTIVE_UPLOADS);  // >> --

dec(_VV_LOCAL_CONFIG_MAX_UPLOADS);
//Synchronize(_total_Uploads_Show);

end;

//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD._ssGo_FileUpload_INITIALIZATION;
//var
//e:string;
begin

// add direct , the Uplod timer direct kiks when error
_UpLoad_Item:=_FXOC_MAIN.AA_0516_vTraffic.Items.Add;
_UpLoad_Item.Caption:=ExtractFileName(_Active_file);
_UpLoad_Item.ImageIndex  :=14;


_UpLoad_Item.SubItems.Add(_octos(_SS_FX_DATA_FILE.Size)); //size
_UpLoad_Item.SubItems.Add('0');   // sent
_UpLoad_Item.SubItems.Add('0,00');   // speed
_UpLoad_Item.SubItems.Add('0');   //%
_UpLoad_Item.SubItems.Add(_SS_REMOTE_USER_NICKNAME);
_UpLoad_Item.SubItems.Add(___ccc__0071__Uploading);



_UpLoad_Item._Pozo       :=41;
_UpLoad_Item.set_cancel  :=false;   // to cancel
_UpLoad_Item.itm_int2    :=0; //percent

_UpLoad_Item.uzr_id      :=_SS_REMOTE_USER_PC_ID; // stok id
_UpLoad_Item.ITM_F_SIZE  :=_SS_FX_DATA_FILE.Size;


end;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD._ssGo_FileUpload_SHAWA_BB;
begin

_UpLoad_Item.itm3     :=_vSS__FILE_UPLOAD_DEC_SIZA;
_UpLoad_Item.ITM_SENT :=(_SS_FX_DATA_FILE.Size-_vSS__FILE_UPLOAD_DEC_SIZA);

// direct here to show speed and exo works
_UpLoad_Item.SubItems[1]:=_octos(_UpLoad_Item.ITM_SENT);   //sent

                   if (_vSS__FILE_UPLOAD_DEC_SIZA=0) then
                   begin  // UL completed
                   _UpLoad_Item.SubItems[5] :=___ccc__0015__Completed;
                   _UpLoad_Item.itm_int2    :=_percenty(_UpLoad_Item.ITM_SENT,_UpLoad_Item.ITM_F_SIZE); // %   ok
                   _UpLoad_Item.SubItems[3] :=IntToStr(_UpLoad_Item.itm_int2)+'%'; // to update progress
                   _UpLoad_Item._Pozo:=42;  //done
                   end;


                             if (_UpLoad_Item.set_cancel) then     //   or (APP_CLOSING)
                             begin
                             _UpLoad_Item.set_cancel :=false;
                             _UpLoad_Item._Pozo      :=45;    // ?? was 43 !!!
                             _SS_IS_CANCELED         :=true;
                             end;


Application.ProcessMessages;

end;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//---------------------------------------------------------ssGo_FileRcv_MAIN----
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD.ssGo_FileRcv_MAIN;
var
s:string;
SIZIN,BufSize,rcv: Int64;
PBuf: PByteArray;
begin
(*  *)
_SS_THREAD_ACTIVE_TASK:='_FileRcv'; // a must to catch kk maker
ClientSocket.SendText(#0+'I'+#0+'i'); // direct no barzat  '



  if _Wsk.WaitForData(5000) then   // user loging...
  begin
  s:=TCrypto._SimSim(ClientSocket.ReceiveText);     // recieve
  try
         //local_id+a_niko+';[f:'+ExtractFileName(_F_ZEND.file_full)+':f][z:'+inttostr(fx.Size)+':z]';
         _SS_REMOTE_USER_PC_ID       :=copy(s,1,10); //
         _SS_REMOTE_USER_NICKNAME    :=copy(s,11,pos(';',s)-11);

         _vSS__FILE_RCV_FILENAME     :=copy(s,pos('[f:',s)+3,(pos(':f]',s)-pos('[f:',s))-3);
         _vSS__FILE_RCV_FILESIZE     :=StrToInt64Def(copy(s,pos('[z:',s)+3,(pos(':z]',s)-pos('[z:',s))-3),-1);
         _vSS__FILE_RCV_LOCAL_SAVA_FILENAME:=_VV_LOCAL_CONFIG_THE_DOWNLOADS_FOLDER+'_$_'+_vSS__FILE_RCV_FILENAME;

         Synchronize(ssGo_FileRcv_RcvACCEPT); // go load form  accept


         _vSS__FILE_RCV_READEN:=0;
         repeat
         Application.ProcessMessages;   // no need , thread separated !!!
         until not FRcvForm.tm_accept.Enabled;


         if FRcvForm.Permission_OK then
         begin

          if FileExists(_vSS__FILE_RCV_LOCAL_SAVA_FILENAME) then
          _SS_FX_DATA_FILE :=TFileStream.Create(_vSS__FILE_RCV_LOCAL_SAVA_FILENAME,fmOpenWrite or fmShareDenyWrite)else    //
          _SS_FX_DATA_FILE :=TFileStream.Create(_vSS__FILE_RCV_LOCAL_SAVA_FILENAME,fmCreate or fmShareDenyWrite);    //

          _SS_FX_DATA_FILE.Position :=_SS_FX_DATA_FILE.Size;
          _vSS__FILE_RCV_READEN     :=_SS_FX_DATA_FILE.Size;
         
          Synchronize(ssGo_FileRcv_OkACCEPTED); // go close timer form and init others
          try

              // send permision ok + ofs
              //'PRM:OK:00000000'
              s:='PRM:OK:'+inttohex(_SS_FX_DATA_FILE.Size,16); // int64 (16)!!!

              s:=TCrypto._BarzaToon(s); //:)
              _Wsk.Write(s[1], Length(s));

              if _Wsk.WaitForData(10000) then  // wait
              begin
              _Wsk.Read(SIZIN, SizeOf(SIZIN));   // read size offseted !!! ( the incoming size )
              FRcvForm.TMkbs.Enabled:=true;

              if SIZIN < MAX_BUFFER_FILE_SEND then BufSize := SIZIN else BufSize := MAX_BUFFER_FILE_SEND;
              GetMem(PBuf, BufSize);
              try //------------4

                       while ( SIZIN >0 ) do
                       begin

                       if (SIZIN > BufSize) then rcv := BufSize else rcv := SIZIN;

                        if _Wsk.WaitForData(20000)then
                        begin
                        rcv := _Wsk.Read(PBuf^, rcv);
                        _SS_FX_DATA_FILE.Write(PBuf^, rcv);
                        Dec(SIZIN, rcv);
                        inc(_vSS__FILE_RCV_READEN,rcv); // bytes read
                        _SS_IS_PANIK_ERROR:=(rcv=0);
                        end;


                       Synchronize(ssGo_FileRcv_SHAWA);

                       if (_SS_IS_CANCELED) or (_SS_IS_PANIK_ERROR) or (_THE_EXOSEE_APPLICATION_IS_TERMINATED) then break;

                       end;

              _vSS__FILE_RCV_DONE_OK:=(SIZIN=0);
              FRcvForm.TMkbs.Enabled:=false;

              finally
              FreeMem(PBuf); // no size !!!!
              end; //------------4

              end;

            finally
            _SS_FX_DATA_FILE.Free;
            end;


     end;// permission ok
    

    // force own terminated here
    finally
    Synchronize(ssGo_FileRcv_TERMINATED);
    end;

  end; //sk.WaitForData(5000)

 
end;

//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD.ssGo_FileRcv_RcvACCEPT; // go_init_form_creation__rcv
begin
(*  *)
FRcvForm             :=T_FRcvFile.Create(Application);
FRcvForm.Show;

FRcvForm._otodw_timeA:=DateTimeToStr(now);
FRcvForm.ee1.Caption :=_vSS__FILE_RCV_FILENAME;
FRcvForm.ee2.Caption :=_SS_REMOTE_USER_NICKNAME;
FRcvForm.ee3.Caption :=_octos(_vSS__FILE_RCV_FILESIZE);
FRcvForm.AA_0584_eCapFromUser.Caption :=FRcvForm.AA_0584_eCapFromUser.Caption+_SS_REMOTE_USER_NICKNAME;

if (pos(_SS_REMOTE_USER_PC_ID,_VV_LOCAL_USER_FAVORITES_LIST)>0) and (is_fav_allowed_2_do(_SS_REMOTE_USER_PC_ID,2)) then
                             begin
                             FRcvForm._Panel_CONFIRM.Visible  :=false; // hide_panel
                             FRcvForm.Permission_OK          :=true;
                             _vSS__FILE_RCV_IS_OTO_ACCEPT    :=true;
                             FRcvForm.tm_accept.Enabled      :=false;
                             end
                             else
                             FRcvForm.tm_accept.Enabled      := true;



end;

//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD.ssGo_FileRcv_OkACCEPTED;  //go_to_main_panel_filling_data_its_starting...
begin

FRcvForm.gress.Max     :=_vSS__FILE_RCV_FILESIZE;
FRcvForm.BytesRCV      :=_SS_FX_DATA_FILE.Position;
FRcvForm.gress.Position:=_vSS__FILE_RCV_READEN;

FRcvForm.csiz.Caption  :=_octos(_vSS__FILE_RCV_FILESIZE);
FRcvForm.cread.Caption :=_octos(_SS_FX_DATA_FILE.Position);
FRcvForm.ckbs.Caption  :='0,00 Kbs';

FRcvForm.zzRemoteFileName.Caption  :=_vSS__FILE_RCV_FILENAME;
FRcvForm.cpStat.Caption            :=___ccc__0092__Downloading;

//FRcvForm.tm_kbs.enabled:=true;

end;

//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD.ssGo_FileRcv_SHAWA;
begin

FRcvForm.BytesRCV       :=_vSS__FILE_RCV_READEN;

FRcvForm.cread.Caption  :=_octos(_vSS__FILE_RCV_READEN);
FRcvForm.gress.Position :=_vSS__FILE_RCV_READEN;
FRcvForm.pers.Caption :=inttostr(_percenty(FRcvForm.gress.Position,FRcvForm.gress.Max))+'%';
FRcvForm.Caption      :=FRcvForm.pers.Caption;

Application.ProcessMessages;
if FRcvForm._set_cancel then _SS_IS_CANCELED:=true;

end;

//------------------------------------------------------------------------------
procedure TEXOSEE_KERNEL_THREAD.ssGo_FileRcv_TERMINATED;
var
_Stp,_sL:string;
begin


FRcvForm.Tag:=5;   // enable closing
FRcvForm.AA_0569_canz.Tag:=1;



   // if not allow_rcv then exit; // imprtant !!!!
    //safe , no need syncronize !
   // FRcivForm.tm_kbs.enabled:=false;

   // if _FileRcv_done_ok then FRcvForm.dl_stat:='COMPLETED' else FRcvForm.dl_stat:='Disconnection/File_not_ompleted';

    if (_SS_IS_CANCELED) or (_SS_IS_PANIK_ERROR) then
    begin
    if (_SS_IS_CANCELED) then FRcvForm.cpStat.Caption :=___ccc__0019__Canceled
                    else begin // then its cc_kk
                         FRcvForm.cpStat.Caption    :=___ccc__0011__Error;
                         FRcvForm.AA_0569_canz.Caption      :=___ccc__0072__Close; // close caption
                         end;
    end
    else
    begin
      if (FRcvForm.gress.Max=FRcvForm.gress.Position) then
      begin
      FRcvForm.cpStat.Caption:=___ccc__0015__Completed;
     // FRcvForm.d2.Font.Style:=[fsBold];


        while FileExists(_VV_LOCAL_CONFIG_THE_DOWNLOADS_FOLDER+'Completed\'+_vSS__FILE_RCV_FILENAME) do
        begin
        _vSS__FILE_RCV_FILENAME:='_'+_vSS__FILE_RCV_FILENAME;
        end;

        _Stp:=_VV_LOCAL_CONFIG_THE_DOWNLOADS_FOLDER+'Completed\'+_vSS__FILE_RCV_FILENAME;
        MoveFile(pchar(_vSS__FILE_RCV_LOCAL_SAVA_FILENAME),pchar(_Stp));

       
        FRcvForm.AA_0581_ww1.Hint:=_Stp;


      //FRcvForm.d1.Caption       :=remote_fil;
      FRcvForm.AA_0581_ww1.Visible      :=true;
      FRcvForm.AA_0582_ww2.Visible      :=true;
      FRcvForm.AA_0569_canz.Caption     :=___ccc__0072__Close; // close caption
      end
      else
      FRcvForm.cpStat.Caption:='.';
    end;


    FRcvForm.Caption:=FRcvForm.cpStat.Caption;
    FRcvForm.tmrest.Caption:='00:00:00';



    if (not FRcvForm.Permission_OK) or (_SS_IS_CANCELED) then
    begin
    FRcvForm.Close;
    if (_SS_IS_CANCELED) then DeleteFile(_vSS__FILE_RCV_LOCAL_SAVA_FILENAME);
    exit;
    end;


     // add to completed box
     if (not _SS_IS_PANIK_ERROR) then
     begin
     _sL :=format(___ccc__0105__FileAutoAccepted,[FRcvForm.ee1.Caption,FRcvForm.ee2.Caption]);

    _add_2completed(FRcvForm.ee1.Caption,_Stp,FRcvForm.ee2.Caption,_octos(_vSS__FILE_RCV_FILESIZE));

    end;

    if (_vSS__FILE_RCV_IS_OTO_ACCEPT) then _FXOC_MAIN.TheLOGGER.Log(_sL,1);



    // if (_vSS__FILE_RCV_IS_AUTO_ACCEPT)and(_V_MY_20_BOOLEANS[2]<>'A') then  FRcvForm.close; // oto was on !!!

end;


end.





../delphi71code/exosee-code-source/uc_exoseekernel-pas..