kmmsglist.cpp
00001
00002
00003 #ifdef HAVE_CONFIG_H
00004 #include <config.h>
00005 #endif
00006
00007 #include "kmmsglist.h"
00008 #include "kmmsgdict.h"
00009 #include "kmkernel.h"
00010 #include <assert.h>
00011 #include <stdlib.h>
00012
00013
00014 KMMsgList::KMMsgList(int initSize)
00015 : QMemArray<KMMsgBase*>(initSize),
00016 mHigh( 0 ), mCount( 0 )
00017 {
00018 if ( size() > 0 )
00019 for (unsigned int i=size(); i>0; i--)
00020 QMemArray<KMMsgBase*>::at(i-1) = 0;
00021 }
00022
00023
00024
00025 KMMsgList::~KMMsgList()
00026 {
00027 clear(TRUE);
00028 }
00029
00030
00031
00032 void KMMsgList::clear(bool doDelete, bool syncDict)
00033 {
00034 KMMsgDict *dict = 0;
00035 if (syncDict)
00036 dict = kmkernel->msgDict();
00037
00038 if ( mHigh > 0 )
00039 for (unsigned int i=mHigh; i>0; i--)
00040 {
00041 KMMsgBase * msg = at(i-1);
00042 if (msg) {
00043 if (dict)
00044 dict->remove(msg);
00045 at(i-1) = 0;
00046 if (doDelete) delete msg;
00047 }
00048 }
00049 mHigh = 0;
00050 mCount = 0;
00051 }
00052
00053
00054
00055 bool KMMsgList::resize(unsigned int aSize)
00056 {
00057 unsigned int i, oldSize = size();
00058 KMMsgBase* msg;
00059
00060
00061 if (aSize < mHigh)
00062 {
00063 for (i=aSize; i<mHigh; i++)
00064 {
00065 msg = at(i);
00066 if (msg)
00067 {
00068 delete msg;
00069 mCount--;
00070 }
00071 mHigh = aSize;
00072 }
00073 }
00074
00075
00076 if (!QMemArray<KMMsgBase*>::resize(aSize)) return FALSE;
00077
00078
00079 for (i=oldSize; i<aSize; i++)
00080 at(i) = 0;
00081
00082 return TRUE;
00083 }
00084
00085
00086
00087 bool KMMsgList::reset(unsigned int aSize)
00088 {
00089 if (!resize(aSize)) return FALSE;
00090 clear();
00091 return TRUE;
00092 }
00093
00094
00095
00096 void KMMsgList::set(unsigned int idx, KMMsgBase* aMsg)
00097 {
00098 if (idx >= size())
00099 resize( idx > 2 * size() ? idx + 16 : 2 * size() );
00100
00101 if (!at(idx) && aMsg) mCount++;
00102 else if (at(idx) && !aMsg) mCount--;
00103
00104 delete at(idx);
00105
00106 at(idx) = aMsg;
00107
00108 if (!aMsg || idx >= mHigh) rethinkHigh();
00109 }
00110
00111
00112
00113 void KMMsgList::insert(unsigned int idx, KMMsgBase* aMsg, bool syncDict)
00114 {
00115 KMMsgDict *dict = 0;
00116 if (syncDict)
00117 dict = kmkernel->msgDict();
00118
00119 if (idx >= size())
00120 resize( idx > 2 * size() ? idx + 16 : 2 * size() );
00121
00122 if (aMsg) mCount++;
00123
00124 for (unsigned int i=mHigh; i>idx; i--) {
00125 if (dict)
00126 dict->remove(at(i - 1));
00127 at(i) = at(i-1);
00128 if (dict)
00129 dict->insert(at(i), i);
00130 }
00131
00132 at(idx) = aMsg;
00133 if (dict)
00134 dict->insert(at(idx), idx);
00135
00136 mHigh++;
00137 }
00138
00139
00140
00141 unsigned int KMMsgList::append(KMMsgBase* aMsg, bool syncDict)
00142 {
00143 const unsigned int idx = mHigh;
00144 insert(idx, aMsg, syncDict);
00145 return idx;
00146 }
00147
00148
00149
00150 void KMMsgList::remove(unsigned int idx)
00151 {
00152 assert(idx<size());
00153 KMMsgDict *dict = kmkernel->msgDict();
00154
00155 if (at(idx)) {
00156 mCount--;
00157 if (dict)
00158 dict->remove(at(idx));
00159 }
00160
00161 mHigh--;
00162 for (unsigned int i=idx; i<mHigh; i++) {
00163 if (dict)
00164 dict->update(at(i + 1), i + 1, i);
00165 at(i) = at(i+1);
00166 }
00167
00168 at(mHigh) = 0;
00169
00170 rethinkHigh();
00171 }
00172
00173
00174
00175 KMMsgBase* KMMsgList::take(unsigned int idx)
00176 {
00177 KMMsgBase* msg=at(idx);
00178 remove(idx);
00179 return msg;
00180 }
00181
00182
00183
00184 void KMMsgList::rethinkHigh()
00185 {
00186 unsigned int sz = size();
00187
00188 if (mHigh < sz && at(mHigh))
00189 {
00190
00191 while (mHigh < sz && at(mHigh))
00192 mHigh++;
00193 }
00194 else
00195 {
00196
00197 while (mHigh>0 && !at(mHigh-1))
00198 mHigh--;
00199 }
00200 }
00201
00202
00203 void KMMsgList::fillMsgDict(KMMsgDict *dict)
00204 {
00205 for (unsigned int idx = 0; idx < mHigh; idx++)
00206 if (at(idx))
00207 dict->insert(0, at(idx), idx);
00208 }
This file is part of the documentation for kmail Library Version 3.2.2.