static GVOGameProcess s_gvoGameProcess;
static GVORenderer s_renderer;
static GVOWorldMap s_worldMap;
+const std::wstring && k_routeListFilePath = g_makeFullPath(L"RouteList.dat");
static std::unique_ptr<GVOShipRouteList> s_shipRouteList;
static POINT s_latestSurveyCoord;
static GVOVector s_latestShipVector;
// \83\81\83C\83\93 \83\81\83b\83Z\81[\83W \83\8b\81[\83v:
const LRESULT retVal = s_mainLoop();
+ s_shipRouteList->saveToFile( k_routeListFilePath );
s_gvoGameProcess.teardown();
s_config.save();
s_renderer.setup( &s_config, g_hdcMain, &s_worldMap );
s_shipRouteList.reset( new GVOShipRouteList() );
+ s_shipRouteList->loadFromFile( k_routeListFilePath );
s_pollingInterval = s_config.m_pollingInterval;
s_gvoGameProcess.setup( s_config );
#pragma once
#include <deque>
+#include <ctime>
#include "GVONormalizedPoint.h"
//!@brief \8dq\98H
class GVOShipRoute {
public:
- typedef std::deque<GVONormalizedPoint> Line;
+ typedef std::vector<GVONormalizedPoint> Line;
typedef std::deque<Line> Lines;
private:
Lines m_lines;
bool m_hilight = false;
bool m_fixed = false; //!<@brief \8dq\98H\8cÅ\92è\83t\83\89\83O
+ std::time_t m_earliestDateTime = std::time_t();
+ std::time_t m_latestDateTime = std::time_t();
+
public:
GVOShipRoute() = default;
~GVOShipRoute() = default;
{
return m_length;
}
+
+ std::time_t earliestDateTime() const
+ {
+ return m_earliestDateTime;
+ }
+
+ // \82¿\82å\82Á\82Æ\89\98\82¢\82©\82È\81[
+ void setEarliestDateTime( const std::time_t dateTime )
+ {
+ m_earliestDateTime = dateTime;
+ }
+
+ // \82¿\82å\82Á\82Æ\89\98\82¢\82©\82È\81[
+ std::time_t latestDateTime() const
+ {
+ return m_latestDateTime;
+ }
+
+ // \82¿\82å\82Á\82Æ\89\98\82¢\82©\82È\81[
+ void setLatestDateTime( const std::time_t dateTime )
+ {
+ m_latestDateTime = dateTime;
+ }
+
+ // \82¿\82å\82Á\82Æ\89\98\82¢\82©\82È\81[
+ void addLine( Line & line )
+ {
+ m_lines.push_back( line );
+ }
+ void addLine( Line && line )
+ {
+ m_lines.push_back( line );
+ }
private:
};
#include "GVOShipRouteList.h"
+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;
+}
void GVOShipRouteList::closeRoute()
class GVOShipRouteList {
private:
typedef std::list<GVOShipRoutePtr> RouteList;
+
+private:
RouteList m_shipRouteList;
IGVOShipRouteListObserver * m_observer = nullptr;
size_t m_maxRouteCountWithoutFavorits = 30; //!<@brief \82¨\8bC\82É\93ü\82è\82ð\8f\9c\8aO\82µ\82½\8dq\98H\95Û\91¶\90\94
GVOShipRouteList() = default;
~GVOShipRouteList() = default;
+ //!@note \82 \82ñ\82Ü\82è\8ds\8bV\82ª\97Ç\82¢\8e\96\82¶\82á\82È\82¢\82¯\82ê\82Ç\81B
+ bool saveToFile( const std::wstring & filePath );
+
+ //!@note \82 \82ñ\82Ü\82è\8ds\8bV\82ª\97Ç\82¢\8e\96\82¶\82á\82È\82¢\82¯\82ê\82Ç\81B
+ bool loadFromFile( const std::wstring & filePath );
+
+
void setObserver( IGVOShipRouteListObserver * observer )
{
m_observer = observer;
return reverseIndex;
}
- //void removeShipRouteAtReverseIndex( int reverseIndex );
-
void removeShipRoute( GVOShipRoutePtr shipRoute );
void clearAllItems();