meos-2024/code/oBase.cpp
2017-08-30 08:57:46 +02:00

191 lines
4.8 KiB
C++

/************************************************************************
MeOS - Orienteering Software
Copyright (C) 2009-2017 Melin Software HB
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Melin Software HB - software@melin.nu - www.melin.nu
Eksoppsvägen 16, SE-75646 UPPSALA, Sweden
************************************************************************/
// oBase.cpp: implementation of the oBase class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "meos.h"
#include "oBase.h"
#include "oCard.h"
#include "meos_util.h"
#include "oEvent.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
char RunnerStatusOrderMap[100];
oBase::oBase(oEvent *poe)
{
Removed = false;
oe = poe;
Id = 0;
changed = false;
reChanged = false;
counter = 0;
Modified.update();
correctionNeeded = true;
}
oBase::~oBase()
{
}
bool oBase::synchronize(bool writeOnly)
{
if (oe && changed) {
changedObject();
oe->dataRevision++;
}
if (oe && oe->HasDBConnection && (changed || !writeOnly)) {
correctionNeeded = false;
return oe->msSynchronize(this);
}
else {
if (changed) {
if (!oe->HasPendingDBConnection) // True if we are trying to reconnect to mysql
changed = false;
}
}
return true;
}
void oBase::clearCombo(HWND hWnd)
{
SendMessage(hWnd, CB_RESETCONTENT, 0, 0);
}
void oBase::addToCombo(HWND hWnd, const string &str, int data)
{
int index=SendMessage(hWnd, CB_ADDSTRING, 0, LPARAM(str.c_str()));
SendMessage(hWnd, CB_SETITEMDATA, index, data);
}
void oBase::setExtIdentifier(__int64 id)
{
getDI().setInt64("ExtId", id);
}
__int64 oBase::getExtIdentifier() const
{
return getDCI().getInt64("ExtId");
}
string oBase::getExtIdentifierString() const {
__int64 raw = getExtIdentifier();
char res[16];
if (raw == 0)
return "";
if (raw & BaseGenStringFlag)
convertDynamicBase(raw & ExtStringMask, 256-32, res);
else if (raw & Base36StringFlag)
convertDynamicBase(raw & ExtStringMask, 36, res);
else
convertDynamicBase(raw, 10, res);
return res;
}
void oBase::converExtIdentifierString(__int64 raw, char bf[16]) {
if (raw & BaseGenStringFlag)
convertDynamicBase(raw & ExtStringMask, 256-32, bf);
else if (raw & Base36StringFlag)
convertDynamicBase(raw & ExtStringMask, 36, bf);
else
convertDynamicBase(raw, 10, bf);
}
__int64 oBase::converExtIdentifierString(const string &str) {
__int64 val;
int base = convertDynamicBase(str, val);
if (base == 36)
val |= Base36StringFlag;
else if (base > 36)
val |= BaseGenStringFlag;
return val;
}
void oBase::setExtIdentifier(const string &str) {
__int64 val = converExtIdentifierString(str);
setExtIdentifier(val);
}
int oBase::idFromExtId(__int64 val) {
int basePart = int(val & 0x0FFFFFFF);
if (basePart == val)
return basePart;
__int64 hash = (val&ExtStringMask) % 2000000011ul;
int res = basePart + int(hash&0xFFFFFF);
if (res == 0)
res += int(hash);
return res & 0x0FFFFFFF;
}
bool oBase::isStringIdentifier() const {
__int64 raw = getExtIdentifier();
return (raw & (BaseGenStringFlag|Base36StringFlag)) != 0;
}
string oBase::getTimeStamp() const {
if (oe && oe->isClient() && !sqlUpdated.empty())
return sqlUpdated;
else return Modified.getStampString();
}
void oBase::changeId(int newId) {
Id = newId;
}
oDataInterface oBase::getDI(void) {
pvoid data;
pvoid olddata;
pvectorstr strData;
oDataContainer &dc = getDataBuffers(data, olddata, strData);
return dc.getInterface(data, getDISize(), this);
}
oDataConstInterface oBase::getDCI(void) const
{
pvoid data;
pvoid olddata;
pvectorstr strData;
oDataContainer &dc = getDataBuffers(data, olddata, strData);
return dc.getConstInterface(data, getDISize(), this);
}
void oBase::updateChanged() {
Modified.update();
changed=true;
}