draft `far:about`: separate FarAbout() function
[far2l.git] / inside / src / ItemList.cpp
blob9f93117f33087d81a299d422faf9e326d4662aa6
1 #include "ItemList.h"
3 inline BOOL FPIL_ADDEXIST(const PluginPanelItem *p) { return ((p)->Reserved[0] && (p)->Reserved[1]); }
4 inline DWORD FPIL_ADDSIZE(const PluginPanelItem *p) { return FPIL_ADDEXIST(p) ? (DWORD)(p)->Reserved[0] : 0; }
5 inline LPVOID FPIL_ADDDATA(const PluginPanelItem *p) { return FPIL_ADDEXIST(p) ? ((void*)(p)->Reserved[1]) : NULL; }
6 inline void FPIL_ADDSET(PluginPanelItem *p, DWORD sz, LPVOID dt) { (p)->Reserved[0] = sz; (p)->Reserved[1] = (DWORD_PTR)dt; }
8 //---------------------------------------------------------------------------------
9 FP_ItemList::FP_ItemList(BOOL NeedToDelete)
11 needToDelete = NeedToDelete;
12 List = NULL;
13 ItemsCount = 0;
14 MaxCount = 0;
18 BOOL FP_ItemList::Realloc(int NewSize)
20 if(!NewSize)
21 return FALSE;
23 if(NewSize <= MaxCount)
24 return TRUE;
26 MaxCount = NewSize;
28 if(!List)
29 List = (PluginPanelItem*)malloc(sizeof(PluginPanelItem)*MaxCount);
30 else
31 List = (PluginPanelItem *)realloc(List,sizeof(PluginPanelItem)*MaxCount);
33 if(!List)
35 ItemsCount = 0;
36 MaxCount = 0;
37 return FALSE;
40 return TRUE;
43 PluginPanelItem *FP_ItemList::Add(const PluginPanelItem *pi,int icn)
45 if(!Realloc(ItemsCount+icn))
46 return NULL;
48 PluginPanelItem *p = List + ItemsCount; //!! Do not use Item(ItemsCount) because we need point after last element
49 Copy(p, pi, icn);
50 ItemsCount += icn;
51 return p;
54 void FP_ItemList::Clear(void)
56 if(needToDelete)
57 Free(List,ItemsCount);
59 ItemsCount = 0;
60 MaxCount = 0;
61 List = NULL;
65 bool IsBadReadPtr(const void *p, size_t l)
67 ULONG_PTR v = (ULONG_PTR)p;
68 return v<0x10000;
71 void FP_ItemList::Copy(PluginPanelItem *dest,const PluginPanelItem *src,int cn)
73 if(!cn) return;
75 memmove(dest, src, sizeof(*dest)*cn);
77 for(; cn; cn--,src++,dest++)
79 //User data
80 if(IS_FLAG(src->Flags,PPIF_USERDATA))
82 DWORD sz = (src->UserData && !IsBadReadPtr((void*)src->UserData,sizeof(DWORD)))
83 ? (*((DWORD*)src->UserData))
84 : 0;
86 if(sz && !IsBadReadPtr((void*)src->UserData,sz))
88 dest->UserData = (DWORD_PTR)malloc(sz+1);
89 memmove((char*)dest->UserData,(char*)src->UserData,sz);
91 else
93 dest->UserData = 0;
94 CLR_FLAG(dest->Flags,PPIF_USERDATA);
98 //CustomColumn
99 if(src->CustomColumnNumber)
101 dest->CustomColumnData = (LPSTR*)malloc(sizeof(LPSTR*)*src->CustomColumnNumber);
103 for(int n = 0; n < src->CustomColumnNumber; n++)
105 dest->CustomColumnData[n] = strdup(src->CustomColumnData[n]);
109 //Description
110 if(src->Description)
111 dest->Description = strdup(src->Description);
113 //Owner
114 if(src->Owner)
115 dest->Owner = strdup(src->Owner);
117 //Additionals
118 if(FPIL_ADDEXIST(src))
120 DWORD sz = FPIL_ADDSIZE(src);
121 LPVOID ptr = malloc(sz);
123 if(ptr)
125 memmove(ptr, FPIL_ADDDATA(src), sz);
126 FPIL_ADDSET(dest, sz, ptr);
128 else
129 FPIL_ADDSET(dest, 0, NULL);
134 void FP_ItemList::Free(PluginPanelItem *List,int count)
136 PluginPanelItem *p = List;
138 for(int i = 0; i < count; i++,List++)
140 //UserData
141 if(IS_FLAG(List->Flags,PPIF_USERDATA))
143 free((char*)List->UserData);
144 List->UserData = 0;
147 //CustomColumn
148 for(int n = 0; n < List->CustomColumnNumber; n++)
149 free(List->CustomColumnData[n]);
151 if(List->CustomColumnData)
152 free(List->CustomColumnData);
154 //Description
155 if(List->Description)
156 free(List->Description), List->Description = NULL;
158 //Owner
159 if(List->Owner)
160 free(List->Owner), List->Owner = NULL;
162 //Additionals
163 if(FPIL_ADDEXIST(List))
165 free(FPIL_ADDDATA(List));
166 List->Reserved[0] = 0;
167 List->Reserved[1] = 0;
171 free(p);