summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/UserInfoEx/src/mir_contactqueue.cpp318
-rw-r--r--plugins/UserInfoEx/src/mir_contactqueue.h75
-rw-r--r--plugins/UserInfoEx/src/mir_string.cpp39
3 files changed, 143 insertions, 289 deletions
diff --git a/plugins/UserInfoEx/src/mir_contactqueue.cpp b/plugins/UserInfoEx/src/mir_contactqueue.cpp
index c7c2e8da97..d07cc07213 100644
--- a/plugins/UserInfoEx/src/mir_contactqueue.cpp
+++ b/plugins/UserInfoEx/src/mir_contactqueue.cpp
@@ -20,31 +20,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "commonheaders.h"
-/**
- * This static helper function is used to sort the queue items by time
- * beginning with the next upcoming item to call the Callback for.
- *
- * @param i1 - the first queue item
- * @param i2 - the second queue item
- *
- * @return The function returns the time slack between the two items.
- **/
static int QueueSortItems(const CQueueItem *i1, const CQueueItem *i2)
{
int rc = i1->check_time - i2->check_time;
if (!rc)
- {
rc = i1->hContact != i2->hContact;
- }
+
return rc;
}
-/**
- *
- *
- **/
-CContactQueue::CContactQueue(int initialSize)
- : _queue(initialSize, QueueSortItems)
+/////////////////////////////////////////////////////////////////////////////////////////
+// Constructor & destructor
+
+CContactQueue::CContactQueue(int initialSize) :
+ _queue(initialSize, QueueSortItems)
{
_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
_status = RUNNING;
@@ -52,38 +41,32 @@ CContactQueue::CContactQueue(int initialSize)
mir_forkthread((pThreadFunc)CContactQueue::ThreadProc, this);
}
-/**
- *
- *
- **/
CContactQueue::~CContactQueue()
{
if (_status == RUNNING)
- {
_status = STOPPING;
- }
+
SetEvent(_hEvent);
for (int count = 0; _status != STOPPED && ++count < 50;)
- {
Sleep(10);
- }
for (int i = 0; i < _queue.getCount(); i++)
- {
mir_free(_queue[i]);
- }
CloseHandle(_hEvent);
}
-/**
- * This function removes all queue items.
- *
- * @param none
- *
- * @return nothing
- **/
+void CContactQueue::Remove(int idx)
+{
+ CQueueItem *qi = _queue[idx];
+ _queue.remove(idx);
+ mir_free(qi);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// This function removes all queue items.
+
void CContactQueue::RemoveAll()
{
mir_cslock lck(_cs);
@@ -93,275 +76,174 @@ void CContactQueue::RemoveAll()
_queue.destroy();
}
-/**
- * This function removes all queue items for the hContact.
- *
- * @param hContact - the contact whose queue items to delete
- *
- * @return nothing
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This function removes all queue items for the hContact.
+
void CContactQueue::RemoveAll(MCONTACT hContact)
{
mir_cslock lck(_cs);
- for (int i = _queue.getCount() - 1; i >= 0; --i)
- {
+ for (int i = _queue.getCount() - 1; i >= 0; --i) {
CQueueItem *qi = _queue[i];
-
- if (qi->hContact == hContact)
- {
+ if (qi->hContact == hContact) {
_queue.remove(i);
mir_free(qi);
}
}
}
-/**
- * This function removes all queue items for the hContact considering the correct parameter.
- *
- * @param hContact - the contact whose queue items to delete
- * @param param - a caller defined parameter passed to the callback function
- *
- * @return nothing
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This function removes all queue items for the hContact considering the correct parameter.
+
void CContactQueue::RemoveAllConsiderParam(MCONTACT hContact, PVOID param)
{
mir_cslock lck(_cs);
- for (int i = _queue.getCount() - 1; i >= 0; --i)
- {
+ for (int i = _queue.getCount() - 1; i >= 0; --i) {
CQueueItem *qi = _queue[i];
-
- if (qi->hContact == hContact && qi->param == param)
- {
+ if (qi->hContact == hContact && qi->param == param) {
_queue.remove(i);
mir_free(qi);
}
}
}
-/**
- * This method adds the desired new item.
- *
- * @param waitTime - the time to wait until the callback is desired to run
- * @param hContact - the contact to perform the action for
- * @param param - a caller defined parameter passed to the callback function
- *
- * @retval TRUE - The item is added to the queue successfully.
- * @retval FALSE - The item is not added to the queue.
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This method adds the desired new item.
+
BOOL CContactQueue::Add(int waitTime, MCONTACT hContact, PVOID param)
{
- BOOL rc;
-
mir_cslock lck(_cs);
-
- rc = InternalAdd(waitTime, hContact, param);
-
- return rc;
+ return InternalAdd(waitTime, hContact, param);
}
-/**
- * This method adds the desired new item only, if the queue does not yet contain
- * an item for the contact.
- *
- * @param waitTime - the time to wait until the callback is desired to run
- * @param hContact - the contact to perform the action for
- * @param param - a caller defined parameter passed to the callback function
- *
- * @retval TRUE - The item is added to the queue successfully.
- * @retval FALSE - The item is not added to the queue.
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This method adds the desired new item only, if the queue does not yet contain
+// an item for the contact.
+
BOOL CContactQueue::AddIfDontHave(int waitTime, MCONTACT hContact, PVOID param)
{
- int i;
- BOOL rc;
-
mir_cslock lck(_cs);
- for (i = _queue.getCount() - 1; i >= 0; --i)
- {
+ for (int i = _queue.getCount() - 1; i >= 0; --i)
if (_queue[i]->hContact == hContact)
- {
- break;
- }
- }
-
- rc = (i == -1) ? InternalAdd(waitTime, hContact, param) : 0;
+ return FALSE;
- return rc;
+ return InternalAdd(waitTime, hContact, param);
}
-/**
- * This method removes all existing queue items for the contact and adds a new queue item
- * for the given contact. This method might be used to move an existing entry,
- * whose check_time has changed.
- *
- * @param waitTime - the time to wait until the callback is desired to run
- * @param hContact - the contact to perform the action for
- * @param param - a caller defined parameter passed to the callback function
- *
- * @retval TRUE - The item is added to the queue successfully.
- * @retval FALSE - The item is not added to the queue.
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This method removes all existing queue items for the contact and adds a new queue item
+// for the given contact. This method might be used to move an existing entry,
+// whose check_time has changed.
+
BOOL CContactQueue::AddUnique(int waitTime, MCONTACT hContact, PVOID param)
{
- BOOL rc;
-
mir_cslock lck(_cs);
RemoveAll(hContact);
- rc = InternalAdd(waitTime, hContact, param);
-
- return rc;
+ return InternalAdd(waitTime, hContact, param);
}
-/**
- * This method removes all existing queue items for the contact with the same parameter as @e param
- * and adds a new queue item for the given contact. This method might be used to move an existing
- * entry, whose check_time has changed.
- *
- * @param waitTime - the time to wait until the callback is desired to run
- * @param hContact - the contact to perform the action for
- * @param param - a caller defined parameter passed to the callback function
- *
- * @retval TRUE - The item is added to the queue successfully.
- * @retval FALSE - The item is not added to the queue.
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This method removes all existing queue items for the contact with the same parameter as @e param
+// and adds a new queue item for the given contact. This method might be used to move an existing
+// entry, whose check_time has changed.
+
BOOL CContactQueue::AddUniqueConsiderParam(int waitTime, MCONTACT hContact, PVOID param)
{
- BOOL rc;
-
mir_cslock lck(_cs);
RemoveAllConsiderParam(hContact, param);
- rc = InternalAdd(waitTime, hContact, param);
-
- return rc;
+ return InternalAdd(waitTime, hContact, param);
}
-/**
- * This member function really adds an item into the time sorted queue list.
- *
- * @param waitTime - the time to wait until the callback is desired to run
- * @param hContact - the contact to perform the action for
- * @param param - a caller defined parameter passed to the callback function
- *
- * @retval TRUE - The item is added to the queue successfully.
- * @retval FALSE - The item is not added to the queue.
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This member function really adds an item into the time sorted queue list.
+
BOOL CContactQueue::InternalAdd(int waitTime, MCONTACT hContact, PVOID param)
{
- BOOL rc;
CQueueItem *qi = (CQueueItem *) mir_alloc(sizeof(CQueueItem));
-
qi->hContact = hContact;
qi->check_time = GetTickCount() + waitTime;
qi->param = param;
- rc = _queue.insert(qi);
+ int rc = _queue.insert(qi);
if (!rc)
- {
mir_free(qi);
- }
SetEvent(_hEvent);
-
return rc;
}
-/**
- * This is the real thread callback function. As long as _status
- * is set to RUNNING it looks for items in the queue to perform
- * the _pfnCallback function on them. If the queue is empty or the
- * next upcoming item is located in the future, the thread is suspended
- * in the meanwhile.
- *
- * @param none
- *
- * @return nothing
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This is the real thread callback function. As long as _status
+// is set to RUNNING it looks for items in the queue to perform
+// the _pfnCallback function on them. If the queue is empty or the
+// next upcoming item is located in the future, the thread is suspended
+// in the meanwhile.
+
void CContactQueue::Thread()
{
- while (_status == RUNNING)
- {
+ while (_status == RUNNING) {
ResetEvent(_hEvent);
- mir_cslock lck(_cs);
+ mir_cslockfull lck(_cs);
- if (_queue.getCount() <= 0)
- {
+ if (_queue.getCount() <= 0) {
// can be used by a derivant
OnEmpty();
+ lck.unlock();
Suspend(INFINITE);
+ continue;
}
- else
- {
- // Take a look at first queue item
- CQueueItem *qi = _queue[0];
-
- int dt = qi->check_time - GetTickCount();
- if (dt > 0)
- {
- Suspend(dt);
- }
- else
- {
- // Will request this queue item
- _queue.remove(0);
-
- Callback(qi->hContact, qi->param);
-
- mir_free(qi);
- }
+
+ // Take a look at first queue item
+ CQueueItem *qi = _queue[0];
+
+ int dt = qi->check_time - GetTickCount();
+ if (dt > 0) {
+ lck.unlock();
+ Suspend(dt);
+ continue;
}
+
+ // Will request this queue item
+ _queue.remove(0);
+ lck.unlock();
+
+ Callback(qi->hContact, qi->param);
+ mir_free(qi);
}
_status = STOPPED;
}
-/**
- * This method suspends the worker thread for the given ammount of time.
- *
- * @param time - milliseconds to suspend the thread for
- *
- * @return nothing
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This method suspends the worker thread for the given ammount of time.
+
void CContactQueue::Suspend(int time) const
{
if (_status == RUNNING)
- {
WaitForSingleObject(_hEvent, time);
- }
}
-/**
- * This method resumes the worker thread and immitiatly goes on with the next entry.
- *
- * @param none
- *
- * @return nothing
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+// This method resumes the worker thread and immitiatly goes on with the next entry.
+
void CContactQueue::ContinueWithNext()
{
- if (_status == RUNNING)
- {
- int i, c, dt;
-
- mir_cslock lck(_cs);
-
- c = _queue.getCount();
- if (c > 0)
- {
- dt = _queue[0]->check_time - GetTickCount() - 3000;
- if (dt > 0)
- {
- for (i = 0; i < c; i++)
- {
- _queue[i]->check_time -= dt;
- }
- }
- }
- SetEvent(_hEvent);
+ if (_status != RUNNING)
+ return;
+
+ mir_cslock lck(_cs);
+
+ int c = _queue.getCount();
+ if (c > 0) {
+ int dt = _queue[0]->check_time - GetTickCount() - 3000;
+ if (dt > 0)
+ for (int i = 0; i < c; i++)
+ _queue[i]->check_time -= dt;
}
+ SetEvent(_hEvent);
}
diff --git a/plugins/UserInfoEx/src/mir_contactqueue.h b/plugins/UserInfoEx/src/mir_contactqueue.h
index 32ccdd1eaa..efd9fbd1dd 100644
--- a/plugins/UserInfoEx/src/mir_contactqueue.h
+++ b/plugins/UserInfoEx/src/mir_contactqueue.h
@@ -33,10 +33,8 @@ struct CQueueItem
PVOID param;
};
-/**
- *
- *
- **/
+/////////////////////////////////////////////////////////////////////////////////////////
+
class CContactQueue
{
public:
@@ -48,33 +46,23 @@ public:
STOPPED = 2
};
- CContactQueue (int initialSize = 10);
- ~CContactQueue ();
-
- inline int Size () const { return _queue.getCount();}
- inline int Remove (int idx) { mir_free(_queue[idx]); return _queue.remove(idx);}
- inline CQueueItem* Get (int idx) const { return _queue[idx];}
-
+ CContactQueue(int initialSize = 10);
+ ~CContactQueue();
+ __forceinline int Size() const {
+ return _queue.getCount();
+ }
+
+ CQueueItem* Get(int idx) const {
+ return _queue[idx];
+ }
+
void RemoveAll();
- /**
- * This function removes all queue items for the hContact.
- *
- * @param hContact - the contact whose queue items to delete
- *
- * @return nothing
- **/
+ // This function removes all queue items for the hContact.
void RemoveAll(MCONTACT hContact);
- /**
- * This function removes all queue items for the hContact considering the correct parameter.
- *
- * @param hContact - the contact whose queue items to delete
- * @param param - a caller defined parameter passed to the callback function
- *
- * @return nothing
- **/
+ // This function removes all queue items for the hContact considering the correct parameter.
void RemoveAllConsiderParam(MCONTACT hContact, PVOID param);
/**
@@ -128,19 +116,12 @@ public:
**/
BOOL AddUniqueConsiderParam (int waitTime, MCONTACT hContact, PVOID param = NULL);
- /**
- * This method resumes the worker thread and immitiatly goes on with the next entry.
- *
- * @param none
- *
- * @return nothing
- **/
+ // This method resumes the worker thread and immitiatly goes on with the next entry.
void ContinueWithNext();
protected:
-
- virtual void OnEmpty () {};
- virtual void Callback (MCONTACT hContact, PVOID param) = 0;
+ virtual void OnEmpty() {};
+ virtual void Callback(MCONTACT hContact, PVOID param) = 0;
/**
* This is the real thread callback function. As long as _status
@@ -155,32 +136,18 @@ protected:
**/
void Thread();
- /**
- * This is a static method to redirect the thread's callback function
- * to the desired class object.
- *
- * @param obj - pointer to the object (instance) of CContactQueue
- *
- * @return nothing
- **/
+ // This is a static method to redirect the thread's callback function
+ // to the desired class object.
static void ThreadProc(CContactQueue* obj)
{
obj->Thread();
}
- /**
- * This method suspends the worker thread for the given ammount of time.
- *
- * @param time - milliseconds to suspend the thread for
- *
- * @return nothing
- **/
+ // This method suspends the worker thread for the given ammount of time.
void Suspend(int time) const;
private:
-
LIST<CQueueItem> _queue;
-
mir_cs _cs;
HANDLE _hEvent;
EQueueStatus _status;
@@ -196,6 +163,8 @@ private:
* @retval FALSE - The item is not added to the queue.
**/
BOOL InternalAdd(int waitTime, MCONTACT hContact, PVOID param);
+
+ void Remove(int idx);
};
#endif // __CONTACTASYNCQUEUE_H__ \ No newline at end of file
diff --git a/plugins/UserInfoEx/src/mir_string.cpp b/plugins/UserInfoEx/src/mir_string.cpp
index 0bfa1925d6..0e43a41517 100644
--- a/plugins/UserInfoEx/src/mir_string.cpp
+++ b/plugins/UserInfoEx/src/mir_string.cpp
@@ -21,48 +21,50 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "commonheaders.h"
-char *mir_strncat_c(char *pszDest, const char cSrc)
+char* mir_strncat_c(char *pszDest, const char cSrc)
{
- char *pszRet;
size_t size = 2;
-
if (pszDest != NULL)
size += strlen(pszDest); //cSrc = 1 + 1 forNULL temination
- pszRet = (char *)mir_realloc(pszDest, (sizeof(char) * size));
+
+ char *pszRet = (char *)mir_realloc(pszDest, (sizeof(char) * size));
if (pszRet == NULL)
return NULL;
+
pszRet[size - 2] = cSrc;
pszRet[size - 1] = 0;
return pszRet;
}
-wchar_t *mir_wcsncat_c(wchar_t *pwszDest, const wchar_t wcSrc) {
- wchar_t *pwszRet;
+wchar_t* mir_wcsncat_c(wchar_t *pwszDest, const wchar_t wcSrc)
+{
size_t size = 2;
-
if (pwszDest != NULL)
size += wcslen(pwszDest); //cSrc = 1 + 1 forNULL temination
- pwszRet = (wchar_t *)mir_realloc(pwszDest, (sizeof(wchar_t) * size));
+
+ wchar_t *pwszRet = (wchar_t *)mir_realloc(pwszDest, (sizeof(wchar_t) * size));
if (pwszRet == NULL)
return NULL;
+
pwszRet[size - 2] = wcSrc;
pwszRet[size - 1] = 0;
return pwszRet;
}
-char *mir_strnerase(char *pszDest, size_t sizeFrom, size_t sizeTo) {
+char* mir_strnerase(char *pszDest, size_t sizeFrom, size_t sizeTo)
+{
char *pszReturn = NULL;
size_t sizeNew, sizeLen = strlen(pszDest);
if (sizeFrom >= 0 && sizeFrom < sizeLen && sizeTo >= 0 && sizeTo <= sizeLen && sizeFrom < sizeTo) {
sizeNew = sizeLen - (sizeTo - sizeFrom);
size_t sizeCopy = sizeNew - sizeFrom;
- pszReturn = (char *) mir_alloc(sizeNew + 1);
+ pszReturn = (char *)mir_alloc(sizeNew + 1);
memcpy(pszReturn, pszDest, sizeFrom);
memcpy(pszReturn + sizeFrom, pszDest + sizeTo, sizeCopy);
pszReturn[sizeNew] = 0;
}
- pszDest = (char *) mir_realloc(pszDest, sizeNew + 1);
+ pszDest = (char *)mir_realloc(pszDest, sizeNew + 1);
pszDest = mir_strcpy(pszDest, pszReturn);
mir_free(pszReturn);
return pszDest;
@@ -72,11 +74,12 @@ int mir_IsEmptyA(char *str)
{
if (str == NULL || str[0] == 0)
return 1;
+
int i = 0;
while (str[i]) {
- if (str[i]!=' ' &&
- str[i]!='\r' &&
- str[i]!='\n')
+ if (str[i] != ' ' &&
+ str[i] != '\r' &&
+ str[i] != '\n')
return 0;
i++;
}
@@ -87,14 +90,14 @@ int mir_IsEmptyW(wchar_t *str)
{
if (str == NULL || str[0] == 0)
return 1;
+
int i = 0;
while (str[i]) {
- if (str[i]!=' ' &&
- str[i]!='\r' &&
- str[i]!='\n')
+ if (str[i] != ' ' &&
+ str[i] != '\r' &&
+ str[i] != '\n')
return 0;
i++;
}
return 1;
}
-