//-----------------------------------------------------------------------------
void TAdministradora :: LoadDomainsNacionales(AnsiString pDomainNacional)
{
  TFile* TreeFile = new TFile(pDomainNacional);
  TreeFile->Open("rb+");
  TreeFile->SeekTo(0);

  if(TreeFile->IsOpen())
  {
    TSDomainInfo SDominio;
    TreeFile->Read(&SDominio,sizeof(TSServerInfo));

    while(!TreeFile->Eof())
    {
      TPreOrderNode* node = new  TPreOrderNode();
      TDomain* domain = new TDomain();
      node->End(SDominio.End);
      node->RightLink(SDominio.LinkedRight);
      domain->NameDomain(SDominio.Name);
      node->Info(domain);
      aDomainsPreOrderList->Insert(node);
      TreeFile->Read(&SDominio,sizeof(TSDomainInfo));
    }
  }
  TreeFile->Close();
  delete TreeFile;
}
//-----------------------------------------------------------------------------
//Internacionales Servers
void TAdministradora :: SaveServersInternacional(AnsiString pNameFile)
{
  TFile* internacional = new TFile(pNameFile);
  internacional->Open("wb");
  internacional->SeekTo(0);

  if(internacional->IsOpen())
  {
    TSServerInfo server;

    for(int i = 0; i < aInternacionales->Length(); i++)
    {
      TServidor* servidor = (TServidor*)aInternacionales->ItemInfo(i);
      server.Tope = servidor->Tope();
      server.MaxMail = servidor->Max();
      strcpy(server.Name,servidor->NameDomain().c_str());
      internacional->Write(&server,sizeof(TSServerInfo));
    }
  }
  internacional->Close();
  delete internacional;
}
//-----------------------------------------------------------------------------
//::::::::::::::::::::::::::::LOAD/SAVE SERVERS::::::::::::::::::::::::::::::::::::
//-----------------------------------------------------------------------------
//Nacionales Servers
void TAdministradora :: SaveServersNacionales(AnsiString pServerName)
{
  TFile* serverFile = new TFile(pServerName);
  serverFile->Open("wb");
  serverFile->SeekTo(0);

  if(serverFile->IsOpen())
  {   FiltrarServerNacional();
      TSServerInfo server;

    for(int i = 0; i < aNacionalesServers->Length(); i++)
    {
      TServidor* servidor = (TServidor*)aNacionalesServers->ItemInfo(i);
      server.Tope = servidor->Tope();
      server.MaxMail = servidor->Max();
      strcpy(server.Name,servidor->NameDomain().c_str());
      serverFile->Write(&server,sizeof(TSServerInfo));
    }
  }
  serverFile->Close();
  delete serverFile;
}
//-----------------------------------------------------------------------------
void TAdministradora::LoadServersInternacional(AnsiString pNameFile)
{
  TFile* internacional = new TFile(pNameFile);
  internacional->Open("rb+");
  internacional->SeekTo(0);

  if(internacional->IsOpen())
  {
    TSServerInfo server;
    internacional->Read(&server,sizeof(TSServerInfo));

    while(!internacional->Eof())
    {
      TServidor* Servidor = new TServidor();
      Servidor->Tope(server.Tope);
      Servidor->Max(server.MaxMail);
      Servidor->NameDomain(server.Name);
      aInternacionales->Insert(Servidor);
      internacional->Read(&server,sizeof(TSServerInfo));
    }
  }
  internacional->Close();
  delete internacional;
}
//-----------------------------------------------------------------------------
void TAdministradora :: LoadServersNacionales(AnsiString pServerName)
{
  TFile* serverFile = new TFile(pServerName);
  serverFile->Open("rb+");
  serverFile->SeekTo(0);

  if(serverFile->IsOpen())
  {
    TSServerInfo server;
    serverFile->Read(&server,sizeof(TSServerInfo));

    while(!serverFile->Eof())
    {
      TServidor* Servidor = new TServidor();
      Servidor->Tope(server.Tope);
      Servidor->Max(server.MaxMail);
      Servidor->NameDomain(server.Name);
      aNacionalesServers->Insert(Servidor);
      serverFile->Read(&server,sizeof(TSServerInfo));
    }
  }
  serverFile->Close();
  delete serverFile;
}
//-----------------------------------------------------------------------------
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//::::::::::::::::::: METODOS DE GUARDAR/CARGAR EN FICHEROS:::::::::::::::::::
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//-----------------------------------------------------------------------------
//Nacionales Domains
void TAdministradora :: SaveDominioTree(AnsiString pNameDomain)
{
  TFile* TreeFile = new TFile(pNameDomain);
  TreeFile->Open("wb");
  TreeFile->SeekTo(0);

  TSeqPreOrderTree* preorder = new TSeqPreOrderTree(aTree);

  if(TreeFile->IsOpen())
  {
    TSDomainInfo SDominio;
    for(int i = 0; i < preorder->Length(); i++)
    {
      TPreOrderNode* node = (TPreOrderNode*)preorder->ItemInfo(i);
      SDominio.End = node->End();
      SDominio.LinkedRight = node->RightLink();
      TDomain* domain = (TDomain*)node->Info();
      strcpy(SDominio.Name,domain->NameDomain().c_str());
      TreeFile->Write(&SDominio,sizeof(TSDomainInfo));
    }
  }
  TreeFile->Close();
  delete TreeFile;
}
//-----------------------------------------------------------------------------
void TAdministradora :: LoadAccounts(AnsiString pFileName)//ver lo del buffer cuando voy a escribir un parrafo
{                                                          //eso hay que arreglarlo
  TFile* AccountFile = new TFile(pFileName);
  AccountFile->Open("rb+");
  AccountFile->SeekTo(0);

  if(AccountFile->IsOpen())
  {
    TGLinkedList* Servers = new TGLinkedList();
    AllServers(Servers);
    if(Servers)
    {
      while(AccountFile->FilePos() < AccountFile->FileSize())
      {
        TSAccount account;
        AccountFile->Read(&account,sizeof(TSAccount)); //primera lectura
        AnsiString ServidorNombre = account.server;
        TServidor* Server = (TServidor*)Servers->FirstThat(Daemon::FindNameList,&ServidorNombre);
        if(Server)
        {
          TCuenta* cuenta = new TCuenta();
          cuenta->Usuario(account.usuario);
          cuenta->Password(account.password);
          cuenta->Address(account.address);

          TSPerson person;
          cuenta->Person()->Name(account.persona.name);
          cuenta->Person()->Apellidos(account.persona.apellidos);
          cuenta->Person()->Sexo(account.persona.sexo);
          cuenta->Person()->Ocupacion(account.persona.ocupation);
          cuenta->Person()->Age(account.persona.age);
          cuenta->Cuota(account.cuota);
          cuenta->Cuotafree(account.cuotafree);
          cuenta->Salida(account.internacional);
          Server->Cuentas()->Insert(cuenta);

          int i = 0;
          while(i < account.emails)
          {
            TSMail mail;

            AccountFile->Read(&mail,sizeof(TSMail)); //segunda lectura

            TMail* Mail = new TMail();
            Mail->Parrafo(mail.parrafo);
            Mail->Asunto(mail.asunto);
            Mail->Remitente(mail.remitente);
            Mail->Size(mail.size);
            cuenta->Correos()->Insert(Mail);
            i++;

            int j = 0;
            while(j < mail.adjunts)
            {
              TSAdjunt adjunt;
              AccountFile->Read(&adjunt,sizeof(TSAdjunt)); //tercera lectura
              TFichero* fichero = new TFichero();
              fichero->Adress(adjunt.adress);
              fichero->Tipo(adjunt.tipo);
              fichero->Size(adjunt.length);
              Mail->InsertAdjunt(fichero);
              j++;
            }
          }
          int c = 0;
          while(c < account.agendas)
          {
            char direccion[36];
            AccountFile->Read(&direccion,36);
            AnsiString nombre = direccion;
            cuenta->Agendas()->Insert(&nombre);
          }
        }
      }
    }
  }
  AccountFile->Close();
  delete AccountFile;
}
//-----------------------------------------------------------------------------
//::::::::::::::FIN METODOS DE GUARDAR/CARGAR EN FICHEROS::::::::::::::::::::::::
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//::::::::::::::::::::TRABAJO CON LOS FICHEROS CUENTAS::::::::::::::::::::::::::
//::::::::::::::::::::::::::::::::CARGA/GUARDA::::::::::::::::::::::::::::::::::
//-----------------------------------------------------------------------------
void TAdministradora :: SaveAccounts(AnsiString pFileName) //ver lo del buffer cuando voy a escribir un parrafo
{                                                          //eso hay que arreglarlo
  TFile* AccountFile = new TFile(pFileName);
  AccountFile->Open("wb");
  AccountFile->SeekTo(0);

  if(AccountFile->IsOpen())
  {
    TGLinkedList* servidores = new TGLinkedList();
    AllServers(servidores);
    for(int i = 0; i < servidores->Length(); i++)
    {
      TServidor* Server = (TServidor*)servidores->ItemInfo(i);
      if(Server)
      {
        for(int j = 0; j < Server->Cuentas()->Length(); j++)
        {
          TCuenta* account = (TCuenta*)Server->Cuentas()->ItemInfo(j);
          if(account)
          {
            TSPerson person;
            strcpy(person.name,account->Person()->Name().c_str());
            strcpy(person.apellidos,account->Person()->Apellidos().c_str());
            person.sexo = account->Person()->Sexo();
            person.ocupation = account->Person()->Ocupacion();
            person.age = account->Person()->Age();

            TSAccount cuenta;
            strcpy(cuenta.server,Server->NameDomain().c_str());
            strcpy(cuenta.usuario,account->Usuario().c_str());
            strcpy(cuenta.password,account->Password().c_str());
            strcpy(cuenta.address,account->Address().c_str());
            cuenta.persona = person;
            cuenta.cuota = account->Cuota();
            cuenta.cuotafree = account->Cuotafree();
            cuenta.internacional = account->Salida();
            cuenta.emails = account->Correos()->Length();
            cuenta.agendas = account->Agendas()->Length();

            AccountFile->Write(&cuenta,sizeof(TSAccount)); //primera escritura

            for(int k = 0; k < account->Correos()->Length(); k++)
            {
              TMail* mail = (TMail*)account->Correos()->ItemInfo(k);
              if(mail)
              {
                TSMail correo;
                strcpy(correo.parrafo,mail->Parrafo().c_str());
                strcpy(correo.asunto,mail->Asunto().c_str());
                strcpy(correo.remitente,mail->Remitente().c_str());
                correo.size = mail->Size();
                correo.adjunts = mail->Adjunts()->Length();

                AccountFile->Write(&correo,sizeof(TSMail)); //segunda escritura

                for(int l = 0; l < mail->Adjunts()->Length(); l++)
                {
                  TFichero* file = (TFichero*)mail->Adjunts()->ItemInfo(l);
                  if(file)
                  {
                    TSAdjunt adjunto;
                    strcpy(adjunto.adress,file->Adress().c_str());
                    strcpy(adjunto.tipo,file->Tipo().c_str());
                    adjunto.length = file->Size();

                    AccountFile->Write(&adjunto,sizeof(TSAdjunt)); //tercera escritura
                  }
                }
              }
            }
            for(int c = 0; c < cuenta.agendas; c++)
            {
              AnsiString* name = (AnsiString*)account->Agendas()->ItemInfo(c);
              AnsiString aqui = *name;
              char direccion[36];
              strcpy(direccion,aqui.c_str());
              AccountFile->Write(&direccion,aqui.Length()-1);
            }
          }
        }
      }
    }
  }
  AccountFile->Close();
  delete AccountFile;
}