114 lines
3.4 KiB
C
114 lines
3.4 KiB
C
|
/*
|
||
|
*
|
||
|
* @APPLE_LICENSE_HEADER_START@
|
||
|
*
|
||
|
* Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
|
||
|
*
|
||
|
* This file contains Original Code and/or Modifications of Original Code
|
||
|
* as defined in and that are subject to the Apple Public Source License
|
||
|
* Version 2.0 (the 'License'). You may not use this file except in
|
||
|
* compliance with the License. Please obtain a copy of the License at
|
||
|
* http://www.opensource.apple.com/apsl/ and read it before using this
|
||
|
* file.
|
||
|
*
|
||
|
* The Original Code and all software distributed under the License are
|
||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||
|
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
||
|
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||
|
* Please see the License for the specific language governing rights and
|
||
|
* limitations under the License.
|
||
|
*
|
||
|
* @APPLE_LICENSE_HEADER_END@
|
||
|
*
|
||
|
*/
|
||
|
/*
|
||
|
File: DateTranslator.h
|
||
|
|
||
|
Contains: Efficient routines & data structures for converting from
|
||
|
RFC 1123 compliant date strings to local file system dates & vice versa.
|
||
|
|
||
|
|
||
|
|
||
|
*/
|
||
|
|
||
|
#ifndef _DATE_TRANSLATOR_H_
|
||
|
#define _DATE_TRANSLATOR_H_
|
||
|
|
||
|
#include <ctype.h>
|
||
|
#include <time.h>
|
||
|
#include "StrPtrLen.h"
|
||
|
|
||
|
class DateBuffer;
|
||
|
|
||
|
class DateTranslator
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
// this updates the DateBuffer to be the current date / time.
|
||
|
// If you wish to set the DateBuffer to a particular date, pass in that date.
|
||
|
// Dates should be in the OS.h compliant format
|
||
|
static void UpdateDateBuffer(DateBuffer* inDateBuffer, const SInt64& inDate, time_t gmtoffset = 0);
|
||
|
|
||
|
//Given an HTTP/1.1 compliant date string (in one of the three 1.1 formats)
|
||
|
//this returns an OS.h compliant date/time value.
|
||
|
static SInt64 ParseDate(StrPtrLen* inDateString);
|
||
|
|
||
|
private:
|
||
|
|
||
|
static UInt32 ConvertCharToMonthTableIndex(int inChar)
|
||
|
{
|
||
|
return (UInt32)(toupper(inChar) - 'A'); // Convert to a value between 0 - 25
|
||
|
}
|
||
|
};
|
||
|
|
||
|
class DateBuffer
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
// This class provides no protection against being accessed from multiple threads
|
||
|
// simultaneously. Update & InexactUpdate rewrite the date buffer, so care should
|
||
|
// be taken to protect against simultaneous access.
|
||
|
|
||
|
DateBuffer() : fLastDateUpdate(0) { fDateBuffer[0] = 0; }
|
||
|
~DateBuffer() {}
|
||
|
|
||
|
//SEE RFC 1123 for details on the date string format
|
||
|
//ex: Mon, 04 Nov 1996 21:42:17 GMT
|
||
|
|
||
|
//RFC 1123 date strings are always of this length
|
||
|
enum
|
||
|
{
|
||
|
kDateBufferLen = 29
|
||
|
};
|
||
|
|
||
|
// Updates this date buffer to reflect the current time.
|
||
|
// If a date is provided, this updates the DateBuffer to be that date.
|
||
|
void Update(const SInt64& inDate) { DateTranslator::UpdateDateBuffer(this, inDate); }
|
||
|
|
||
|
// Updates this date buffer to reflect the current time, with a certain degree
|
||
|
// of inexactitude (the range of error is defined by the kUpdateInterval value)
|
||
|
void InexactUpdate();
|
||
|
|
||
|
//returns a NULL terminated C-string always of kHTTPDateLen length.
|
||
|
char *GetDateBuffer() { return fDateBuffer; }
|
||
|
|
||
|
private:
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
kUpdateInterval = 60000 // Update every minute
|
||
|
};
|
||
|
|
||
|
//+1 for terminator +1 for padding
|
||
|
char fDateBuffer[kDateBufferLen + 2];
|
||
|
SInt64 fLastDateUpdate;
|
||
|
|
||
|
friend class DateTranslator;
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|