MCPcopy Create free account
hub / github.com/abbeycode/UnrarKit / DllVolChange

Function DllVolChange

Libraries/unrar/volume.cpp:181–253  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

179#endif
180
181bool DllVolChange(RAROptions *Cmd,wchar *NextName,size_t NameSize)
182{
183 bool DllVolChanged=false,DllVolAborted=false;
184
185 if (Cmd->Callback!=NULL)
186 {
187 wchar OrgNextName[NM];
188 wcsncpyz(OrgNextName,NextName,ASIZE(OrgNextName));
189 if (Cmd->Callback(UCM_CHANGEVOLUMEW,Cmd->UserData,(LPARAM)NextName,RAR_VOL_ASK)==-1)
190 DllVolAborted=true;
191 else
192 if (wcscmp(OrgNextName,NextName)!=0)
193 DllVolChanged=true;
194 else
195 {
196 char NextNameA[NM],OrgNextNameA[NM];
197 WideToChar(NextName,NextNameA,ASIZE(NextNameA));
198 strncpyz(OrgNextNameA,NextNameA,ASIZE(OrgNextNameA));
199 if (Cmd->Callback(UCM_CHANGEVOLUME,Cmd->UserData,(LPARAM)NextNameA,RAR_VOL_ASK)==-1)
200 DllVolAborted=true;
201 else
202 if (strcmp(OrgNextNameA,NextNameA)!=0)
203 {
204 // We can damage some Unicode characters by U->A->U conversion,
205 // so set Unicode name only if we see that ANSI name is changed.
206 CharToWide(NextNameA,NextName,NameSize);
207 DllVolChanged=true;
208 }
209 }
210 }
211 if (!DllVolChanged && Cmd->ChangeVolProc!=NULL)
212 {
213 char NextNameA[NM];
214 WideToChar(NextName,NextNameA,ASIZE(NextNameA));
215 // Here we preserve ESP value. It is necessary for those developers,
216 // who still define ChangeVolProc callback as "C" type function,
217 // even though in year 2001 we announced in unrar.dll whatsnew.txt
218 // that it will be PASCAL type (for compatibility with Visual Basic).
219#if defined(_MSC_VER)
220#ifndef _WIN_64
221 __asm mov ebx,esp
222#endif
223#elif defined(_WIN_ALL) && defined(__BORLANDC__)
224 _EBX=_ESP;
225#endif
226 int RetCode=Cmd->ChangeVolProc(NextNameA,RAR_VOL_ASK);
227
228 // Restore ESP after ChangeVolProc with wrongly defined calling
229 // convention broken it.
230#if defined(_MSC_VER)
231#ifndef _WIN_64
232 __asm mov esp,ebx
233#endif
234#elif defined(_WIN_ALL) && defined(__BORLANDC__)
235 _ESP=_EBX;
236#endif
237 if (RetCode==0)
238 DllVolAborted=true;

Callers 1

MergeArchiveFunction · 0.85

Calls 4

wcsncpyzFunction · 0.85
WideToCharFunction · 0.85
strncpyzFunction · 0.85
CharToWideFunction · 0.85

Tested by

no test coverage detected