--- parser3/src/main/pa_common.C 2005/11/18 10:17:39 1.209 +++ parser3/src/main/pa_common.C 2005/11/22 11:51:00 1.212 @@ -3,9 +3,30 @@ Copyright(c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) -*/ -static const char * const IDENT_COMMON_C="$Date: 2005/11/18 10:17:39 $"; + * BASE64 part + * Authors: Michael Zucchi + * Jeffrey Stedfast + * + * Copyright 2000-2004 Ximian, Inc. (www.ximian.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +static const char * const IDENT_COMMON_C="$Date: 2005/11/22 11:51:00 $"; #include "pa_common.h" #include "pa_exception.h" @@ -458,7 +479,7 @@ static const String* basic_authorization if(pass) combined<> 16; + *outptr++ = saved >> 8; + *outptr++ = saved; + i = 0; + } + } + } + + *save = saved; + *state = i; + + /* quick scan back for '=' on the end somewhere */ + /* fortunately we can drop 1 output char for each trailing = (upto 2) */ + i = 2; + while (inptr > in && i) { + inptr--; + if (gmime_base64_rank[*inptr] != 0xff) { + if (*inptr == '=' && outptr > out) + outptr--; + i--; + } + } + + /* if i != 0 then there is a truncation error! */ + return (outptr - out); +} + + +char* pa_base64_encode(const char *in, size_t in_size) { /* wont go to more than 2x size (overly conservative) */ - char* result=new(PointerFreeGC) char[len * 2 + 6]; + char* result=new(PointerFreeGC) char[in_size * 2 + 6]; int state=0; int save=0; #ifndef NDEBUG size_t filled= #endif - g_mime_utils_base64_encode_close ((const unsigned char*)in, len, + g_mime_utils_base64_encode_close ((const unsigned char*)in, in_size, (unsigned char*)result, &state, &save); - assert(filled <= len * 2 + 6); + assert(filled <= in_size * 2 + 6); return result; } + +void pa_base64_decode(const char *in, size_t in_size, char*& result, size_t& result_size) +{ + /* wont go to more than had (overly conservative) */ + result=new(PointerFreeGC) char[in_size+1/*terminator*/]; + int state=0; + int save=0; + result_size= + g_mime_utils_base64_decode_step ((const unsigned char*)in, in_size, + (unsigned char*)result, &state, &save); + assert(result_size <= in_size); + result[result_size]=0; // for text files +}