亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vconverter.cpp

?? funambol windows mobile plugin source code, the source code is taken from the funambol site
?? CPP
字號:
/*
 * Copyright (C) 2003-2007 Funambol, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY, TITLE, NONINFRINGEMENT 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 Place, Suite 330, Boston, MA
 * 02111-1307  USA
 */


#include "base/util/utils.h"
#include "vocl/VConverter.h"
#include "vocl/VObjectFactory.h"
#include "base/util/WString.h"
#include "base/quoted-printable.h"


VObject* VConverter::parse(const WCHAR* buffer) {

	WCHAR *objType = extractObjectType(buffer);
	WCHAR *objVersion = extractObjectVersion(buffer);
    if(!objType)
        return NULL;

	VObject* vo = VObjectFactory::createInstance(objType, objVersion);
    VProperty *prop;

    // Unfolding
    WCHAR* buffCopy = unfolding(buffer);

    while ( true ) {
        prop = readFieldHeader(buffCopy);
        if (!prop) {
            break;
        }
        if ( readFieldBody(buffCopy, prop )) {
            vo->addProperty(prop);
        }
        delete prop;
    }

    delete [] buffCopy; buffCopy  = NULL;

    return vo;
}

VProperty* VConverter::readFieldHeader(WCHAR* buffer) {

    WCHAR* headerIndex = NULL;
    WCHAR* quotaIndex = NULL;
    quotaIndex = wcschr(buffer, '"');
    headerIndex = wcschr(buffer, ':');


    if(!headerIndex)
        return NULL;
    bool quota = false;
    // If the header contains a quotation mark,
    // then rescan it starting directly after the _quotation mark_
    // (not after the end of the header, as in the original code)
    // to find the real end of the header.
    //
    // The reason for this code apparently is that the simple search above
    // might have found a headerIndex which points into the middle of
    // the quoted string.
    //
    // A better solution would be to always scan the header properly.
    if(quotaIndex && quotaIndex < headerIndex) {
        quota = true;
        int len = int(wcslen(buffer));
        for(int i = int(quotaIndex - buffer) + 1; i < len; i++) {
            if(buffer[i] == '"')
                quota = !quota;
            if(buffer[i] == ':' && !quota) {
                headerIndex = &buffer[i];
                break;
            }
        }
    }

    if(quota)
        return NULL;

    VProperty* prop = new VProperty(NULL);

    WCHAR* header = new WCHAR[wcslen(buffer) + 1];
    buffer[headerIndex - buffer] = '\0';
    wcscpy(header, buffer);
    // Shift the remaing string to the front of the buffer.
    // Using wcscpy() for that is incorrect because the standard
    // does not guarantee in which order bytes are moved!
    // wcscpy(buffer, ++headerIndex);
    ++headerIndex;
    memmove(buffer, headerIndex, (wcslen(headerIndex) + 1) * sizeof(*headerIndex));

    //if the header is folded (in .ics files)
    //we need to remove the folding
    WCHAR* headerFolding = NULL;
    if(headerFolding = wcsstr(header, TEXT("\n "))) {
        header[headerFolding - header] = '\0';
    }

    WCHAR seps[] = TEXT(";");
    WCHAR *token;
    bool first = true;

	token = wcstok( header, seps );
	while( token != NULL ) {
        if (first) {

            WCHAR* group = new WCHAR[wcslen(token) + 1];
            if(extractGroup(token, group))
                prop->addParameter(TEXT("GROUP"), group);
            else
                delete [] group; group= NULL;
            prop->setName(token);
            first = false;
        }
        else {
            WCHAR* paramIndex;
            paramIndex = wcschr(token, '=');

            if(paramIndex) {
                WCHAR* paramName = new WCHAR[wcslen(token) + 1];
                token[paramIndex - token] = '\0';
                wcscpy(paramName, token);
                ++paramIndex;
                memmove(token, paramIndex, (wcslen(paramIndex) + 1) * sizeof(*paramIndex));

                WCHAR* paramVal = new WCHAR[wcslen(token) + 1];
                wcscpy(paramVal, token);
                prop->addParameter(paramName, paramVal);

                delete [] paramName; paramName = NULL;
                delete [] paramVal; paramVal = NULL;
            }
            else {
                prop->addParameter(token,NULL);
            }
        }
        token = wcstok( NULL, seps );
    }

    delete [] header; header = NULL;
    delete token; token = NULL;

    return prop;
}

bool VConverter::readFieldBody(WCHAR* buffer, VProperty* vprop) {

    int i      = 0;
    int j      = 0;
    int len    = 0;
    int offset = 0;
    bool ret   = false;
    WCHAR* value     = NULL;
    WCHAR* allValues = NULL;
    WCHAR* c         = NULL;

    // Get length of all values
    while (buffer[i] != '\0') {
        if ((buffer[i] == '\r') || buffer[i] == '\n') {

            // Get offset of next property
            for (j=i+1; buffer[j] != '\0'; j++) {
                if((buffer[j] != '\r') && (buffer[j] != '\n'))
                    break;
            }
            offset = j;
            break;
        }
        i++;
    }
    len = i;


    if (!len) {
        // This field is empty, we MUST consider it adding an empty value
        // so any value on client will be deleted.
        vprop->addValue(TEXT(""));
        ret = true;
        goto finally;
    }

    // This is a string with all values for this property (to parse)
    allValues = new WCHAR[len + 1];
    wcsncpy(allValues, buffer, len);
    allValues[len] = 0;


    //
    // If needed, decode QP string and copy to 'allValues'.
    //
    if(vprop->equalsEncoding(TEXT("QUOTED-PRINTABLE"))) {

        char* buf = toMultibyte(allValues);
	    char* dec = qp_decode(buf);
        len = strlen(dec);
	    delete [] buf;

	    if (dec) {
            WCHAR* wdecoded = toWideChar(dec);
            delete [] dec;

            if (wdecoded) {
                wcsncpy(allValues, wdecoded, len);
                allValues[len] = 0;
                delete [] wdecoded;
            }
        }
        if (!len) {
            goto finally;
        }
    }

    /*
    --- base64 is not decoded ----
    IT IS NOT POSSIBLE TO DECODE BASE64 PARAMETERS IN A WCHAR
    AND TAKE THE LENGHT OF A BINARY!!
    */

    // This is a buffer for each single value
    value = new WCHAR[len + 1];
    wcscpy(value, TEXT(""));

    //
    // Extract values and add to Vproperty
    //
    j=0;
    c = allValues;
    for (i=0; i<len; i++) {

        // End of value
        if (c[i] == ';') {
            vprop->addValue(value);
            j = 0;
            wcscpy(value, TEXT(""));
        }

        else {
            // Manage escaped chars: jump back-slash
            if (c[i] == '\\') {
                if (c[i+1]=='n') {
                    // none: this is "\n" sequence (formatted line ending for 3.0)
                }
                else {
                    i++;
                    if (c[i] == '\0')
                        break;
                }
            }
            value[j] = c[i];
            j++;
            value[j] = '\0';
        }
    }

    vprop->addValue(value);
    ret = true;

finally:

    // Shift buffer for next property to parse
    //wcscpy(buffer, buffer+offset);
    memmove(buffer, buffer+offset, (wcslen(buffer+offset) + 1)*sizeof(*buffer));

    if (value) {
        delete [] value;     value = NULL;
    }
    if (allValues) {
        delete [] allValues; allValues = NULL;
    }

	return ret;
}



WCHAR* VConverter::extractObjectProperty(const WCHAR* buffer, const WCHAR *property,
                                           WCHAR * &buffCopy, size_t &buffCopyLen) {

    // Memory handling in extractObjectType() and
    // extractObjectVersion() was broken:
    // they allocated a buffer, then returned a pointer into
    // parts of this buffer as result. The caller cannot
    // free the result in this case. The functions were also
    // duplicating the same code.
    //
    // This partial fix reuses previously allocated
    // memory if the function is called a second time.

    size_t len = wcslen(buffer) + 1;
    if (buffCopyLen < len) {
        if (buffCopy) {
            delete [] buffCopy;
        }
        buffCopy = new WCHAR[len];
        buffCopyLen = len;
    }
    wcscpy(buffCopy, buffer);

    WCHAR seps[] = TEXT(":\n");
    WCHAR *token;

    token = wcstok( buffCopy, seps );
    while (token != NULL) {
        if(!wcscmp(token, property)) {
            token = wcstok( NULL, seps );
            WCHAR* index = wcschr(token,'\r');
            if(index)
                token[index-token] = '\0';
            return token;
        }
        token = wcstok( NULL, seps );
    }

    return NULL;
}

WCHAR* VConverter::extractObjectType(const WCHAR* buffer) {
    static WCHAR* buffCopy;
    static size_t buffCopyLen;

    return extractObjectProperty(buffer, TEXT("BEGIN"),
                                 buffCopy, buffCopyLen);
}


WCHAR* VConverter::extractObjectVersion(const WCHAR* buffer) {
    static WCHAR* buffCopy;
    static size_t buffCopyLen;

    return extractObjectProperty(buffer, TEXT("VERSION"),
                                 buffCopy, buffCopyLen);
}

bool VConverter::extractGroup(WCHAR* propertyName, WCHAR* propertyGroup) {

    WCHAR* groupIndex;
    groupIndex = wcschr(propertyName, '.');

    if(!groupIndex)
        return false;

    propertyName[groupIndex - propertyName] = '\0';
    wcscpy(propertyGroup, propertyName);
    wcscpy(propertyName, ++groupIndex);

    return true;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产一区二区三区| 中文字幕免费一区| 亚洲成人1区2区| 欧美性高清videossexo| 亚洲二区视频在线| 欧美一级高清大全免费观看| 九九国产精品视频| 国产亚洲成年网址在线观看| youjizz久久| 亚洲二区视频在线| 亚洲精品一区二区精华| 丁香一区二区三区| 一区二区在线免费| 91精品国产综合久久精品| 精品一区二区在线视频| 一区在线观看视频| 欧美日韩国产免费一区二区| 国产一区999| 亚洲黄色av一区| 精品国产a毛片| 一本一道久久a久久精品| 视频一区二区三区在线| 国产日韩精品一区二区浪潮av | 天堂蜜桃91精品| www亚洲一区| 欧美亚洲综合在线| 国内精品国产三级国产a久久| 亚洲视频小说图片| 亚洲精品一区二区三区99| 色综合久久久久综合体桃花网| 蜜臀a∨国产成人精品| 国产精品高潮久久久久无| 欧美日韩免费一区二区三区视频| 国内精品久久久久影院一蜜桃| 亚洲天堂精品在线观看| 欧美一卡2卡3卡4卡| 91香蕉视频mp4| 国产在线国偷精品产拍免费yy| 有码一区二区三区| 国产亚洲精品bt天堂精选| 91精品国产乱码| 91在线视频观看| 国产精品影视网| 日本中文字幕一区| 亚洲欧美激情一区二区| 久久综合九色综合欧美98| 欧美网站大全在线观看| av一本久道久久综合久久鬼色| 精品一区二区三区的国产在线播放| 亚洲黄色小说网站| 中文字幕一区av| 国产嫩草影院久久久久| 精品国产人成亚洲区| 欧美福利视频导航| 欧美午夜精品一区二区三区| 久久日韩粉嫩一区二区三区| 欧美色成人综合| av在线综合网| 懂色中文一区二区在线播放| 看电视剧不卡顿的网站| 日韩电影在线免费观看| 一卡二卡欧美日韩| 综合色中文字幕| 国产精品免费丝袜| 国产三级欧美三级日产三级99| 欧美videos中文字幕| 日韩一区二区三区在线观看| 91精品国产综合久久精品| 欧美精品在线一区二区三区| 欧美丝袜丝交足nylons图片| 欧美图片一区二区三区| 欧美天堂亚洲电影院在线播放| 91在线观看美女| 91年精品国产| 91麻豆精品在线观看| 日本精品视频一区二区三区| 在线精品亚洲一区二区不卡| 欧美中文字幕不卡| 欧美日韩免费观看一区三区| 欧美日韩亚洲综合| 91精品在线麻豆| 日韩精品中文字幕一区二区三区| 日韩一级成人av| 精品日韩一区二区三区| 26uuu精品一区二区在线观看| 久久久亚洲午夜电影| 亚洲国产精品传媒在线观看| 中文字幕亚洲在| 亚洲国产综合色| 老司机精品视频一区二区三区| 激情深爱一区二区| 国产91丝袜在线播放| 91小视频在线| 8x8x8国产精品| 久久综合九色综合久久久精品综合| 国产欧美一区二区精品仙草咪| 国产精品欧美久久久久无广告| 亚洲乱码精品一二三四区日韩在线| 亚洲激情自拍视频| 日韩黄色一级片| 国产传媒日韩欧美成人| 97久久精品人人爽人人爽蜜臀| 色www精品视频在线观看| 制服.丝袜.亚洲.另类.中文 | 久久精品国产**网站演员| 国产精品自在欧美一区| 色综合中文综合网| 91在线精品秘密一区二区| 精品视频色一区| 精品成a人在线观看| 国产精品久久毛片a| 香蕉影视欧美成人| 国产精品白丝av| 91国在线观看| 国产亚洲精品7777| 亚洲成人动漫一区| 国产成人精品亚洲午夜麻豆| 欧美综合一区二区| 久久综合九色综合97婷婷| 日韩一区中文字幕| 久久精品国产一区二区| 国产欧美一区二区精品性| 亚洲午夜在线电影| 国产a精品视频| 911精品国产一区二区在线| 国产精品污www在线观看| 日本中文在线一区| 在线视频欧美精品| 国产日韩欧美亚洲| 日本欧美在线观看| 91福利资源站| 国产精品色哟哟| 美腿丝袜在线亚洲一区| 在线观看亚洲成人| 国产精品免费久久| 麻豆中文一区二区| 欧美亚洲高清一区二区三区不卡| 久久久精品免费网站| 蜜桃精品视频在线| 欧美三日本三级三级在线播放| 国产精品乱码妇女bbbb| 狠狠色综合色综合网络| 欧美日韩国产欧美日美国产精品| 国产精品久久久久久久久果冻传媒| 久久精品国产精品青草| 欧美浪妇xxxx高跟鞋交| 亚洲伊人色欲综合网| av高清不卡在线| 国产欧美日韩在线| 狠狠色丁香婷婷综合| 这里是久久伊人| 午夜一区二区三区在线观看| 91麻豆免费看| 亚洲日本乱码在线观看| 风间由美性色一区二区三区| 精品播放一区二区| 久草热8精品视频在线观看| 欧美电影影音先锋| 亚洲va欧美va国产va天堂影院| 色偷偷成人一区二区三区91| 中文字幕在线播放不卡一区| 国v精品久久久网| 国产精品无圣光一区二区| 国产69精品一区二区亚洲孕妇| 久久久久久久精| 成人永久免费视频| 欧美极品另类videosde| 国产 日韩 欧美大片| 国产精品丝袜一区| www.日韩精品| 亚洲伦理在线免费看| 欧美自拍偷拍一区| 午夜精品爽啪视频| 欧美一级夜夜爽| 国产揄拍国内精品对白| 国产婷婷色一区二区三区四区 | 成人av网站大全| 中文字幕一区二区三区不卡在线 | 欧美日韩一区二区三区免费看| 一区二区三区四区在线免费观看| 在线观看三级视频欧美| 亚洲综合色在线| 91精品国产一区二区三区香蕉 | 久久精品欧美一区二区三区麻豆| 国产成都精品91一区二区三| 一区在线播放视频| 欧美日本精品一区二区三区| 免费观看30秒视频久久| 久久嫩草精品久久久精品| 成人av免费网站| 亚洲综合精品自拍| 欧美一级一区二区| 国产精品99久久久久久久vr| 亚洲色图欧美偷拍| 91麻豆精品国产无毒不卡在线观看 | 国产精品高潮久久久久无| 欧美亚洲日本国产| 狠狠色丁香九九婷婷综合五月| 国产乱码一区二区三区| 亚洲卡通欧美制服中文|