| 179 | #endif |
| 180 | |
| 181 | bool 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; |
no test coverage detected