| 444 | |
| 445 | |
| 446 | wxString EncodeBase64(const char *pbBufferIn, unsigned int bufLen) |
| 447 | { |
| 448 | wxString pbBufferOut; |
| 449 | wxString strHeader; |
| 450 | |
| 451 | if( !strHeaderLine.IsEmpty() ) { |
| 452 | strHeader = "-----BEGIN " + strHeaderLine + "-----"; |
| 453 | if( g_fUseCRLF ) { |
| 454 | strHeader += "\r"; |
| 455 | } |
| 456 | strHeader += "\n"; |
| 457 | } |
| 458 | |
| 459 | unsigned long nDiv = ((unsigned long)bufLen) / 3; |
| 460 | unsigned long nRem = ((unsigned long)bufLen) % 3; |
| 461 | unsigned int NewLineSize = g_fUseCRLF ? 2 : 1; |
| 462 | |
| 463 | // Allocate enough space in the output buffer to speed up things |
| 464 | pbBufferOut.Alloc( |
| 465 | strHeader.Len() * 2 + // header/footer |
| 466 | (bufLen * 4) / 3 + 1 + // Number of codes |
| 467 | nDiv * NewLineSize + // Number of new lines |
| 468 | (nRem ? 1 : 0) * NewLineSize ); // Last line |
| 469 | pbBufferOut = strHeader; |
| 470 | |
| 471 | unsigned long nChars = 0; |
| 472 | const unsigned char *pIn = (unsigned char*)pbBufferIn; |
| 473 | while( nDiv > 0 ) { |
| 474 | pbBufferOut += to_b64[ (pIn[0] >> 2) & 0x3f]; |
| 475 | pbBufferOut += to_b64[((pIn[0] << 4) & 0x30) | ((pIn[1] >> 4) & 0xf)]; |
| 476 | pbBufferOut += to_b64[((pIn[1] << 2) & 0x3c) | ((pIn[2] >> 6) & 0x3)]; |
| 477 | pbBufferOut += to_b64[ pIn[2] & 0x3f]; |
| 478 | pIn += 3; |
| 479 | nDiv--; |
| 480 | nChars += 4; |
| 481 | if( nChars >= g_nCharsPerLine && g_nCharsPerLine != 0 ) { |
| 482 | nChars = 0; |
| 483 | if( g_fUseCRLF ) { |
| 484 | pbBufferOut += "\r"; |
| 485 | } |
| 486 | pbBufferOut += "\n"; |
| 487 | } |
| 488 | } |
| 489 | switch( nRem ) { |
| 490 | case 2: |
| 491 | pbBufferOut += to_b64[ (pIn[0] >> 2) & 0x3f]; |
| 492 | pbBufferOut += to_b64[((pIn[0] << 4) & 0x30) | ((pIn[1] >> 4) & 0xf)]; |
| 493 | pbBufferOut += to_b64[ (pIn[1] << 2) & 0x3c]; |
| 494 | pbBufferOut += "="; |
| 495 | nChars += 4; |
| 496 | if( nChars >= g_nCharsPerLine && g_nCharsPerLine != 0 ) { |
| 497 | nChars = 0; |
| 498 | if( g_fUseCRLF ) { |
| 499 | pbBufferOut += "\r"; |
| 500 | } |
| 501 | pbBufferOut += "\n"; |
| 502 | } |
| 503 | break; |
no test coverage detected