LCOV - code coverage report
Current view: top level - libreoffice/ucb/source/ucp/webdav-neon - DateTimeHelper.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 101 0.0 %
Date: 2012-12-27 Functions: 0 4 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*************************************************************************
       3             :  *
       4             :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5             :  *
       6             :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7             :  *
       8             :  * OpenOffice.org - a multi-platform office productivity suite
       9             :  *
      10             :  * This file is part of OpenOffice.org.
      11             :  *
      12             :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13             :  * it under the terms of the GNU Lesser General Public License version 3
      14             :  * only, as published by the Free Software Foundation.
      15             :  *
      16             :  * OpenOffice.org is distributed in the hope that it will be useful,
      17             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19             :  * GNU Lesser General Public License version 3 for more details
      20             :  * (a copy is included in the LICENSE file that accompanied this code).
      21             :  *
      22             :  * You should have received a copy of the GNU Lesser General Public License
      23             :  * version 3 along with OpenOffice.org.  If not, see
      24             :  * <http://www.openoffice.org/license.html>
      25             :  * for a copy of the LGPLv3 License.
      26             :  *
      27             :  ************************************************************************/
      28             : 
      29             : 
      30             : #include <stdio.h>
      31             : #include <osl/time.h>
      32             : #include <com/sun/star/util/DateTime.hpp>
      33             : #include "DateTimeHelper.hxx"
      34             : 
      35             : using namespace com::sun::star::util;
      36             : 
      37             : using namespace webdav_ucp;
      38             : 
      39             : using ::rtl::OUString;
      40             : using ::rtl::OString;
      41             : 
      42           0 : bool DateTimeHelper::ISO8601_To_DateTime (const OUString& s,
      43             :     DateTime& dateTime)
      44             : {
      45           0 :     OString aDT (s.getStr(), s.getLength(), RTL_TEXTENCODING_ASCII_US);
      46             : 
      47             :     int year, month, day, hours, minutes, off_hours, off_minutes, fix;
      48             :     double seconds;
      49             : 
      50             :     // 2001-01-01T12:30:00Z
      51             :     int n = sscanf( aDT.getStr(), "%04d-%02d-%02dT%02d:%02d:%lfZ",
      52           0 :                     &year, &month, &day, &hours, &minutes, &seconds );
      53           0 :     if ( n == 6 )
      54             :     {
      55           0 :         fix = 0;
      56             :     }
      57             :     else
      58             :     {
      59             :         // 2001-01-01T12:30:00+03:30
      60             :         n = sscanf( aDT.getStr(), "%04d-%02d-%02dT%02d:%02d:%lf+%02d:%02d",
      61             :                     &year, &month, &day, &hours, &minutes, &seconds,
      62           0 :                     &off_hours, &off_minutes );
      63           0 :         if ( n == 8 )
      64             :         {
      65           0 :             fix = - off_hours * 3600 - off_minutes * 60;
      66             :         }
      67             :         else
      68             :         {
      69             :             // 2001-01-01T12:30:00-03:30
      70             :             n = sscanf( aDT.getStr(), "%04d-%02d-%02dT%02d:%02d:%lf-%02d:%02d",
      71             :                         &year, &month, &day, &hours, &minutes, &seconds,
      72           0 :                         &off_hours, &off_minutes );
      73           0 :             if ( n == 8 )
      74             :             {
      75           0 :                 fix = off_hours * 3600 + off_minutes * 60;
      76             :             }
      77             :             else
      78             :             {
      79           0 :                 return false;
      80             :             }
      81             :         }
      82             :     }
      83             : 
      84             :     // Convert to local time...
      85             : 
      86             :     oslDateTime aDateTime;
      87           0 :     aDateTime.NanoSeconds = 0;
      88           0 :     aDateTime.Seconds     = sal::static_int_cast< sal_uInt16 >(seconds); // 0-59
      89           0 :     aDateTime.Minutes     = sal::static_int_cast< sal_uInt16 >(minutes); // 0-59
      90           0 :     aDateTime.Hours       = sal::static_int_cast< sal_uInt16 >(hours); // 0-23
      91           0 :     aDateTime.Day         = sal::static_int_cast< sal_uInt16 >(day); // 1-31
      92           0 :     aDateTime.DayOfWeek   = 0;          // 0-6, 0 = Sunday
      93           0 :     aDateTime.Month       = sal::static_int_cast< sal_uInt16 >(month); // 1-12
      94           0 :     aDateTime.Year        = sal::static_int_cast< sal_uInt16 >(year);
      95             : 
      96             :     TimeValue aTimeValue;
      97           0 :     if ( osl_getTimeValueFromDateTime( &aDateTime, &aTimeValue ) )
      98             :     {
      99           0 :         aTimeValue.Seconds += fix;
     100             : 
     101           0 :         if ( osl_getLocalTimeFromSystemTime( &aTimeValue, &aTimeValue ) )
     102             :         {
     103           0 :             if ( osl_getDateTimeFromTimeValue( &aTimeValue, &aDateTime ) )
     104             :             {
     105           0 :                 dateTime.Year    = aDateTime.Year;
     106           0 :                 dateTime.Month   = aDateTime.Month;
     107           0 :                 dateTime.Day     = aDateTime.Day;
     108           0 :                 dateTime.Hours   = aDateTime.Hours;
     109           0 :                 dateTime.Minutes = aDateTime.Minutes;
     110           0 :                 dateTime.Seconds = aDateTime.Seconds;
     111             : 
     112           0 :                 return true;
     113             :              }
     114             :         }
     115             :     }
     116             : 
     117           0 :     return false;
     118             : }
     119             : 
     120           0 : sal_Int32 DateTimeHelper::convertMonthToInt (const OUString& month)
     121             : {
     122           0 :     if (month.compareToAscii ("Jan") == 0)
     123           0 :         return 1;
     124           0 :     else if (month.compareToAscii ("Feb") == 0)
     125           0 :         return 2;
     126           0 :     else if (month.compareToAscii ("Mar") == 0)
     127           0 :         return 3;
     128           0 :     else if (month.compareToAscii ("Apr") == 0)
     129           0 :         return 4;
     130           0 :     else if (month.compareToAscii ("May") == 0)
     131           0 :         return 5;
     132           0 :     else if (month.compareToAscii ("Jun") == 0)
     133           0 :         return 6;
     134           0 :     else if (month.compareToAscii ("Jul") == 0)
     135           0 :         return 7;
     136           0 :     else if (month.compareToAscii ("Aug") == 0)
     137           0 :         return 8;
     138           0 :     else if (month.compareToAscii ("Sep") == 0)
     139           0 :         return 9;
     140           0 :     else if (month.compareToAscii ("Oct") == 0)
     141           0 :         return 10;
     142           0 :     else if (month.compareToAscii ("Nov") == 0)
     143           0 :         return 11;
     144           0 :     else if (month.compareToAscii ("Dec") == 0)
     145           0 :         return 12;
     146             :     else
     147           0 :         return 0;
     148             : }
     149             : 
     150           0 : bool DateTimeHelper::RFC2068_To_DateTime (const OUString& s,
     151             :     DateTime& dateTime)
     152             : {
     153             :     int year;
     154             :     int day;
     155             :     int hours;
     156             :     int minutes;
     157             :     int seconds;
     158             :     sal_Char string_month[3 + 1];
     159             :     sal_Char string_day[3 + 1];
     160             : 
     161           0 :     sal_Int32 found = s.indexOf (',');
     162           0 :     if (found != -1)
     163             :     {
     164           0 :         OString aDT (s.getStr(), s.getLength(), RTL_TEXTENCODING_ASCII_US);
     165             : 
     166             :         // RFC 1123
     167             :         found = sscanf (aDT.getStr(), "%3s, %2d %3s %4d %2d:%2d:%2d GMT",
     168           0 :                         string_day, &day, string_month, &year, &hours, &minutes, &seconds);
     169           0 :         if (found != 7)
     170             :         {
     171             :             // RFC 1036
     172             :             found = sscanf (aDT.getStr(), "%3s, %2d-%3s-%2d %2d:%2d:%2d GMT",
     173           0 :                             string_day, &day, string_month, &year, &hours, &minutes, &seconds);
     174             :         }
     175           0 :         found = (found == 7) ? 1 : 0;
     176             :     }
     177             :     else
     178             :     {
     179           0 :         OString aDT (s.getStr(), s.getLength(), RTL_TEXTENCODING_ASCII_US);
     180             : 
     181             :         // ANSI C's asctime () format
     182             :         found = sscanf (aDT.getStr(), "%3s %3s %d %2d:%2d:%2d %4d",
     183             :                         string_day, string_month,
     184           0 :                         &day, &hours, &minutes, &seconds, &year);
     185           0 :         found = (found == 7) ? 1 : 0;
     186             :     }
     187             : 
     188           0 :     if (found)
     189             :     {
     190           0 :         found = 0;
     191             : 
     192             :         int month = DateTimeHelper::convertMonthToInt (
     193           0 :                             OUString::createFromAscii (string_month));
     194           0 :         if (month)
     195             :         {
     196             :             // Convert to local time...
     197             : 
     198             :             oslDateTime aDateTime;
     199           0 :             aDateTime.NanoSeconds = 0;
     200           0 :             aDateTime.Seconds     = sal::static_int_cast< sal_uInt16 >(seconds);
     201             :                 // 0-59
     202           0 :             aDateTime.Minutes     = sal::static_int_cast< sal_uInt16 >(minutes);
     203             :                 // 0-59
     204           0 :             aDateTime.Hours       = sal::static_int_cast< sal_uInt16 >(hours);
     205             :                 // 0-23
     206           0 :             aDateTime.Day         = sal::static_int_cast< sal_uInt16 >(day);
     207             :                 // 1-31
     208           0 :             aDateTime.DayOfWeek   = 0; //dayofweek;  // 0-6, 0 = Sunday
     209           0 :             aDateTime.Month       = sal::static_int_cast< sal_uInt16 >(month);
     210             :                 // 1-12
     211           0 :             aDateTime.Year        = sal::static_int_cast< sal_uInt16 >(year);
     212             : 
     213             :             TimeValue aTimeValue;
     214           0 :             if ( osl_getTimeValueFromDateTime( &aDateTime,
     215           0 :                                                 &aTimeValue ) )
     216             :             {
     217           0 :                 if ( osl_getLocalTimeFromSystemTime( &aTimeValue,
     218           0 :                                                         &aTimeValue ) )
     219             :                 {
     220           0 :                     if ( osl_getDateTimeFromTimeValue( &aTimeValue,
     221           0 :                                                         &aDateTime ) )
     222             :                     {
     223           0 :                         dateTime.Year    = aDateTime.Year;
     224           0 :                         dateTime.Month   = aDateTime.Month;
     225           0 :                         dateTime.Day     = aDateTime.Day;
     226           0 :                         dateTime.Hours   = aDateTime.Hours;
     227           0 :                         dateTime.Minutes = aDateTime.Minutes;
     228           0 :                         dateTime.Seconds = aDateTime.Seconds;
     229             : 
     230           0 :                         found = 1;
     231             :                     }
     232             :                 }
     233             :             }
     234             :         }
     235             :     }
     236             : 
     237           0 :     return (found) ? true : false;
     238             : }
     239             : 
     240           0 : bool DateTimeHelper::convert (const OUString& s, DateTime& dateTime)
     241             : {
     242           0 :     if (ISO8601_To_DateTime (s, dateTime))
     243           0 :         return true;
     244           0 :     else if (RFC2068_To_DateTime (s, dateTime))
     245           0 :         return true;
     246             :     else
     247           0 :         return false;
     248             : }
     249             : 
     250             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10