Skip to content

Commit

Permalink
Merge pull request #198 from paopaofeng/master
Browse files Browse the repository at this point in the history
打印状态提交到“预约到书”库
  • Loading branch information
任延华 authored Jul 13, 2018
2 parents d99bf2d + b7fdd8a commit 86dc086
Show file tree
Hide file tree
Showing 7 changed files with 482 additions and 324 deletions.
30 changes: 30 additions & 0 deletions DigitalPlatform.LibraryRestClient/DataStructure.cs
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,36 @@ public class WriteResResponse
[DataMember]
public byte[] baOutputTimestamp { get; set; }
}

[DataContract]
public class GetResRequest
{
[DataMember]
public string strResPath { get; set; }
[DataMember]
public long nStart { get; set; }
[DataMember]
public int nLength { get; set; }
[DataMember]
public string strStyle { get; set; }
}

[DataContract]
public class GetResResponse
{
[DataMember]
public LibraryServerResult GetResResult { get; set; }

[DataMember]
public byte[] baContent { get; set; }
[DataMember]
public string strMetadata { get; set; }
[DataMember]
public string strOutputResPath { get; set; }
[DataMember]
public byte[] baOutputTimestamp { get; set; }
}

// GetSearchResult()
[DataContract]
public class GetSearchResultRequest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalPlatform.Base\DigitalPlatform.Base.csproj">
<Project>{56eb94fd-45d0-4c82-ae8e-d398f1c4efcf}</Project>
<Name>DigitalPlatform.Base</Name>
</ProjectReference>
<ProjectReference Include="..\DigitalPlatform.Text\DigitalPlatform.Text.csproj">
<Project>{26f96cc3-a4a9-4bc4-a10a-bc7e25581ff6}</Project>
<Name>DigitalPlatform.Text</Name>
Expand Down
274 changes: 274 additions & 0 deletions DigitalPlatform.LibraryRestClient/LibraryChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ public class LibraryChannel
/// </summary>
public event BeforeLoginEventHandle BeforeLogin;

/// <summary>
/// 空闲事件
/// </summary>
public event IdleEventHandler Idle = null;

// 重登录次数
int _loginCount = 0;

Expand Down Expand Up @@ -1468,7 +1473,249 @@ public SearchResponse Search(string queryXml,
}


public WriteResResponse WriteRes(
string strResPath,
string strRanges,
long lTotalLength,
byte[] baContent,
string strMetadata,
string strStyle,
byte[] baInputTimestamp)
{
REDO:
CookieAwareWebClient client = new CookieAwareWebClient(this.Cookies);
client.Headers["Content-type"] = "application/json; charset=utf-8";

WriteResRequest request = new WriteResRequest()
{
strResPath = strResPath,
strRanges = strRanges,
lTotalLength = lTotalLength,
baContent = baContent,
strMetadata = strMetadata,
strStyle = strStyle,
baInputTimestamp = baInputTimestamp
};

byte[] baData = Encoding.UTF8.GetBytes(Serialize(request));
byte[] result = client.UploadData(GetRestfulApiUrl("WriteRes"),
"POST",
baData);

string strResult = Encoding.UTF8.GetString(result);
WriteResResponse response = Deserialize<WriteResResponse>(strResult);
if (response.WriteResResult.Value == -1
&& response.WriteResResult.ErrorCode == ErrorCode.NotLogin)
{
string strError = "";
if (DoNotLogin(ref strError) == 1)
goto REDO;
}

return response;
}

public long WriteRes(
string strPath,
string strXml,
bool bInlucdePreamble,
string strStyle,
byte[] timestamp,
out byte[] baOutputTimestamp,
out string strOutputPath,
out string strError)
{
strError = "";
strOutputPath = "";
baOutputTimestamp = null;

int nChunkMaxLength = 4096; // chunk

int nStart = 0;

byte[] baInputTimeStamp = null;

byte[] baPreamble = Encoding.UTF8.GetPreamble();

byte[] baTotal = Encoding.UTF8.GetBytes(strXml);

if (bInlucdePreamble == true
&& baPreamble != null && baPreamble.Length > 0)
{
byte[] temp = null;
temp = ByteArray.Add(temp, baPreamble);
baTotal = ByteArray.Add(temp, baTotal);
}

int nTotalLength = baTotal.Length;

if (timestamp != null)
{
baInputTimeStamp = ByteArray.Add(baInputTimeStamp, timestamp);
}

while (true)
{
DoIdle();

int nThisChunkSize = nChunkMaxLength;

if (nThisChunkSize + nStart > nTotalLength)
{
nThisChunkSize = nTotalLength - nStart; // 最后一次
if (nThisChunkSize <= 0)
break;
}

byte[] baChunk = new byte[nThisChunkSize];
Array.Copy(baTotal, nStart, baChunk, 0, baChunk.Length);

string strMetadata = "";
string strRange = Convert.ToString(nStart) + "-" + Convert.ToString(nStart + baChunk.Length - 1);

WriteResResponse response = WriteRes(strPath,
strRange,
nTotalLength,
baChunk,
strMetadata,
strStyle,
baInputTimeStamp);
if (response.WriteResResult.Value == -1)
{
strError = response.WriteResResult.ErrorInfo;
return -1;
}

baOutputTimestamp = response.baOutputTimestamp;
strOutputPath = response.strOutputResPath;

nStart += baChunk.Length;

if (nStart >= nTotalLength)
break;

Debug.Assert(strOutputPath != "", "outputpath不能为空");

strPath = strOutputPath; // 如果第一次的strPath中包含'?'id, 必须用outputpath才能正确继续
baInputTimeStamp = baOutputTimestamp; //baOutputTimeStamp;
}

return 0;
}


public GetResResponse GetRes(
string strResPath,
long lStart,
int nLength,
string strStyle)
{
REDO:
CookieAwareWebClient client = new CookieAwareWebClient(this.Cookies);
client.Headers["Content-type"] = "application/json; charset=utf-8";

GetResRequest request = new GetResRequest()
{
strResPath = strResPath,
nStart = lStart,
nLength = nLength,
strStyle = strStyle
};
byte[] baData = Encoding.UTF8.GetBytes(Serialize(request));
byte[] result = client.UploadData(GetRestfulApiUrl("GetRes"),
"POST",
baData);

string strResult = Encoding.UTF8.GetString(result);
GetResResponse response = Deserialize<GetResResponse>(strResult);
if (response.GetResResult.Value == -1
&& response.GetResResult.ErrorCode == ErrorCode.NotLogin)
{
string strError = "";
if (DoNotLogin(ref strError) == 1)
goto REDO;
}

return response;
}

/// <summary>
///
/// </summary>
/// <param name="strPath"></param>
/// <param name="strStyle">一般设置为"content,data,metadata,timestamp,outputpath"</param>
/// <param name="strResult"></param>
/// <param name="strMetaData"></param>
/// <param name="baOutputTimeStamp"></param>
/// <param name="strOutputResPath"></param>
/// <param name="strError"></param>
/// <returns></returns>
public long GetRes(
string strPath,
string strStyle,
out string strResult,
out string strMetaData,
out byte[] baOutputTimeStamp,
out string strOutputResPath,
out string strError)
{
strMetaData = "";
strResult = "";
strError = "";
strOutputResPath = "";
baOutputTimeStamp = null;

byte[] baContent = null;

int nStart = 0;
int nPerLength = -1;

byte[] baTotal = null;

while(true)
{
DoIdle();

GetResResponse response = GetRes(strPath,
nStart,
nPerLength,
strStyle);

long lRet = response.GetResResult.Value;
if (lRet == -1)
{
strError = response.GetResResult.ErrorInfo;
return -1;
}

strMetaData = response.strMetadata;
strOutputResPath = response.strOutputResPath;
baOutputTimeStamp = response.baOutputTimestamp;
baContent = response.baContent;

if (StringUtil.IsInList("data", strStyle) != true)
break;

if (StringUtil.IsInList("content", strStyle) == false)
return lRet;

baTotal = ByteArray.Add(baTotal, baContent);

Debug.Assert(baContent != null, "");
Debug.Assert(baContent.Length <= (int)lRet, "每次返回的包尺寸[" + Convert.ToString(baContent.Length) + "]应当小于result.Value[" + Convert.ToString(lRet) + "]");

nStart += baContent.Length;
if (nStart >= (int)lRet)
break; // 结束
}

if (StringUtil.IsInList("data", strStyle) != true)
return 0;

strResult = ByteArray.ToString(baTotal);

return 0;
}

public void Close()
{
Expand Down Expand Up @@ -1523,6 +1770,19 @@ public void AbortIt()

#region 公共函数

void DoIdle()
{
System.Threading.Thread.Sleep(1); // 避免CPU资源过度耗费

// bool bDoEvents = true;
if (this.Idle != null)
{
IdleEventArgs e = new IdleEventArgs();
this.Idle(this, e);
// bDoEvents = e.bDoEvents;
}
System.Threading.Thread.Sleep(1); // 避免CPU资源过度耗费
}
/// <summary>
/// 拼出接口url地址
/// </summary>
Expand Down Expand Up @@ -1750,6 +2010,20 @@ public class BeforeLoginEventArgs : EventArgs
public LoginFailCondition LoginFailCondition = LoginFailCondition.NormalError;
}

/// <summary>
/// 空闲事件
/// </summary>
/// <param name="sender">发送者</param>
/// <param name="e">事件参数</param>
public delegate void IdleEventHandler(object sender,
IdleEventArgs e);

/// <summary>
/// 空闲事件的参数
/// </summary>
public class IdleEventArgs : EventArgs
{
// public bool bDoEvents = true;
}

}
Loading

0 comments on commit 86dc086

Please sign in to comment.