Author: rfm
Date: Wed Apr 5 12:54:03 2017
New Revision: 40448
URL: http://svn.gna.org/viewcvs/gnustep?rev=40448&view=rev
Log:
fixups for json timezone/timestamp encoding
Modified:
libs/webservices/trunk/GWSCoder.h
libs/webservices/trunk/GWSJSONCoder.m
Modified: libs/webservices/trunk/GWSCoder.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/webservices/trunk/GWSCoder.h?rev=40448&r1=40447&r2=40448&view=diff
==============================================================================
--- libs/webservices/trunk/GWSCoder.h (original)
+++ libs/webservices/trunk/GWSCoder.h Wed Apr 5 12:54:03 2017
@@ -478,7 +478,7 @@
/** Take the supplied date and encode it as an XMLRPC timestamp.<br />
* This uses the timezone currently set in the receiver to determine
- * the time of day encoded.
+ * the time of day encoded. The format is YYYYMMDDTHH:MM:SS
*/
- (NSString*) encodeDateTimeFrom: (NSDate*)source;
@@ -585,10 +585,16 @@
parameters: (NSDictionary*)parameters
order: (NSArray*)order;
+/** A helper method which decodes a timestamp from ISO8601 format,
+ * YYYY-MM-DDTHH:MM:SS.mmmZ
+ */
+- (NSCalendarDate*) decodeDateTimeFrom: (NSString*)source;
+
/** Take the supplied date and encode it as a string.<br />
* This uses the timezone currently set in the receiver to determine
* the time of day encoded.<br />
- * There is no standard for JSON timestamps.
+ * There is no standard for JSON timestamps, but the recommended value
+ * (supported by javascript) is ISO8601 ... YYYY-MM-DDTHH:MM:SS.mmmZ
*/
- (NSString*) encodeDateTimeFrom: (NSDate*)source;
@@ -606,6 +612,10 @@
*/
- (void) setRPCID: (id)o;
+/** Does nothing ... JSON always uses GMT as the time zone.
+ */
+- (void) setTimeZone: (NSTimeZone*)timeZone;
+
/** Sets the json-rpc version.<br />
* May be "2.0" or "1.0" (any other non-nil value is currently considered
* to be version 1.0) or nil if JSON-RPC is not to be used.<br />
@@ -615,6 +625,10 @@
* to the method call overrides any value set in the coder).
*/
- (void) setVersion: (NSString*)v;
+
+/** Return the time zone for encoding/decoding; always GMT for JSON.
+ */
+- (NSTimeZone*) timeZone;
/** Returns the json-rpc version (currently "2.0" or "1.0" or nil).<br />
* See -setVersion: for details.
Modified: libs/webservices/trunk/GWSJSONCoder.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/webservices/trunk/GWSJSONCoder.m?rev=40448&r1=40447&r2=40448&view=diff
==============================================================================
--- libs/webservices/trunk/GWSJSONCoder.m (original)
+++ libs/webservices/trunk/GWSJSONCoder.m Wed Apr 5 12:54:03 2017
@@ -41,6 +41,7 @@
static Class NSNullClass;
static Class NSNumberClass;
static Class NSStringClass;
+static NSTimeZone *tz;
static NSString*
JSONQuote(NSString *str)
@@ -579,6 +580,7 @@
boolY = [[NSNumberClass numberWithBool: YES] retain];
boolN = [[NSNumberClass numberWithBool: NO] retain];
null = [[NSNullClass null] retain];
+ tz = [[NSTimeZone timeZoneWithName: @"GMT"] retain];
}
- (void) appendObject: (id)o
@@ -949,12 +951,49 @@
[super dealloc];
}
+- (NSCalendarDate*) decodeDateTimeFrom: (NSString*)source
+{
+ int year;
+ int month;
+ int day;
+ int hour;
+ int minute;
+ int second;
+ int millisecond;
+ NSTimeInterval ti;
+ const char *u;
+ NSCalendarDate *d;
+
+ u = [source UTF8String];
+ if (sscanf(u, "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ",
+ &year, &month, &day, &hour, &minute, &second, &millisecond) != 7)
+ {
+ [NSException raise: NSInvalidArgumentException
+ format: @"bad date/time format '%@'", source];
+ }
+ d = [NSCalendarDate alloc];
+ d = [d initWithYear: year
+ month: month
+ day: day
+ hour: hour
+ minute: minute
+ second: second
+ timeZone: tz];
+
+ ti = millisecond;
+ ti /= 1000.0;
+ ti += [d timeIntervalSinceReferenceDate];
+ d = [d initWithTimeIntervalSinceReferenceDate: ti];
+ [d setTimeZone: tz];
+ return [d autorelease];
+}
+
- (NSString*) encodeDateTimeFrom: (NSDate*)source
{
NSString *s;
- s = [source descriptionWithCalendarFormat: @"%Y%m%dT%H:%M:%S"
- timeZone: [self timeZone]
+ s = [source descriptionWithCalendarFormat: @"%Y-%m-%dT%H:%M:%S.%FZ"
+ timeZone: tz
locale: nil];
return s;
}
@@ -1148,6 +1187,11 @@
}
}
+- (void) setTimeZone: (NSTimeZone*)timeZone
+{
+ return;
+}
+
- (void) setVersion: (NSString*)v
{
if (YES == [ver2 isEqual: v])
@@ -1162,6 +1206,11 @@
{
_version = nil;
}
+}
+
+- (NSTimeZone*) timeZone
+{
+ return tz;
}
- (NSString*) version
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs