return -1;
}
+std::vector<STG_MSG_HDR> hdrsList;
+
+if (store->GetMessageHdrs(&hdrsList, login))
+ {
+ printfd(__FILE__, "Error GetMessageHdrs %s\n", store->GetStrError().c_str());
+ return -1;
+ }
+
+std::vector<STG_MSG_HDR>::const_iterator it;
+for (it = hdrsList.begin(); it != hdrsList.end(); ++it)
+ {
+ STG_MSG msg;
+ if (store->GetMessage(it->id, &msg, login) == 0)
+ {
+ messages.push_back(msg);
+ }
+ }
+
return 0;
}
//-----------------------------------------------------------------------------
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-if (stgTime - lastWriteStat > settings->GetStatWritePeriod())
+if (stgTime > static_cast<time_t>(lastWriteStat + settings->GetStatWritePeriod()))
{
printfd(__FILE__, "USER::WriteStat user=%s\n", GetLogin().c_str());
WriteStat();
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-if (SendMessage(*msg) == 0)
+if (SendMessage(*msg))
+ {
+ if (store->AddMessage(msg, login))
+ {
+ errorStr = store->GetStrError();
+ WriteServLog("Error adding message: '%s'", errorStr.c_str());
+ printfd(__FILE__, "Error adding message: '%s'\n", errorStr.c_str());
+ return -1;
+ }
+ messages.push_back(*msg);
+ }
+else
{
if (msg->header.repeat > 0)
{
if (store->AddMessage(msg, login))
{
errorStr = store->GetStrError();
- STG_LOGGER & WriteServLog = GetStgLogger();
- WriteServLog("Error adding message %s", errorStr.c_str());
- WriteServLog("%s", store->GetStrError().c_str());
+ WriteServLog("Error adding repeatable message: '%s'", errorStr.c_str());
+ printfd(__FILE__, "Error adding repeatable message: '%s'\n", errorStr.c_str());
return -1;
}
- }
- }
-else
- {
- if (store->AddMessage(msg, login))
- {
- errorStr = store->GetStrError();
- STG_LOGGER & WriteServLog = GetStgLogger();
- WriteServLog("Error adding message %s", errorStr.c_str());
- WriteServLog("%s", store->GetStrError().c_str());
- return -1;
+ messages.push_back(*msg);
}
}
return 0;
//-----------------------------------------------------------------------------
int USER::SendMessage(const STG_MSG & msg)
{
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-
-if (authorizedBy.empty())
- {
- return -1;
- }
-
+// No lock `cause we are already locked from caller
int ret = -1;
-set<const BASE_AUTH*>::iterator it;
-
-it = authorizedBy.begin();
+set<const BASE_AUTH*>::iterator it(authorizedBy.begin());
while (it != authorizedBy.end())
{
- if ((*it)->SendMessage(msg, currIP) == 0)
+ if (!(*it++)->SendMessage(msg, currIP))
ret = 0;
- ++it;
}
return ret;
}
//-----------------------------------------------------------------------------
int USER::ScanMessage()
{
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+// No lock `cause we are already locked from caller
+// We need not check for the authorizedBy `cause it has already checked by caller
-vector<STG_MSG_HDR> hdrsList;
+/*vector<STG_MSG_HDR> hdrsList;
if (store->GetMessageHdrs(&hdrsList, login))
{
WriteServLog("%s", store->GetStrError().c_str());
}
}
+ }*/
+
+std::list<STG_MSG>::iterator it(messages.begin());
+while (it != messages.end())
+ {
+ printfd(__FILE__, "Message timeout: %d, delta: %f\n", settings->GetMessageTimeout(), difftime(stgTime, it->header.creationTime));
+ if (settings->GetMessageTimeout() > 0 &&
+ difftime(stgTime, it->header.creationTime) > settings->GetMessageTimeout())
+ {
+ // Timeout exceeded
+ if (store->DelMessage(it->header.id, login))
+ {
+ WriteServLog("Error deleting message: '%s'", store->GetStrError().c_str());
+ printfd(__FILE__, "Error deleting message: '%s'\n", store->GetStrError().c_str());
+ }
+ messages.erase(it++);
+ continue;
+ }
+ if (static_cast<time_t>(it->header.lastSendTime + it->header.repeatPeriod * 60) < stgTime)
+ {
+ if (SendMessage(*it))
+ {
+ // We need to check all messages in queue for timeout
+ ++it;
+ continue;
+ }
+ it->header.repeat--;
+ if (it->header.repeat < 0)
+ {
+ if (store->DelMessage(it->header.id, login))
+ {
+ WriteServLog("Error deleting message: '%s'", store->GetStrError().c_str());
+ printfd(__FILE__, "Error deleting message: '%s'\n", store->GetStrError().c_str());
+ }
+ messages.erase(it++);
+ }
+ else
+ {
+ #ifndef DEBUG
+ //TODO: gcc v. 4.x generate ICE on x86_64
+ it->header.lastSendTime = time(NULL);
+ #else
+ it->header.lastSendTime = stgTime;
+ #endif
+ if (store->EditMessage(*it, login))
+ {
+ WriteServLog("Error modifying message: '%s'", store->GetStrError().c_str());
+ printfd(__FILE__, "Error modifying message: '%s'\n", store->GetStrError().c_str());
+ }
+ ++it;
+ }
+ }
+ else
+ {
+ ++it;
+ }
}
+
return 0;
}
//-----------------------------------------------------------------------------