00001 #include "MessageList.h"
00002 #include <stdio.h>
00003 namespace rwil {
00004 void MessageList::Add(const Message& msg)
00005 {
00006 list<Message> lst;
00007
00008 lst.push_back(msg);
00009 Add(lst);
00010 }
00011 void MessageList::Add(list<Message>& messages)
00012 {
00013 if(m_addcallback)
00014 m_addcallback(messages);
00015 ScopedMutex scope(m_op);
00016 messages.sort();
00017 m_messages.merge(messages);
00018 m_count.Signal();
00019 }
00020
00021 void MessageList::SetAddCallback(rwil_MessageList_AddCallback_t callback)
00022 {
00023 m_addcallback = callback;
00024 }
00025 list<Message *> MessageList::Query(time_t start, time_t end)
00026 {
00027 ScopedMutex scope(m_op);
00028 list<Message>::iterator iter;
00029 list<Message *> retval;
00030
00031 iter = m_messages.begin();
00032 while(iter != m_messages.end())
00033 {
00034 time_t when = (*iter).GetWhen();
00035 if((when >= start) && ( when <=end))
00036 {
00037 retval.push_back(&(*iter));
00038 }
00039
00040 iter++;
00041 }
00042 return retval;
00043 }
00044
00045 list<Message *> MessageList::Query(std::string paramname, std::string value)
00046 {
00047 ScopedMutex scope(m_op);
00048 list<Message>::iterator iter;
00049 list<Message *> retval;
00050
00051 iter = m_messages.begin();
00052
00053 while(iter != m_messages.end())
00054 {
00055 if((*iter).GetParam(paramname) == value)
00056 {
00057 retval.push_back(&(*iter));
00058 }
00059 iter++;
00060 }
00061 return retval;
00062 }
00063
00064
00065 void MessageList::Destroy(list<Message*> messages)
00066 {
00067 ScopedMutex scope(m_op);
00068 list<Message *>::iterator piter;
00069 list<Message>::iterator miter;
00070 piter = messages.begin();
00071 while(piter != messages.end())
00072 {
00073 miter = m_messages.begin();
00074 while(miter != m_messages.end())
00075 {
00076 if(&(*miter) == *piter)
00077 {
00078 m_messages.erase(miter);
00079 break;
00080 }
00081 }
00082 piter++;
00083 }
00084 }
00085
00086 void MessageList::Lock()
00087 {
00088 m_lock.Wait();
00089 }
00090 void MessageList::Release()
00091 {
00092 m_lock.Release();
00093 }
00094
00095 bool MessageList::Wait(int milli)
00096 {
00097 return m_count.Wait(milli);
00098 }
00099
00100 void MessageList::Wait()
00101 {
00102 return m_count.Wait();
00103 }
00104 }