From 65fbeda18720c1150804a2e0c7df97c1e3b83c9a Mon Sep 17 00:00:00 2001 From: David Santos Date: Sun, 10 Mar 2019 00:39:30 -0300 Subject: [PATCH] Support 1.34, dlc_balt, dlc_or Add support for ETS2/ATS v1.34, and the Beyond the Baltic Sea (ETS2) and Oregon (ATS) DLCs. --- ETS2Sync-Helper-4.vcxproj | 10 +++---- res/app.rc | 10 +++---- src/DlcSelector.cpp | 14 ++++++++-- src/DlcSelector.hpp | 2 +- src/Ets2/Save.cpp | 50 ++++++++++++++++++++++++--------- src/Ets2/Save.hpp | 7 +++-- src/JobSyncer.cpp | 59 ++++++++++++++++++++++----------------- src/JobSyncer.hpp | 4 +-- src/MainWindow.cpp | 6 ++-- src/SyncDialog.cpp | 6 ++-- src/SyncDialog.hpp | 4 +-- src/version.hpp | 4 +-- 12 files changed, 109 insertions(+), 67 deletions(-) diff --git a/ETS2Sync-Helper-4.vcxproj b/ETS2Sync-Helper-4.vcxproj index 851d9d5..21ea491 100644 --- a/ETS2Sync-Helper-4.vcxproj +++ b/ETS2Sync-Helper-4.vcxproj @@ -22,7 +22,7 @@ {C58DE3D1-9460-4ACD-A334-8A8B9991DEF4} Win32Proj Ets2SyncHelper - 8.1 + 10.0.17763.0 @@ -94,7 +94,7 @@ Use Level4 Disabled - WIN32;WINVER=0x0601;__WXMSW__;_wxUSE_GUI=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + WIN32;WINVER=0x0601;__WXMSW__;_wxUSE_GUI=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) $(WXWIN)\include\msvc;$(WXWIN)\include;$(ZLIBDIR);$(ProjectDir)lib $(IntDir)/%(RelativeDir)/ @@ -109,7 +109,7 @@ Windows true - $(WXWIN)\lib\vc_lib;$(ZLIBDIR)\contrib\vstudio\vc11\x86\ZlibStat$(Configuration) + $(WXWIN)\lib\vc_lib;$(ZLIBDIR)\contrib\vstudio\vc14\x86\ZlibStat$(Configuration) zlibstat.lib;wininet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) @@ -136,7 +136,7 @@ MaxSpeed true true - WIN32;WINVER=0x0601;__WXMSW__;_wxUSE_GUI=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + WIN32;WINVER=0x0601;__WXMSW__;_wxUSE_GUI=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;ZLIB_WINAPI;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) $(WXWIN)\include\msvc;$(WXWIN)\include;$(ZLIBDIR);$(ProjectDir)lib $(IntDir)/%(RelativeDir)/ @@ -153,7 +153,7 @@ true true true - $(WXWIN)\lib\vc_lib;$(ZLIBDIR)\contrib\vstudio\vc11\x86\ZlibStat$(Configuration) + $(WXWIN)\lib\vc_lib;$(ZLIBDIR)\contrib\vstudio\vc14\x86\ZlibStatReleaseWithoutAsm zlibstat.lib;wininet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) diff --git a/res/app.rc b/res/app.rc index 1e13f76..2e84f5b 100644 --- a/res/app.rc +++ b/res/app.rc @@ -59,8 +59,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 5,4,0,0 - PRODUCTVERSION 5,4,0,0 + FILEVERSION 5,5,0,0 + PRODUCTVERSION 5,5,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x3L @@ -77,12 +77,12 @@ BEGIN BEGIN VALUE "CompanyName", "David Santos" VALUE "FileDescription", "ETS2Sync Helper" - VALUE "FileVersion", "5.4.0" + VALUE "FileVersion", "5.5.0" VALUE "InternalName", "ets2sync_helper" - VALUE "LegalCopyright", "© 2018 by David Santos" + VALUE "LegalCopyright", "© 2019 by David Santos" VALUE "OriginalFilename", "ets2sync_helper.exe" VALUE "ProductName", "ETS2Sync Helper" - VALUE "ProductVersion", "5.4.0" + VALUE "ProductVersion", "5.5.0" END END BLOCK "VarFileInfo" diff --git a/src/DlcSelector.cpp b/src/DlcSelector.cpp index ef3b32c..14a8c4f 100644 --- a/src/DlcSelector.cpp +++ b/src/DlcSelector.cpp @@ -41,11 +41,19 @@ DlcSelector::DlcSelector(wxWindow * parent, wxWindowID id) vec->push_back(cb); mDlcByCheckbox[cb] = L"heavy_cargo"; + cb = new wxCheckBox(this, wxID_ANY, "Beyond the Baltic Sea"); + vec->push_back(cb); + mDlcByCheckbox[cb] = L"balt"; + vec = &mCheckboxesByGame[Ets2::Game::ATS]; cb = new wxCheckBox(this, wxID_ANY, "New Mexico"); vec->push_back(cb); mDlcByCheckbox[cb] = L"nwmexico"; + cb = new wxCheckBox(this, wxID_ANY, "Oregon"); + vec->push_back(cb); + mDlcByCheckbox[cb] = L"oregon"; + cb = new wxCheckBox(this, wxID_ANY, "Heavy Cargo Pack"); vec->push_back(cb); mDlcByCheckbox[cb] = L"heavy"; @@ -53,7 +61,7 @@ DlcSelector::DlcSelector(wxWindow * parent, wxWindowID id) wxBoxSizer * parentSizer = new wxBoxSizer(wxHORIZONTAL); contentSizer->Add(parentSizer, wxSizerFlags().Expand()); for (size_t i = 0; i < std::max(mCheckboxesByGame[Ets2::Game::ETS2].size(), mCheckboxesByGame[Ets2::Game::ATS].size()); i++) { - if ((i % 3) == 0) { + if ((i % 4) == 0) { if (i > 0) { parentSizer->AddStretchSpacer(1); } @@ -101,14 +109,14 @@ void DlcSelector::setSave(const Ets2::Save * save) { Layout(); } -const Ets2::Save::DlcList DlcSelector::getRefusedDlcs() const { +const Ets2::Save::DlcList DlcSelector::getDlcs() const { Ets2::Save::DlcList dlcs = {}; if (mSave == nullptr) { return dlcs; } for (auto& cb : mCheckboxesByGame.at(mSave->getGame())) { - if (cb->IsEnabled() && !cb->IsChecked()) { + if (cb->IsEnabled() && cb->IsChecked()) { dlcs.push_back(mDlcByCheckbox.at(cb)); } } diff --git a/src/DlcSelector.hpp b/src/DlcSelector.hpp index 7ad4820..c15141a 100644 --- a/src/DlcSelector.hpp +++ b/src/DlcSelector.hpp @@ -9,7 +9,7 @@ class DlcSelector : public Ets2StaticBox { DlcSelector(wxWindow * parent, wxWindowID); void setSave(const Ets2::Save * save); - const Ets2::Save::DlcList getRefusedDlcs() const; + const Ets2::Save::DlcList getDlcs() const; private: wxHyperlinkCtrl * mSelectAll; diff --git a/src/Ets2/Save.cpp b/src/Ets2/Save.cpp index ad872d5..56e5dba 100644 --- a/src/Ets2/Save.cpp +++ b/src/Ets2/Save.cpp @@ -63,7 +63,7 @@ namespace Ets2 { } dlcNameEnd = wideValue.find(L'|', dlcNameStart); mDlcs.push_back(wideValue.substr(dlcNameStart, dlcNameEnd == std::wstring::npos ? std::wstring::npos : dlcNameEnd - dlcNameStart)); - //DEBUG_LOG(L"DLC: %ls", mDlcs.at(mDlcs.size() - 1)); + //DEBUG_LOG(L"%ls: DLC: %ls", mName, mDlcs.at(mDlcs.size() - 1)); } } } @@ -73,15 +73,18 @@ namespace Ets2 { } void Save::setupBlankJob(Job& job) { - job.cargo = "null"; - job.companyTruck = ""; - job.variant = -1; job.target = ""; job.urgency = -1; job.distance = 0; - job.ferryPrice = 0; job.ferryTime = 0; - job.trailerPlace = 0; + job.ferryPrice = 0; + job.cargo = "null"; + job.companyTruck = ""; + job.trailerVariant = "null"; + job.trailerDefinition = "null"; + job.unitsCount = 0; + job.fillRatio = 1; + job.trailerPlace = {}; } // Returns the number of jobs inserted in the save, or -1 in case of error. @@ -168,7 +171,9 @@ namespace Ets2 { } newSaveData.append("}\r\n"); } else { - newSaveData.append(1, ' ').append(name).append(": "); + if (!inJob || name.find("trailer_place[") != 0) { + newSaveData.append(1, ' ').append(name).append(": "); + } newLineHasValue = false; if (inEconomy && name == GAME_TIME_ATTRIBUTE) { gameTime = std::stol(value); @@ -191,8 +196,11 @@ namespace Ets2 { newSaveData.append("\""); } newLineHasValue = true; - } else if (name == "variant") { - newSaveData.append(currentJob->variant == -1 ? "nil" : std::to_string(currentJob->variant)); + } else if (name == "trailer_variant") { + newSaveData.append(currentJob->trailerVariant); + newLineHasValue = true; + } else if (name == "trailer_definition") { + newSaveData.append(currentJob->trailerDefinition); newLineHasValue = true; } else if (name == "target") { newSaveData.append("\"").append(currentJob->target).append("\""); @@ -217,14 +225,30 @@ namespace Ets2 { newSaveData.append(std::to_string(currentJob->ferryPrice)); newLineHasValue = true; } else if (name == "trailer_place") { - newSaveData.append(std::to_string(currentJob->trailerPlace)); + newSaveData.append(std::to_string(currentJob->trailerPlace.size())); + int tpIdx = 0; + for (std::string p : currentJob->trailerPlace) { + newSaveData.append("\r\n trailer_place["); + newSaveData.append(std::to_string(tpIdx)); + newSaveData.append("]: "); + newSaveData.append(p); + ++tpIdx; + } + newLineHasValue = true; + } else if (name == "units_count") { + newSaveData.append(std::to_string(currentJob->unitsCount)); + newLineHasValue = true; + } else if (name == "fill_ratio") { + newSaveData.append(std::to_string(currentJob->fillRatio)); newLineHasValue = true; } } - if (!newLineHasValue) { - newSaveData.append(sourceValue); + if (name.find("trailer_place[") != 0) { + if (!newLineHasValue) { + newSaveData.append(sourceValue); + } + newSaveData.append("\r\n"); } - newSaveData.append("\r\n"); } progress = offset / (dataLength / 100); diff --git a/src/Ets2/Save.hpp b/src/Ets2/Save.hpp index 001158b..0152e14 100644 --- a/src/Ets2/Save.hpp +++ b/src/Ets2/Save.hpp @@ -16,14 +16,17 @@ namespace Ets2 { struct Job { std::string cargo; - int variant; std::string target; int urgency; int distance; int ferryTime; int ferryPrice; std::string companyTruck; - int trailerPlace; + std::string trailerVariant; + std::string trailerDefinition; + int unitsCount; + int fillRatio; + std::vector trailerPlace; }; typedef std::map> JobList; diff --git a/src/JobSyncer.cpp b/src/JobSyncer.cpp index 539f19d..b769646 100644 --- a/src/JobSyncer.cpp +++ b/src/JobSyncer.cpp @@ -28,7 +28,7 @@ JobSyncer::~JobSyncer() { } } -void JobSyncer::start(const Ets2::Save * save, const Ets2::Save::DlcList& refusedDlcs, int jobList) { +void JobSyncer::start(const Ets2::Save * save, const Ets2::Save::DlcList& dlcs, int jobList) { Status status = getStatus(); if (status.state >= State::STARTING && status.state < State::FINISHED) { // Don't use SYNC_DEBUG_LOG because mSave is the save from the sync that's already running @@ -37,7 +37,7 @@ void JobSyncer::start(const Ets2::Save * save, const Ets2::Save::DlcList& refuse return; } mSave = save; - mRefusedDlcs = refusedDlcs; + mDlcs = dlcs; mJobList = jobList; if (mSave == nullptr) { SYNC_DEBUG_LOG(L"Can't start sync: save is null."); @@ -112,13 +112,16 @@ wxThread::ExitCode JobSyncer::Entry() { Ets2::Save::Job job; job.cargo = "invalid"; job.companyTruck = "invalid"; - job.variant = 100; + job.trailerDefinition = "invalid"; + job.trailerVariant = "invalid"; job.target = "invalid.invalid"; job.urgency = 0; job.distance = 1000; job.ferryPrice = 1000; job.ferryTime = 100; - job.trailerPlace = 0; + job.trailerPlace = {}; + job.unitsCount = 0; + job.fillRatio = 1; jobs.clear(); jobs[mSave->getGame() == Ets2::Game::ETS2 ? "sanbuilders.hamburg" : "vm_car_dlr.las_vegas"].push_back(job); } @@ -154,29 +157,21 @@ bool JobSyncer::getJobs(Ets2::Save::JobList& jobs) { std::wstring syncUrl = APP_URL_SYNC; std::wstring gameParam = L""; - std::wstring refusedDlcsParam = L""; - std::wstring saveDlcsParam = L""; + std::wstring dlcsParam = L""; if (mSave->getGame() == Ets2::Game::ATS) { gameParam = L"ats"; } else { gameParam = L"ets2"; } - for (auto&& dlc : mRefusedDlcs) { - if (!refusedDlcsParam.empty()) - refusedDlcsParam.push_back(L','); - refusedDlcsParam.append(dlc); - } - if (mSave != nullptr) { - for (auto&& dlc : mSave->getDlcs()) { - if (!saveDlcsParam.empty()) - saveDlcsParam.push_back(L','); - saveDlcsParam.append(dlc); - } + for (auto&& dlc : mDlcs) { + if (!dlcsParam.empty()) + dlcsParam.push_back(L','); + dlcsParam.append(dlc); } if (mJobList != -1) { syncUrl += L"&list=" + std::to_wstring(mJobList); } - syncUrl += L"&game=" + gameParam + L"&refused_dlcs=" + refusedDlcsParam + "&save_dlcs=" + saveDlcsParam; + syncUrl += L"&game=" + gameParam + L"&dlcs=" + dlcsParam; SYNC_DEBUG_LOG(L"Downloading from URL: %s", syncUrl); HINTERNET urlHandle = InternetOpenUrl(mInternetHandle, syncUrl.data(), NULL, (DWORD)-1, @@ -315,7 +310,7 @@ bool JobSyncer::getJobs(Ets2::Save::JobList& jobs) { Ets2::Save::setupBlankJob(job); for (Value::ConstMemberIterator propIterator = jobIterator->MemberBegin(); propIterator != jobIterator->MemberEnd(); ++propIterator) { propName.assign(propIterator->name.GetString(), propIterator->name.GetStringLength()); - if (propName == "cargo" || propName == "company_truck" || propName == "target") { + if (propName == "cargo" || propName == "company_truck" || propName == "target" || propName == "trailer_variant" || propName == "trailer_definition") { propValue.assign(propIterator->value.GetString(), propIterator->value.GetStringLength()); if (propName == "cargo") { job.cargo = propValue; @@ -323,12 +318,14 @@ bool JobSyncer::getJobs(Ets2::Save::JobList& jobs) { job.companyTruck = propValue; } else if (propName == "target") { job.target = propValue; + } else if (propName == "trailer_variant") { + job.trailerVariant = propValue; + } else if (propName == "trailer_definition") { + job.trailerDefinition = propValue; } - } else if (propName == "variant" || propName == "urgency" || propName == "shortest_distance_km" || propName == "ferry_time" || propName == "ferry_price" || propName == "trailer_place") { + } else if (propName == "urgency" || propName == "shortest_distance_km" || propName == "ferry_time" || propName == "ferry_price" || propName == "units_count" || propName == "fill_ratio") { int propValueInt = propIterator->value.GetInt(); - if (propName == "variant") { - job.variant = propValueInt; - } else if (propName == "urgency") { + if (propName == "urgency") { job.urgency = propValueInt; } else if (propName == "shortest_distance_km") { job.distance = propValueInt; @@ -336,11 +333,21 @@ bool JobSyncer::getJobs(Ets2::Save::JobList& jobs) { job.ferryTime = propValueInt; } else if (propName == "ferry_price") { job.ferryPrice = propValueInt; - } else if (propName == "trailer_place") { - job.trailerPlace = propValueInt; + } else if (propName == "units_count") { + job.unitsCount = propValueInt; + } else if (propName == "fill_ratio") { + job.fillRatio = propValueInt; + } + } else if (propName == "trailer_place") { + job.trailerPlace = {}; + auto trailerPlaceArray = propIterator->value.GetArray(); + for (Value::ConstValueIterator trailerPlaceIterator = trailerPlaceArray.Begin() ; trailerPlaceIterator != trailerPlaceArray.End() ; ++trailerPlaceIterator) { + job.trailerPlace.push_back(std::string(trailerPlaceIterator->GetString(), trailerPlaceIterator->GetStringLength())); } } else { - throw(std::runtime_error(wxString::Format("unknown job property: '%s'", propName))); + SYNC_DEBUG_LOG(L"unknown job property: '%s'", propName); + setStatus(SET_ALL, State::FAILED, PROGRESS_UNDEFINED, wxString::Format(L"Unknown remote job property: %s", propName).ToStdWstring()); + return false; } } jobs[keyIterator->name.GetString()].push_back(job); diff --git a/src/JobSyncer.hpp b/src/JobSyncer.hpp index 41b6db8..9591d70 100644 --- a/src/JobSyncer.hpp +++ b/src/JobSyncer.hpp @@ -34,7 +34,7 @@ class JobSyncer : public wxEvtHandler, public wxThreadHelper { wxString message; }; - void start(const Ets2::Save * save, const Ets2::Save::DlcList& refusedDlcs, int jobList); + void start(const Ets2::Save * save, const Ets2::Save::DlcList& dlcs, int jobList); const Status getStatus(); void cancel(); @@ -56,7 +56,7 @@ class JobSyncer : public wxEvtHandler, public wxThreadHelper { bool mCancel; wxCriticalSection mCancelLock; const Ets2::Save * mSave; - Ets2::Save::DlcList mRefusedDlcs; + Ets2::Save::DlcList mDlcs; int mJobList; void setStatus(int flags, State state, int progress, wxString message); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 2f462d9..8485523 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -212,7 +212,7 @@ void MainWindow::onSaveChanged() { void MainWindow::onSync() { mFSTimer->Stop(); wxDELETE(mFSWatcher); - mSyncDialog = new SyncDialog(this, getSelectedSave(), mDlcSelector->getRefusedDlcs(), JobSyncer::SyncType::SYNC, mJobListSelector->getJobList()); + mSyncDialog = new SyncDialog(this, getSelectedSave(), mDlcSelector->getDlcs(), JobSyncer::SyncType::SYNC, mJobListSelector->getJobList()); wxDELETE(mSyncDialog); updateEts2Info(mEts2Info->getDirectory()); } @@ -220,7 +220,7 @@ void MainWindow::onSync() { void MainWindow::onClearJobs() { mFSTimer->Stop(); wxDELETE(mFSWatcher); - mSyncDialog = new SyncDialog(this, getSelectedSave(), mDlcSelector->getRefusedDlcs(), JobSyncer::SyncType::CLEAR, -1); + mSyncDialog = new SyncDialog(this, getSelectedSave(), mDlcSelector->getDlcs(), JobSyncer::SyncType::CLEAR, -1); wxDELETE(mSyncDialog); updateEts2Info(mEts2Info->getDirectory()); } @@ -228,7 +228,7 @@ void MainWindow::onClearJobs() { void MainWindow::onResetEconomy() { mFSTimer->Stop(); wxDELETE(mFSWatcher); - mSyncDialog = new SyncDialog(this, getSelectedSave(), mDlcSelector->getRefusedDlcs(), JobSyncer::SyncType::RESET_ECONOMY, -1); + mSyncDialog = new SyncDialog(this, getSelectedSave(), mDlcSelector->getDlcs(), JobSyncer::SyncType::RESET_ECONOMY, -1); wxDELETE(mSyncDialog); updateEts2Info(mEts2Info->getDirectory()); } diff --git a/src/SyncDialog.cpp b/src/SyncDialog.cpp index 74a6b98..1319d70 100644 --- a/src/SyncDialog.cpp +++ b/src/SyncDialog.cpp @@ -3,11 +3,11 @@ #include "version.hpp" -SyncDialog::SyncDialog(wxWindow * parent, const Ets2::Save * save, const Ets2::Save::DlcList& refusedDlcs, JobSyncer::SyncType syncType, int jobList) +SyncDialog::SyncDialog(wxWindow * parent, const Ets2::Save * save, const Ets2::Save::DlcList& dlcs, JobSyncer::SyncType syncType, int jobList) : wxDialog(parent, wxID_ANY, L"Job Sync") { mParent = parent; mSave = save; - mRefusedDlcs = refusedDlcs; + mDlcs = dlcs; mSyncType = syncType; mJobList = jobList; @@ -51,7 +51,7 @@ SyncDialog::SyncDialog(wxWindow * parent, const Ets2::Save * save, const Ets2::S borderSizer->AddSpacer(border.x); Fit(); Center(); - mJobSyncer->start(mSave, mRefusedDlcs, mJobList); + mJobSyncer->start(mSave, mDlcs, mJobList); ShowModal(); } diff --git a/src/SyncDialog.hpp b/src/SyncDialog.hpp index 977a542..5c0587c 100644 --- a/src/SyncDialog.hpp +++ b/src/SyncDialog.hpp @@ -6,13 +6,13 @@ class SyncDialog : public wxDialog { public: - SyncDialog(wxWindow * parent, const Ets2::Save * save, const Ets2::Save::DlcList& refusedDlcs, JobSyncer::SyncType syncType, int jobList); + SyncDialog(wxWindow * parent, const Ets2::Save * save, const Ets2::Save::DlcList& dlcs, JobSyncer::SyncType syncType, int jobList); ~SyncDialog(); private: wxWindow * mParent; const Ets2::Save * mSave; - std::vector mRefusedDlcs; + std::vector mDlcs; JobSyncer::SyncType mSyncType; int mJobList; StatusText * mStatus; diff --git a/src/version.hpp b/src/version.hpp index 6611a67..6dad935 100644 --- a/src/version.hpp +++ b/src/version.hpp @@ -3,7 +3,7 @@ #include // put this here so it's easier to bump -#define THIS_APP_VERSION L"5.4.0" +#define THIS_APP_VERSION L"5.5.0" const std::wstring APP_NAME = L"ETS2SyncHelper"; const std::wstring APP_DISPLAY_NAME = L"ETS2Sync Helper"; @@ -11,7 +11,7 @@ const std::wstring APP_VERSION = THIS_APP_VERSION; const std::wstring APP_URL_WEBSITE = L"http://sync.dsantosdev.com/"; #if _DEBUG -const std::wstring APP_URL_API_BASE = APP_URL_WEBSITE + "app-test/"; +const std::wstring APP_URL_API_BASE = L"http://sync.dsantosdev.com.teste/app/"; #else const std::wstring APP_URL_API_BASE = APP_URL_WEBSITE + "app/"; #endif