Exemple #1
0
 error_t FAT::int_ls(uint32_t sector, dirvector& ents) const
 {
   bool done = false;
   do {
     // read sector sync
     buffer_t data = device.read_sync(sector);
     if (UNLIKELY(!data))
         return { error_t::E_IO, "Unable to read directory" };
     // parse directory into @ents
     done = int_dirent(sector, data->data(), ents);
     // go to next sector until done
     sector++;
   } while (!done);
   return no_error;
 }
Exemple #2
0
 void FAT::int_ls(
     uint32_t sector, 
     dirvec_t dirents, 
     on_internal_ls_func callback)
 {
   // list contents of meme sector by sector
   typedef std::function<void(uint32_t)> next_func_t;
   
   auto next = std::make_shared<next_func_t> ();
   *next = 
   [this, sector, callback, dirents, next] (uint32_t sector)
   {
     debug("int_ls: sec=%u\n", sector);
     device.read(sector,
     [this, sector, callback, dirents, next] (buffer_t data)
     {
       if (!data)
       {
         // could not read sector
         callback(true, dirents);
         return;
       }
       
       // parse entries in sector
       bool done = int_dirent(sector, data.get(), dirents);
       if (done)
       {
         // execute callback
         callback(no_error, dirents);
       }
       else
       {
         // go to next sector
         (*next)(sector+1);
       }
       
     }); // read root dir
   };
   
   // start reading sectors asynchronously
   (*next)(sector);
 }
Exemple #3
0
  void FAT::int_ls(
     uint32_t   sector,
     Dirvec_ptr dirents,
     on_internal_ls_func callback) const
  {
    // list contents of meme sector by sector
    typedef delegate<void(uint32_t)> next_func_t;

    auto next = std::make_shared<next_func_t> ();
    auto weak_next = std::weak_ptr<next_func_t>(next);
    *next = next_func_t::make_packed(
    [this, callback, dirents, weak_next] (uint32_t sector)
    {
      FS_PRINT("int_ls: sec=%u\n", sector);
      auto next = weak_next.lock();
      device.read(
        sector,
        hw::Block_device::on_read_func::make_packed(
        [this, sector, callback, dirents, next] (buffer_t data)
        {
          if (data == nullptr) {
            // could not read sector
            callback({ error_t::E_IO, "Unable to read directory" }, dirents);
            return;
          }

          // parse entries in sector
          bool done = int_dirent(sector, data->data(), *dirents);
          if (done)
            // execute callback
            callback(no_error, dirents);
          else
            // go to next sector
            (*next)(sector+1);

        })
      ); // read root dir
    });

    // start reading sectors asynchronously
    (*next)(sector);
  }