+namespace {
+ struct FileHeaderV1 {
+ enum {
+ k_FileVersion = 1,
+ };
+ const uint32_t version = k_FileVersion;
+ uint32_t favoritsCount = 0;
+ };
+
+ typedef FileHeaderV1 FileHeader;
+}
+
+
+bool GVOShipRouteList::saveToFile( const std::wstring & filePath )
+{
+ std::unique_ptr<FILE, decltype(&::fclose)> file(::_wfopen(filePath.c_str(), L"wb"), &::fclose);
+ if ( !file ) {
+ return false;
+ }
+
+ FileHeader fileHeader;
+
+ ::fseek( file.get(), sizeof(FileHeader), SEEK_SET );
+
+ for ( const auto & shipRoute : m_shipRouteList ) {
+ if ( shipRoute->isFavorite() ) {
+ ++fileHeader.favoritsCount;
+
+ std::time_t dateTime = std::time_t();
+ dateTime = shipRoute->earliestDateTime();
+ ::fwrite( &dateTime, sizeof(dateTime), 1, file.get() );
+ dateTime = shipRoute->latestDateTime();
+ ::fwrite( &dateTime, sizeof(dateTime), 1, file.get() );
+
+ const size_t lineCount = shipRoute->getLines().size();
+ ::fwrite( &lineCount, sizeof(lineCount), 1, file.get() );
+
+ for ( const auto & line : shipRoute->getLines() ) {
+ const size_t count = line.size();
+ ::fwrite( &count, sizeof(count), 1, file.get() );
+ if ( !line.empty() ) {
+ ::fwrite( &line[0], sizeof(line[0]), line.size(), file.get() );
+ }
+ }
+ }
+ }
+
+ ::fseek( file.get(), 0, SEEK_SET );
+ ::fwrite( &fileHeader, sizeof(fileHeader), 1, file.get() );
+ return true;
+}
+
+
+bool GVOShipRouteList::loadFromFile( const std::wstring & filePath )
+{
+ std::unique_ptr<FILE, decltype(&::fclose)> file( ::_wfopen( filePath.c_str(), L"rb" ), &::fclose );
+ if ( !file ) {
+ return false;
+ }
+
+ FileHeader fileHeader;
+ ::fread( &fileHeader, sizeof( fileHeader ), 1, file.get() );
+
+ if ( fileHeader.version != FileHeader::k_FileVersion ) {
+ return false;
+ }
+
+ m_shipRouteList.clear();
+
+ for ( uint32_t i = 0; i < fileHeader.favoritsCount; ++i ) {
+ GVOShipRoutePtr shipRoute( new GVOShipRoute() );
+ shipRoute->setFavorite( true );
+
+ std::time_t dateTime = std::time_t();
+ ::fread( &dateTime, sizeof(dateTime), 1, file.get() );
+ shipRoute->setEarliestDateTime( dateTime );
+ ::fread( &dateTime, sizeof(dateTime), 1, file.get() );
+ shipRoute->setLatestDateTime( dateTime );
+
+ size_t lineCount = 0;
+ ::fread( &lineCount, sizeof(lineCount), 1, file.get() );
+
+ for ( size_t k = 0; k < lineCount; ++k ) {
+ size_t pointCount = 0;
+ ::fread( &pointCount, sizeof(pointCount), 1, file.get() );
+ if ( 0 < pointCount ) {
+ GVOShipRoute::Line tmp( pointCount );
+ ::fread( &tmp[0], sizeof(tmp[0]), tmp.size(), file.get() );
+ shipRoute->addLine( std::move( tmp ) );
+ }
+ }
+
+ m_shipRouteList.push_back( std::move( shipRoute ) );
+ }
+
+ return true;
+}