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