//  Boost.Filesystem mbcopy.cpp  ---------------------------------------------//

//  Copyright Beman Dawes 2005

//  Use, modification, and distribution is subject to the Boost Software
//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)

//  Copy the files in a directory, using mbpath to represent the new file names
//  See http://../doc/path.htm#mbpath for more information

//  See deprecated_test for tests of deprecated features
#define BOOST_FILESYSTEM_NO_DEPRECATED

#include <boost/filesystem/config.hpp>
# ifdef BOOST_FILESYSTEM_NARROW_ONLY
#   error This compiler or standard library does not support wide-character strings or paths
# endif

#include "mbpath.hpp"
#include <iostream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
#include "../src/utf8_codecvt_facet.hpp"

namespace fs = boost::filesystem;

namespace
{
  // we can't use boost::filesystem::copy_file() because the argument types
  // differ, so provide a not-very-smart replacement.

  void copy_file( const fs::wpath & from, const user::mbpath & to )
  {
    fs::ifstream from_file( from, std::ios_base::in | std::ios_base::binary );
    if ( !from_file ) { std::cout << "input open failed\n"; return; }

    fs::ofstream to_file( to, std::ios_base::out | std::ios_base::binary );
    if ( !to_file ) { std::cout << "output open failed\n"; return; }

    char c;
    while ( from_file.get(c) )
    {
      to_file.put(c);
      if ( to_file.fail() ) { std::cout << "write error\n"; return; }
    }

    if ( !from_file.eof() ) { std::cout << "read error\n"; }
  }
}

int main( int argc, char * argv[] )
{
  if ( argc != 2 )
  {
    std::cout << "Copy files in the current directory to a target directory\n"
              << "Usage: mbcopy <target-dir>\n";
    return 1;
  }

  // For encoding, use Boost UTF-8 codecvt
  std::locale global_loc = std::locale();
  std::locale loc( global_loc, new fs::detail::utf8_codecvt_facet );
  user::mbpath_traits::imbue( loc );

  std::string target_string( argv[1] );
  user::mbpath target_dir( user::mbpath_traits::to_internal( target_string ) );

  if ( !fs::is_directory( target_dir ) )
  {
    std::cout << "Error: " << argv[1] << " is not a directory\n";
    return 1;
  }

  for ( fs::wdirectory_iterator it( L"." );
    it != fs::wdirectory_iterator(); ++it )
  {
    if ( fs::is_regular_file(it->status()) )
    {
      copy_file( *it, target_dir / it->path().filename() );
    }
  }

  return 0;
}





