-#include "stdafx.h"
+#include "stdafx.h"
#include "GVOShipRouteList.h"
+namespace {
+ struct FileHeaderV1 {
+ enum {
+ k_FileVersion = 1,
+ };
+ const uint32_t version = k_FileVersion;
+ uint32_t favoritsCount = 0;
+ };
-GVOShipRouteList::~GVOShipRouteList()
+ 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 )
{
- for ( GVOShipRoute *route : m_shipRouteList ) {
- delete route;
+ 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;
}
void GVOShipRouteList::closeRoute()
{
- addRoute();
+ if ( !m_shipRouteList.empty() ) {
+ m_shipRouteList.back()->setFix( true );
+ }
}
void GVOShipRouteList::addRoutePoint( const GVONormalizedPoint point )
{
- if ( m_shipRouteList.empty() ) {
+ if ( m_shipRouteList.empty() || m_shipRouteList.back()->isFixed() ) {
addRoute();
}
m_shipRouteList.back()->addRoutePoint( point );
if ( m_observer ) {
- m_observer->onShipRouteListUpdateRoute( *m_shipRouteList.back() );
+ m_observer->onShipRouteListUpdateRoute( m_shipRouteList.back() );
}
}
-void GVOShipRouteList::removeShipRouteAtReverseIndex( int reverseIndex )
+void GVOShipRouteList::removeShipRoute( GVOShipRoutePtr shipRoute )
{
- _ASSERT( 0 <= reverseIndex );
- _ASSERT( reverseIndex < (int)m_shipRouteList.size() );
-
- std::unique_ptr<GVOShipRoute> route;
- RouteList::iterator it;
- it = m_shipRouteList.begin();
- std::advance( it, indexFromReverseIndex( reverseIndex ) );
- route.reset( std::move( *it ) );
+ _ASSERT( shipRoute != nullptr );
+ auto it = std::find( m_shipRouteList.begin(), m_shipRouteList.end(), shipRoute );
+ if ( it == m_shipRouteList.end() ) {
+ return;
+ }
+ GVOShipRoutePtr removeTarget = shipRoute;
m_shipRouteList.erase( it );
if ( m_observer ) {
- m_observer->onShipRouteListRemoveItem( *route );
- }
- if ( reverseIndex == 0 ) {
- // \8dÅ\90V\8dX\90V\92\86\8dq\98H\82ð\92P\8f\83\8dí\8f\9c\82·\82é\82Æ\92¼\91O\82Ì\8dq\98H\82ª\8dX\90V\82³\82ê\91±\82¯\82é\88×\81A\90V\8bK\8dq\98H\82ð\8dì\90¬\82·\82é\81B
- addRoute();
+ m_observer->onShipRouteListRemoveItem( removeTarget );
}
}
void GVOShipRouteList::addRoute()
{
// \92Ç\89Á\82Æ\92Ê\92m
- m_shipRouteList.push_back( new GVOShipRoute() );
+ m_shipRouteList.push_back( GVOShipRoutePtr( new GVOShipRoute() ) );
if ( m_observer ) {
- m_observer->onShipRouteListAddRoute( *m_shipRouteList.back() );
+ m_observer->onShipRouteListAddRoute( m_shipRouteList.back() );
}
// \88ì\82ê\82½\95ª\82ð\8dí\8f\9c
int removeCount = 0;
auto it = m_shipRouteList.begin();
while ( it != m_shipRouteList.end() && removeCount < overCount) {
- auto route = *it;
- if ( route->isFavorite() ) {
+ if ( (*it)->isFavorite() ) {
++it;
continue;
}
auto itNext = std::next( it, 1 );
- delete route;
m_shipRouteList.erase( it );
++removeCount;
it = itNext;
std::advance( itBase, indexFromReverseIndex( reverseIndex ) );
RouteList::iterator itPrev = std::prev( itBase );
_ASSERT( itPrev != m_shipRouteList.end() );
- GVOShipRoute *baseRoute = *itBase;
- std::unique_ptr<GVOShipRoute> prevRoute( std::move( *itPrev ) );
+ GVOShipRoutePtr baseRoute = *itBase;
+ GVOShipRoutePtr prevRoute = *itPrev;
m_shipRouteList.erase( itPrev );
+
+ // remove\82µ\82½\8e\9e\82É\92Ê\92m\83n\83\93\83h\83\89\82Å\91®\90«\82ª\95Ï\8dX\82³\82ê\82Ä\82µ\82Ü\82¤\82Ì\82Å\81A
+ // \82±\82Ì\8e\9e\93_\82Å\8b\92²\91®\90«\82ð\95Û\91¶\82µ\82Ä\82¨\82\81B
+ bool isHilight = prevRoute->isHilight() | baseRoute->isHilight();
if ( m_observer ) {
- m_observer->onShipRouteListRemoveItem( *prevRoute );
+ m_observer->onShipRouteListRemoveItem( prevRoute );
}
baseRoute->jointPreviousLinesWithRoute( *prevRoute );
+ baseRoute->setHilight( isHilight );
// \92Ê\92m
if ( m_observer ) {
- m_observer->onShipRouteListUpdateRoute( *baseRoute );
+ m_observer->onShipRouteListUpdateRoute( baseRoute );
}
}