]> git.stg.codes - stg.git/blobdiff - projects/stargazer/user.cpp
Merge branch 'master' of madf.dyndns.org:/var/git/stg
[stg.git] / projects / stargazer / user.cpp
index 3d9371fda7f7c5110f200c92175f31668ef00416..d8368c4d41b1885821af69c158b4da0afe4dc417 100644 (file)
@@ -123,8 +123,6 @@ currIP.AddAfterNotifier(&ipNotifier);
 
 lastScanMessages = 0;
 
-writeFreeMbTraffCost = settings->GetWriteFreeMbTraffCost();
-
 pthread_mutexattr_t attr;
 pthread_mutexattr_init(&attr);
 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
@@ -206,8 +204,6 @@ currIP.AddAfterNotifier(&ipNotifier);
 
 lastScanMessages = 0;
 
-writeFreeMbTraffCost = settings->GetWriteFreeMbTraffCost();
-
 property.SetProperties(u.property);
 
 pthread_mutexattr_t attr;
@@ -339,10 +335,11 @@ int USER::WriteMonthStat()
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 time_t tt = stgTime - 3600;
-struct tm * t1 = localtime(&tt);
+struct tm t1;
+localtime_r(&tt, &t1);
 
 USER_STAT stat(property.GetStat());
-if (store->SaveMonthStat(stat, t1->tm_mon, t1->tm_year, login))
+if (store->SaveMonthStat(stat, t1.tm_mon, t1.tm_year, login))
     {
     WriteServLog("Cannot write month stat for user %s.", login.c_str());
     WriteServLog("%s", store->GetStrError().c_str());
@@ -605,7 +602,7 @@ void USER::Run()
 {
 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();
@@ -770,7 +767,8 @@ sessionUpload[dir] += len;
 
 //Add detailed stat
 
-if (!writeFreeMbTraffCost && freeMb.ConstData() >= 0)
+if (!settings->GetWriteFreeMbTraffCost() &&
+     freeMb.ConstData() >= 0)
     cost = 0;
 
 #ifdef TRAFF_STAT_WITH_PORTS
@@ -860,7 +858,8 @@ sessionDownload[dir] += len;
 
 //Add detailed stat
 
-if (!writeFreeMbTraffCost && freeMb.ConstData() >= 0)
+if (!settings->GetWriteFreeMbTraffCost() &&
+     freeMb.ConstData() >= 0)
     cost = 0;
 
 #ifdef TRAFF_STAT_WITH_PORTS
@@ -1007,13 +1006,13 @@ STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 static int daysInMonth[12] =
 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
-struct tm tms;
+struct tm tms;
 time_t t = stgTime;
-tms = localtime(&t);
+localtime_r(&t, &tms);
 
-time_t secMonth = daysInMonth[(tms->tm_mon + 11) % 12] * 24 * 3600; // Previous month
+time_t secMonth = daysInMonth[(tms.tm_mon + 11) % 12] * 24 * 3600; // Previous month
 
-if (tms->tm_year % 4 == 0 && tms->tm_mon == 1)
+if (tms.tm_year % 4 == 0 && tms.tm_mon == 1)
     {
     // Leap year
     secMonth += 24 * 3600;
@@ -1031,12 +1030,11 @@ void USER::SetPassiveTimeAsNewUser()
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 
-time_t t;
-struct tm * tm;
-t = stgTime;
-tm = localtime(&t);
+time_t t = stgTime;
+struct tm tm;
+localtime_r(&t, &tm);
 int daysCurrMon = DaysInCurrentMonth();
-double pt = (tm->tm_mday - 1) / (double)daysCurrMon;
+double pt = (tm.tm_mday - 1) / (double)daysCurrMon;
 
 passiveTime = (time_t)(pt * 24 * 3600 * daysCurrMon);
 }
@@ -1188,7 +1186,7 @@ else
 return 0;
 }
 //-----------------------------------------------------------------------------
-int USER::SendMessage(const STG_MSG & msg)
+int USER::SendMessage(STG_MSG & msg) const
 {
 // No lock `cause we are already locked from caller
 int ret = -1;
@@ -1198,71 +1196,47 @@ while (it != authorizedBy.end())
     if (!(*it++)->SendMessage(msg, currIP))
         ret = 0;
     }
+if (!ret)
+    {
+#ifndef DEBUG
+    //TODO: gcc v. 4.x generate ICE on x86_64
+    msg.header.lastSendTime = time(NULL);
+#else
+    msg.header.lastSendTime = stgTime;
+#endif
+    msg.header.repeat--;
+    }
 return ret;
 }
 //-----------------------------------------------------------------------------
-int USER::ScanMessage()
+void USER::ScanMessage()
 {
 // 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;
-
-if (store->GetMessageHdrs(&hdrsList, login))
-    {
-    printfd(__FILE__, "Error GetMessageHdrs %s\n", store->GetStrError().c_str());
-    return -1;
-    }
-
-for (unsigned i = 0; i < hdrsList.size(); i++)
+std::list<STG_MSG>::iterator it(messages.begin());
+while (it != messages.end())
     {
-
-    if (hdrsList[i].lastSendTime + hdrsList[i].repeatPeriod * 60 < (unsigned)stgTime)
+    if (settings->GetMessageTimeout() > 0 &&
+        difftime(stgTime, it->header.creationTime) > settings->GetMessageTimeout())
         {
-        STG_MSG msg;
-        if (store->GetMessage(hdrsList[i].id, &msg, login) == 0)
+        // Timeout exceeded
+        if (store->DelMessage(it->header.id, login))
             {
-            if (SendMessage(msg) == 0)
-                {
-                msg.header.repeat--;
-                if (msg.header.repeat < 0)
-                    {
-                    printfd(__FILE__, "DelMessage\n");
-                    store->DelMessage(hdrsList[i].id, login);
-                    }
-                else
-                    {
-                    #ifndef DEBUG
-                    //TODO: gcc v. 4.x generate ICE on x86_64
-                    msg.header.lastSendTime = time(NULL);
-                    #else
-                    msg.header.lastSendTime = stgTime;
-                    #endif
-                    if (store->EditMessage(msg, login))
-                        {
-                        printfd(__FILE__, "EditMessage Error %s\n", store->GetStrError().c_str());
-                        }
-                    }
-                }
-            }
-        else
-            {
-            WriteServLog("Cannot get message for user %s.", login.c_str());
-            WriteServLog("%s", store->GetStrError().c_str());
+            WriteServLog("Error deleting message: '%s'", store->GetStrError().c_str());
+            printfd(__FILE__, "Error deleting message: '%s'\n", store->GetStrError().c_str());
             }
+        messages.erase(it++);
+        continue;
         }
-    }*/
-
-std::list<STG_MSG>::iterator it(messages.begin());
-while (it != messages.end())
-    {
-    if (static_cast<time_t>(it->header.lastSendTime + it->header.repeatPeriod * 60) < stgTime)
+    if (it->GetNextSendTime() <= stgTime)
         {
         if (SendMessage(*it))
             {
-            return -1;
+            // 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))
@@ -1274,12 +1248,6 @@ while (it != messages.end())
             }
         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());
@@ -1288,13 +1256,7 @@ while (it != messages.end())
             ++it;
             }
         }
-    else
-        {
-        ++it;
-        }
     }
-
-return 0;
 }
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------