utils.cpp

来自「funambol window mobile客户端源代码」· C++ 代码 · 共 2,314 行 · 第 1/5 页

CPP
2,314
字号
      s.insert(position, _T("<"));
      s.replace(position +1, 4, _T(""));
          if (position + 1 >= s.length()) {
            position = std::wstring::npos;
            break;
          }
          position = position + 1;
      position = s.find(_T("&lt;"), position);

      if (position == std::wstring::npos) {
            break;
          }
    }

    //
    // >
    //
    position = 0;
    previousPosition = 0;
    position = s.find(_T("&gt;"));
    while (position != std::wstring::npos) {
      s.insert(position, _T(">"));
      s.replace(position + 1, 4, _T(""));
          if (position + 1 >= s.length()) {
            position = std::wstring::npos;
            break;
          }
          position = position + 1;
      position = s.find(_T("&gt;"), position);

      if (position == std::wstring::npos) {
            break;
         }
    }

}

/*
* The method return current system time in VariantTime format
* used in FILEFileManagement
*/

DATE getSystemTime() {

    SYSTEMTIME t;
    DATE date;
    BOOL isUTC = TRUE;
    wchar_t localTemp [DIM_LOCAL_TEMP];

    GetLocalTime (&t);

    // conversion from actual time to UTC
    // if propertyValue PROPERTY_SOURCEPROP_SYSTEMTIME_TO_LOCALTIME == 1 then
    //wchar_t propertyValue[10];
    //getClientConfigurationInternal (NULL, PROPERTY_SOURCEPROP_SPDM_SYSTEMTIME_TO_LOCALTIME, propertyValue, FALSE);

    //if (wcscmp(propertyValue, TEXT("1")) == 0) {
    //    isUTC = TRUE;
    //}

    if (isUTC) {
        localTimeToUTC(t);
    }

    wchar_t month [10];
    wchar_t day   [10];
    wchar_t hour  [10];
    wchar_t minute[10];
    wchar_t second[10];

    // month
    if (t.wMonth < 10)
        wsprintf(month, TEXT("0%i"), t.wMonth);
    else
        wsprintf(month, TEXT("%i"), t.wMonth);

    // day
    if (t.wDay  < 10)
        wsprintf(day, TEXT("0%i"), t.wDay);
    else
        wsprintf(day, TEXT("%i"), t.wDay);

    // hour
    if (t.wHour  < 10)
        wsprintf(hour, TEXT("0%i"), t.wHour);
    else
        wsprintf(hour, TEXT("%i"), t.wHour);

    // minute
    if (t.wMinute < 10)
        wsprintf(minute, TEXT("0%i"), t.wMinute);
    else
        wsprintf(minute, TEXT("%i"), t.wMinute);

    // second
    if (t.wSecond < 10)
        wsprintf(second, TEXT("0%i"), t.wSecond);
    else
        wsprintf(second, TEXT("%i"), t.wSecond);

    if (isUTC) {
        wsprintf(localTemp, TEXT("%i%s%sT%s%s%sZ"), t.wYear, month, day, hour, minute, second);
    } else {
        wsprintf(localTemp, TEXT("%i%s%sT%s%s%s"), t.wYear, month, day, hour, minute, second);
    }
    //MessageBox (NULL, localTemp, TEXT ("Update"), MB_SETFOREGROUND |MB_OK);
    systemTimeToDouble(localTemp, &date, NULL);

    return date;

}

/*
* The method return current system time from VariantTime format
*
* @param tempDate : the variable to write date in
* @param date     : the date in variant time format
*/

void doubleToSystemTime(wchar_t* tempDate, DATE date) {
    doubleToSystemTimeHourZero(tempDate, date, FALSE, TRUE);
}


/**
 * Variant time (double) -> System time ("YYYYMMDD" or "YYYYMMDDThhmmssZ")
 * The output 'tempDate' is a string. It's in UTC based on param 'toUTC'.
 *
 * @param tempDate           [OUT] the date returned in SystemTime format
 * @param date               the input date in variant time format
 * @param isHourToSetToZero  if TRUE, the output systemTime has hours, minutes and seconds = 0
 * @param toUTC              TRUE if we want conversion in UTC format (YYYYMMDDThhmmssZ)
 */
void doubleToSystemTimeHourZero(wchar_t* tempDate, DATE date, BOOL isHourToSetToZero, BOOL toUTC) {

    SYSTEMTIME t;
    VariantTimeToSystemTime(date, &t);

    if (isHourToSetToZero) {
        t.wHour = 0;
        t.wMinute = 0;
        t.wSecond = 0;
    }

    if (toUTC) {
        localTimeToUTC2(t);
    }

    wsprintf(tempDate, TEXT("%d%02d%02dT%02d%02d%02d"),
             t.wYear, t.wMonth, t.wDay,
             t.wHour, t.wMinute, t.wSecond);

    if (toUTC) {
        wcscat(tempDate, TEXT("Z"));
    }
}





/*
* Is like doubleToSystemTime but set hour to 0. It used directly for anniversary and birthday.
* if not the time represented by date is the same in which the date is written
* on the device
*/
void doubleToSystemTimeBirthday(wchar_t* tempDate, DATE date) {

    SYSTEMTIME t;

    VariantTimeToSystemTime(date, &t);

    t.wHour = 0;
    t.wMinute = 0;
    t.wSecond = 0;

    wchar_t month [10];
    wchar_t day   [10];

    // month
    if (t.wMonth < 10)
        wsprintf(month, TEXT("0%i"), t.wMonth);
    else
        wsprintf(month, TEXT("%i"), t.wMonth);

    // day
    if (t.wDay  < 10)
        wsprintf(day, TEXT("0%i"), t.wDay);
    else
        wsprintf(day, TEXT("%i"), t.wDay);


    wsprintf(tempDate, TEXT("%i-%s-%s"), t.wYear, month, day);


}

/*
* The method transform a string date in format "yyyy-MM-dd" to DATE
*
* @param dataString : the string in yyyy-MM-dd format
* @param date       : the returned value into VariantTime format
* @action           : the parameter to set manually hour and minute. If NULL current value are used
*/
void systemTimeToDoubleBirthday(const wchar_t* dataString, DATE* date) {
    systemTimeToDoubleBirthFormat(dataString, date, TEXT("START"));
}

/*
* It is used to transform yyyy-MM-dd format date into DATE. type parameter is to set
* the hours and minutes.
* Parameter END to set hour 23:59
* Parameter START to set hour 00:00
* Set the hour to 00:00 is used for birthday, anniversary and startDate of appoitment
* when it is all day event. Set hour 23:59 for endDate when an appointment it is allDayEvent
*/
void systemTimeToDoubleBirthFormat(const wchar_t* dataString, DATE* date, const wchar_t* type) {

    wchar_t* token  = NULL;
    wchar_t* dummy  = NULL;
    wchar_t* Ztoken = NULL;

    wchar_t internalString[DIM_LOCAL_TEMP];
    wsprintf(internalString, dataString);
    wchar_t tmp[50];

    int ret = 0;

    SYSTEMTIME t;

    Ztoken = wcschr(dataString, '-');
    if (Ztoken == NULL) {
        systemTimeToDouble(dataString, date, NULL);
        return;
    }

    //  TEXT("yyyy-MM-dd")
    token = wcstok(internalString, TEXT("-"));

    if (token != NULL) {

        //yyyy
        wcsncpy(tmp, dataString, 4);
        tmp[4] = 0;
        swscanf(tmp, TEXT("%d"),&t.wYear);
        //MM
        wcsncpy(tmp, dataString + 5, 2);
        tmp[2] = 0;
        swscanf(tmp, TEXT("%d"),&t.wMonth);
        //dd
         wcsncpy(tmp, dataString + 8, 2);
        tmp[2] = 0;
        swscanf(tmp, TEXT("%d"),&t.wDay);

        if (wcscmp(type, TEXT("END")) == 0) {

            t.wHour = 23;
            t.wMinute = 59;
            t.wSecond = 0;
        } else {

            t.wHour = 0;
            t.wMinute = 0;
            t.wSecond = 0;
        }

        // set to default
        t.wMilliseconds = 0;
        t.wDayOfWeek = 0;

        ret = SystemTimeToVariantTime (&t, date);


    } else {

        (*date) = 949998.000000;

    }
}


/*
* The method transform a date in format "YYYYMMDDThhmmss" or "YYYYMMDDThhmmssZ" with hour 0-24 into VariantTime format.
*
* @param dataString : the string in "YYYYMMDDThhmmss" or "YYYYMMDDThhmmssZ" format
* @param date       : the returned value into VariantTime format
* @action           : the parameter to set manually hour and minute. If NULL current value are used
*/
void systemTimeToDouble(const wchar_t* dataString, DATE* date, const wchar_t* action) {

    wchar_t* token  = NULL;
    wchar_t* dummy  = NULL;
    wchar_t* Ztoken = NULL;
    BOOL isUTC      = FALSE;
    wchar_t internalString[DIM_LOCAL_TEMP];
    wsprintf(internalString, dataString);
    wchar_t tmp[50];

    int ret = 0;

    SYSTEMTIME t;

    //  TEXT("20041006T203457") or TEXT("20041006T203457Z")
    token = wcstok(internalString, TEXT("T"));
    Ztoken = wcschr(dataString, 'Z');
    if (Ztoken != NULL) {
        isUTC = TRUE;
    }

    if (token != NULL) {

        //yyyy
        wcsncpy(tmp, dataString, 4);
        tmp[4] = 0;
        swscanf(tmp, TEXT("%d"),&t.wYear);
        //MM
        wcsncpy(tmp, dataString + 4, 2);
        tmp[2] = 0;
        swscanf(tmp, TEXT("%d"),&t.wMonth);
        //dd
        wcsncpy(tmp, dataString + 6, 2);
        tmp[2] = 0;
        swscanf(tmp, TEXT("%d"),&t.wDay);

        if (action != NULL && wcscmp(action, TEXT("0000")) == 0) {
            t.wHour = 0;
            t.wMinute = 0;
            t.wSecond = 0;

        } else if (action != NULL && wcscmp(action, TEXT("2359")) == 0) {
            t.wHour = 23;
            t.wMinute = 59;
            t.wSecond = 59;
        } else {
            if (wcslen(dataString) > 9) {
                //HH
                wcsncpy(tmp, dataString + 9, 2);
                tmp[2] = 0;
                swscanf(tmp, TEXT("%d"),&t.wHour);

                //mm
                 wcsncpy(tmp, dataString + 11, 2);
                tmp[2] = 0;
                swscanf(tmp, TEXT("%d"),&t.wMinute);
                //ss
                 wcsncpy(tmp, dataString + 13, 2);
                tmp[2] = 0;
                swscanf(tmp, TEXT("%d"),&t.wSecond);


            } else {
                t.wHour = 0;
                t.wMinute = 0;
                t.wSecond = 0;
            }

        }
        // set to default
        t.wMilliseconds = 0;
        t.wDayOfWeek = 0;


        if(isUTC) {
            UTCToLocalTime2(t);
        }
        ret = SystemTimeToVariantTime (&t, date);


    } else {

        (*date) = 949998.000000;

    }

}

/*
* return date and time of a date and if it is in utc or not
*/
BOOL getDateAndTimeAsIs(const wchar_t* dataString, DATE* date) {

    wchar_t* token  = NULL;
    wchar_t* dummy  = NULL;
    wchar_t* Ztoken = NULL;
    BOOL isUTC      = FALSE;
    wchar_t internalString[DIM_LOCAL_TEMP];
    wsprintf(internalString, dataString);
    wchar_t tmp[50];

    int ret = 0;

    SYSTEMTIME t;

    //  TEXT("20041006T203457") or TEXT("20041006T203457Z")
    token = wcstok(internalString, TEXT("T"));
    Ztoken = wcschr(dataString, 'Z');
    if (Ztoken != NULL) {
        isUTC = TRUE;
    }

    if (token != NULL) {

        //yyyy
        wcsncpy(tmp, dataString, 4);
        tmp[4] = 0;
        swscanf(tmp, TEXT("%d"),&t.wYear);
        //MM
        wcsncpy(tmp, dataString + 4, 2);
        tmp[2] = 0;
        swscanf(tmp, TEXT("%d"),&t.wMonth);
        //dd
         wcsncpy(tmp, dataString + 6, 2);
        tmp[2] = 0;
        swscanf(tmp, TEXT("%d"),&t.wDay);

        if (wcslen(dataString) > 9) {
            //HH
            wcsncpy(tmp, dataString + 9, 2);
            tmp[2] = 0;
            swscanf(tmp, TEXT("%d"),&t.wHour);

            //mm
            wcsncpy(tmp, dataString + 11, 2);
            tmp[2] = 0;
            swscanf(tmp, TEXT("%d"),&t.wMinute);
            //ss
            wcsncpy(tmp, dataString + 13, 2);
            tmp[2] = 0;
            swscanf(tmp, TEXT("%d"),&t.wSecond);

        } else {
            t.wHour = 0;
            t.wMinute = 0;
            t.wSecond = 0;
        }


        // set to default
        t.wMilliseconds = 0;
        t.wDayOfWeek = 0;

        ret = SystemTimeToVariantTime (&t, date);


    } else {

        (*date) = 949998.000000;

    }
    return isUTC;

}


/**
 * Check if the given date is in date-only format or not.
 * FIXME: we should support YYYYMMDD too, without '-'.
 */
bool isDateForAllDayEventFormat(const wchar_t* stringDate) {
    return (wcschr(stringDate, '-') != NULL);
}

/**

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?