(fix) improved EAS email flagging handling (#3140)
parent
b6c6e09a5a
commit
efd182f145
|
@ -283,7 +283,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
serverId = [NSString stringWithFormat: @"%@.ics", [theCollection globallyUniqueObjectId]];
|
serverId = [NSString stringWithFormat: @"%@.ics", [theCollection globallyUniqueObjectId]];
|
||||||
sogoObject = [[SOGoTaskObject alloc] initWithName: serverId
|
sogoObject = [[SOGoTaskObject alloc] initWithName: serverId
|
||||||
inContainer: theCollection];
|
inContainer: theCollection];
|
||||||
o = [sogoObject component: YES secure: NO];
|
o = [sogoObject component: YES secure: NO];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ActiveSyncMailFolder:
|
case ActiveSyncMailFolder:
|
||||||
|
@ -311,10 +311,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
syncCache = [folderMetadata objectForKey: @"SyncCache"];
|
syncCache = [folderMetadata objectForKey: @"SyncCache"];
|
||||||
dateCache = [folderMetadata objectForKey: @"DateCache"];
|
dateCache = [folderMetadata objectForKey: @"DateCache"];
|
||||||
|
|
||||||
[syncCache setObject: [folderMetadata objectForKey: @"SyncKey"] forKey: serverId];
|
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
|
||||||
[dateCache setObject: [NSCalendarDate date] forKey: serverId];
|
[dateCache setObject: [NSCalendarDate date] forKey: serverId];
|
||||||
|
|
||||||
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -365,6 +365,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
NSString *serverId;
|
NSString *serverId;
|
||||||
NSArray *changes;
|
NSArray *changes;
|
||||||
id aChange, o, sogoObject;
|
id aChange, o, sogoObject;
|
||||||
|
NSMutableDictionary *folderMetadata, *syncCache;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -372,6 +373,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
if ([changes count])
|
if ([changes count])
|
||||||
{
|
{
|
||||||
|
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||||
|
syncCache = [folderMetadata objectForKey: @"SyncCache"];
|
||||||
|
|
||||||
for (i = 0; i < [changes count]; i++)
|
for (i = 0; i < [changes count]; i++)
|
||||||
{
|
{
|
||||||
aChange = [changes objectAtIndex: i];
|
aChange = [changes objectAtIndex: i];
|
||||||
|
@ -398,6 +402,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
o = [sogoObject vCard];
|
o = [sogoObject vCard];
|
||||||
[o takeActiveSyncValues: allChanges inContext: context];
|
[o takeActiveSyncValues: allChanges inContext: context];
|
||||||
[sogoObject saveComponent: o];
|
[sogoObject saveComponent: o];
|
||||||
|
|
||||||
|
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ActiveSyncEventFolder:
|
case ActiveSyncEventFolder:
|
||||||
|
@ -406,15 +413,30 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
o = [sogoObject component: NO secure: NO];
|
o = [sogoObject component: NO secure: NO];
|
||||||
[o takeActiveSyncValues: allChanges inContext: context];
|
[o takeActiveSyncValues: allChanges inContext: context];
|
||||||
[sogoObject saveComponent: o];
|
[sogoObject saveComponent: o];
|
||||||
|
|
||||||
|
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ActiveSyncMailFolder:
|
case ActiveSyncMailFolder:
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
NSDictionary *result;
|
||||||
|
NSString *modseq;
|
||||||
|
|
||||||
[sogoObject takeActiveSyncValues: allChanges inContext: context];
|
[sogoObject takeActiveSyncValues: allChanges inContext: context];
|
||||||
|
|
||||||
|
result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]];
|
||||||
|
modseq = [[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"];
|
||||||
|
|
||||||
|
if (modseq)
|
||||||
|
[syncCache setObject: modseq forKey: serverId];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
|
||||||
|
|
||||||
|
|
||||||
[theBuffer appendString: @"<Change>"];
|
[theBuffer appendString: @"<Change>"];
|
||||||
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
|
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
|
||||||
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
|
||||||
|
@ -899,6 +921,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
[syncCache removeObjectForKey: [aCacheObject uid]];
|
[syncCache removeObjectForKey: [aCacheObject uid]];
|
||||||
[dateCache removeObjectForKey: [aCacheObject uid]];
|
[dateCache removeObjectForKey: [aCacheObject uid]];
|
||||||
|
|
||||||
|
return_count++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -908,17 +932,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
inContext: context
|
inContext: context
|
||||||
acquire: 0];
|
acquire: 0];
|
||||||
|
|
||||||
[s appendString: @"<Change xmlns=\"AirSync:\">"];
|
if (![[aCacheObject sequence] isEqual: [syncCache objectForKey: [aCacheObject uid]]])
|
||||||
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", [aCacheObject uid]];
|
{
|
||||||
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
|
[s appendString: @"<Change xmlns=\"AirSync:\">"];
|
||||||
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
|
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", [aCacheObject uid]];
|
||||||
[s appendString: @"</ApplicationData>"];
|
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
|
||||||
[s appendString: @"</Change>"];
|
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
|
||||||
|
[s appendString: @"</ApplicationData>"];
|
||||||
|
[s appendString: @"</Change>"];
|
||||||
|
|
||||||
|
return_count++;
|
||||||
|
}
|
||||||
|
|
||||||
[syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]];
|
[syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]];
|
||||||
}
|
}
|
||||||
|
|
||||||
return_count++;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1193,22 +1220,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
[context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"];
|
[context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"];
|
||||||
|
|
||||||
// We generate the commands, if any, for the response. We might also have
|
|
||||||
// generated some in processSyncCommand:inResponse: as we could have
|
|
||||||
// received a Fetch command
|
|
||||||
if (getChanges && !first_sync)
|
|
||||||
{
|
|
||||||
[self processSyncGetChanges: theDocumentElement
|
|
||||||
inCollection: collection
|
|
||||||
withWindowSize: windowSize
|
|
||||||
withMaxSyncResponseSize: theMaxSyncResponseSize
|
|
||||||
withSyncKey: syncKey
|
|
||||||
withFolderType: folderType
|
|
||||||
withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]
|
|
||||||
inBuffer: changeBuffer
|
|
||||||
lastServerKey: &lastServerKey];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// We process the commands from the request
|
// We process the commands from the request
|
||||||
//
|
//
|
||||||
|
@ -1226,12 +1237,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
inBuffer: s
|
inBuffer: s
|
||||||
processed: &processed];
|
processed: &processed];
|
||||||
|
|
||||||
// Windows phons don't empty Responses tags - such as: <Responses></Responses>.
|
// Windows phones don't like empty Responses tags - such as: <Responses></Responses>.
|
||||||
// We onnly generate this tag when the command has generated a response.
|
// We only generate this tag when there is a response
|
||||||
if (processed && [s length])
|
if (processed && [s length])
|
||||||
[commandsBuffer appendFormat: @"<Responses>%@</Responses>", s];
|
[commandsBuffer appendFormat: @"<Responses>%@</Responses>", s];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// We generate the commands, if any, for the response. We might also have
|
||||||
|
// generated some in processSyncCommand:inResponse: as we could have
|
||||||
|
// received a Fetch command
|
||||||
|
if (getChanges && !first_sync)
|
||||||
|
{
|
||||||
|
[self processSyncGetChanges: theDocumentElement
|
||||||
|
inCollection: collection
|
||||||
|
withWindowSize: windowSize
|
||||||
|
withMaxSyncResponseSize: theMaxSyncResponseSize
|
||||||
|
withSyncKey: syncKey
|
||||||
|
withFolderType: folderType
|
||||||
|
withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]
|
||||||
|
inBuffer: changeBuffer
|
||||||
|
lastServerKey: &lastServerKey];
|
||||||
|
}
|
||||||
|
|
||||||
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]];
|
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]];
|
||||||
|
|
||||||
// If we got any changes or if we have applied any commands
|
// If we got any changes or if we have applied any commands
|
||||||
|
@ -1256,7 +1284,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
{
|
{
|
||||||
// Make sure that client is updated with the right syncKey. - This keeps vtodo's and vevent's syncKey in sync.
|
// Make sure that client is updated with the right syncKey. - This keeps vtodo's and vevent's syncKey in sync.
|
||||||
syncKeyInCache = [folderMetadata objectForKey: @"SyncKey"];
|
syncKeyInCache = [folderMetadata objectForKey: @"SyncKey"];
|
||||||
if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && ![davCollectionTag isEqualToString: @"-1"])
|
if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && !first_sync)
|
||||||
{
|
{
|
||||||
davCollectionTag = syncKeyInCache;
|
davCollectionTag = syncKeyInCache;
|
||||||
*changeDetected = YES;
|
*changeDetected = YES;
|
||||||
|
|
1
NEWS
1
NEWS
|
@ -17,6 +17,7 @@ Bug fixes
|
||||||
- fixed data ordering in events list of Calendar module (#3261)
|
- fixed data ordering in events list of Calendar module (#3261)
|
||||||
- fixed data ordering in tasks list of Calendar module (#3267)
|
- fixed data ordering in tasks list of Calendar module (#3267)
|
||||||
- Android EAS Lollipop fixes (#3268 and #3269)
|
- Android EAS Lollipop fixes (#3268 and #3269)
|
||||||
|
- improved EAS email flagging handling (#3140)
|
||||||
|
|
||||||
2.3.0 (2015-06-01)
|
2.3.0 (2015-06-01)
|
||||||
-------------------
|
-------------------
|
||||||
|
|
Loading…
Reference in New Issue