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
;
18 BOOL
FP_ItemList::Realloc(int NewSize
)
23 if(NewSize
<= MaxCount
)
29 List
= (PluginPanelItem
*)malloc(sizeof(PluginPanelItem
)*MaxCount
);
31 List
= (PluginPanelItem
*)realloc(List
,sizeof(PluginPanelItem
)*MaxCount
);
43 PluginPanelItem
*FP_ItemList::Add(const PluginPanelItem
*pi
,int icn
)
45 if(!Realloc(ItemsCount
+icn
))
48 PluginPanelItem
*p
= List
+ ItemsCount
; //!! Do not use Item(ItemsCount) because we need point after last element
54 void FP_ItemList::Clear(void)
57 Free(List
,ItemsCount
);
65 bool IsBadReadPtr(const void *p
, size_t l
)
67 ULONG_PTR v
= (ULONG_PTR
)p
;
71 void FP_ItemList::Copy(PluginPanelItem
*dest
,const PluginPanelItem
*src
,int cn
)
75 memmove(dest
, src
, sizeof(*dest
)*cn
);
77 for(; cn
; cn
--,src
++,dest
++)
80 if(IS_FLAG(src
->Flags
,PPIF_USERDATA
))
82 DWORD sz
= (src
->UserData
&& !IsBadReadPtr((void*)src
->UserData
,sizeof(DWORD
)))
83 ? (*((DWORD
*)src
->UserData
))
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
);
94 CLR_FLAG(dest
->Flags
,PPIF_USERDATA
);
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
]);
111 dest
->Description
= strdup(src
->Description
);
115 dest
->Owner
= strdup(src
->Owner
);
118 if(FPIL_ADDEXIST(src
))
120 DWORD sz
= FPIL_ADDSIZE(src
);
121 LPVOID ptr
= malloc(sz
);
125 memmove(ptr
, FPIL_ADDDATA(src
), sz
);
126 FPIL_ADDSET(dest
, sz
, ptr
);
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
++)
141 if(IS_FLAG(List
->Flags
,PPIF_USERDATA
))
143 free((char*)List
->UserData
);
148 for(int n
= 0; n
< List
->CustomColumnNumber
; n
++)
149 free(List
->CustomColumnData
[n
]);
151 if(List
->CustomColumnData
)
152 free(List
->CustomColumnData
);
155 if(List
->Description
)
156 free(List
->Description
), List
->Description
= NULL
;
160 free(List
->Owner
), List
->Owner
= NULL
;
163 if(FPIL_ADDEXIST(List
))
165 free(FPIL_ADDDATA(List
));
166 List
->Reserved
[0] = 0;
167 List
->Reserved
[1] = 0;