~ubuntu-branches/debian/sid/gdal/sid

« back to all changes in this revision

Viewing changes to port/cpl_base64.cpp

  • Committer: Package Import Robot
  • Author(s): Francesco Paolo Lovergine
  • Date: 2012-05-07 15:04:42 UTC
  • mfrom: (5.5.16 experimental)
  • Revision ID: package-import@ubuntu.com-20120507150442-2eks97loeh6rq005
Tags: 1.9.0-1
* Ready for sid, starting transition.
* All symfiles updated to latest builds.
* Added dh_numpy call in debian/rules to depend on numpy ABI.
* Policy bumped to 3.9.3, no changes required.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************************************
 
2
 * $Id: cpl_base64.cpp 21954 2011-03-13 18:18:20Z warmerdam $
 
3
 *
 
4
 * Project:  Common Portability Library
 
5
 * Purpose:  Encoding/Decoding Base64 strings
 
6
 * Author:   Paul Ramsey <pramsey@cleverelephant.ca>
 
7
 *           Dave Blasby <dblasby@gmail.com>
 
8
 *           René Nyffenegger
 
9
 *
 
10
 ******************************************************************************
 
11
 * Copyright (c) 2008 Paul Ramsey
 
12
 * Copyright (c) 2002 Refractions Research
 
13
 * Copyright (C) 2004-2008 René Nyffenegger
 
14
 *
 
15
 * (see also part way down the file for license terms for René's code)
 
16
 *
 
17
 * Permission is hereby granted, free of charge, to any person obtaining a
 
18
 * copy of this software and associated documentation files (the "Software"),
 
19
 * to deal in the Software without restriction, including without limitation
 
20
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 
21
 * and/or sell copies of the Software, and to permit persons to whom the
 
22
 * Software is furnished to do so, subject to the following conditions:
 
23
 *
 
24
 * The above copyright notice and this permission notice shall be included in
 
25
 * all copies of this Software or works derived from this Software.
 
26
 *
 
27
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 
28
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
29
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 
30
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
31
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 
32
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 
33
 * DEALINGS IN THE SOFTWARE.
 
34
 ****************************************************************************/
 
35
 
 
36
#include "cpl_string.h"
 
37
 
 
38
CPL_CVSID("$Id: cpl_base64.cpp 21954 2011-03-13 18:18:20Z warmerdam $");
 
39
 
 
40
/* Derived from MapServer's mappostgis.c */
 
41
 
 
42
/*
 
43
** Decode a base64 character.
 
44
*/
 
45
static const unsigned char CPLBase64DecodeChar[256] = {
 
46
    /* not Base64 characters */
 
47
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
 
48
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
 
49
    64,64,64,64,64,64,64,64,64,64,64,
 
50
    /*  +  */
 
51
    62,
 
52
    /* not Base64 characters */
 
53
    64,64,64,
 
54
    /*  /  */
 
55
    63,
 
56
    /* 0-9 */
 
57
    52,53,54,55,56,57,58,59,60,61,
 
58
    /* not Base64 characters */
 
59
    64,64,64,64,64,64,64,
 
60
    /* A-Z */
 
61
    0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
 
62
    /* not Base64 characters */
 
63
    64,64,64,64,64,64,
 
64
    /* a-z */
 
65
    26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,
 
66
    /* not Base64 characters */
 
67
    64,64,64,64,64,
 
68
    /* not Base64 characters (upper 128 characters) */
 
69
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
 
70
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
 
71
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
 
72
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
 
73
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
 
74
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
 
75
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
 
76
    64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64
 
77
    };
 
78
 
 
79
/************************************************************************/
 
80
/*                       CPLBase64DecodeInPlace()                       */
 
81
/*                                                                      */
 
82
/*      Decode base64 string "pszBase64" (null terminated) in place     */
 
83
/*      Returns length of decoded array or 0 on failure.                */
 
84
/************************************************************************/
 
85
 
 
86
int CPLBase64DecodeInPlace(GByte* pszBase64)
 
87
{
 
88
    if (pszBase64 && *pszBase64) {
 
89
 
 
90
        unsigned char *p = pszBase64;
 
91
        int i, j, k;
 
92
 
 
93
        /* Drop illegal chars first */
 
94
        for (i=0, j=0; pszBase64[i]; i++) {
 
95
            unsigned char c = pszBase64[i];
 
96
            if ( (CPLBase64DecodeChar[c] != 64) || (c == '=') ) {
 
97
                pszBase64[j++] = c;
 
98
            }
 
99
        }
 
100
 
 
101
        for (k=0; k<j; k+=4) {
 
102
            register unsigned char b1, b2, b3, b4, c3, c4;
 
103
 
 
104
            b1 = CPLBase64DecodeChar[pszBase64[k]];
 
105
 
 
106
            if (k+3<j) {
 
107
                b2 = CPLBase64DecodeChar[pszBase64[k+1]];
 
108
                c3 = pszBase64[k+2];
 
109
                c4 = pszBase64[k+3];
 
110
            }
 
111
            else if (k+2<j) {
 
112
                b2 = CPLBase64DecodeChar[pszBase64[k+1]];
 
113
                c3 = pszBase64[k+2];
 
114
                c4 = 'A';
 
115
            }
 
116
            else if (k+1<j) {
 
117
                b2 = CPLBase64DecodeChar[pszBase64[k+1]];
 
118
                c3 = 'A';
 
119
                c4 = 'A';
 
120
            }
 
121
            else
 
122
            {
 
123
                b2 = 0;
 
124
                c3 = 'A';
 
125
                c4 = 'A';
 
126
            }
 
127
 
 
128
            b3 = CPLBase64DecodeChar[c3];
 
129
            b4 = CPLBase64DecodeChar[c4];
 
130
 
 
131
            *p++=((b1<<2)|(b2>>4) );
 
132
            if (c3 != '=') {
 
133
                *p++=(((b2&0xf)<<4)|(b3>>2) );
 
134
            }
 
135
            if (c4 != '=') {
 
136
                *p++=(((b3&0x3)<<6)|b4 );
 
137
            }
 
138
        }
 
139
        return(p-pszBase64);
 
140
    }
 
141
    return 0;
 
142
}
 
143
 
 
144
/*
 
145
 * This function was extracted from the base64 cpp utility published by
 
146
 * René Nyffenegger. The code was modified into a form suitable for use in
 
147
 * CPL.  The original code can be found at 
 
148
 * http://www.adp-gmbh.ch/cpp/common/base64.html.
 
149
 *
 
150
 * The following is the original notice of this function.
 
151
 *
 
152
 * base64.cpp and base64.h
 
153
 *
 
154
 *  Copyright (C) 2004-2008 René Nyffenegger
 
155
 *
 
156
 *  This source code is provided 'as-is', without any express or implied
 
157
 *  warranty. In no event will the author be held liable for any damages
 
158
 *  arising from the use of this software.
 
159
 *
 
160
 *  Permission is granted to anyone to use this software for any purpose,
 
161
 *  including commercial applications, and to alter it and redistribute it
 
162
 *  freely, subject to the following restrictions:
 
163
 *
 
164
 *  1. The origin of this source code must not be misrepresented; you must not
 
165
 *     claim that you wrote the original source code. If you use this source code
 
166
 *     in a product, an acknowledgment in the product documentation would be
 
167
 *     appreciated but is not required.
 
168
 *
 
169
 *  2. Altered source versions must be plainly marked as such, and must not be
 
170
 *     misrepresented as being the original source code.
 
171
 *
 
172
 *  3. This notice may not be removed or altered from any source distribution.
 
173
 *
 
174
 *  René Nyffenegger rene.nyffenegger@adp-gmbh.ch
 
175
*/
 
176
 
 
177
/************************************************************************/
 
178
/*                          CPLBase64Encode()                           */
 
179
/************************************************************************/
 
180
 
 
181
char *CPLBase64Encode( int nDataLen, const GByte *pabyBytesToEncode )
 
182
 
 
183
{
 
184
    static const std::string base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
185
 
 
186
    int           i = 0;
 
187
    int           j = 0;
 
188
    std::string   result("");
 
189
    unsigned char charArray3[3];
 
190
    unsigned char charArray4[4];
 
191
 
 
192
    while( nDataLen-- )
 
193
    {
 
194
        charArray3[i++] = *(pabyBytesToEncode++);
 
195
 
 
196
        if( i == 3 )
 
197
        {
 
198
            charArray4[0] = (charArray3[0] & 0xfc) >> 2;
 
199
            charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4);
 
200
            charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6);
 
201
            charArray4[3] = charArray3[2] & 0x3f;
 
202
 
 
203
            for( i = 0; i < 4; i++ )
 
204
            {
 
205
                result += base64Chars[charArray4[i]];
 
206
            }
 
207
 
 
208
            i = 0;
 
209
        }
 
210
    }
 
211
 
 
212
    if( i )
 
213
    {
 
214
        for( j = i; j < 3; j++ )
 
215
        {
 
216
            charArray3[j] = '\0';
 
217
        }
 
218
 
 
219
        charArray4[0] = (charArray3[0]  & 0xfc) >> 2;
 
220
        charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4);
 
221
        charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6);
 
222
        charArray4[3] = charArray3[2] & 0x3f;
 
223
 
 
224
        for ( j = 0; j < (i + 1); j++ )
 
225
        {
 
226
            result += base64Chars[charArray4[j]];
 
227
        }
 
228
 
 
229
        while( i++ < 3 )
 
230
            result += '=';
 
231
    }
 
232
 
 
233
    return (CPLStrdup(result.c_str()));
 
234
}
 
235