none
MS-FSSHTTPB - Responding to a Query changes request RRS feed

  • Question

  • Hi,

    I'm trying to implement the MS-FSSHTTPB protocol, but I've hit a brick wall. I believe there's some information missing from the spec. Here's where I'm at:

    • We've installed an Office Web Applications Server
    • I've set up an iframe on our main site to point to it (/we/wordeditorframe.aspx)
    • I've uploaded a MS Word document to our file server
    • I am just trying to get the Word document to load in the editor frame

    First the OWA server makes a request to our file server,

    <RequestVersion xmlns="http://schemas.microsoft.com/sharepoint/soap/" Version="2" MinorVersion="2"/><RequestCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" CorrelationId="018cd2e1-160a-4372-bc15-a7c4acb10742"><Request RequestToken="0" Build="15.0.4481.1000" UserAgentClient="msword" UserAgentPlatform="wac" MetaData="99"><SubRequest SubRequestToken="1" Type="Cell"><SubRequestData BinaryDataSize="197" PartitionID="bbd4e3c0-21b4-463d-9279-9c5a9406aa8f">DAALAJzPKfM5lAabBgIAAO4CAABaBBYADW1zd29yZAd3YWN6AggAFRihD3cBFgIGAAUFABoEIADA49S7tCE9RpJ5nFqUBqqPigICAAk+AgQAAQAfAT4CBAACALoCAgAVHwE+AgQABwECA1QAA1G5+t6Eo6oNSqOoUgx3rHBzAQAAAADqbeOQaI5Gpm3DzbeeY5MBAAAAHwE+AgQABwECAywAAikwtZ5NpE1DT7hZsxzAcAZlAQAAAB8BhABBCwGsAgBVAwE=</SubRequestData></SubRequest></Request></RequestCollection>

    (Which is malformed SOAP if I'm not mistaken -- where's the envelope?)

    I respond to that request with some more XML:

    <ResponseVersion xmlns="http://schemas.microsoft.com/sharepoint/soap/" Version="2" MinorVersion="2"/><ResponseCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" WebUrl="http://wopi.dev9/cobalt"><Response RequestToken="0" HealthScore="1"><SubResponse SubRequestToken="1" ErrorCode="Success" HResult="0"><SubResponseData>DAALAJ3PKfM5lAabFgMCAACsAgAMWkBVA/QYYxm6uF1HqPBEkQDF2H+A9BhjGbq4XUeo8ESRAMXYf6sGAAAAAAAAAwVVDgIGAAUFAPoCKABAVQP0GGMZurhdR6jwRJEAxdh/AIQAJgIgABMfCRCCyPtAmIZlM/k0wh1sAXBZDBy48tArSv5NU6f0wPKqfsE1MQAQUAVlEFUAaMVczmhAdw5dAlAAUABQAABwuQxZw9hgrojtQ5VkxEM1UlKdlTEAO1AxgMCAYoNMXTKG0Ggjg41cMoDAUANTDFwwfJBlVmPOaDRx2YRSc01pYX3QXINjTVs4gYh101KZXTOG3GBzcwxeYYiMUQAAtRMBJgIgAA7pdjoygAxNud3zxlApQz5MASAmDBy48tArSv5NU6f0wPKqfsEDAKUTAUEHAYsB</SubResponseData></SubResponse></Response></ResponseCollection>

    OWA sends another request:

    <RequestVersion xmlns="http://schemas.microsoft.com/sharepoint/soap/" Version="2" MinorVersion="2"/><RequestCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" CorrelationId="19261f6c-799a-4ed9-bdc1-8adb612567ef"><Request RequestToken="0" Build="15.0.4481.1000" UserAgentClient="msword" UserAgentPlatform="wac" MetaData="99"><SubRequest SubRequestToken="1" Type="Coauth"><SubRequestData ClientID="766c3bb9-d359-45e0-9490-967769799783" SchemaLockID="29358ec1-e813-4793-8e70-ed0344e7b73c" Timeout="3600" AllowFallbackToExclusive="False" CoauthRequestType="JoinCoauthoring"/></SubRequest></Request></RequestCollection>

    I respond:

    <ResponseVersion xmlns="http://schemas.microsoft.com/sharepoint/soap/" Version="2" MinorVersion="2"/><ResponseCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" WebUrl="http://wopi.dev9/cobalt"><Response RequestToken="0" HealthScore="1"><SubResponse SubRequestToken="1" ErrorCode="Success" HResult="0"><SubResponseData LockType="SchemaLock" CoauthStatus="Alone" TransitionID="de59c4a6-56ea-4385-81b9-d63674728a8c"/></SubResponse></Response></ResponseCollection>

    OWA replies:

    <RequestVersion xmlns="http://schemas.microsoft.com/sharepoint/soap/" Version="2" MinorVersion="2"/><RequestCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" CorrelationId="7e0c6407-43db-4621-a4fc-1c80c47e2e17"><Request RequestToken="0" Build="15.0.4481.1000" UserAgentClient="msword" UserAgentPlatform="wac" MetaData="99"><SubRequest SubRequestToken="1" Type="WhoAmI"><SubRequestData/></SubRequest></Request></RequestCollection>

    Me:

    <ResponseVersion xmlns="http://schemas.microsoft.com/sharepoint/soap/" Version="2" MinorVersion="2"/><ResponseCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" WebUrl="http://wopi.dev9/cobalt"><Response RequestToken="0" HealthScore="1"><SubResponse SubRequestToken="1" ErrorCode="Success" HResult="0"><SubResponseData UserName="Markleus" UserLogin="markleus" UserEmailAddress="" UserSIPAddress=""/></SubResponse></Response></ResponseCollection>

    Then all of a sudden the OWA server sends a binary request. I couldn't find anything in the headers, or anything in the spec to suggest why the OWA server would suddenly switch protocols. The only way I have found to differentiate the two types of requests is to attempt to parse the request as XML and if that fails, assume it's a binary MS-FSSHTTPB request (is there a better way?)

    The request looks like this (in base64):

    DAALAJzPKfM5lAabBgIAAO4CAABaBBYADW1zd29yZAd3YWN6AggAFRihD3cBFgIGAAMFABoEIAAAAAAAAAAAAAAAAAAAAAAAigICAAALAawCAFUDAQ==

    Or this in hex:

    0c 00 0b 00 9c cf 29 f3 39 94 06 9b 06 02 00 00 
    ee 02 00 00 5a 04 16 00 0d 6d 73 77 6f 72 64 07 
    77 61 63 7a 02 08 00 15 18 a1 0f 77 01 16 02 06 
    00 03 05 00 1a 04 20 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 8a 02 02 00 00 0b 01 ac 
    02 00 55 03 01 

    I've decoded it as follows:

    [0x40] Request [0] 
      [0x5d] User agent [0] 
        [0x8b] User agent name [11] "\rmsword\awac"
        [0x4f] User agent version [4] 1518a10f
      [0x42] Sub-request [3] 030500
        [0x83] Target Partition Id [16] {00000000-0000-0000-0000-000000000000}
        [0x51] Query changes request [1] 00
      [0x15] Data element package [1] 00

    First I would like to point out that the "Stream Object type" of 0x8b is not documented in section 2.2.1.5.2, nor 2.2.1.5.1. Given its contents, I assume this is the User agent name.

    The request as a whole does not seem to follow section 2.2.2. I don't see a User Agent GUID, nor any "Request Hashing Options Declaration" or "Request Hashing Schema (variable)".

    More importantly, however, is that I can't figure out how I need to respond to this request. Section 3.1.4.2 has some comments about "Query Changes Sub-Request Processing" and talks about what to do if "Request Data Element Hashes" is 1, but it appears to be completely absent in my case.

    Sections 4.1 and 4.2 describe what some of the different bytes mean, but don't describe where I should get this information from.

    The Query changes request looks nothing like what's described in 2.2.2.1.3 -- it contains only a single 0-byte. Section 2.2.3.1.3 says I need to respond with some "Knowledge", but I don't know what that means or what it should contain. 

    So, how do I respond to this request?



    • Edited by Markleus Wednesday, March 5, 2014 11:53 PM
    Wednesday, March 5, 2014 11:38 PM

Answers

  • Hi Markleus,

    You asked the same question about Clock Data here, too. I repeat my answer:
    There is no need to know the structure of the Clock Data from the interoperability point of view; the only requirement is that when the Query Changes request is assembled its value should be used without any change. If you are implementing a SharePoint server, you can put there any value to keep track of the changes.

    Thanks, Vilmos
    Wednesday, September 3, 2014 4:49 PM

All replies

  • Hello Markleus,
                          Thank you for your inquiry about MS-FSSHTTPB protocol. One of the Open specifications team member will contact you shortly.


    Regards,
    Sreekanth Nadendla
    Microsoft Windows Open Specifications

    Thursday, March 6, 2014 3:26 AM
    Moderator
  • Any update on this?
    Friday, April 4, 2014 3:48 PM
  • Hi Markleus,

    Thank you for your patience.  I was delving into this question with our documentation team and this may answer your question(s).

    The Stream Object header "0x8B" represents a "UserAgentClientAndPlatform" Stream Object.  This stream object was added in Office 2013, and according to our Product Group, the document will be updated to include this in a future release of the documentation.  In the meantime, Office 2013 changed the way user agents are presented.  Instead of passing in a monolithic GUID that represents a User Agent that is unique for a given platform/client combo, two strings are passed based id’s to represent the client/platform configuration.  The client/platform are serialized as UTF8 encoded byte arrays, each preceded by an int32 length (0 is written for either one when not specified).  So the way to interpret these lines is (example):

    x5A x04 x16 x00   StreamObjectHeader32: id:UsrAgentGuid HeaderType:x2 Compound:False Type:x8B Len:xD    Raw:x16045A
    x0Dx6D x73 x77    Length:6(0xD, compact Uint 7 bit value) ClientId: “msword”
    x6F x72 x64x07   Length:3(0x7, compact Uint 7 bit value)
    x77 x61 x63x7A   PlatformId:  “wac”StreamObjectHeader32: Compound:False Type:4f Len:x4 Raw:x8027A
    x02 x08 x00x15

    x18 xA1 x0Fx77   Encoded Build Number: 15.0.4481.1000

    Hopefully, this gets you past your issue and leads to the answers to your subsequent questions/issues parsing the Stream Object structure.  Otherwise, let me know and we'll delve into what more we can provide from a documentation standpoint.

    Regards,

    Mark Miller | Escalation Engineer | Microsoft Open Protocols Team



    Friday, April 11, 2014 8:35 PM
  • Hi Mark Miller,


    Thank you for responding. I appreciate you explaining the 0x8B header, but there are still a few points to my question that I would like clarification on.

    1. How can I differentiate if the incoming request is going to be XML or binary without first attempting to parse it (and failing)? Is there something in the HTTP headers that will tell me the request type (MS-FSSHTTP or MS-FSSHTTPB)?

    2. Where can I find information about how to respond to the following request?

    0c 00 0b 00 9c cf 29 f3 39 94 06 9b 06 02 00 00 
    ee 02 00 00 5a 04 16 00 0d 6d 73 77 6f 72 64 07 
    77 61 63 7a 02 08 00 15 18 a1 0f 77 01 16 02 06 
    00 03 05 00 1a 04 20 00 0b dc 3a 38 6e e6 38 44 
    95 e6 e3 9e f9 72 01 22 8a 02 02 00 00 0b 01 ac 
    02 00 55 03 01 

    It's similar to the one given in section 4.1 of the documentation, but the response in  section 4.2 is not very well explained. For example, where do the GUIDs come from? Where do the docx file contents go? What is the "target partition ID" used for?

    At this point we are trying to implement the minimal set of commands to get a document to load in the word editor frame.

    3. Do you have an ETA on when we expect an updated spec?

    3b. Is there any updated documentation that you can send us right now? We are working on a project which integrates with the OWA server.

    4. Is there a way to get error messages back from the OWA server? When I send a bad response back to the server it just stops replying without any indication of what's wrong.
    • Edited by Markleus Wednesday, April 30, 2014 4:23 PM
    Wednesday, April 23, 2014 10:41 PM
  • you can find some error message in the "C:\ProgramData\Microsoft\OfficeWebApps\Data\Logs\ULS" on the owas host
    Thursday, April 24, 2014 10:35 AM
  • i have also found some problem of the specification,for example:

    In document [ms-fsshttp] section 3.1.4.2 Cell Subrequest, have text:

    • The binary data sent in the SubRequestData element indicates if this is a file content upload or download. The meaning of the data is as specified in [MS-FSSHTTPB] section 2.2.3.1.5. The cell subrequest for an upload of the file contents is processed as specified in [MS-FSSHTTPB] section 3.1.4.5. The cell subrequest for a download of the file contents is processed as specified in [MS-FSSHTTPB] section 3.1.4.2. The schema lock identifier MUST be specified in a cell subrequest if the current client already shared the lock on the file and is in a coauthoring session. The schema lock identifier is defined in section 2.3.1.1. When the schema lock identifier is specified in the cell subrequest, the protocol server returns a success error code if the file currently has a shared lock with the specified schema lock identifier.

    but i can't find section  2.2.3.1.5 in  [MS-FSSHTTPB], also  [MS-FSSHTTPB] have no section 3.1.4.5

    Thursday, April 24, 2014 10:38 AM
  • Hi Markleus,

    Have you implemented the minimal set of commands to get a document to load in the word editor frame?

    we are trying to implement FSSHTTP/FSSHTTPB just start, we found the document so puzzled.

    could you give me some code example of FSSHTTP, thank you very much.

    Thursday, April 24, 2014 10:51 AM
  • Hi Marx-Yu:

    I noticed that you sent the same question to dochelp yesterday. A member of the open specifications team is already in contact with you regarding this question.


    Regards, Obaid Farooqi

    Thursday, April 24, 2014 2:52 PM
    Owner
  • Thanks all.

    I have received an bright answer from Josh Curry last night.


    • Edited by Marx Yu Friday, April 25, 2014 2:32 AM
    Friday, April 25, 2014 2:31 AM
  • Hi Marx-Yu,

    No, I have not been able to get a document to load in the word editor frame. I got it to load in the word viewer frame, but the editor frame keeps sending more and more requests and I don't know how to respond to them.

    Thanks for the tip about the error messages; I will take a look there.

    Mark

    Friday, April 25, 2014 6:05 PM
  • hi Mark,

    i am sorry to hear that.it is so trouble to implement fsshttp/b.

    i have setuped a sharepoint 2013 test server, and capture web packet between sp and owas, analyze the packet according to the fsshttp/b specification, but there are many thing not match.i am so sad.

    can i ask a question:

    you said:

    First the OWA server makes a request to our file server,

    <RequestVersion xmlns="http://schemas.microsoft.com/sharepoint/soap/" Version="2" MinorVersion="2"/><RequestCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" CorrelationId="018cd2e1-160a-4372-bc15-a7c4acb10742"><Request RequestToken="0" Build="15.0.4481.1000" UserAgentClient="msword" UserAgentPlatform="wac" MetaData="99"><SubRequest SubRequestToken="1" Type="Cell"><SubRequestData BinaryDataSize="197" PartitionID="bbd4e3c0-21b4-463d-9279-9c5a9406aa8f">DAALAJzPKfM5lAabBgIAAO4CAABaBBYADW1zd29yZAd3YWN6AggAFRihD3cBFgIGAAUFABoEIADA49S7tCE9RpJ5nFqUBqqPigICAAk+AgQAAQAfAT4CBAACALoCAgAVHwE+AgQABwECA1QAA1G5+t6Eo6oNSqOoUgx3rHBzAQAAAADqbeOQaI5Gpm3DzbeeY5MBAAAAHwE+AgQABwECAywAAikwtZ5NpE1DT7hZsxzAcAZlAQAAAB8BhABBCwGsAgBVAwE=</SubRequestData></SubRequest></Request></RequestCollection>

    I respond to that request with some more XML:

    <ResponseVersion xmlns="http://schemas.microsoft.com/sharepoint/soap/" Version="2" MinorVersion="2"/><ResponseCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" WebUrl="http://wopi.dev9/cobalt"><Response RequestToken="0" HealthScore="1"><SubResponse SubRequestToken="1" ErrorCode="Success" HResult="0"><SubResponseData>DAALAJ3PKfM5lAabFgMCAACsAgAMWkBVA/QYYxm6uF1HqPBEkQDF2H+A9BhjGbq4XUeo8ESRAMXYf6sGAAAAAAAAAwVVDgIGAAUFAPoCKABAVQP0GGMZurhdR6jwRJEAxdh/AIQAJgIgABMfCRCCyPtAmIZlM/k0wh1sAXBZDBy48tArSv5NU6f0wPKqfsE1MQAQUAVlEFUAaMVczmhAdw5dAlAAUABQAABwuQxZw9hgrojtQ5VkxEM1UlKdlTEAO1AxgMCAYoNMXTKG0Ggjg41cMoDAUANTDFwwfJBlVmPOaDRx2YRSc01pYX3QXINjTVs4gYh101KZXTOG3GBzcwxeYYiMUQAAtRMBJgIgAA7pdjoygAxNud3zxlApQz5MASAmDBy48tArSv5NU6f0wPKqfsEDAKUTAUEHAYsB</SubResponseData></SubResponse></Response></ResponseCollection>

    how do you parse the sub request, and generate response?

    i have got a same request content from owa, This cell sub request, is neither a query change request nor a query access request according the fsshttpb document, i am so puzzled.

    Sunday, April 27, 2014 4:32 PM
  • Marx-Yu,

    I don't actually know to handle that request either; I set up a SharePoint server and I've been monitoring the HTTP traffic in an attempt to reverse-engineer the protocol. I pulled the response out of there and hardcoded it.

    Microsoft,

    Can you shed some light in here? I'm still waiting on a response to my last set of questions on April 23rd.



    • Edited by Markleus Thursday, May 1, 2014 8:53 PM
    Wednesday, April 30, 2014 4:22 PM
  • hi all,

    Every time I edit a docx file, will receive a request from owas first as follow: 

    <RequestVersion Version="2" MinorVersion="2" xmlns="http://schemas.microsoft.com/sharepoint/soap/" /><RequestCollection CorrelationId="3f9db128-5b8b-4222-ad7a-b6ac4abafc3d" xmlns="http://schemas.microsoft.com/sharepoint/soap/"><Request RequestToken="0" Build="15.0.4481.1000" UserAgentClient="msword" UserAgentPlatform="wac" MetaData="99"><SubRequest SubRequestToken="1" Type="Cell"><SubRequestData BinaryDataSize="197" PartitionID="bbd4e3c0-21b4-463d-9279-9c5a9406aa8f">DAALAJzPKfM5lAabBgIAAO4CAABaBBYADW1zd29yZAd3YWN6AggAFRihD3cBFgIGAAUFABoEIADA49S7tCE9RpJ5nFqUBqqPigICAAk+AgQAAQAfAT4CBAACALoCAgAVHwE+AgQABwECA1QAA1G5+t6Eo6oNSqOoUgx3rHBzAQAAAADqbeOQaI5Gpm3DzbeeY5MBAAAAHwE+AgQABwECAywAAikwtZ5NpE1DT7hZsxzAcAZlAQAAAB8BhABBCwGsAgBVAwE=</SubRequestData></SubRequest></Request></RequestCollection>

    Decode the base64 SubRequestData get the follow hex bytes array: 

    0C 00 0B 00 9C CF 29 F3 39 94 06 9B 06 02 00 00 
    EE 02 00 00 5A 04 16 00 0D 6D 73 77 6F 72 64 07 
    77 61 63 7A 02 08 00 15 18 A1 0F 77 01 16 02 06 
    00 05 05 00 1A 04 20 00 C0 E3 D4 BB B4 21 3D 46 
    92 79 9C 5A 94 06 AA 8F 8A 02 02 00 09 3E 02 04 
    00 01 00 1F 01 3E 02 04 00 02 00 BA 02 02 00 15 
    1F 01 3E 02 04 00 07 01 02 03 54 00 03 51 B9 FA 
    DE 84 A3 AA 0D 4A A3 A8 52 0C 77 AC 70 73 01 00 
    00 00 00 EA 6D E3 90 68 8E 46 A6 6D C3 CD B7 9E 
    63 93 01 00 00 00 1F 01 3E 02 04 00 07 01 02 03 
    2C 00 02 29 30 B5 9E 4D A4 4D 43 4F B8 59 B3 1C 
    C0 70 06 65 01 00 00 00 1F 01 84 00 41 0B 01 AC 
    02 00 55 03 01

    According to FSSHTTPB specification, I decoded the data as follow:

    Protocol Version (2 bytes): 0x000C 
    Minimum Version (2 bytes): 0x000B 
    Signature: 0x9B069439F329CF9C 
    Cell Request Start (4 bytes): 0x00000206 
    User Agent Start (4 bytes): 0x000002EE 

    0x0016045a,HeaderType:x2 Compound:False Type:x8B Len:xB,"UserAgentClientAndPlatform" Stream Object 

    11 bytes:useragent and plateform 

    0x0008027a,Compound:False Type:x4f Len:x4, User agent version flag 
    4 bytes:1518a10f, version 

    0x0177,User Agent End 

    0x00060216,type:x42,len:x3,Sub-request Start 
    3 bytes:0x050500 
    Request Id (1 byte): 0x05 this represents a value of 0x2. 
    Request Type (1 byte): 0x05 this represents a value of 0x02. ->>query change request 
    Priority (1 byte): 0x00 

    0x0020041a,type:x83,len:x10=16,Target Partition Id Start 
    16 bytes: 0xc0 e3 d4 bb b4 21 3d 46 92 79 9c 5a 94 06 aa 8f 
    Partition Id GUID {BBD4E3C0-21B4-463D-9279-9C5A9406AA8F} 

    0x0002028a,type:x51,len:1,Query Changes request 

    1 byte: 0x09, Reserved and other bits 

    0x0004023E,type:x47,len:x2,Query Changes Filter Start 
    1 byte:0x01, filter type, all filter 
    1 byte:0x00, filter operation, A value of zero specifies that any data elements matching the filter will be excluded from the response data element package 
    0x011f,type:x47,Query Changes Filter End 

    0x0004023e,type:x47,len:x2,Query Changes Filter Start 
    1 bytes:x02,filter type, Data element type filter 
    1 bytes:0x00, 

    0x000202BA,type:x57,len:x1,Query changes filter data element type. 
    1 byte: 0x15,Data Element Type decoded value =0xA ->> Object data BLOB 

    0x011f,type:47,Query Changes Filter End 


    0x0004023e,type:x47,len:x2,Query Changes Filter Start 
    1 bytes:x07,filter type, Hierarchy filter 
    1 bytes:0x01, 
    0x00540302, type:x60, len:x2a=42 ,Query changes filter hierarchy 

    1 byte: 0x03,Depth -Deep. All data elements and storage index entries under the sub-graphs rooted by the specified keys 
    41 bytes: torage Index Extended GUID Array ->How to do 
    1 byte: 0x51,compact Uint 7 bit values, value=0x28=40 


    0x011f,type:47,Query Changes Filter End 

    at the last Query Changes Filter secton, the Extended GUID Array 40 bytes follow: 

    B9 FA 
    DE 84 A3 AA 0D 4A A3 A8 52 0C 77 AC 70 73 01 00 
    00 00 00 EA 6D E3 90 68 8E 46 A6 6D C3 CD B7 9E 
    63 93 01 00 00 00 

    I don't known how to parse as EXGUID Array? 

    Thursday, May 1, 2014 11:15 PM
  • Marx-Yu,

    I encountered that exact same problem the other day too; same number of bytes and everything.

    I've come to the conclusion that what follows is not a GUID array, and that's a documentation bug.

    A EXGUID Array should be a compact unsigned integer (n) followed by n EXGUIDs. Each EXGUID should be a value followed by a GUID.

    The "40" that you read appears to represent the number of bytes remaining in the section, as far as I can tell. What follows appears to be two pairs of (GUID, 4-byte unsigned integer), which does not correspond with anything I've read in the documentation.


    • Edited by Markleus Tuesday, May 6, 2014 6:24 PM
    Tuesday, May 6, 2014 6:23 PM
  • Hi Markleus,

    Thank you for your patience.  If you can send an unencrypted network trace of this issue to 'dochelp'<at>'Microsoft'<dot>'com' it will be helpful while I continue to investigate this with our documentation team.  Following are some findings related to your questions for this issue (April 30th post of this forum thread):

    1. How can I differentiate if the incoming request is going to be XML or binary without first attempting to parse it (and failing)? Is there something in the HTTP headers that will tell me the request type (MS-FSSHTTP or MS-FSSHTTPB)?

    [A] The content highlighted in green is Base64 format binary data, wrapped in xml.  I don’t think there is a differentiator, although I am still looking into this to verify.

    <SubRequestData PartitionID="383adc0b-e66e-4438-95e6-e39ef9720122" BinaryDataSize="88">DAALAJzPKfM5lAabBgIAAO4CAACqAiAAfrgx50XdqkSrgAx1+9FTDnoCCAD0J0UfdwEWAgYAAwUAigICAADaAgYAAwAAygIIAAgAgAOEAEELAawCAFUDAQ==</SubRequestData>

    <SubResponseData CoalesceHResult="0" ContainsHotboxData="True">DAALAJ3PKfM5lAabFgMCAACsAgAMVgx6KmdPAwAaQpf2Pb9Nlj2NgCminTMNs9JDutyBtjY1HeoBAAAAAAAAAAOIVAxZA/FHJtJ3R6iV1MCVAWthgNcfQoujYe9GnWDh5152y9MCAAAAAAAAAAUMVgxZA/FHJtJ3R6iV1MCVAWthgNcfQoujYe9GnWDh5152y9MBAAAAAAAAAAVgIAAAAAAAAAAAAAAAAAAAAAAFVQ4CBgADBQD6AiQADHoqZ08DABpCl/Y9v02WPY0AhABBBwGLAQ==</SubResponseData>

    2. Where can I find information about how to respond to the following request?

    [A] I am still investigating this and it appears to be a documentation bug.  I will follow up as soon as I have more details.

    This is the deserialized request:

    0c 00 ->Protocol Version

    0b 00 ->Minimum Version

    9c cf 29 f3 39 94 06 9b ->Signature

    06 02 00 00 ->Cell Request Start

    ee 02 00 00 ->User Agent Start

    5a 04 16 00 0d 6d 73 77 6f 72 64 07

    77 61 63 (some Unknown field can’t be found in TD, decode to 0x8B with length 13)

    7a 02 08 00 ->User Agent Version

    15 18 a1 0f ->Version

    77 01 ->User Agent End

    16 02 06 00 ->Sub-request Start

    03 ->Request Id

    05 ->Request Type(Decoded, this represents a value of 0x02)

    00 ->Priority

    1a 04 20 00 ->Target Partition Id(Length 16)

    0b dc 3a 38 6e e6 38 44 95 e6 e3 9e f9 72 01 22 ->Partition Id GUID

    8a 02 02 00 ->Query Changes

    00 ->Reserved //From here we know that actually this request contains no parameters

    0b 01 ->Sub-Request End

    ac 02 ->Data Element Package Start

    00 ->Reserved

    55 ->E - Data Element Package End

    03 01 ->Cell Request End

    3. Do you have an ETA on when we expect an updated spec?

    3b. Is there any updated documentation that you can send us right now? We are working on a project which integrates with the OWA server

    [A] An updated specification has recently been published though it will not of course reflect these issues you are currently raising.  However, you will want to be referring to the latest version, regardless.  The latest version available is available at the Open Specifications Documentation site, http://msdn.microsoft.com/en-us/library/dd965780%28v=office.12%29.aspx.

    4. Is there a way to get error messages back from the OWA server? When I send a bad response back to the server it just stops replying without any indication of what's wrong.

    This would seem to be more of a product question rather than documentation issue (i.e. could relate to configuration, etc.).  The SharePoint developer forum may be helpful with this question.

    Regards,

    Mark Miller | Microsoft Open Protocols Team



    Wednesday, May 7, 2014 3:31 PM
  • Hi Mark,

    Thank you for responding. A few follow-up questions:

    Regarding [1], I meant that the OWA server sometimes sends binary directly -- it's not an XML-wrapped request. It seems to alternative between XML, XML-wrapped binary, and straight up binary arbitrarily.

    As an example, the first request I get is XML-wrapped binary:

    <RequestVersion Version="2" MinorVersion="2" xmlns="http://schemas.microsoft.com/sharepoint/soap/" /><RequestCollection CorrelationId="693c4157-2e06-493c-bc2d-c1641fa5253f" xmlns="http://schemas.microsoft.com/sharepoint/soap/"><Request RequestToken="0" Build="15.0.4481.1000" UserAgentClient="msword" UserAgentPlatform="wac" MetaData="99"><SubRequest SubRequestToken="1" Type="Cell"><SubRequestData BinaryDataSize="197" PartitionID="bbd4e3c0-21b4-463d-9279-9c5a9406aa8f">DAALAJzPKfM5lAabBgIAAO4CAABaBBYADW1zd29yZAd3YWN6AggAFRihD3cBFgIGAAUFABoEIADA49S7tCE9RpJ5nFqUBqqPigICAAk+AgQAAQAfAT4CBAACALoCAgAVHwE+AgQABwECA1QAA1G5+t6Eo6oNSqOoUgx3rHBzAQAAAADqbeOQaI5Gpm3DzbeeY5MBAAAAHwE+AgQABwECAywAAikwtZ5NpE1DT7hZsxzAcAZlAQAAAB8BhABBCwGsAgBVAwE=</SubRequestData></SubRequest></Request></RequestCollection>

    The second is straight up XML:

    <RequestVersion Version="2" MinorVersion="2" xmlns="http://schemas.microsoft.com/sharepoint/soap/" /><RequestCollection CorrelationId="9c88cc6f-da88-402e-9bfe-0ccf353a2198" xmlns="http://schemas.microsoft.com/sharepoint/soap/"><Request RequestToken="0" Build="15.0.4481.1000" UserAgentClient="msword" UserAgentPlatform="wac" MetaData="99"><SubRequest SubRequestToken="1" Type="Coauth"><SubRequestData ClientID="abdc743d-8f66-4a0a-97de-ebebc8eede83" SchemaLockID="29358ec1-e813-4793-8e70-ed0344e7b73c" Timeout="3600" AllowFallbackToExclusive="False" CoauthRequestType="JoinCoauthoring" /></SubRequest></Request></RequestCollection>

    The third is also XML:

    <RequestVersion Version="2" MinorVersion="2" xmlns="http://schemas.microsoft.com/sharepoint/soap/" /><RequestCollection CorrelationId="0048523f-458e-4e4c-ac30-0769a7f79dde" xmlns="http://schemas.microsoft.com/sharepoint/soap/"><Request RequestToken="0" Build="15.0.4481.1000" UserAgentClient="msword" UserAgentPlatform="wac" MetaData="99"><SubRequest SubRequestToken="1" Type="WhoAmI"><SubRequestData /></SubRequest></Request></RequestCollection>

    The fourth suddenly switches to binary, with no wrapper:

    0c 00 0b 00 9c cf 29 f3 39 94 06 9b 06 02 00 00 
    ee 02 00 00 5a 04 16 00 0d 6d 73 77 6f 72 64 07 
    77 61 63 7a 02 08 00 15 18 a1 0f 77 01 16 02 06 
    00 03 05 00 1a 04 20 00 0b dc 3a 38 6e e6 38 44 
    95 e6 e3 9e f9 72 01 22 8a 02 02 00 00 0b 01 ac 
    02 00 55 03 01

    Do you know why it's switching like that? I thought every request was supposed to be wrapped in XML?

    [2] Thank you for helping to deserialize that request, but the part I'm struggling with is figuring out how to respond to it. I'm not sure what data it's asking for, or how to fetch it from the Word document. Section 4.2 gives an example Query Changes Response, but does not explain where all that data is coming from or how those GUIDs are determined.

    Further, the example appears to be incomplete. It's missing the protocol version and signature and 32-bit stream response header (0x15). While watching the SharePoint HTTP traffic we noticed it also sent a Data element package (0x01) full of data which is not present in the example. The last third of the example response is missing from the documentation below it. 0x0701 is the cell sub response end; what are the bytes that follow?

    0x00000090:   00 A5 13 01 41 07 01 8B   01 0D 0A 33 39 0D 0A 0D
    0x000000A0:   0A 2D 2D 75 75 69 64 3A   66 31 65 62 62 66 35 33
    0x000000B0:   2D 65 62 39 39 2D 34 36   62 64 2D 61 63 63 30 2D
    0x000000C0:   34 32 65 35 65 62 61 32   36 35 30 35 2B 69 64 3D
    0x000000D0:   36 30 33 38 2D 2D 0D 0A   0D 0A 30 0D 0A 0D 0A

    Note that this is example is taken from the latest version of the documentation dated April 30, 2014.

    [3] Thank you. There appears to be a bit more information here, although some stuff is still missing. 

    [4] I'll ask there, thanks.

    I will forward the network trace now via email.

    Thank you,

    Mark





    • Edited by Markleus Wednesday, May 7, 2014 11:22 PM
    Wednesday, May 7, 2014 6:03 PM
  • hi Mark,

    Could you answer my question above, detail here,

    I am so worry that.


    • Edited by Marx Yu Sunday, May 11, 2014 3:34 PM
    Saturday, May 10, 2014 5:18 PM
  • Also, in section 4.4 the signature is wrong; it says 9B069439F329CF9C but the response signature is always supposed to be 9B069439F329CF9D (note the last letter).
    • Edited by Markleus Thursday, May 15, 2014 6:22 PM
    Wednesday, May 14, 2014 7:00 PM
  • At [FSSHTTPB] section 2.2.1.13.5.1, describe Content Tag Knowledge Entry,

    But where should i get this information from for response? and what do the Clock Data of Content Tag Knowledge Entry mean?

    Thursday, May 22, 2014 3:24 PM
  • Hi Mark,

    Some answers to your follow up questions:

    Q1: Do you know why it's switching like that? I thought every request was supposed to be wrapped in XML?

    A1:  Every binary content should be wrapped in xml, see MS-FSSHTTPB section 1.4: “This protocol is embedded within the File Synchronization via SOAP over HTTP Protocol, as described in [MS-FSSHTTP]. Could you please send a capture of the network traffic for this using “Microsoft Network Monitor”?  There are FSSHTTP Netmon parsers we could use that may assist if we have a Netmon trace.  You can download the Microsoft Network Monitor here, http://www.microsoft.com/en-us/download/details.aspx?id=4865

    Q2: Thank you for helping to deserialize that request, but the part I'm struggling with is figuring out how to respond to it. I'm not sure what data it's asking for, or how to fetch it from the Word document. Section 4.2 gives an example Query Changes Response, but does not explain where all that data is coming from or how those GUIDs are determined.

    A2:  The specified request does not appear to be complete, the parameters for “Query Change” are missing.  Also, how to process “Query Change” request is specified in MS-FSSHTTPB section 3.1.4.2.  A Netmon capture may help confirm if this is still an issue.

    Also, I filed a documentation bug for the Undocumented Binary Request Object 0x8B. 

    Regards,

    Mark Miller | Microsoft Open Protocols Team

    Thursday, May 22, 2014 3:33 PM
  •  

    1)MS-FSSHTTPB section 2.2.1.12.6.6 Data Element Hash, the last line of the diagram, write "Object Group Metadata End"

    2)MS-FSSHTTPB section 2.2.1.12.6.3.1 Object Metadata, said Object Change Frequency value must be[0,1,2,3,4], but i parse the response from sharepoint to owas, this value is confused, it can be 11,13,15,58...

    Friday, May 23, 2014 4:15 AM
  • I think i have found the way to parse that 40 bytes, it is not Extended GUID Array, it is a serial number array or just a cell id, the syntax shows follow:

    B9FADE84A3AA0D4AA3A8520C77AC7073, 16 bytes, is a guid, decoded as {84DEFAB9-AAA3-4A0D-A3A8-520C77AC7073},

    01000000, 4 bytes, a uint32 value=0x01,

    00EA6DE390688E46A66DC3CDB79E6393 = {E36DEA00-6890-468E-A66D-C3CDB79E6393}

    01000000=0x01

    so it represents two serial number or a cell id.

    and this cell id will present in the follow request and response

    Sunday, May 25, 2014 10:57 AM
  • I parse a response packet from sharepoint to owas, it is an error sub-response, but i think it constructs not right, detail below:

    the origin packet from sharepoint to owas:

    <ResponseVersion Version="2" MinorVersion="2" xmlns="http://schemas.microsoft.com/sharepoint/soap/" /><ResponseCollection WebUrl="http://sp.tongbupan.com/sites/Doc" xmlns="http://schemas.microsoft.com/sharepoint/soap/"><Response RequestToken="1" HealthScore="0"><SubResponse SubRequestToken="1" ErrorCode="CellRequestFail" HResult="2147500037"><SubResponseData>DAALAJ3PKfM5lAabFgMCAACsAgBVDgIGAAUFAW4CIABWp2ZazoeQQqOLxhxboFpnMgMIAAEAAABuAiAAEZDDMjluxEareNtBkp1nnkoCCABXAAeANwE3AQcBiwE=</SubResponseData></SubResponse></Response></ResponseCollection>

    the binary array after base64 decoding:

     OFFSET 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    00000000 0C 00 0B 00 9D CF 29 F3  39 94 06 9B 16 03 02 00
    00000010 00 AC 02 00 55 0E 02 06  00 05 05 01 6E 02 20 00
    00000020 56 A7 66 5A CE 87 90 42  A3 8B C6 1C 5B A0 5A 67
    00000030 32 03 08 00 01 00 00 00  6E 02 20 00 11 90 C3 32
    00000040 39 6E C4 46 AB 78 DB 41  92 9D 67 9E 4A 02 08 00
    00000050 57 00 07 80 37 01 37 01  07 01 8B 01 

    parse the binary array, see [FSSHTTPB] section 2.2.3.2 Response Error:

    00000000  Protocol version and Signature
    0000000C  ObjectHeader:0x16030200, Type=0x62, Len=1, com=1 Response. Start
    A - Status: Success
    00000011  ObjectHeader:0xAC02, Type=0x15, Len=1, com=1 Data element package. Start
    1 byte Reserved
    00000014  ObjectHeader:0x55, Type=0x15, Data element package. End
    00000015  ObjectHeader:0x0E020600, Type=0x41, Len=3, com=1 Sub-response. Start
    Request ID: Value=2
    Request Type: Value=2 Query changes.
    A - Status: Failed
    0000001C  ObjectHeader:0x6E022000, Type=0x4D, Len=16, com=1 Error. Start
    Error Type GUID: {5A66A756-87CE-4290-A38B-C61C5BA05A67} Cell error (section 2.2.3.2.1).
    00000030  ObjectHeader:0x32030800, Type=0x66, Len=4, com=0 Error cell. Flag
    Error Code: 1
    00000038  ObjectHeader:0x6E022000, Type=0x4D, Len=16, com=1 Error. Start
    Error Type GUID: {32C39011-6E39-46C4-AB78-DB41929D679E} Win32 error (section 2.2.3.2.3).
    0000004C  ObjectHeader:0x4A020800, Type=0x49, Len=4, com=0 Error Win32. Flag
    Error Code: 2147942487
    00000054  ObjectHeader:0x3701, Type=0x4D, Error. End
    00000056  ObjectHeader:0x3701, Type=0x4D, Error. End
    00000058  ObjectHeader:0x0701, Type=0x41, Sub-response. End
    0000005A  ObjectHeader:0x8B01, Type=0x62, Response. End

    the bold italic lines, according to the  [FSSHTTPB] section 2.2.3.2 Response Error, they should be:

     ObjectHeader:0x6E022000, Type=0x4D, Len=16, com=1 Error. Start
    Error Type GUID: {5A66A756-87CE-4290-A38B-C61C5BA05A67} Cell error (section 2.2.3.2.1).
    00000030  ObjectHeader:0x32030800, Type=0x66, Len=4, com=0 Error cell. Flag
    Error Code: 1

     ObjectHeader:0x3701, Type=0x4D, Error. End

     ObjectHeader:0x6E022000, Type=0x4D, Len=16, com=1 Error. Start
    Error Type GUID: {32C39011-6E39-46C4-AB78-DB41929D679E} Win32 error (section 2.2.3.2.3).
    0000004C  ObjectHeader:0x4A020800, Type=0x49, Len=4, com=0 Error Win32. Flag
    Error Code: 2147942487

     ObjectHeader:0x3701, Type=0x4D, Error. End

    here is the captured packets, open use Microsoft Network Monitor 3.4, frame:81,82:

    • Edited by Marx Yu Tuesday, May 27, 2014 5:14 AM
    Tuesday, May 27, 2014 5:01 AM
  • Regarding the "40 bytes" -- I don't think those are serial numbers either. They don't parse out correctly. It's just two pairs of (GUID, 32-bit unsigned integer). I'm not sure what that's supposed to be.
    • Proposed as answer by SirRoj Thursday, June 5, 2014 4:17 AM
    Wednesday, June 4, 2014 10:26 PM
  • Regarding the "40 bytes" -- I don't think those are serial numbers either. They don't parse out correctly. It's just two pairs of (GUID, 32-bit unsigned integer). I'm not sure what that's supposed to be.

    I am having the same issues with WOPI word edits.

    I have so far figured out you can use the Microsoft.CobaltCore dll on the OWA server to process the payload and get meaningful results. See below. Still don't know how to execute this against my file system file and return a result but its a start . Let us know your own thoughts .

    requestBatch seems to be complete and digests the BINARY ok.

      Roger

     [Route("files/{name}")]
            public HttpResponseMessage PostFileAction(string name, [FromUri] string access_token)
            {
                // gete the message payload as it will contain special instructions when we are using it to edit word etc.
                // most of the time its empty requests. Even a powerpoint edit will make blank calls to here  !?
                //
                var responseMessage = new HttpResponseMessage(HttpStatusCode.OK);
                var InwardMessagePayload = Request.Content.ReadAsStringAsync();
               
                //make a cobalt core call to decipher this request.
    
               
                // we pass this to the Cobalt API to create an object that will do all the work for us against the file ( I hope !!! , rhogg 6 june 2014 )
                // byte[] test1 = System.Convert.FromBase64String("DAALAJzPKfM5lAabBgIAAO4CAABaBBYADW1zd29yZAd3YWN6AggAFRihD3cBFgIGAAUFABoEIADA49S7tCE9RpJ5nFqUBqqPigICAAk+AgQAAQAfAT4CBAACALoCAgAVHwE+AgQABwECA1QAA1G5+t6Eo6oNSqOoUgx3rHBzAQAAAADqbeOQaI5Gpm3DzbeeY5MBAAAAHwE+AgQABwECAywAAikwtZ5NpE1DT7hZsxzAcAZlAQAAAB8BhABBCwGsAgBVAwE=");
                // create an atom object from the fsshttp input AtomFromByteArray atomRequest = new AtomFromByteArray(test1);
    
                try
                {
                    // from the body extract the base64 and make a byte array.
                    string InwardMessageString = InwardMessagePayload.Result;
                    System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
                    doc.LoadXml("<root>" + InwardMessageString + "</root>");
                    byte[] inwardStringAsByteArray = System.Convert.FromBase64String(doc.DocumentElement.InnerText);
                    Cobalt.AtomFromByteArray atomRequest = new Cobalt.AtomFromByteArray(inwardStringAsByteArray);
                    Cobalt.RequestBatch requestBatch = new Cobalt.RequestBatch();
                    requestBatch.DeserializeInputFromProtocol(atomRequest);
                    // now you can inspect requestBatch to view the decoded objects
                    // ToDo !
                    // if its a cobalt request we will end our days in here and not progress outside this try catch
                    //
                }
                catch (Exception ex2)
                {
                    string a = ex2.ToString();
                }
    Thursday, June 5, 2014 4:20 AM
  • foreach

    ( Cobalt.RequestaRequest inrequestBatch.Requests)

                    {

                        aRequest.ForceSetCompletedSuccessfully();

                    }

                   

    //


                   

    // var responseMessage2 = new HttpResponseMessage(HttpStatusCode.Continue); continue caused it to keep going a while longer but it times out after about 20 seconds at the client end.


                   

    // var responseMessage2 = new HttpResponseMessage(HttpStatusCode.Accepted); DOES NOT WORK


                   

    // var responseMessage2 = new HttpResponseMessage(HttpStatusCode.Created); DOES NOT WORK


                   

    // I suspect there is a call to another as yet undefined route taking place here when Word is used in edit mode.


                   

    varresponseMessage2 = newHttpResponseMessage(HttpStatusCode.Continue);

                   

    returnresponseMessage2;

    Thursday, June 5, 2014 4:53 AM
  • I have written a parser tool App for FSSHTTP/B/D, it can parse the request or response http body between sharepoint and owas.

    I think it is usable for the search work of implementing FSSHTTP/B/D, so share here:

    https://github.com/Tongbupan/FSSHTTP

    Monday, June 9, 2014 2:19 PM
  • This guy has a working wopi service that can edit word.

    search google for BsiWopiService.zip

    This may provide some idea of what can be done.

    Wednesday, June 11, 2014 4:29 AM
  • @SirRoj

    The download link broken, could you send me the file "BsiWopiService.zip",

    my email is: 985105yu at gmail.com

    thanks


    • Edited by Marx Yu Thursday, June 12, 2014 6:22 AM
    Thursday, June 12, 2014 6:20 AM
  • Did you every get the Cobalt API approach to Edit Word ?

    I am stuck with it still saying Sorry - we cant open this document.

    Wednesday, June 25, 2014 4:28 AM
  • Made a bit of progress today.  Each data element has in it an "object group data" which contains two "object group object datas". The first one contains a piece of the file contents, and the 2nd is 36 bytes which I haven't fully been able to decode.

    As you probably already know, docx files are zip files. They follow a simple structure. Each file chunk is just a "local file header" from the zip. 

    The 36-byte string has the following structure:

        fc00082b29 f03cd496e820a2787a888d10b98b05535446208f 1011 5606 0000000000007d

    The 1st, 3rd and 5th chunks are constants. Some kind of structure I haven't decoded. The 2nd piece looks like a SHA1, but I can't figure out of what. Its not the compressed or decompressed file contents, unless maybe it's been salted.

    The 4th piece is a little-endian encoding of the full header length.

    Please let me know if you figure out how to compute the hash.

    Thursday, July 10, 2014 3:29 PM
  • I have decoded the 36-bytes, see [FSSHTTPD] section 2.2 Object Definitions and 2.4 File Chunking.

    you can use this tool to parse the request or response stream:https://github.com/Tongbupan/FSSHTTP

    Monday, July 14, 2014 5:27 AM
  • This a Wopi Host demo written by me.
    With Cobalt(FSSHTTPB/D) support for Office Web Apps. 
    Support DOCX Editing, and also PPTX,XLSX.

    https://github.com/marx-yu/WopiHost

    Requires Microsoft.CobaltCore.dll


    • Edited by Marx Yu Wednesday, July 16, 2014 5:15 AM
    Wednesday, July 16, 2014 5:15 AM
  • Hi Markleus,

    There are many questions on this thread so it is difficult to discern which ones are definitively answered at this point.  It appears you answered your question from 7/10 on 7/14, otherwise, let me know and I will continue to pursue that answer.

    Regards,

    Mark Miller | Microsoft Open Specifications Team

    Thursday, July 31, 2014 2:53 PM
  • Hi Mark Miller,

    That was Marx Yu that replied on July 14th. However, using his tip about MS-FSSHTTPD and zip files we were able to figure it out.

    The part we're stuck on now is figuring out what "Clock Data" is. 2.2.1.13.5.1 Content Tag Knowledge Entry says it contains Clock Data, but I can't find a reference to this anywhere else on web.




    • Edited by Markleus Wednesday, August 6, 2014 6:18 PM
    Wednesday, August 6, 2014 6:02 PM
  • Hi Markleus,

    Understood.  Thank you for the clarification.  I am investigating this issue and will follow up on this forum.

    Regards,

    Mark Miller | Microsoft Open Specifications Team

    Thursday, August 7, 2014 3:38 PM
  • Thank you Mark.

    I have some 4 examples of "clock data" which I extracted from the SharePoint data packets:

    • 310000500000
    • 310010500565105500789e520d878a63175d0250005000500000
    • 31003b503484dc8062834c5d3480d4580353cc5d3180c05003530c5c307c945d23538d68358794856263d85d637dd0707373585b38839055d3728d5d6487d85c2356cc5c3673c5500000
    • 3100085005540260db88ee5000500000

    They all start and end the same way, but I can't decipher them. There are some GUIDs associated with each one too, but they don't seem to correspond with anything.



    • Edited by Markleus Thursday, August 7, 2014 4:12 PM
    Thursday, August 7, 2014 4:11 PM
  • Any update? This is still a blocker for us.
    Thursday, August 28, 2014 6:21 PM
  • Hi Markleus,

    You asked the same question about Clock Data here, too. I repeat my answer:
    There is no need to know the structure of the Clock Data from the interoperability point of view; the only requirement is that when the Query Changes request is assembled its value should be used without any change. If you are implementing a SharePoint server, you can put there any value to keep track of the changes.

    Thanks, Vilmos
    Wednesday, September 3, 2014 4:49 PM