A failsafe for network synchronization of subtitle

git-svn-id: https://subtitleedit.googlecode.com/svn/trunk@209 99eadd0c-20b8-1223-b5c4-2a2b2df33de2
This commit is contained in:
niksedk 2010-12-28 14:23:32 +00:00
parent e18f350936
commit f50bb051b0
7 changed files with 85 additions and 47 deletions

View File

@ -7375,10 +7375,11 @@ namespace Nikse.SubtitleEdit.Forms
SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged;
string message = string.Empty; string message = string.Empty;
int numberOfLines = 0;
List<SeNetworkService.SeUpdate> updates = null; List<SeNetworkService.SeUpdate> updates = null;
try try
{ {
updates = _networkSession.GetUpdates(out message); updates = _networkSession.GetUpdates(out message, out numberOfLines);
} }
catch (Exception exception) catch (Exception exception)
{ {
@ -7541,6 +7542,18 @@ namespace Nikse.SubtitleEdit.Forms
} }
} }
} }
if (numberOfLines != _subtitle.Paragraphs.Count)
{
_subtitle = _networkSession.ReloadSubtitle();
SubtitleListview1.Fill(_subtitle, _subtitleAlternate);
UpdateListviewWithUserLogEntries();
_networkSession.LastSubtitle = new Subtitle(_subtitle);
_oldSelectedParagraph = null;
SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged;
_networkSession.TimerStart();
RefreshSelectedParagraph();
return;
}
if (deleteIndices.Count > 0) if (deleteIndices.Count > 0)
{ {
deleteIndices.Sort(); deleteIndices.Sort();
@ -7564,8 +7577,6 @@ namespace Nikse.SubtitleEdit.Forms
doReFill = true; doReFill = true;
} }
_networkSession.CheckForAndSubmitUpdates(updates); // updates only (no inserts/deletes) _networkSession.CheckForAndSubmitUpdates(updates); // updates only (no inserts/deletes)
//TODO: do some compare lines count... and reload if no match!
} }
else else
{ {

View File

@ -43,7 +43,7 @@
// labelStatus // labelStatus
// //
this.labelStatus.AutoSize = true; this.labelStatus.AutoSize = true;
this.labelStatus.Location = new System.Drawing.Point(35, 197); this.labelStatus.Location = new System.Drawing.Point(35, 173);
this.labelStatus.Name = "labelStatus"; this.labelStatus.Name = "labelStatus";
this.labelStatus.Size = new System.Drawing.Size(59, 13); this.labelStatus.Size = new System.Drawing.Size(59, 13);
this.labelStatus.TabIndex = 18; this.labelStatus.TabIndex = 18;
@ -60,13 +60,13 @@
// //
// labelWebServiceUrl // labelWebServiceUrl
// //
this.labelWebServiceUrl.AutoSize = true;
this.labelWebServiceUrl.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.labelWebServiceUrl.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelWebServiceUrl.Location = new System.Drawing.Point(9, 138); this.labelWebServiceUrl.Location = new System.Drawing.Point(2, 112);
this.labelWebServiceUrl.Name = "labelWebServiceUrl"; this.labelWebServiceUrl.Name = "labelWebServiceUrl";
this.labelWebServiceUrl.Size = new System.Drawing.Size(81, 13); this.labelWebServiceUrl.Size = new System.Drawing.Size(92, 21);
this.labelWebServiceUrl.TabIndex = 16; this.labelWebServiceUrl.TabIndex = 16;
this.labelWebServiceUrl.Text = "Web service url"; this.labelWebServiceUrl.Text = "Web service url";
this.labelWebServiceUrl.TextAlign = System.Drawing.ContentAlignment.TopRight;
// //
// comboBoxWebServiceUrl // comboBoxWebServiceUrl
// //
@ -74,7 +74,7 @@
this.comboBoxWebServiceUrl.Items.AddRange(new object[] { this.comboBoxWebServiceUrl.Items.AddRange(new object[] {
"http://www.nikse.dk/se/SeService.asmx", "http://www.nikse.dk/se/SeService.asmx",
"http://nikse555.brinkster.net/SeService.asmx"}); "http://nikse555.brinkster.net/SeService.asmx"});
this.comboBoxWebServiceUrl.Location = new System.Drawing.Point(96, 131); this.comboBoxWebServiceUrl.Location = new System.Drawing.Point(96, 107);
this.comboBoxWebServiceUrl.Name = "comboBoxWebServiceUrl"; this.comboBoxWebServiceUrl.Name = "comboBoxWebServiceUrl";
this.comboBoxWebServiceUrl.Size = new System.Drawing.Size(290, 21); this.comboBoxWebServiceUrl.Size = new System.Drawing.Size(290, 21);
this.comboBoxWebServiceUrl.TabIndex = 2; this.comboBoxWebServiceUrl.TabIndex = 2;
@ -82,7 +82,7 @@
// buttonCancel // buttonCancel
// //
this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonCancel.Location = new System.Drawing.Point(311, 173); this.buttonCancel.Location = new System.Drawing.Point(311, 149);
this.buttonCancel.Name = "buttonCancel"; this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(75, 21); this.buttonCancel.Size = new System.Drawing.Size(75, 21);
this.buttonCancel.TabIndex = 4; this.buttonCancel.TabIndex = 4;
@ -92,7 +92,7 @@
// //
// textBoxUserName // textBoxUserName
// //
this.textBoxUserName.Location = new System.Drawing.Point(96, 79); this.textBoxUserName.Location = new System.Drawing.Point(96, 55);
this.textBoxUserName.Name = "textBoxUserName"; this.textBoxUserName.Name = "textBoxUserName";
this.textBoxUserName.Size = new System.Drawing.Size(290, 20); this.textBoxUserName.Size = new System.Drawing.Size(290, 20);
this.textBoxUserName.TabIndex = 0; this.textBoxUserName.TabIndex = 0;
@ -100,7 +100,7 @@
// buttonJoin // buttonJoin
// //
this.buttonJoin.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.buttonJoin.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.buttonJoin.Location = new System.Drawing.Point(230, 173); this.buttonJoin.Location = new System.Drawing.Point(230, 149);
this.buttonJoin.Name = "buttonJoin"; this.buttonJoin.Name = "buttonJoin";
this.buttonJoin.Size = new System.Drawing.Size(75, 21); this.buttonJoin.Size = new System.Drawing.Size(75, 21);
this.buttonJoin.TabIndex = 3; this.buttonJoin.TabIndex = 3;
@ -110,36 +110,36 @@
// //
// labelUserName // labelUserName
// //
this.labelUserName.AutoSize = true;
this.labelUserName.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.labelUserName.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelUserName.Location = new System.Drawing.Point(35, 82); this.labelUserName.Location = new System.Drawing.Point(-1, 55);
this.labelUserName.Name = "labelUserName"; this.labelUserName.Name = "labelUserName";
this.labelUserName.Size = new System.Drawing.Size(55, 13); this.labelUserName.Size = new System.Drawing.Size(91, 20);
this.labelUserName.TabIndex = 11; this.labelUserName.TabIndex = 11;
this.labelUserName.Text = "Username"; this.labelUserName.Text = "Username";
this.labelUserName.TextAlign = System.Drawing.ContentAlignment.TopRight;
// //
// textBoxSessionKey // textBoxSessionKey
// //
this.textBoxSessionKey.Location = new System.Drawing.Point(96, 105); this.textBoxSessionKey.Location = new System.Drawing.Point(96, 81);
this.textBoxSessionKey.Name = "textBoxSessionKey"; this.textBoxSessionKey.Name = "textBoxSessionKey";
this.textBoxSessionKey.Size = new System.Drawing.Size(290, 20); this.textBoxSessionKey.Size = new System.Drawing.Size(290, 20);
this.textBoxSessionKey.TabIndex = 1; this.textBoxSessionKey.TabIndex = 1;
// //
// labelSessionKey // labelSessionKey
// //
this.labelSessionKey.AutoSize = true;
this.labelSessionKey.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.labelSessionKey.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelSessionKey.Location = new System.Drawing.Point(35, 108); this.labelSessionKey.Location = new System.Drawing.Point(2, 81);
this.labelSessionKey.Name = "labelSessionKey"; this.labelSessionKey.Name = "labelSessionKey";
this.labelSessionKey.Size = new System.Drawing.Size(25, 13); this.labelSessionKey.Size = new System.Drawing.Size(88, 20);
this.labelSessionKey.TabIndex = 19; this.labelSessionKey.TabIndex = 19;
this.labelSessionKey.Text = "Key"; this.labelSessionKey.Text = "Key";
this.labelSessionKey.TextAlign = System.Drawing.ContentAlignment.TopRight;
// //
// NetworkJoin // NetworkJoin
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(408, 214); this.ClientSize = new System.Drawing.Size(408, 191);
this.Controls.Add(this.textBoxSessionKey); this.Controls.Add(this.textBoxSessionKey);
this.Controls.Add(this.labelSessionKey); this.Controls.Add(this.labelSessionKey);
this.Controls.Add(this.labelStatus); this.Controls.Add(this.labelStatus);

View File

@ -49,13 +49,13 @@
// //
// labelSessionKey // labelSessionKey
// //
this.labelSessionKey.AutoSize = true;
this.labelSessionKey.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.labelSessionKey.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelSessionKey.Location = new System.Drawing.Point(87, 19); this.labelSessionKey.Location = new System.Drawing.Point(12, 19);
this.labelSessionKey.Name = "labelSessionKey"; this.labelSessionKey.Name = "labelSessionKey";
this.labelSessionKey.Size = new System.Drawing.Size(64, 13); this.labelSessionKey.Size = new System.Drawing.Size(139, 17);
this.labelSessionKey.TabIndex = 21; this.labelSessionKey.TabIndex = 21;
this.labelSessionKey.Text = "Session key"; this.labelSessionKey.Text = "Session key";
this.labelSessionKey.TextAlign = System.Drawing.ContentAlignment.TopRight;
// //
// labelLog // labelLog
// //
@ -75,6 +75,7 @@
this.textBoxLog.Multiline = true; this.textBoxLog.Multiline = true;
this.textBoxLog.Name = "textBoxLog"; this.textBoxLog.Name = "textBoxLog";
this.textBoxLog.ReadOnly = true; this.textBoxLog.ReadOnly = true;
this.textBoxLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.textBoxLog.Size = new System.Drawing.Size(543, 179); this.textBoxLog.Size = new System.Drawing.Size(543, 179);
this.textBoxLog.TabIndex = 4; this.textBoxLog.TabIndex = 4;
// //
@ -92,13 +93,13 @@
// //
// labelWebServiceUrl // labelWebServiceUrl
// //
this.labelWebServiceUrl.AutoSize = true;
this.labelWebServiceUrl.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.labelWebServiceUrl.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelWebServiceUrl.Location = new System.Drawing.Point(70, 71); this.labelWebServiceUrl.Location = new System.Drawing.Point(12, 71);
this.labelWebServiceUrl.Name = "labelWebServiceUrl"; this.labelWebServiceUrl.Name = "labelWebServiceUrl";
this.labelWebServiceUrl.Size = new System.Drawing.Size(81, 13); this.labelWebServiceUrl.Size = new System.Drawing.Size(139, 17);
this.labelWebServiceUrl.TabIndex = 29; this.labelWebServiceUrl.TabIndex = 29;
this.labelWebServiceUrl.Text = "Web service url"; this.labelWebServiceUrl.Text = "Web service url";
this.labelWebServiceUrl.TextAlign = System.Drawing.ContentAlignment.TopRight;
// //
// textBoxUserName // textBoxUserName
// //
@ -110,13 +111,13 @@
// //
// labelUserName // labelUserName
// //
this.labelUserName.AutoSize = true;
this.labelUserName.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.labelUserName.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelUserName.Location = new System.Drawing.Point(96, 45); this.labelUserName.Location = new System.Drawing.Point(12, 45);
this.labelUserName.Name = "labelUserName"; this.labelUserName.Name = "labelUserName";
this.labelUserName.Size = new System.Drawing.Size(55, 13); this.labelUserName.Size = new System.Drawing.Size(139, 17);
this.labelUserName.TabIndex = 28; this.labelUserName.TabIndex = 28;
this.labelUserName.Text = "Username"; this.labelUserName.Text = "Username";
this.labelUserName.TextAlign = System.Drawing.ContentAlignment.TopRight;
// //
// textBoxWebServiceUrl // textBoxWebServiceUrl
// //

View File

@ -71,13 +71,13 @@
// //
// labelUserName // labelUserName
// //
this.labelUserName.AutoSize = true;
this.labelUserName.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.labelUserName.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelUserName.Location = new System.Drawing.Point(36, 86); this.labelUserName.Location = new System.Drawing.Point(2, 86);
this.labelUserName.Name = "labelUserName"; this.labelUserName.Name = "labelUserName";
this.labelUserName.Size = new System.Drawing.Size(55, 13); this.labelUserName.Size = new System.Drawing.Size(89, 13);
this.labelUserName.TabIndex = 3; this.labelUserName.TabIndex = 3;
this.labelUserName.Text = "Username"; this.labelUserName.Text = "Username";
this.labelUserName.TextAlign = System.Drawing.ContentAlignment.TopRight;
// //
// comboBoxWebServiceUrl // comboBoxWebServiceUrl
// //
@ -92,13 +92,13 @@
// //
// labelWebServiceUrl // labelWebServiceUrl
// //
this.labelWebServiceUrl.AutoSize = true;
this.labelWebServiceUrl.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.labelWebServiceUrl.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelWebServiceUrl.Location = new System.Drawing.Point(10, 112); this.labelWebServiceUrl.Location = new System.Drawing.Point(2, 109);
this.labelWebServiceUrl.Name = "labelWebServiceUrl"; this.labelWebServiceUrl.Name = "labelWebServiceUrl";
this.labelWebServiceUrl.Size = new System.Drawing.Size(81, 13); this.labelWebServiceUrl.Size = new System.Drawing.Size(89, 16);
this.labelWebServiceUrl.TabIndex = 8; this.labelWebServiceUrl.TabIndex = 8;
this.labelWebServiceUrl.Text = "Web service url"; this.labelWebServiceUrl.Text = "Web service url";
this.labelWebServiceUrl.TextAlign = System.Drawing.ContentAlignment.TopRight;
// //
// labelInfo // labelInfo
// //
@ -120,13 +120,13 @@
// //
// labelSessionKey // labelSessionKey
// //
this.labelSessionKey.AutoSize = true;
this.labelSessionKey.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.labelSessionKey.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.labelSessionKey.Location = new System.Drawing.Point(26, 60); this.labelSessionKey.Location = new System.Drawing.Point(-1, 60);
this.labelSessionKey.Name = "labelSessionKey"; this.labelSessionKey.Name = "labelSessionKey";
this.labelSessionKey.Size = new System.Drawing.Size(65, 13); this.labelSessionKey.Size = new System.Drawing.Size(92, 17);
this.labelSessionKey.TabIndex = 11; this.labelSessionKey.TabIndex = 11;
this.labelSessionKey.Text = "Session Key"; this.labelSessionKey.Text = "Session Key";
this.labelSessionKey.TextAlign = System.Drawing.ContentAlignment.TopRight;
// //
// textBoxSessionKey // textBoxSessionKey
// //

View File

@ -140,17 +140,33 @@ namespace Nikse.SubtitleEdit.Logic.Networking
_timerWebService.Start(); _timerWebService.Start();
} }
public List<SeNetworkService.SeUpdate> GetUpdates(out string message) public List<SeNetworkService.SeUpdate> GetUpdates(out string message, out int numberOfLines)
{ {
List<SeNetworkService.SeUpdate> list = new List<SeNetworkService.SeUpdate>(); List<SeNetworkService.SeUpdate> list = new List<SeNetworkService.SeUpdate>();
DateTime newUpdateTime; DateTime newUpdateTime;
var updates = _seWs.GetUpdates(SessionId, CurrentUser.UserName, _seWsLastUpdate, out message, out newUpdateTime); var updates = _seWs.GetUpdates(SessionId, CurrentUser.UserName, _seWsLastUpdate, out message, out newUpdateTime, out numberOfLines);
foreach (var update in updates) foreach (var update in updates)
list.Add(update); list.Add(update);
_seWsLastUpdate = newUpdateTime; _seWsLastUpdate = newUpdateTime;
return list; return list;
} }
public Subtitle ReloadSubtitle()
{
Subtitle.Paragraphs.Clear();
string tempFileName;
DateTime updateTime;
var sequences = _seWs.GetSubtitle(SessionId, out tempFileName, out updateTime);
FileName = tempFileName;
_seWsLastUpdate = updateTime;
if (sequences != null)
{
foreach (var sequence in sequences)
Subtitle.Paragraphs.Add(new Paragraph(HttpUtility.HtmlDecode(sequence.Text).Replace("<br />", Environment.NewLine), sequence.StartMilliseconds, sequence.EndMilliseconds));
}
return Subtitle;
}
private void ReloadFromWs() private void ReloadFromWs()
{ {
if (_seWs != null) if (_seWs != null)

View File

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:4.0.30319.1 // Runtime Version:4.0.30319.208
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
@ -9,7 +9,7 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// //
// This source code was auto-generated by Microsoft.VSDesigner, Version 4.0.30319.1. // This source code was auto-generated by Microsoft.VSDesigner, Version 4.0.30319.208.
// //
#pragma warning disable 1591 #pragma warning disable 1591
@ -359,13 +359,14 @@ namespace Nikse.SubtitleEdit.SeNetworkService {
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetUpdates", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetUpdates", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public SeUpdate[] GetUpdates(string sessionId, string userName, System.DateTime lastUpdateTime, out string message, out System.DateTime newUpdateTime) { public SeUpdate[] GetUpdates(string sessionId, string userName, System.DateTime lastUpdateTime, out string message, out System.DateTime newUpdateTime, out int numberOfLines) {
object[] results = this.Invoke("GetUpdates", new object[] { object[] results = this.Invoke("GetUpdates", new object[] {
sessionId, sessionId,
userName, userName,
lastUpdateTime}); lastUpdateTime});
message = ((string)(results[1])); message = ((string)(results[1]));
newUpdateTime = ((System.DateTime)(results[2])); newUpdateTime = ((System.DateTime)(results[2]));
numberOfLines = ((int)(results[3]));
return ((SeUpdate[])(results[0])); return ((SeUpdate[])(results[0]));
} }
@ -472,7 +473,7 @@ namespace Nikse.SubtitleEdit.SeNetworkService {
} }
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.208")]
[System.SerializableAttribute()] [System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")] [System.ComponentModel.DesignerCategoryAttribute("code")]
@ -529,7 +530,7 @@ namespace Nikse.SubtitleEdit.SeNetworkService {
} }
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.208")]
[System.SerializableAttribute()] [System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")] [System.ComponentModel.DesignerCategoryAttribute("code")]
@ -622,7 +623,7 @@ namespace Nikse.SubtitleEdit.SeNetworkService {
} }
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.208")]
[System.SerializableAttribute()] [System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")] [System.ComponentModel.DesignerCategoryAttribute("code")]
@ -882,6 +883,14 @@ namespace Nikse.SubtitleEdit.SeNetworkService {
return ((System.DateTime)(this.results[2])); return ((System.DateTime)(this.results[2]));
} }
} }
/// <remarks/>
public int numberOfLines {
get {
this.RaiseExceptionIfNecessary();
return ((int)(this.results[3]));
}
}
} }
/// <remarks/> /// <remarks/>

View File

@ -161,6 +161,7 @@
<s:element minOccurs="0" maxOccurs="1" name="GetUpdatesResult" type="tns:ArrayOfSeUpdate" /> <s:element minOccurs="0" maxOccurs="1" name="GetUpdatesResult" type="tns:ArrayOfSeUpdate" />
<s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="newUpdateTime" type="s:dateTime" /> <s:element minOccurs="1" maxOccurs="1" name="newUpdateTime" type="s:dateTime" />
<s:element minOccurs="1" maxOccurs="1" name="numberOfLines" type="s:int" />
</s:sequence> </s:sequence>
</s:complexType> </s:complexType>
</s:element> </s:element>