| OLD | NEW |
| (Empty) |
| 1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | |
| 2 /* ***** BEGIN LICENSE BLOCK ***** | |
| 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | |
| 4 * | |
| 5 * The contents of this file are subject to the Mozilla Public License Version | |
| 6 * 1.1 (the "License"); you may not use this file except in compliance with | |
| 7 * the License. You may obtain a copy of the License at | |
| 8 * http://www.mozilla.org/MPL/ | |
| 9 * | |
| 10 * Software distributed under the License is distributed on an "AS IS" basis, | |
| 11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | |
| 12 * for the specific language governing rights and limitations under the | |
| 13 * License. | |
| 14 * | |
| 15 * The Original Code is mozilla.org code. | |
| 16 * | |
| 17 * The Initial Developer of the Original Code is | |
| 18 * Netscape Communications Corporation. | |
| 19 * Portions created by the Initial Developer are Copyright (C) 1998 | |
| 20 * the Initial Developer. All Rights Reserved. | |
| 21 * | |
| 22 * Contributor(s): | |
| 23 * | |
| 24 * Alternatively, the contents of this file may be used under the terms of | |
| 25 * either the GNU General Public License Version 2 or later (the "GPL"), or | |
| 26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | |
| 27 * in which case the provisions of the GPL or the LGPL are applicable instead | |
| 28 * of those above. If you wish to allow use of your version of this file only | |
| 29 * under the terms of either the GPL or the LGPL, and not to allow others to | |
| 30 * use your version of this file under the terms of the MPL, indicate your | |
| 31 * decision by deleting the provisions above and replace them with the notice | |
| 32 * and other provisions required by the GPL or the LGPL. If you do not delete | |
| 33 * the provisions above, a recipient may use your version of this file under | |
| 34 * the terms of any one of the MPL, the GPL or the LGPL. | |
| 35 * | |
| 36 * ***** END LICENSE BLOCK ***** */ | |
| 37 | |
| 38 #include <string> | |
| 39 #include <vector> | |
| 40 #include <errno.h> | |
| 41 | |
| 42 | |
| 43 #include "xp.h" | |
| 44 | |
| 45 #include "format.h" | |
| 46 #include "logger.h" | |
| 47 | |
| 48 extern Logger * logger; | |
| 49 | |
| 50 //////////////////////////////////////////////////////////////////////////////// | |
| 51 // From Google Chrome's string_util.cc | |
| 52 | |
| 53 // It's possible for functions that use a va_list, such as StringPrintf, to | |
| 54 // invalidate the data in it upon use. The fix is to make a copy of the | |
| 55 // structure before using it and use that copy instead. va_copy is provided | |
| 56 // for this purpose. MSVC does not provide va_copy, so define an | |
| 57 // implementation here. It is not guaranteed that assignment is a copy, so the | |
| 58 // StringUtil.__GNUC__ unit test tests this capability. | |
| 59 #if defined(COMPILER_GCC) | |
| 60 #define GG_VA_COPY(a, b) (va_copy(a, b)) | |
| 61 #elif defined(_MSC_VER) | |
| 62 #define GG_VA_COPY(a, b) (a = b) | |
| 63 #endif | |
| 64 | |
| 65 | |
| 66 // The arraysize(arr) macro returns the # of elements in an array arr. | |
| 67 // The expression is a compile-time constant, and therefore can be | |
| 68 // used in defining new arrays, for example. If you use arraysize on | |
| 69 // a pointer by mistake, you will get a compile-time error. | |
| 70 // | |
| 71 // One caveat is that arraysize() doesn't accept any array of an | |
| 72 // anonymous type or a type defined inside a function. In these rare | |
| 73 // cases, you have to use the unsafe ARRAYSIZE_UNSAFE() macro below. This is | |
| 74 // due to a limitation in C++'s template system. The limitation might | |
| 75 // eventually be removed, but it hasn't happened yet. | |
| 76 | |
| 77 // This template function declaration is used in defining arraysize. | |
| 78 // Note that the function doesn't need an implementation, as we only | |
| 79 // use its type. | |
| 80 template <typename T, size_t N> | |
| 81 char (&ArraySizeHelper(T (&array)[N]))[N]; | |
| 82 | |
| 83 // That gcc wants both of these prototypes seems mysterious. VC, for | |
| 84 // its part, can't decide which to use (another mystery). Matching of | |
| 85 // template overloads: the final frontier. | |
| 86 #ifndef _MSC_VER | |
| 87 template <typename T, size_t N> | |
| 88 char (&ArraySizeHelper(const T (&array)[N]))[N]; | |
| 89 #endif | |
| 90 | |
| 91 #define arraysize(array) (sizeof(ArraySizeHelper(array))) | |
| 92 | |
| 93 #if defined(_WIN32) | |
| 94 inline int vsnprintf(char* buffer, size_t size, | |
| 95 const char* format, va_list arguments) { | |
| 96 int length = vsnprintf_s(buffer, size, size - 1, format, arguments); | |
| 97 if (length < 0) | |
| 98 return _vscprintf(format, arguments); | |
| 99 return length; | |
| 100 } | |
| 101 #else | |
| 102 inline int vsnprintf(char* buffer, size_t size, | |
| 103 const char* format, va_list arguments) { | |
| 104 return ::vsnprintf(buffer, size, format, arguments); | |
| 105 } | |
| 106 #endif | |
| 107 | |
| 108 | |
| 109 // Templatized backend for StringPrintF/StringAppendF. This does not finalize | |
| 110 // the va_list, the caller is expected to do that. | |
| 111 template <class StringType> | |
| 112 static void StringAppendVT(StringType* dst, | |
| 113 const typename StringType::value_type* format, | |
| 114 va_list ap) { | |
| 115 // First try with a small fixed size buffer. | |
| 116 // This buffer size should be kept in sync with StringUtilTest.GrowBoundary | |
| 117 // and StringUtilTest.StringPrintfBounds. | |
| 118 typename StringType::value_type stack_buf[1024]; | |
| 119 | |
| 120 va_list ap_copy; | |
| 121 GG_VA_COPY(ap_copy, ap); | |
| 122 | |
| 123 #if !defined(_WIN32) | |
| 124 errno = 0; | |
| 125 #endif | |
| 126 int result = vsnprintf(stack_buf, arraysize(stack_buf), format, ap_copy); | |
| 127 va_end(ap_copy); | |
| 128 | |
| 129 if (result >= 0 && result < static_cast<int>(arraysize(stack_buf))) { | |
| 130 // It fit. | |
| 131 dst->append(stack_buf, result); | |
| 132 return; | |
| 133 } | |
| 134 | |
| 135 // Repeatedly increase buffer size until it fits. | |
| 136 int mem_length = arraysize(stack_buf); | |
| 137 while (true) { | |
| 138 if (result < 0) { | |
| 139 #if !defined(_WIN32) | |
| 140 // On Windows, vsnprintf always returns the number of characters in a | |
| 141 // fully-formatted string, so if we reach this point, something else is | |
| 142 // wrong and no amount of buffer-doubling is going to fix it. | |
| 143 if (errno != 0 && errno != EOVERFLOW) | |
| 144 #endif | |
| 145 { | |
| 146 // If an error other than overflow occurred, it's never going to work. | |
| 147 return; | |
| 148 } | |
| 149 // Try doubling the buffer size. | |
| 150 mem_length *= 2; | |
| 151 } else { | |
| 152 // We need exactly "result + 1" characters. | |
| 153 mem_length = result + 1; | |
| 154 } | |
| 155 | |
| 156 if (mem_length > 32 * 1024 * 1024) { | |
| 157 // That should be plenty, don't try anything larger. This protects | |
| 158 // against huge allocations when using vsnprintf implementations that | |
| 159 // return -1 for reasons other than overflow without setting errno. | |
| 160 return; | |
| 161 } | |
| 162 | |
| 163 std::vector<typename StringType::value_type> mem_buf(mem_length); | |
| 164 | |
| 165 // NOTE: You can only use a va_list once. Since we're in a while loop, we | |
| 166 // need to make a new copy each time so we don't use up the original. | |
| 167 GG_VA_COPY(ap_copy, ap); | |
| 168 result = vsnprintf(&mem_buf[0], mem_length, format, ap_copy); | |
| 169 va_end(ap_copy); | |
| 170 | |
| 171 if ((result >= 0) && (result < mem_length)) { | |
| 172 // It fit. | |
| 173 dst->append(&mem_buf[0], result); | |
| 174 return; | |
| 175 } | |
| 176 } | |
| 177 } | |
| 178 | |
| 179 std::string StringPrintf(const char* format, ...) { | |
| 180 va_list ap; | |
| 181 va_start(ap, format); | |
| 182 std::string result; | |
| 183 StringAppendVT(&result, format, ap); | |
| 184 va_end(ap); | |
| 185 return result; | |
| 186 } | |
| 187 | |
| 188 //////////////////////////////////////////////////////////////////////////////// | |
| 189 | |
| 190 | |
| 191 char * FormatNPAPIError(int iError) | |
| 192 { | |
| 193 static char szError[64]; | |
| 194 switch (iError) | |
| 195 { | |
| 196 case NPERR_NO_ERROR: | |
| 197 sprintf(szError, "NPERR_NO_ERROR"); | |
| 198 break; | |
| 199 case NPERR_GENERIC_ERROR: | |
| 200 sprintf(szError, "NPERR_GENERIC_ERROR"); | |
| 201 break; | |
| 202 case NPERR_INVALID_INSTANCE_ERROR: | |
| 203 sprintf(szError, "NPERR_INVALID_INSTANCE_ERROR"); | |
| 204 break; | |
| 205 case NPERR_INVALID_FUNCTABLE_ERROR: | |
| 206 sprintf(szError, "NPERR_INVALID_FUNCTABLE_ERROR"); | |
| 207 break; | |
| 208 case NPERR_MODULE_LOAD_FAILED_ERROR: | |
| 209 sprintf(szError, "NPERR_MODULE_LOAD_FAILED_ERROR"); | |
| 210 break; | |
| 211 case NPERR_OUT_OF_MEMORY_ERROR: | |
| 212 sprintf(szError, "NPERR_OUT_OF_MEMORY_ERROR"); | |
| 213 break; | |
| 214 case NPERR_INVALID_PLUGIN_ERROR: | |
| 215 sprintf(szError, "NPERR_INVALID_PLUGIN_ERROR"); | |
| 216 break; | |
| 217 case NPERR_INVALID_PLUGIN_DIR_ERROR: | |
| 218 sprintf(szError, "NPERR_INVALID_PLUGIN_DIR_ERROR"); | |
| 219 break; | |
| 220 case NPERR_INCOMPATIBLE_VERSION_ERROR: | |
| 221 sprintf(szError, "NPERR_INCOMPATIBLE_VERSION_ERROR"); | |
| 222 break; | |
| 223 case NPERR_INVALID_PARAM: | |
| 224 sprintf(szError, "NPERR_INVALID_PARAM"); | |
| 225 break; | |
| 226 case NPERR_INVALID_URL: | |
| 227 sprintf(szError, "NPERR_INVALID_URL"); | |
| 228 break; | |
| 229 case NPERR_FILE_NOT_FOUND: | |
| 230 sprintf(szError, "NPERR_FILE_NOT_FOUND"); | |
| 231 break; | |
| 232 case NPERR_NO_DATA: | |
| 233 sprintf(szError, "NPERR_NO_DATA"); | |
| 234 break; | |
| 235 case NPERR_STREAM_NOT_SEEKABLE: | |
| 236 sprintf(szError, "NPERR_STREAM_NOT_SEEKABLE"); | |
| 237 break; | |
| 238 default: | |
| 239 sprintf(szError, "Unlisted error"); | |
| 240 break; | |
| 241 } | |
| 242 return &szError[0]; | |
| 243 } | |
| 244 | |
| 245 char * FormatNPAPIReason(int iReason) | |
| 246 { | |
| 247 static char szReason[64]; | |
| 248 switch (iReason) | |
| 249 { | |
| 250 case NPRES_DONE: | |
| 251 sprintf(szReason, "NPRES_DONE"); | |
| 252 break; | |
| 253 case NPRES_NETWORK_ERR: | |
| 254 sprintf(szReason, "NPRES_NETWORK_ERR"); | |
| 255 break; | |
| 256 case NPRES_USER_BREAK: | |
| 257 sprintf(szReason, "NPRES_USER_BREAK"); | |
| 258 break; | |
| 259 default: | |
| 260 sprintf(szReason, "Unlisted reason"); | |
| 261 break; | |
| 262 } | |
| 263 return &szReason[0]; | |
| 264 } | |
| 265 | |
| 266 char * FormatNPNVariable(NPNVariable var) | |
| 267 { | |
| 268 static char szVar[80]; | |
| 269 switch (var) | |
| 270 { | |
| 271 case NPNVxDisplay: | |
| 272 sprintf(szVar, "%i -- NPNVxDisplay", var); | |
| 273 break; | |
| 274 case NPNVxtAppContext: | |
| 275 sprintf(szVar, "%i -- NPNVxtAppContext", var); | |
| 276 break; | |
| 277 case NPNVnetscapeWindow: | |
| 278 sprintf(szVar, "%i -- NPNVnetscapeWindow", var); | |
| 279 break; | |
| 280 case NPNVjavascriptEnabledBool: | |
| 281 sprintf(szVar, "%i -- NPNVjavascriptEnabledBool", var); | |
| 282 break; | |
| 283 case NPNVasdEnabledBool: | |
| 284 sprintf(szVar, "%i -- NPNVasdEnabledBool", var); | |
| 285 break; | |
| 286 case NPNVisOfflineBool: | |
| 287 sprintf(szVar, "%i -- NPNVisOfflineBool", var); | |
| 288 break; | |
| 289 default: | |
| 290 sprintf(szVar, "%i -- Unlisted variable", var); | |
| 291 break; | |
| 292 } | |
| 293 return &szVar[0]; | |
| 294 } | |
| 295 | |
| 296 char * FormatNPPVariable(NPPVariable var) | |
| 297 { | |
| 298 static char szVar[80]; | |
| 299 switch (var) | |
| 300 { | |
| 301 case NPPVpluginNameString: | |
| 302 sprintf(szVar, "%i -- NPPVpluginNameString", var); | |
| 303 break; | |
| 304 case NPPVpluginDescriptionString: | |
| 305 sprintf(szVar, "%i -- NPPVpluginDescriptionString?", var); | |
| 306 break; | |
| 307 case NPPVpluginWindowBool: | |
| 308 sprintf(szVar, "%i -- NPPVpluginWindowBool?", var); | |
| 309 break; | |
| 310 case NPPVpluginTransparentBool: | |
| 311 sprintf(szVar, "%i -- NPPVpluginTransparentBool?", var); | |
| 312 break; | |
| 313 case NPPVjavaClass: | |
| 314 sprintf(szVar, "%i -- NPPVjavaClass?", var); | |
| 315 break; | |
| 316 case NPPVpluginWindowSize: | |
| 317 sprintf(szVar, "%i -- NPPVpluginWindowSize?", var); | |
| 318 break; | |
| 319 case NPPVpluginTimerInterval: | |
| 320 sprintf(szVar, "%i -- NPPVpluginTimerInterval?", var); | |
| 321 break; | |
| 322 case NPPVpluginScriptableInstance: | |
| 323 sprintf(szVar, "%i -- NPPVpluginScriptableInstance?", var); | |
| 324 break; | |
| 325 case NPPVpluginScriptableIID: | |
| 326 sprintf(szVar, "%i -- NPPVpluginScriptableIID?", var); | |
| 327 break; | |
| 328 default: | |
| 329 sprintf(szVar, "%i -- Unlisted variable?", var); | |
| 330 break; | |
| 331 } | |
| 332 return &szVar[0]; | |
| 333 } | |
| 334 | |
| 335 BOOL FormatPCHARArgument(char * szBuf, int iLength, LogArgumentStruct * parg) | |
| 336 { | |
| 337 if(iLength <= parg->iLength) | |
| 338 return FALSE; | |
| 339 | |
| 340 if(parg->pData == NULL) | |
| 341 sprintf(szBuf, "%#08lx", parg->dwArg); | |
| 342 else | |
| 343 sprintf(szBuf, "%#08lx(\"%s\")", parg->dwArg, (char *)parg->pData); | |
| 344 return TRUE; | |
| 345 } | |
| 346 | |
| 347 BOOL FormatBOOLArgument(char * szBuf, int iLength, LogArgumentStruct * parg) | |
| 348 { | |
| 349 if(iLength <= 8) | |
| 350 return FALSE; | |
| 351 | |
| 352 sprintf(szBuf, "%s", ((NPBool)parg->dwArg == TRUE) ? "TRUE" : "FALSE"); | |
| 353 return TRUE; | |
| 354 } | |
| 355 | |
| 356 BOOL FormatPBOOLArgument(char * szBuf, int iLength, LogArgumentStruct * parg) | |
| 357 { | |
| 358 if(iLength <= 8) | |
| 359 return FALSE; | |
| 360 | |
| 361 sprintf(szBuf, "%#08lx(%s)", parg->dwArg, (*((NPBool *)parg->pData) == TRUE) ?
"TRUE" : "FALSE"); | |
| 362 return TRUE; | |
| 363 } | |
| 364 | |
| 365 static void makeAbbreviatedString(char * szBuf, int iSize, DWORD dwArg, int iLen
gth, int iWrap) | |
| 366 { | |
| 367 if(dwArg == 0L) | |
| 368 { | |
| 369 szBuf[0] = '\0'; | |
| 370 return; | |
| 371 } | |
| 372 | |
| 373 if(iLength > iWrap) | |
| 374 { | |
| 375 int iRealWrap = (iSize > iWrap) ? iWrap : (iSize - 4); | |
| 376 memcpy((LPVOID)&szBuf[0], (LPVOID)dwArg, iRealWrap); | |
| 377 szBuf[iRealWrap] = '.'; | |
| 378 szBuf[iRealWrap + 1] = '.'; | |
| 379 szBuf[iRealWrap + 2] = '.'; | |
| 380 szBuf[iRealWrap + 3] = '\0'; | |
| 381 } | |
| 382 else | |
| 383 { | |
| 384 if(iLength >= iSize) | |
| 385 { | |
| 386 memcpy((LPVOID)&szBuf[0], (LPVOID)dwArg, iSize - 4); | |
| 387 szBuf[iSize] = '.'; | |
| 388 szBuf[iSize + 1] = '.'; | |
| 389 szBuf[iSize + 2] = '.'; | |
| 390 szBuf[iSize + 3] = '\0'; | |
| 391 } | |
| 392 else | |
| 393 { | |
| 394 memcpy((LPVOID)&szBuf[0], (LPVOID)dwArg, iLength); | |
| 395 szBuf[iLength] = '\0'; | |
| 396 } | |
| 397 } | |
| 398 } | |
| 399 | |
| 400 LogItemStruct * makeLogItemStruct(NPAPI_Action action, | |
| 401 DWORD dw1, DWORD dw2, DWORD dw3, DWORD dw4, | |
| 402 DWORD dw5, DWORD dw6, DWORD dw7, BOOL bShort) | |
| 403 { | |
| 404 int iWrap = 64; | |
| 405 | |
| 406 LogItemStruct * plis = new LogItemStruct; | |
| 407 if(plis == NULL) | |
| 408 return NULL; | |
| 409 | |
| 410 plis->action = action; | |
| 411 plis->arg1.dwArg = dw1; | |
| 412 plis->arg2.dwArg = dw2; | |
| 413 plis->arg3.dwArg = dw3; | |
| 414 plis->arg4.dwArg = dw4; | |
| 415 plis->arg5.dwArg = dw5; | |
| 416 plis->arg6.dwArg = dw6; | |
| 417 plis->arg7.dwArg = dw7; | |
| 418 | |
| 419 char szTarget[1024] = {'\0'}; | |
| 420 char szBuf[1024] = {'\0'}; | |
| 421 | |
| 422 if(bShort) | |
| 423 return plis; | |
| 424 | |
| 425 switch (action) | |
| 426 { | |
| 427 case action_invalid: | |
| 428 break; | |
| 429 | |
| 430 // NPN action | |
| 431 case action_npn_version: | |
| 432 plis->arg1.pData = new int[1]; | |
| 433 *(int*)(plis->arg1.pData) = *((int*)dw1); | |
| 434 plis->arg1.iLength = sizeof(int); | |
| 435 | |
| 436 plis->arg2.pData = new int[1]; | |
| 437 *(int*)(plis->arg2.pData) = *((int*)dw2); | |
| 438 plis->arg2.iLength = sizeof(int); | |
| 439 | |
| 440 plis->arg3.pData = new int[1]; | |
| 441 *(int*)(plis->arg3.pData) = *((int*)dw3); | |
| 442 plis->arg3.iLength = sizeof(int); | |
| 443 | |
| 444 plis->arg4.pData = new int[1]; | |
| 445 *(int*)(plis->arg4.pData) = *((int*)dw4); | |
| 446 plis->arg4.iLength = sizeof(int); | |
| 447 | |
| 448 break; | |
| 449 case action_npn_get_url_notify: | |
| 450 if(dw2 != 0L) | |
| 451 { | |
| 452 plis->arg2.iLength = strlen((char *)dw2) + 1; | |
| 453 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 454 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 455 } | |
| 456 | |
| 457 if(dw3 != 0L) | |
| 458 { | |
| 459 makeAbbreviatedString(szTarget, sizeof(szTarget), dw3, strlen((char *)dw
3), iWrap); | |
| 460 plis->arg3.iLength = strlen(szTarget) + 1; | |
| 461 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 462 memcpy(plis->arg3.pData, (LPVOID)&szTarget[0], plis->arg3.iLength); | |
| 463 } | |
| 464 break; | |
| 465 case action_npn_get_url: | |
| 466 { | |
| 467 if(dw2 != 0L) | |
| 468 { | |
| 469 plis->arg2.iLength = strlen((char *)dw2) + 1; | |
| 470 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 471 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 472 } | |
| 473 | |
| 474 if(dw3 != 0L) | |
| 475 { | |
| 476 makeAbbreviatedString(szTarget, sizeof(szTarget), dw3, strlen((char *)dw
3), iWrap); | |
| 477 plis->arg3.iLength = strlen(szTarget) + 1; | |
| 478 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 479 memcpy(plis->arg3.pData, (LPVOID)&szTarget[0], plis->arg3.iLength); | |
| 480 } | |
| 481 break; | |
| 482 } | |
| 483 case action_npn_post_url_notify: | |
| 484 { | |
| 485 if(dw2 != 0L) | |
| 486 { | |
| 487 plis->arg2.iLength = strlen((char *)dw2) + 1; | |
| 488 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 489 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 490 } | |
| 491 | |
| 492 if(dw3 != 0L) | |
| 493 { | |
| 494 makeAbbreviatedString(szTarget, sizeof(szTarget), dw3, strlen((char *)dw
3), iWrap); | |
| 495 plis->arg3.iLength = strlen(szTarget) + 1; | |
| 496 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 497 memcpy(plis->arg3.pData, (LPVOID)&szTarget[0], plis->arg3.iLength); | |
| 498 } | |
| 499 | |
| 500 makeAbbreviatedString(szBuf, sizeof(szBuf), dw5, strlen((char *)dw5), iWra
p); | |
| 501 plis->arg5.iLength = (int)dw4 + 1; | |
| 502 plis->arg5.pData = new char[plis->arg5.iLength]; | |
| 503 memcpy(plis->arg5.pData, (LPVOID)&szBuf[0], plis->arg5.iLength); | |
| 504 | |
| 505 break; | |
| 506 } | |
| 507 case action_npn_post_url: | |
| 508 { | |
| 509 if(dw2 != 0L) | |
| 510 { | |
| 511 plis->arg2.iLength = strlen((char *)dw2) + 1; | |
| 512 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 513 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 514 } | |
| 515 | |
| 516 if(dw3 != 0L) | |
| 517 { | |
| 518 makeAbbreviatedString(szTarget, sizeof(szTarget), dw3, strlen((char *)dw
3), iWrap); | |
| 519 plis->arg3.iLength = strlen(szTarget) + 1; | |
| 520 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 521 memcpy(plis->arg3.pData, (LPVOID)&szTarget[0], plis->arg3.iLength); | |
| 522 } | |
| 523 | |
| 524 makeAbbreviatedString(szBuf, sizeof(szBuf), dw5, strlen((char *)dw5), iWra
p); | |
| 525 plis->arg5.iLength = (int)dw4 + 1; | |
| 526 plis->arg5.pData = new char[plis->arg5.iLength]; | |
| 527 memcpy(plis->arg5.pData, (LPVOID)&szBuf[0], plis->arg5.iLength); | |
| 528 | |
| 529 break; | |
| 530 } | |
| 531 case action_npn_new_stream: | |
| 532 { | |
| 533 if(dw2 != 0L) | |
| 534 { | |
| 535 plis->arg2.iLength = strlen((char *)dw2) + 1; | |
| 536 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 537 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 538 } | |
| 539 | |
| 540 makeAbbreviatedString(szTarget, sizeof(szTarget), dw3, strlen((char *)dw3)
, iWrap); | |
| 541 plis->arg3.iLength = strlen(szTarget) + 1; | |
| 542 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 543 memcpy(plis->arg3.pData, (LPVOID)&szTarget[0], plis->arg3.iLength); | |
| 544 | |
| 545 plis->arg4.pData = new char[sizeof(DWORD)]; | |
| 546 plis->arg4.iLength = sizeof(DWORD); | |
| 547 memcpy(plis->arg4.pData, (LPVOID)dw4, plis->arg4.iLength); | |
| 548 | |
| 549 break; | |
| 550 } | |
| 551 case action_npn_destroy_stream: | |
| 552 break; | |
| 553 case action_npn_request_read: | |
| 554 break; | |
| 555 case action_npn_write: | |
| 556 { | |
| 557 makeAbbreviatedString(szBuf, sizeof(szBuf), dw4, strlen((char *)dw4), iWra
p); | |
| 558 plis->arg4.iLength = strlen(szBuf) + 1; | |
| 559 plis->arg4.pData = new char[plis->arg4.iLength]; | |
| 560 memcpy(plis->arg4.pData, (LPVOID)&szBuf[0], plis->arg4.iLength); | |
| 561 break; | |
| 562 } | |
| 563 case action_npn_status: | |
| 564 if(dw2 != 0L) | |
| 565 { | |
| 566 plis->arg2.iLength = strlen((char *)dw2) + 1; | |
| 567 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 568 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 569 } | |
| 570 break; | |
| 571 case action_npn_user_agent: | |
| 572 break; | |
| 573 case action_npn_mem_alloc: | |
| 574 break; | |
| 575 case action_npn_mem_free: | |
| 576 break; | |
| 577 case action_npn_mem_flush: | |
| 578 break; | |
| 579 case action_npn_reload_plugins: | |
| 580 break; | |
| 581 case action_npn_get_java_env: | |
| 582 break; | |
| 583 case action_npn_get_java_peer: | |
| 584 break; | |
| 585 case action_npn_get_value: | |
| 586 plis->arg3.iLength = sizeof(DWORD); | |
| 587 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 588 memcpy(plis->arg3.pData, (LPVOID)dw3, plis->arg3.iLength); | |
| 589 break; | |
| 590 case action_npn_set_value: | |
| 591 if(((NPPVariable)dw2 == NPPVpluginNameString) || ((NPPVariable)dw2 == NPPV
pluginDescriptionString)) | |
| 592 { | |
| 593 makeAbbreviatedString(szBuf, sizeof(szBuf), dw3, strlen((char *)dw3), iW
rap); | |
| 594 plis->arg3.iLength = strlen(szBuf) + 1; | |
| 595 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 596 memcpy(plis->arg3.pData, (LPVOID)&szBuf[0], plis->arg3.iLength); | |
| 597 } | |
| 598 else if(((NPPVariable)dw2 == NPPVpluginWindowBool) || ((NPPVariable)dw2 ==
NPPVpluginTransparentBool)) | |
| 599 { | |
| 600 plis->arg3.iLength = sizeof(NPBool); | |
| 601 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 602 memcpy(plis->arg3.pData, (LPVOID)&dw3, plis->arg3.iLength); | |
| 603 } | |
| 604 else if((NPPVariable)dw2 == NPPVpluginWindowSize) | |
| 605 { | |
| 606 plis->arg3.iLength = sizeof(NPSize); | |
| 607 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 608 memcpy(plis->arg3.pData, (LPVOID)dw3, plis->arg3.iLength); | |
| 609 } | |
| 610 break; | |
| 611 case action_npn_invalidate_rect: | |
| 612 { | |
| 613 plis->arg2.iLength = sizeof(NPRect); | |
| 614 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 615 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 616 break; | |
| 617 } | |
| 618 case action_npn_invalidate_region: | |
| 619 break; | |
| 620 case action_npn_force_redraw: | |
| 621 break; | |
| 622 | |
| 623 // NPP action | |
| 624 case action_npp_new: | |
| 625 plis->arg1.iLength = strlen((char *)dw1) + 1; | |
| 626 plis->arg1.pData = new char[plis->arg1.iLength]; | |
| 627 memcpy(plis->arg1.pData, (LPVOID)dw1, plis->arg1.iLength); | |
| 628 break; | |
| 629 case action_npp_destroy: | |
| 630 plis->arg2.iLength = sizeof(DWORD); | |
| 631 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 632 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 633 break; | |
| 634 case action_npp_set_window: | |
| 635 plis->arg2.iLength = sizeof(NPWindow); | |
| 636 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 637 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 638 break; | |
| 639 case action_npp_new_stream: | |
| 640 plis->arg2.iLength = strlen((char *)dw2) + 1; | |
| 641 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 642 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 643 | |
| 644 plis->arg5.iLength = sizeof(uint16); | |
| 645 plis->arg5.pData = new char[plis->arg5.iLength]; | |
| 646 memcpy(plis->arg5.pData, (LPVOID)dw5, plis->arg5.iLength); | |
| 647 break; | |
| 648 case action_npp_destroy_stream: | |
| 649 break; | |
| 650 case action_npp_stream_as_file: | |
| 651 plis->arg3.iLength = strlen((char *)dw3) + 1; | |
| 652 plis->arg3.pData = new char[plis->arg3.iLength]; | |
| 653 memcpy(plis->arg3.pData, (LPVOID)dw3, plis->arg3.iLength); | |
| 654 break; | |
| 655 case action_npp_write_ready: | |
| 656 break; | |
| 657 case action_npp_write: | |
| 658 { | |
| 659 if(dw5 != 0L) | |
| 660 { | |
| 661 makeAbbreviatedString(szBuf, sizeof(szBuf), dw5, strlen((char *)dw5), iW
rap); | |
| 662 plis->arg5.iLength = strlen(szBuf) + 1; | |
| 663 plis->arg5.pData = new char[plis->arg5.iLength]; | |
| 664 memcpy(plis->arg5.pData, (LPVOID)&szBuf[0], plis->arg5.iLength); | |
| 665 } | |
| 666 break; | |
| 667 } | |
| 668 case action_npp_print: | |
| 669 break; | |
| 670 case action_npp_handle_event: | |
| 671 break; | |
| 672 case action_npp_url_notify: | |
| 673 plis->arg2.iLength = strlen((char *)dw2) + 1; | |
| 674 plis->arg2.pData = new char[plis->arg2.iLength]; | |
| 675 memcpy(plis->arg2.pData, (LPVOID)dw2, plis->arg2.iLength); | |
| 676 break; | |
| 677 case action_npp_get_java_class: | |
| 678 break; | |
| 679 case action_npp_get_value: | |
| 680 break; | |
| 681 case action_npp_set_value: | |
| 682 break; | |
| 683 | |
| 684 default: | |
| 685 break; | |
| 686 } | |
| 687 | |
| 688 return plis; | |
| 689 } | |
| 690 | |
| 691 void freeLogItemStruct(LogItemStruct * lis) | |
| 692 { | |
| 693 if(lis) | |
| 694 delete lis; | |
| 695 } | |
| 696 | |
| 697 void formatLogItem(LogItemStruct * plis, std::string* output, BOOL bDOSStyle) | |
| 698 { | |
| 699 static char szEOL[8]; | |
| 700 static char szEOI[256]; | |
| 701 static char szEndOfItem[] = ""; | |
| 702 | |
| 703 if(bDOSStyle) | |
| 704 { | |
| 705 strcpy(szEOL, "\r\n"); | |
| 706 //strcpy(szEOI, szEndOfItem); | |
| 707 //strcat(szEOI, "\r\n"); | |
| 708 } | |
| 709 else | |
| 710 { | |
| 711 strcpy(szEOL, "\n"); | |
| 712 //strcpy(szEOI, szEndOfItem); | |
| 713 //strcat(szEOI, "\n"); | |
| 714 } | |
| 715 | |
| 716 DWORD dw1 = plis->arg1.dwArg; | |
| 717 DWORD dw2 = plis->arg2.dwArg; | |
| 718 DWORD dw3 = plis->arg3.dwArg; | |
| 719 DWORD dw4 = plis->arg4.dwArg; | |
| 720 DWORD dw5 = plis->arg5.dwArg; | |
| 721 DWORD dw6 = plis->arg6.dwArg; | |
| 722 DWORD dw7 = plis->arg7.dwArg; | |
| 723 | |
| 724 char sz1[1024] = {'\0'}; | |
| 725 char sz2[1024] = {'\0'}; | |
| 726 char sz3[1024] = {'\0'}; | |
| 727 char sz4[1024] = {'\0'}; | |
| 728 char sz5[1024] = {'\0'}; | |
| 729 char sz6[1024] = {'\0'}; | |
| 730 | |
| 731 switch (plis->action) | |
| 732 { | |
| 733 case action_invalid: | |
| 734 break; | |
| 735 | |
| 736 // NPN action | |
| 737 case action_npn_version: | |
| 738 if((plis->arg1.pData != NULL)&&(plis->arg2.pData != NULL)&&(plis->arg3.pDa
ta != NULL)&&(plis->arg4.pData != NULL)) | |
| 739 *output = StringPrintf("NPN_Version(%#08lx, %#08lx, %#08lx, %#08lx)", dw
1,dw2,dw3,dw4); | |
| 740 else | |
| 741 *output = StringPrintf("NPN_Version(%#08lx, %#08lx, %#08lx, %#08lx)", dw
1,dw2,dw3,dw4); | |
| 742 break; | |
| 743 case action_npn_get_url_notify: | |
| 744 { | |
| 745 FormatPCHARArgument(sz2, sizeof(sz2), &plis->arg2); | |
| 746 FormatPCHARArgument(sz3, sizeof(sz3), &plis->arg3); | |
| 747 *output = StringPrintf("NPN_GetURLNotify(%#08lx, %s, %s, %#08lx)", dw1,sz2
,sz3,dw4); | |
| 748 break; | |
| 749 } | |
| 750 case action_npn_get_url: | |
| 751 { | |
| 752 FormatPCHARArgument(sz2, sizeof(sz2), &plis->arg2); | |
| 753 FormatPCHARArgument(sz3, sizeof(sz3), &plis->arg3); | |
| 754 *output = StringPrintf("NPN_GetURL(%#08lx, %s, %s)", dw1,sz2,sz3); | |
| 755 break; | |
| 756 } | |
| 757 case action_npn_post_url_notify: | |
| 758 { | |
| 759 FormatPCHARArgument(sz2, sizeof(sz2), &plis->arg2); | |
| 760 FormatPCHARArgument(sz3, sizeof(sz3), &plis->arg3); | |
| 761 FormatPCHARArgument(sz5, sizeof(sz5), &plis->arg5); | |
| 762 FormatBOOLArgument(sz6, sizeof(sz6), &plis->arg6); | |
| 763 | |
| 764 *output = StringPrintf("NPN_PostURLNotify(%#08lx, %s, %s, %li, %s, %s, %#0
8lx)", | |
| 765 dw1,sz2,sz3,(uint32)dw4,sz5,sz6,dw7); | |
| 766 break; | |
| 767 } | |
| 768 case action_npn_post_url: | |
| 769 { | |
| 770 FormatPCHARArgument(sz2, sizeof(sz2), &plis->arg2); | |
| 771 FormatPCHARArgument(sz3, sizeof(sz3), &plis->arg3); | |
| 772 FormatPCHARArgument(sz5, sizeof(sz5), &plis->arg5); | |
| 773 FormatBOOLArgument(sz6, sizeof(sz6), &plis->arg6); | |
| 774 | |
| 775 *output = StringPrintf("NPN_PostURL(%#08lx, %s, %s, %li, %s, %s)", | |
| 776 dw1,sz2,sz3,(uint32)dw4,sz5,sz6); | |
| 777 break; | |
| 778 } | |
| 779 case action_npn_new_stream: | |
| 780 { | |
| 781 FormatPCHARArgument(sz2, sizeof(sz2), &plis->arg2); | |
| 782 FormatPCHARArgument(sz3, sizeof(sz3), &plis->arg3); | |
| 783 if(plis->arg4.pData != NULL) | |
| 784 *output = StringPrintf("NPN_NewStream(%#08lx, %s, %s, %#08lx(%#08lx))", | |
| 785 dw1, sz2,sz3,dw4,*(DWORD *)plis->arg4.pData); | |
| 786 else | |
| 787 *output = StringPrintf("NPN_NewStream(%#08lx, \"%s\", \"%s\", %#08lx)",
dw1, sz2,sz3,dw4); | |
| 788 break; | |
| 789 } | |
| 790 case action_npn_destroy_stream: | |
| 791 *output = StringPrintf("NPN_DestroyStream(%#08lx, %#08lx, %s)", dw1,dw2,Fo
rmatNPAPIReason((int)dw3)); | |
| 792 break; | |
| 793 case action_npn_request_read: | |
| 794 *output = StringPrintf("NPN_RequestRead(%#08lx, %#08lx)", dw1, dw2); | |
| 795 break; | |
| 796 case action_npn_write: | |
| 797 { | |
| 798 FormatPCHARArgument(sz4, sizeof(sz4), &plis->arg4); | |
| 799 *output = StringPrintf("NPN_Write(%#08lx, %#08lx, %li, %s)", dw1, dw2, (in
t32)dw3, sz4); | |
| 800 break; | |
| 801 } | |
| 802 case action_npn_status: | |
| 803 { | |
| 804 FormatPCHARArgument(sz2, sizeof(sz2), &plis->arg2); | |
| 805 *output = StringPrintf("NPN_Status(%#08lx, %s)", dw1, sz2); | |
| 806 break; | |
| 807 } | |
| 808 case action_npn_user_agent: | |
| 809 *output = StringPrintf("NPN_UserAgent(%#08lx)", dw1); | |
| 810 break; | |
| 811 case action_npn_mem_alloc: | |
| 812 *output = StringPrintf("NPN_MemAlloc(%li)", dw1); | |
| 813 break; | |
| 814 case action_npn_mem_free: | |
| 815 *output = StringPrintf("NPN_MemFree(%#08lx)", dw1); | |
| 816 break; | |
| 817 case action_npn_mem_flush: | |
| 818 *output = StringPrintf("NPN_MemFlush(%li)", dw1); | |
| 819 break; | |
| 820 case action_npn_reload_plugins: | |
| 821 { | |
| 822 FormatBOOLArgument(sz1, sizeof(sz1), &plis->arg1); | |
| 823 *output = StringPrintf("NPN_ReloadPlugins(%s)", sz1); | |
| 824 break; | |
| 825 } | |
| 826 case action_npn_get_java_env: | |
| 827 *output = StringPrintf("NPN_GetJavaEnv()"); | |
| 828 break; | |
| 829 case action_npn_get_java_peer: | |
| 830 *output = StringPrintf("NPN_GetJavaPeer(%#08lx)", dw1); | |
| 831 break; | |
| 832 case action_npn_get_value: | |
| 833 { | |
| 834 switch(dw2) | |
| 835 { | |
| 836 case NPNVxDisplay: | |
| 837 case NPNVxtAppContext: | |
| 838 case NPNVnetscapeWindow: | |
| 839 if(dw3 != 0L) | |
| 840 *output = StringPrintf("NPN_GetValue(%#08lx, %s, %#08lx(%#08lx))",dw
1,FormatNPNVariable((NPNVariable)dw2),dw3,*(DWORD *)dw3); | |
| 841 else | |
| 842 *output = StringPrintf("NPN_GetValue(%#08lx, %s, %#08lx)",dw1,Format
NPNVariable((NPNVariable)dw2),dw3); | |
| 843 break; | |
| 844 case NPNVjavascriptEnabledBool: | |
| 845 case NPNVasdEnabledBool: | |
| 846 case NPNVisOfflineBool: | |
| 847 if(dw3 != 0L) | |
| 848 *output = StringPrintf("NPN_GetValue(%#08lx, %s, %#08lx(%s))", | |
| 849 dw1,FormatNPNVariable((NPNVariable)dw2),dw3, | |
| 850 (((NPBool)*(DWORD *)dw3) == TRUE) ? "TRUE" : "FALSE"); | |
| 851 else | |
| 852 *output = StringPrintf("NPN_GetValue(%#08lx, %s, %#08lx)",dw1,Format
NPNVariable((NPNVariable)dw2),dw3); | |
| 853 break; | |
| 854 default: | |
| 855 break; | |
| 856 } | |
| 857 break; | |
| 858 } | |
| 859 case action_npn_set_value: | |
| 860 | |
| 861 if(((NPPVariable)dw2 == NPPVpluginNameString) || ((NPPVariable)dw2 == NPPV
pluginDescriptionString)) | |
| 862 { | |
| 863 FormatPCHARArgument(sz3, sizeof(sz3), &plis->arg3); | |
| 864 *output = StringPrintf("NPN_SetValue(%#08lx, %s, %s)", dw1,FormatNPPVari
able((NPPVariable)dw2),sz3); | |
| 865 } | |
| 866 else if(((NPPVariable)dw2 == NPPVpluginWindowBool) || ((NPPVariable)dw2 ==
NPPVpluginTransparentBool)) | |
| 867 { | |
| 868 FormatPBOOLArgument(sz3, sizeof(sz3), &plis->arg3); | |
| 869 *output = StringPrintf("NPN_SetValue(%#08lx, %s, %s)", | |
| 870 dw1,FormatNPPVariable((NPPVariable)dw2),sz3); | |
| 871 } | |
| 872 else if((NPPVariable)dw2 == NPPVpluginWindowSize) | |
| 873 { | |
| 874 if(plis->arg3.pData != NULL) | |
| 875 { | |
| 876 int32 iWidth = ((NPSize *)plis->arg3.pData)->width; | |
| 877 int32 iHeight = ((NPSize *)plis->arg3.pData)->height; | |
| 878 *output = StringPrintf("NPN_SetValue(%#08lx, %s, %#08lx(%li,%li))", | |
| 879 dw1,FormatNPPVariable((NPPVariable)dw2),dw3,iWidth,iHeight); | |
| 880 } | |
| 881 else | |
| 882 *output = StringPrintf("NPN_SetValue(%#08lx, %s, %#08lx(?,?))", | |
| 883 dw1,FormatNPPVariable((NPPVariable)dw2),dw3); | |
| 884 } | |
| 885 else | |
| 886 *output = StringPrintf("NPN_SetValue(%#08lx, %s, %#08lx(What is it?))",
dw1,FormatNPPVariable((NPPVariable)dw2),dw3); | |
| 887 break; | |
| 888 case action_npn_invalidate_rect: | |
| 889 { | |
| 890 if(plis->arg2.pData != NULL) | |
| 891 { | |
| 892 uint16 top = ((NPRect *)plis->arg2.pData)->top; | |
| 893 uint16 left = ((NPRect *)plis->arg2.pData)->left; | |
| 894 uint16 bottom = ((NPRect *)plis->arg2.pData)->bottom; | |
| 895 uint16 right = ((NPRect *)plis->arg2.pData)->right; | |
| 896 *output = StringPrintf("NPN_InvalidateRect(%#08lx, %#08lx(%u,%u;%u,%u)",
dw1,dw2,top,left,bottom,right); | |
| 897 } | |
| 898 else | |
| 899 *output = StringPrintf("NPN_InvalidateRect(%#08lx, %#08lx(?,?,?,?)", dw1
,dw2); | |
| 900 break; | |
| 901 } | |
| 902 case action_npn_invalidate_region: | |
| 903 *output = StringPrintf("NPN_InvalidateRegion(%#08lx, %#08lx)", dw1,dw2); | |
| 904 break; | |
| 905 case action_npn_force_redraw: | |
| 906 *output = StringPrintf("NPN_ForceRedraw(%#08lx)", dw1); | |
| 907 break; | |
| 908 case action_npn_enumerate: | |
| 909 *output = StringPrintf("NPN_Enumerate()"); | |
| 910 break; | |
| 911 case action_npn_pop_popups_enabled_state: | |
| 912 *output = StringPrintf("NPN_PopPopupsEnabledState()"); | |
| 913 break; | |
| 914 case action_npn_push_popups_enabled_state: | |
| 915 *output = StringPrintf("NPN_PushPopupsEnabledState()"); | |
| 916 break; | |
| 917 case action_npn_set_exception: | |
| 918 *output = StringPrintf("NPN_SetException(%s)", dw1); | |
| 919 break; | |
| 920 case action_npn_has_method: | |
| 921 *output = StringPrintf("NPN_HasMethod(%d)", dw1); | |
| 922 break; | |
| 923 case action_npn_has_property: | |
| 924 *output = StringPrintf("NPN_HasProperty(%d)", dw1); | |
| 925 break; | |
| 926 case action_npn_remove_property: | |
| 927 *output = StringPrintf("NPN_RemoveProperty(%d)", dw1); | |
| 928 break; | |
| 929 case action_npn_set_property: | |
| 930 *output = StringPrintf("NPN_SetProperty(%d)", dw1); | |
| 931 break; | |
| 932 case action_npn_get_property: | |
| 933 *output = StringPrintf("NPN_GetProperty(%d)", dw1); | |
| 934 break; | |
| 935 case action_npn_evaluate: | |
| 936 *output = StringPrintf("NPN_Evaluate(%s)", dw1); | |
| 937 break; | |
| 938 case action_npn_invoke_default: | |
| 939 *output = StringPrintf("NPN_InvokeDefault(%#08lx)", dw1); | |
| 940 break; | |
| 941 case action_npn_invoke: | |
| 942 *output = StringPrintf("NPN_Invoke(%#08lx)", dw1); | |
| 943 break; | |
| 944 case action_npn_release_object: | |
| 945 *output = StringPrintf("NPN_ReleaseObject(%d)", dw1); | |
| 946 break; | |
| 947 case action_npn_retain_object: | |
| 948 *output = StringPrintf("NPN_RetainObject(%d)", dw1); | |
| 949 break; | |
| 950 case action_npn_create_object: | |
| 951 *output = StringPrintf("NPN_CreateObject(%#08lx)", dw1); | |
| 952 break; | |
| 953 case action_npn_int_from_identifier: | |
| 954 *output = StringPrintf("NPN_IntFromIdentifier(%d)", dw1); | |
| 955 break; | |
| 956 case action_npn_utf8_from_identifier: | |
| 957 *output = StringPrintf("NPN_UTF8FromIdentifier(%d)", dw1); | |
| 958 break; | |
| 959 case action_npn_identifier_is_string: | |
| 960 *output = StringPrintf("NPN_IdentifierIsString(%d)", dw1); | |
| 961 break; | |
| 962 case action_npn_get_int_identifer: | |
| 963 *output = StringPrintf("NPN_GetIntIdentifier(%d)", dw1); | |
| 964 break; | |
| 965 case action_npn_get_string_identifiers: | |
| 966 *output = StringPrintf("NPN_GetStringIdentifier()"); | |
| 967 break; | |
| 968 | |
| 969 // NPP action | |
| 970 case action_npp_new: | |
| 971 { | |
| 972 char szMode[16]; | |
| 973 switch (dw3) | |
| 974 { | |
| 975 case NP_EMBED: | |
| 976 strcpy(szMode, "NP_EMBED"); | |
| 977 break; | |
| 978 case NP_FULL: | |
| 979 strcpy(szMode, "NP_FULL"); | |
| 980 break; | |
| 981 default: | |
| 982 strcpy(szMode, "[Invalid mode]"); | |
| 983 break; | |
| 984 } | |
| 985 *output = StringPrintf("NPP_New(\"%s\", %#08lx, %s, %i, %#08lx, %#08lx, %#
08lx)", | |
| 986 (char *)dw1,dw2,szMode,(int)dw4,dw5,dw6,dw7); | |
| 987 break; | |
| 988 } | |
| 989 case action_npp_destroy: | |
| 990 *output = StringPrintf("NPP_Destroy(%#08lx, %#08lx(%#08lx))", dw1, dw2, *(
DWORD *)plis->arg2.pData); | |
| 991 break; | |
| 992 case action_npp_set_window: | |
| 993 { | |
| 994 char szWindow[512]; | |
| 995 | |
| 996 if(plis->arg2.pData != NULL) | |
| 997 { | |
| 998 char szType[80]; | |
| 999 switch (((NPWindow*)plis->arg2.pData)->type) | |
| 1000 { | |
| 1001 case NPWindowTypeWindow: | |
| 1002 sprintf(szType, "NPWindowTypeWindow"); | |
| 1003 break; | |
| 1004 case NPWindowTypeDrawable: | |
| 1005 sprintf(szType, "NPWindowTypeDrawable"); | |
| 1006 break; | |
| 1007 default: | |
| 1008 sprintf(szType, "[Unlisted type]"); | |
| 1009 break; | |
| 1010 } | |
| 1011 sprintf(szWindow, "NPWindow: %#08lx, (%li,%li), (%li,%li), (%i,%i,%i,%i)
, %s", | |
| 1012 ((NPWindow*)plis->arg2.pData)->window, | |
| 1013 ((NPWindow*)plis->arg2.pData)->x, | |
| 1014 ((NPWindow*)plis->arg2.pData)->y, | |
| 1015 ((NPWindow*)plis->arg2.pData)->width, | |
| 1016 ((NPWindow*)plis->arg2.pData)->height, | |
| 1017 ((NPWindow*)plis->arg2.pData)->clipRect.top, | |
| 1018 ((NPWindow*)plis->arg2.pData)->clipRect.left, | |
| 1019 ((NPWindow*)plis->arg2.pData)->clipRect.bottom, | |
| 1020 ((NPWindow*)plis->arg2.pData)->clipRect.right, szType); | |
| 1021 *output = StringPrintf("NPP_SetWindow(%#08lx, %#08lx) %s", dw1,dw2,szWin
dow); | |
| 1022 } | |
| 1023 else | |
| 1024 *output = StringPrintf("NPP_SetWindow(%#08lx, %#08lx)", dw1,dw2); | |
| 1025 | |
| 1026 break; | |
| 1027 } | |
| 1028 case action_npp_new_stream: | |
| 1029 { | |
| 1030 switch (*(int16 *)plis->arg5.pData) | |
| 1031 { | |
| 1032 case NP_NORMAL: | |
| 1033 sprintf(sz5, "NP_NORMAL"); | |
| 1034 break; | |
| 1035 case NP_ASFILEONLY: | |
| 1036 sprintf(sz5, "NP_ASFILEONLY"); | |
| 1037 break; | |
| 1038 case NP_ASFILE: | |
| 1039 sprintf(sz5, "NP_ASFILE"); | |
| 1040 break; | |
| 1041 default: | |
| 1042 sprintf(sz5, "[Unlisted type]"); | |
| 1043 break; | |
| 1044 } | |
| 1045 FormatPCHARArgument(sz2, sizeof(sz2), &plis->arg2); | |
| 1046 *output = StringPrintf("NPP_NewStream(%#08lx, %s, %#08lx (%s), %s, %s)", d
w1, sz2, dw3, | |
| 1047 ((NPStream*)dw3)->url, ((NPBool)dw4 == TRUE) ? "TRUE" : "FALSE",
sz5); | |
| 1048 break; | |
| 1049 } | |
| 1050 case action_npp_destroy_stream: | |
| 1051 *output = StringPrintf("NPP_DestroyStream(%#08lx, %#08lx, %s)", dw1,dw2,Fo
rmatNPAPIReason((int)dw3)); | |
| 1052 break; | |
| 1053 case action_npp_stream_as_file: | |
| 1054 FormatPCHARArgument(sz3, sizeof(sz3), &plis->arg3); | |
| 1055 *output = StringPrintf("NPP_StreamAsFile(%#08lx, %#08lx, %s)", dw1,dw2,sz3
); | |
| 1056 break; | |
| 1057 case action_npp_write_ready: | |
| 1058 *output = StringPrintf("NPP_WriteReady(%#08lx, %#08lx)", dw1,dw2); | |
| 1059 break; | |
| 1060 case action_npp_write: | |
| 1061 { | |
| 1062 FormatPCHARArgument(sz5, sizeof(sz5), &plis->arg5); | |
| 1063 *output = StringPrintf("NPP_Write(%#08lx, %#08lx, %li, %li, %s))",dw1,dw2,
dw3,dw4,sz5); | |
| 1064 break; | |
| 1065 } | |
| 1066 case action_npp_print: | |
| 1067 *output = StringPrintf("NPP_Print(%#08lx, %#08lx)", dw1, dw2); | |
| 1068 break; | |
| 1069 case action_npp_handle_event: | |
| 1070 { | |
| 1071 NPEvent *event = (NPEvent*)dw2; | |
| 1072 *output = StringPrintf("NPP_HandleEvent(%#08lx, %#08lx {event=%d, wParam=%
#08lx lParam=%#08lx)", dw1,dw2,event->event, event->wParam, event->lParam); | |
| 1073 break; | |
| 1074 } | |
| 1075 case action_npp_url_notify: | |
| 1076 { | |
| 1077 FormatPCHARArgument(sz2, sizeof(sz2), &plis->arg2); | |
| 1078 *output = StringPrintf("NPP_URLNotify(%#08lx, %s, %s, %#08lx)", dw1,sz2,Fo
rmatNPAPIReason((int)dw3),dw4); | |
| 1079 break; | |
| 1080 } | |
| 1081 case action_npp_get_java_class: | |
| 1082 *output = StringPrintf("NPP_GetJavaClass()"); | |
| 1083 break; | |
| 1084 case action_npp_get_value: | |
| 1085 *output = StringPrintf("NPP_GetValue(%#08lx, %s, %#08lx)", dw1,FormatNPPVa
riable((NPPVariable)dw2),dw3); | |
| 1086 break; | |
| 1087 case action_npp_set_value: | |
| 1088 *output = StringPrintf("NPP_SetValue(%#08lx, %s, %#08lx)", dw1,FormatNPNVa
riable((NPNVariable)dw2),dw3); | |
| 1089 break; | |
| 1090 | |
| 1091 default: | |
| 1092 *output = StringPrintf("Unknown action"); | |
| 1093 break; | |
| 1094 } | |
| 1095 *output += szEOL; | |
| 1096 *output += szEOI; | |
| 1097 } | |
| OLD | NEW |