-
Notifications
You must be signed in to change notification settings - Fork 0
/
SearcherItmBuffer.cpp
142 lines (138 loc) · 4.59 KB
/
SearcherItmBuffer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "SearcherItmBuffer.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TSearcherItmBuffer::TSearcherItmBuffer()
: TList()
{
BufferUsed=sizeof(TSearcherItmBuffer);
}
//---------------------------------------------------------------------------
__fastcall TSearcherItmBuffer::~TSearcherItmBuffer()
{
__try
{
//Czyszczenie pointerów mamy w klasie nadrzêdnej,
// ale Delete usuwa te¿ struktury z pamiêci
while (Count>0)
Delete(Count-1);
}
__except(EXCEPTION_EXECUTE_HANDLER) { };
}
//---------------------------------------------------------------------------
void __fastcall TSearcherItmBuffer::Delete(int Index)
{
if (Index>=Count) return;
FreeItem(Index);
TList::Delete(Index);
}
//---------------------------------------------------------------------------
void __fastcall TSearcherItmBuffer::FreeItem(int Index)
{
if (Index>=Count) return;
TSrchItmBufItem *DelItem=Items[Index];
if (DelItem!=NULL)
{
if (DelItem->FileBody!=NULL)
{
BufferUsed-=(sizeof(TStringList)+DelItem->Size);
DelItem->FileBody->Free();
}
BufferUsed-=sizeof(TSrchItmBufItem);
delete DelItem;
Items[Index]=NULL;
}
}
//---------------------------------------------------------------------------
TSrchItmBufItem* __fastcall TSearcherItmBuffer::GetItm(int Index)
{
if ((Index<Count)&&(Index>=0))
return (TSrchItmBufItem*)Get(Index);
else
return NULL;
}
//---------------------------------------------------------------------------
void __fastcall TSearcherItmBuffer::PutItm(int Index, TSrchItmBufItem *Item)
{
if (Index>=Count) ChangeItemsCount(Index+2);
Put(Index,Item);
}
//---------------------------------------------------------------------------
bool __fastcall TSearcherItmBuffer::CanLoad(int nItmNumber, AnsiString nFileName)
{
// Sprawdza czy w buforze jest odpowiedni do pobrania plik bazy
TSearchRec F;
TSrchItmBufItem *CurItem=Items[nItmNumber];
//Sprawdzamy czy w ogóle mamy bufor i za³adowany plik
if (CurItem==NULL) return false;
if (CurItem->FileBody==NULL) return false;
//Skoro cos jest za³adowane, sprawdzamy czy pasuje do pliku na dysku
if (FindFirst(nFileName,faReadOnly+faHidden+faSysFile+faArchive,F)!=0) return false;
if (F.Time!=CurItem->Time) return false;
if (F.Size!=CurItem->Size) return false;
return true;
}
//---------------------------------------------------------------------------
void __fastcall TSearcherItmBuffer::ChangeItemsCount(int nCount)
// Wywo³ywana by zmieniæ liczbê wskaŸników pamiêtanych
// w buforze
{
while (Count>nCount)
Delete(Count-1);
if (Count<nCount)
Count=nCount; //To spowoduje dostawienie pustych wskaŸników
}
//---------------------------------------------------------------------------
int __fastcall TSearcherItmBuffer::ConsiderAddingItem(int nItmNumber, AnsiString nFileName, Classes::TStrings* nFileBody)
{
// Okreœla czy w buforze jest miejsce, jak tak to dodaje tam plik.
// Zwraca 0 jezeli doda plik.
TSearchRec F;
//usuwamy to, co mog³o buc wczesniej w buforze
FreeItem(nItmNumber);
//szukamy pliku na dysku
if (FindFirst(nFileName,faReadOnly+faHidden+faSysFile+faArchive,F)!=0) return 12;
//wiec wszystko mamy. Teraz decyzja: czy dodawac
// Potem mo¿e napiszê lepszy system decyzyjny (w buforze lepiej trzymac male pliki)
if (BufferUsed+F.Size > MaxBuffer) return 11;
//no i dodajemy
return AddItm(nItmNumber,F.Time,F.Size,nFileBody);
}
//---------------------------------------------------------------------------
int __fastcall TSearcherItmBuffer::AddItm(int nItmNumber, int nDate, int nFileSize, Classes::TStrings* &nFileBody)
{
// Dodaje element do bufora.
// Zwraca 0 jesli doda.
TSrchItmBufItem *Item;
__try
{
FreeItem(nItmNumber);
Item=new TSrchItmBufItem;
__try
{
BufferUsed+=sizeof(TSrchItmBufItem);
Item->Time=nDate;
Item->Size=nFileSize;
Item->FileBody=new TStringList();
Item->FileBody->Assign(nFileBody);
BufferUsed+=(sizeof(TStringList)+Item->Size);
Items[nItmNumber]=Item;
return 0;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
BufferUsed-=sizeof(TSrchItmBufItem);
delete Item;
Items[nItmNumber]=NULL;
return 2;
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
Items[nItmNumber]=NULL;
return 1;
}
}
//---------------------------------------------------------------------------