2009-01-31 07:53:36 +01:00
/*
2010-02-28 01:08:10 +01:00
* This file is a part of Winix
2014-10-04 20:04:03 +02:00
* and is distributed under the 2 - Clause BSD licence .
* Author : Tomasz Sowa < t . sowa @ ttmath . org >
*/
/*
2022-07-25 14:21:21 +02:00
* Copyright ( c ) 2008 - 2022 , Tomasz Sowa
2009-01-31 07:53:36 +01:00
* All rights reserved .
*
2014-10-04 20:04:03 +02:00
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* 1. Redistributions of source code must retain the above copyright notice ,
* this list of conditions and the following disclaimer .
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR
* CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
* CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE .
*
2009-01-31 07:53:36 +01:00
*/
# include "sessioncontainer.h"
2009-04-21 22:50:55 +02:00
# include "log.h"
2010-10-24 01:12:47 +02:00
# include "misc.h"
2009-01-31 07:53:36 +01:00
2010-05-04 23:58:22 +02:00
2014-02-12 17:30:49 +01:00
namespace Winix
{
2010-05-04 23:58:22 +02:00
2010-11-23 22:52:25 +01:00
SessionContainer : : SessionContainer ( )
{
added: uptime winix function prints how many sessions there are
changed: functions for text/numbers conversions
int Toi(const std::string & str, int base = 10);
int Toi(const std::wstring & str, int base = 10);
int Toi(const char * str, int base = 10);
int Toi(const wchar_t * str, int base = 10);
long Tol(const std::string & str, int base = 10);
long Tol(const std::wstring & str, int base = 10);
long Tol(const char * str, int base = 10);
long Tol(const wchar_t * str, int base = 10);
template<class CharType>
bool Toa(unsigned long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(unsigned int value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(int value, CharType * buffer, size_t buf_len, int base = 10);
const wchar_t * Toa(unsigned int value, int base = 10);
const wchar_t * Toa(unsigned long value, int base = 10);
const wchar_t * Toa(int value, int base = 10);
const wchar_t * Toa(long value, int base = 10);
void Toa(int value, std::string & res, int base = 10, bool clear = true);
void Toa(long value, std::string & res, int base = 10, bool clear = true);
void Toa(int value, std::wstring & res, int base = 10, bool clear = true);
void Toa(long value, std::wstring & res, int base = 10, bool clear = true);
added: HtmlTextStream class (files htmltextstream.cpp htmltextstream.h in templates)
this is a special stream for automatically escaping html tags
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@682 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-11-25 02:34:46 +01:00
table_size = 0 ;
2010-11-23 22:52:25 +01:00
}
2011-01-23 15:15:30 +01:00
void SessionContainer : : SetCur ( Cur * pcur )
2010-11-23 22:52:25 +01:00
{
2011-01-23 15:15:30 +01:00
cur = pcur ;
2010-11-23 22:52:25 +01:00
}
2010-12-07 13:52:52 +01:00
void SessionContainer : : SetConfig ( Config * pconfig )
{
config = pconfig ;
}
2011-01-23 15:15:30 +01:00
void SessionContainer : : SetTmpSession ( Session * psession )
{
tmp_session = psession ;
}
2010-11-23 22:52:25 +01:00
2009-01-31 07:53:36 +01:00
void SessionContainer : : Clear ( )
{
2010-12-07 13:52:52 +01:00
Table : : iterator i = table . begin ( ) ;
2010-11-23 22:52:25 +01:00
2011-01-23 15:15:30 +01:00
log < < log3 < < " SC: deleting all sessions " < < logend ;
2012-03-17 06:11:23 +01:00
cur - > session = tmp_session ;
2010-11-23 22:52:25 +01:00
// don't use table.clear();
// because plugins session data would not be erased
while ( i ! = table . end ( ) )
{
2018-11-21 12:03:53 +01:00
if ( i - > plugin_data . HasAllocatedData ( ) )
{
2022-07-25 14:21:21 +02:00
plugin - > Call ( model_connector , & log , & * i , nullptr , nullptr , WINIX_PLUGIN_SESSION_DATA_REMOVE , nullptr , nullptr , 0 , 0 ) ; // the session passed here is ok?
2018-11-21 12:03:53 +01:00
}
//i->plugin_data.DeleteAll(); // it's better to call it here instead in the destructor
2010-12-07 13:52:52 +01:00
table . erase ( i + + ) ;
2010-11-23 22:52:25 +01:00
}
2010-12-07 13:52:52 +01:00
// erasing indexes
2009-01-31 07:53:36 +01:00
index_id . clear ( ) ;
added: uptime winix function prints how many sessions there are
changed: functions for text/numbers conversions
int Toi(const std::string & str, int base = 10);
int Toi(const std::wstring & str, int base = 10);
int Toi(const char * str, int base = 10);
int Toi(const wchar_t * str, int base = 10);
long Tol(const std::string & str, int base = 10);
long Tol(const std::wstring & str, int base = 10);
long Tol(const char * str, int base = 10);
long Tol(const wchar_t * str, int base = 10);
template<class CharType>
bool Toa(unsigned long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(unsigned int value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(int value, CharType * buffer, size_t buf_len, int base = 10);
const wchar_t * Toa(unsigned int value, int base = 10);
const wchar_t * Toa(unsigned long value, int base = 10);
const wchar_t * Toa(int value, int base = 10);
const wchar_t * Toa(long value, int base = 10);
void Toa(int value, std::string & res, int base = 10, bool clear = true);
void Toa(long value, std::string & res, int base = 10, bool clear = true);
void Toa(int value, std::wstring & res, int base = 10, bool clear = true);
void Toa(long value, std::wstring & res, int base = 10, bool clear = true);
added: HtmlTextStream class (files htmltextstream.cpp htmltextstream.h in templates)
this is a special stream for automatically escaping html tags
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@682 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-11-25 02:34:46 +01:00
table_size = 0 ;
2009-01-31 07:53:36 +01:00
}
2011-01-23 15:15:30 +01:00
2012-03-17 06:11:23 +01:00
void SessionContainer : : EraseById ( long id )
2010-08-10 18:12:50 +02:00
{
2012-03-17 06:11:23 +01:00
IndexId : : iterator i = index_id . find ( id ) ;
if ( i ! = index_id . end ( ) )
{
Session * old_session = tmp_session ;
2011-01-23 15:15:30 +01:00
2012-03-17 06:11:23 +01:00
if ( cur - > session ! = & ( * i - > second ) )
old_session = cur - > session ;
2011-01-23 15:15:30 +01:00
2012-03-17 06:11:23 +01:00
cur - > session = & ( * i - > second ) ;
2011-01-23 15:15:30 +01:00
2012-03-17 06:11:23 +01:00
log < < log4 < < " SC: deleting session, id: " < < i - > second - > id < < logend ;
2012-01-21 13:29:44 +01:00
2012-03-17 06:11:23 +01:00
// call first DeleteAll() because if not then it would be called from the destructor
// and there'll be a problem if it throws an exception there
2018-11-21 12:03:53 +01:00
if ( i - > second - > plugin_data . HasAllocatedData ( ) )
{
2022-07-25 14:21:21 +02:00
plugin - > Call ( model_connector , & log , & * ( i - > second ) , nullptr , nullptr , WINIX_PLUGIN_SESSION_DATA_REMOVE , nullptr , nullptr , 0 , 0 ) ; // the session passed here is ok?
2018-11-21 12:03:53 +01:00
}
//i->second->plugin_data.DeleteAll();
2012-03-17 06:11:23 +01:00
table . erase ( i - > second ) ;
index_id . erase ( i ) ;
table_size - = 1 ;
2011-01-23 15:15:30 +01:00
2012-03-17 06:11:23 +01:00
cur - > session = old_session ;
}
else
{
log < < log1 < < " SC: I cannot delete a session with id: " < < id
< < " (there is no such a session) " < < logend ;
}
2010-08-10 18:12:50 +02:00
}
2011-01-23 15:15:30 +01:00
2010-12-07 13:52:52 +01:00
size_t SessionContainer : : Size ( )
2009-11-21 00:09:52 +01:00
{
added: uptime winix function prints how many sessions there are
changed: functions for text/numbers conversions
int Toi(const std::string & str, int base = 10);
int Toi(const std::wstring & str, int base = 10);
int Toi(const char * str, int base = 10);
int Toi(const wchar_t * str, int base = 10);
long Tol(const std::string & str, int base = 10);
long Tol(const std::wstring & str, int base = 10);
long Tol(const char * str, int base = 10);
long Tol(const wchar_t * str, int base = 10);
template<class CharType>
bool Toa(unsigned long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(unsigned int value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(int value, CharType * buffer, size_t buf_len, int base = 10);
const wchar_t * Toa(unsigned int value, int base = 10);
const wchar_t * Toa(unsigned long value, int base = 10);
const wchar_t * Toa(int value, int base = 10);
const wchar_t * Toa(long value, int base = 10);
void Toa(int value, std::string & res, int base = 10, bool clear = true);
void Toa(long value, std::string & res, int base = 10, bool clear = true);
void Toa(int value, std::wstring & res, int base = 10, bool clear = true);
void Toa(long value, std::wstring & res, int base = 10, bool clear = true);
added: HtmlTextStream class (files htmltextstream.cpp htmltextstream.h in templates)
this is a special stream for automatically escaping html tags
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@682 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-11-25 02:34:46 +01:00
// don't use table.size() as it has O(n) complexity on FreeBSD
return table_size ;
2009-11-21 00:09:52 +01:00
}
2009-01-31 07:53:36 +01:00
SessionContainer : : Iterator SessionContainer : : Begin ( )
{
return table . begin ( ) ;
}
SessionContainer : : Iterator SessionContainer : : End ( )
{
return table . end ( ) ;
}
Session & SessionContainer : : Back ( )
{
return table . back ( ) ;
}
2011-01-23 15:15:30 +01:00
SessionContainer : : IdIterator SessionContainer : : IdBegin ( )
{
return index_id . begin ( ) ;
}
SessionContainer : : IdIterator SessionContainer : : IdEnd ( )
{
return index_id . end ( ) ;
}
2009-01-31 07:53:36 +01:00
2012-03-17 06:11:23 +01:00
SessionContainer : : Iterator SessionContainer : : AddSession ( long id )
2009-01-31 07:53:36 +01:00
{
2012-03-17 06:11:23 +01:00
std : : pair < IndexId : : iterator , bool > index_id_res = index_id . insert ( std : : make_pair ( id , table . end ( ) ) ) ;
2010-12-07 13:52:52 +01:00
if ( ! index_id_res . second )
{
// that element already exists (was not inserted now)
2012-03-17 06:11:23 +01:00
return End ( ) ;
2010-12-07 13:52:52 +01:00
}
2012-03-17 06:11:23 +01:00
Iterator last = table . insert ( table . end ( ) , empty_session ) ;
last - > id = id ;
2010-12-07 13:52:52 +01:00
index_id_res . first - > second = last ;
added: uptime winix function prints how many sessions there are
changed: functions for text/numbers conversions
int Toi(const std::string & str, int base = 10);
int Toi(const std::wstring & str, int base = 10);
int Toi(const char * str, int base = 10);
int Toi(const wchar_t * str, int base = 10);
long Tol(const std::string & str, int base = 10);
long Tol(const std::wstring & str, int base = 10);
long Tol(const char * str, int base = 10);
long Tol(const wchar_t * str, int base = 10);
template<class CharType>
bool Toa(unsigned long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(unsigned int value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(int value, CharType * buffer, size_t buf_len, int base = 10);
const wchar_t * Toa(unsigned int value, int base = 10);
const wchar_t * Toa(unsigned long value, int base = 10);
const wchar_t * Toa(int value, int base = 10);
const wchar_t * Toa(long value, int base = 10);
void Toa(int value, std::string & res, int base = 10, bool clear = true);
void Toa(long value, std::string & res, int base = 10, bool clear = true);
void Toa(int value, std::wstring & res, int base = 10, bool clear = true);
void Toa(long value, std::wstring & res, int base = 10, bool clear = true);
added: HtmlTextStream class (files htmltextstream.cpp htmltextstream.h in templates)
this is a special stream for automatically escaping html tags
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@682 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-11-25 02:34:46 +01:00
table_size + = 1 ;
2012-03-17 06:11:23 +01:00
log < < log3 < < " SC: added session, id: " < < id < < logend ;
added: uptime winix function prints how many sessions there are
changed: functions for text/numbers conversions
int Toi(const std::string & str, int base = 10);
int Toi(const std::wstring & str, int base = 10);
int Toi(const char * str, int base = 10);
int Toi(const wchar_t * str, int base = 10);
long Tol(const std::string & str, int base = 10);
long Tol(const std::wstring & str, int base = 10);
long Tol(const char * str, int base = 10);
long Tol(const wchar_t * str, int base = 10);
template<class CharType>
bool Toa(unsigned long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(long value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(unsigned int value, CharType * buffer, size_t buf_len, int base = 10);
template<class CharType>
bool Toa(int value, CharType * buffer, size_t buf_len, int base = 10);
const wchar_t * Toa(unsigned int value, int base = 10);
const wchar_t * Toa(unsigned long value, int base = 10);
const wchar_t * Toa(int value, int base = 10);
const wchar_t * Toa(long value, int base = 10);
void Toa(int value, std::string & res, int base = 10, bool clear = true);
void Toa(long value, std::string & res, int base = 10, bool clear = true);
void Toa(int value, std::wstring & res, int base = 10, bool clear = true);
void Toa(long value, std::wstring & res, int base = 10, bool clear = true);
added: HtmlTextStream class (files htmltextstream.cpp htmltextstream.h in templates)
this is a special stream for automatically escaping html tags
git-svn-id: svn://ttmath.org/publicrep/winix/trunk@682 e52654a7-88a9-db11-a3e9-0013d4bc506e
2010-11-25 02:34:46 +01:00
2012-03-17 06:11:23 +01:00
return last ;
2009-01-31 07:53:36 +01:00
}
SessionContainer : : Iterator SessionContainer : : FindById ( long id )
{
IndexId : : iterator i ;
i = index_id . find ( id ) ;
if ( i = = index_id . end ( ) )
return table . end ( ) ;
return i - > second ;
}
2012-03-17 06:11:23 +01:00
bool SessionContainer : : ChangeSessionId ( SessionContainer : : Iterator ses , long new_id )
{
std : : pair < IndexId : : iterator , bool > index_id_res = index_id . insert ( std : : make_pair ( new_id , ses ) ) ;
if ( ! index_id_res . second )
{
log < < log1 < < " SC: session with id: " < < new_id < < " already exists " < < logend ;
return false ;
}
long old_id = ses - > id ;
index_id . erase ( old_id ) ; // remove the old index
ses - > id = new_id ;
log < < log3 < < " SC: changed session id from: " < < old_id < < " to " < < new_id < < logend ;
return true ;
}
bool SessionContainer : : ChangeSessionId ( long old_id , long new_id )
{
IndexId : : iterator i = index_id . find ( old_id ) ;
if ( i ! = index_id . end ( ) )
{
return ChangeSessionId ( i - > second , new_id ) ;
}
else
{
log < < log2 < < " SC: there is no a session with id: " < < old_id < < logend ;
}
return false ;
}
2009-01-31 07:53:36 +01:00
2010-12-07 13:52:52 +01:00
2014-02-12 17:30:49 +01:00
} // namespace Winix
2010-12-07 13:52:52 +01:00