// 初始化本对象 // 从外部给的lChannel,在使用完后一定要设置为-1,否则会导致多次Destroy() public int Initial(DtlpChannelArray channels, string strDBPath, string strStartNumber, string strEndNumber) { Debug.Assert(channels != null, "channels参数不能为null"); this.Channels = channels; this.channel = this.Channels.CreateChannel(0); // Debug.Assert(channel != null, "channel参数不能为null"); /* pConnect->m_strDefUserName = strDefUserName; pConnect->m_strDefPassword = strDefPassword; */ Debug.Assert(strStartNumber != "", "strStartNumber参数不能为空"); m_strStartNumber = strStartNumber; Debug.Assert(strEndNumber != "", "strEndNumber参数不能为空"); m_strEndNumber = strEndNumber; Debug.Assert(strDBPath != "", "strDBPath参数不能为空"); m_strDBPath = strDBPath; // 数据库路径 return 0; }
private void DtlpLogForm_Load(object sender, EventArgs e) { stop = new DigitalPlatform.Stop(); stop.Register(MainForm.stopManager, true); // 和容器关联 // 初始化ChannelArray channelArray.appInfo = MainForm.AppInfo; channelArray.AskAccountInfo += new AskDtlpAccountInfoEventHandle(channelArray_AskAccountInfo); /* channelArray.procAskAccountInfo = new Delegate_AskAccountInfo( this.AskAccountInfo); * */ // 准备唯一的通道 if (this.Channel == null) { this.Channel = channelArray.CreateChannel(0); } this.textBox_serverAddr.Text = MainForm.AppInfo.GetString( "dtlplogform", "serveraddr", ""); this.textBox_logFileName.Text = MainForm.AppInfo.GetString( "dtlplogform", "logfilename", ""); this.marcEditor_record.FieldNameCaptionWidth = 0; }
private void DtlpLogForm_Load(object sender, EventArgs e) { stop = new DigitalPlatform.Stop(); stop.Register(MainForm.stopManager, true); // 和容器关联 // 初始化ChannelArray channelArray.appInfo = MainForm.AppInfo; channelArray.AskAccountInfo += new AskDtlpAccountInfoEventHandle(channelArray_AskAccountInfo); /* * channelArray.procAskAccountInfo = new Delegate_AskAccountInfo( * this.AskAccountInfo); * */ // 准备唯一的通道 if (this.Channel == null) { this.Channel = channelArray.CreateChannel(0); } this.textBox_serverAddr.Text = MainForm.AppInfo.GetString( "dtlplogform", "serveraddr", ""); this.textBox_logFileName.Text = MainForm.AppInfo.GetString( "dtlplogform", "logfilename", ""); this.marcEditor_record.FieldNameCaptionWidth = 0; }
// 初始化本对象 // 从外部给的lChannel,在使用完后一定要设置为-1,否则会导致多次Destroy() public int Initial(DtlpChannelArray channels, string strDBPath, string strStartNumber, string strEndNumber) { Debug.Assert(channels != null, "channels参数不能为null"); this.Channels = channels; this.channel = this.Channels.CreateChannel(0); // Debug.Assert(channel != null, "channel参数不能为null"); /* * pConnect->m_strDefUserName = strDefUserName; * pConnect->m_strDefPassword = strDefPassword; */ Debug.Assert(strStartNumber != "", "strStartNumber参数不能为空"); m_strStartNumber = strStartNumber; Debug.Assert(strEndNumber != "", "strEndNumber参数不能为空"); m_strEndNumber = strEndNumber; Debug.Assert(strDBPath != "", "strDBPath参数不能为空"); m_strDBPath = strDBPath; // 数据库路径 return(0); }
public int Initial(DtlpChannelArray channels, DtlpChannel channel) { this.dtlpResDirControl1.channelarray = channels; this.dtlpResDirControl1.Channel = channel; return(0); }
// 创建一个新通道 public DtlpChannel CreateChannel(int usrid) { DtlpChannel channel = new DtlpChannel(); channel.Container = this; channel.m_lUsrID = usrid; channel.InitialHostArray(); this.Add(channel); return(channel); }
private void listView_records_SelectedIndexChanged(object sender, EventArgs e) { if (this.listView_records.SelectedItems.Count == 0) { this.textBox_worksheet.Text = ""; this.marcEditor_record.Marc = ""; this.textBox_description.Text = ""; } else { LogItemInfo info = (LogItemInfo)this.listView_records.SelectedItems[0].Tag; if (info != null) { this.textBox_worksheet.Text = info.Encoding.GetString(info.OriginData).Replace(MarcUtil.SUBFLD, '$'); string strMARC = DtlpChannel.GetDt1000LogRecord(info.OriginData, info.Encoding); this.marcEditor_record.Marc = strMARC; this.marcEditor_record.DocumentOrgX = 0; this.marcEditor_record.DocumentOrgY = 0; string strOperCode = ""; string strOperComment = ""; string strOperPath = ""; string strError = ""; int nRet = DtlpChannel.ParseDt1000LogRecord(strMARC, out strOperCode, out strOperComment, out strOperPath, out strError); if (nRet == -1) { this.textBox_description.Text = strError; } else { if (strOperCode == "12") { this.textBox_description.Text = "操作: " + strOperComment + "\r\n数据库名: " + strOperPath; } else { this.textBox_description.Text = "操作: " + strOperComment + "\r\n路径: " + strOperPath; } } } else { this.textBox_worksheet.Text = "(no origin data)"; this.marcEditor_record.Marc = ""; this.textBox_description.Text = ""; } } }
// 得到下一条记录 // return: // -1 出错 // 0 继续 // 1 到达末尾(超过m_strEndNumber) // 2 没有找到记录 public int NextRecord(ref int nRecCount, out string strError) { strError = ""; string strPath; string strNumber; string strNextNumber; byte[] baPackage = null; int nSearchStyle = DtlpChannel.XX_STYLE; int nRet; int nErrorNo; int nDirStyle = 0; // 方向风格 byte[] baMARC = null; if (this.channel == null) { this.channel = this.Channels.CreateChannel(0); } Debug.Assert(m_strStartNumber != "", "m_strStartNumber值不能为空"); Debug.Assert(m_strEndNumber != "", "m_strEndNumber值不能为空"); // 首次进入本函数 if (nRecCount == -1) { strNumber = m_strStartNumber; nDirStyle = 0; nRecCount = 0; } else { strNumber = m_strNextNumber; if (Convert.ToInt64(m_strStartNumber) <= Convert.ToInt64(m_strEndNumber)) { nDirStyle = DtlpChannel.NEXT_RECORD; if (Convert.ToInt64(strNumber) >= Convert.ToInt64(m_strEndNumber)) { return(1); // 结束 } } else { nDirStyle = DtlpChannel.PREV_RECORD; if (Convert.ToInt64(strNumber) <= Convert.ToInt64(m_strEndNumber)) { return(1); // 结束 } } } strPath = m_strDBPath; strPath += "/ctlno/"; strPath += strNumber; // REDO: nRet = channel.Search(strPath, nSearchStyle | nDirStyle, out baPackage); if (nRet == -1) { nErrorNo = channel.GetLastErrno(); if (nErrorNo == DtlpChannel.GL_NOTLOGIN) { // 重新登录的事情,已经被Search()接管了 } else { if (nErrorNo == DtlpChannel.GL_NOTEXIST) { // 增量号码 Int64 n64Number = Convert.ToInt64(strNumber); string strVersion; // GetDTLPVersion(m_strDBPath, strVersion); // 可以将库名再去除,效果更好 strVersion = "0.9"; if (n64Number + 1 < 9999999 && strVersion == "0.9") { //strNumber.Format(_T("%I0764d"), n64Number+1); // 确保7位数字 strNumber = String.Format("{0:D7}", n64Number + 1); // "{0,7:D}" BUG!!! 左边实际上是空格 2009/2/26 } else { // strNumber.Format(_T("%I64d"), n64Number+1); strNumber = String.Format("{0:D7}", n64Number + 1); // "{0,7:D}" BUG!!! 左边实际上是空格 2009/2/26 } m_strCurNumber = strNumber; goto NOTFOUND; } this.ErrorNo = nErrorNo; if (nErrorNo == DtlpChannel.GL_INVALIDCHANNEL) { this.channel = null; } // 得到字符串即可 /* * channel.ErrorBox(owner, "DtlpIO", * "检索发生错误\nSearch() error"); * */ strError = "检索发生错误\nSearch() error: \r\n" + channel.GetErrorDescription(); goto ERROR1; } m_strPath = strPath; goto ERROR1; } /// Package package = new Package(); package.LoadPackage(baPackage, channel.GetPathEncoding(strPath)); nRet = package.Parse(PackageFormat.Binary); if (nRet == -1) { Debug.Assert(false, "Package::Parse() error"); strError = "Package::Parse() error"; goto ERROR1; } nRet = package.GetFirstBin(out baMARC); if (nRet == -1 || nRet == 0) { Debug.Assert(false, "Package::GetFirstBin() error"); strError = "Package::GetFirstBin() error"; goto ERROR1; } if (baMARC.Length >= 9) { Array.Copy(baMARC, 0, m_baTimeStamp, 0, 9); byte [] baBody = new byte[baMARC.Length - 9]; Array.Copy(baMARC, 9, baBody, 0, baMARC.Length - 9); baMARC = baBody; //baMARC.RemoveAt(0, 9); // 时间戳 } else { // 记录有问题,放入一个空记录? } // ---????????? 编写一个在byte[]末尾追加东西的函数? // baMARC = ByteArray.Add(baMARC, (byte)0); // baMARC.Add(0); // baMARC.Add(0); m_strRecord = channel.GetPathEncoding(strPath).GetString(baMARC); strPath = package.GetFirstPath(); nRet = GetCtlNoFromPath(strPath, out strNextNumber); if (nRet == -1) { Debug.Assert(false, "GetCtlNoFromPath() return error ..."); strError = "GetCtlNoFromPath() error ..."; goto ERROR1; } m_strNextNumber = strNextNumber; if (nRecCount == 0) // 首次 { m_strCurNumber = strNumber; } else { m_strCurNumber = strNextNumber; } m_strPath = strPath; // nRecCount++; return(0); ERROR1: return(-1); NOTFOUND: return(2); }
// 编辑配置文件 void menuItem_editCfgFile_Click(object sender, EventArgs e) { string strError = ""; string strContent = ""; if (this.SelectedNode == null) { strError = "尚未选择要编辑的配置文件节点"; goto ERROR1; } if (this.SelectedNode.ImageIndex != OFFS_CFGFILE) { strError = "所选择的节点不是配置文件类型"; goto ERROR1; } string strPath = GetPath(this.SelectedNode, '/'); if (Channel == null) { Channel = channelarray.CreateChannel(0); } Debug.Assert(Channel != null, "channel尚未初始化"); Cursor.Current = Cursors.WaitCursor; int nRet = Channel.GetCfgFile(strPath, out strContent, out strError); Cursor.Current = Cursors.Default; if (nRet == -1) goto ERROR1; EditCfgForm dlg = new EditCfgForm(); dlg.StartPosition = FormStartPosition.CenterScreen; dlg.CfgPath = strPath; dlg.Content = strContent; dlg.ShowDialog(this); if (dlg.DialogResult != DialogResult.OK) return; if (dlg.Changed == false) return; // 保存到(服务器端)配置文件 // return: // -1 出错 // 0 成功 Cursor.Current = Cursors.WaitCursor; nRet = Channel.WriteCfgFile(dlg.CfgPath, dlg.Content, out strError); Cursor.Current = Cursors.Default; if (nRet == -1) goto ERROR1; MessageBox.Show(this, "配置文件 '" + dlg.CfgPath +"' 保存成功"); return; ERROR1: MessageBox.Show(this, strError); }
// strStart, // 起始路径, ""表示根 Package GetOneLevelDirPackage(string strStart) { int nRet; byte [] baPackage = null; // bool bSetDefault = false; // 表示是否使用过缺省帐户 //bool bFirstLogin = true; Package package = new Package(); // CWaitCursor cursor; if (Channel == null) { Channel = channelarray.CreateChannel(0); } Debug.Assert(Channel != null, "channel尚未初始化"); Cursor.Current = Cursors.WaitCursor; if (Stop != null) { Stop.OnStop += new StopEventHandler(this.DoStop); Stop.SetMessage("正在列目录 '" + strStart + "' ..."); Stop.BeginLoop(); } try { nRet = Channel.Dir(strStart, out baPackage); } finally { if (Stop != null) { Stop.EndLoop(); Stop.OnStop -= new StopEventHandler(this.DoStop); Stop.Initial(""); } Cursor.Current = Cursors.Default; } if (nRet == -1) { Channel.ErrorBox(this, "restree", "列目录发生错误"); goto ERROR1; } package.LoadPackage(baPackage, Channel.GetPathEncoding(strStart)); package.Parse(PackageFormat.String); return package; ERROR1: return null; }
private void MainForm_Load(object sender, EventArgs e) { // 初始化数据目录 if (ApplicationDeployment.IsNetworkDeployed == true) { // MessageBox.Show(this, "network"); DataDir = Application.LocalUserAppDataPath; } else { // MessageBox.Show(this, "no network"); DataDir = Environment.CurrentDirectory; } stopManager.Initial(this.toolButton_stop, (object)this.toolStripStatusLabel1, (object)this.toolStripProgressBar1); stop = new DigitalPlatform.Stop(); stop.Register(this.stopManager, true); // 和容器关联 // DTLP this.textBox_dtlpAsAddress.Text = Settings.Default.DtlpAsAddress; this.textBox_dtlpUserName.Text = Settings.Default.DtlpUserName; this.checkBox_dtlpSavePassword.Checked = Settings.Default.DtlpSavePassword; if (this.checkBox_dtlpSavePassword.Checked == true) { string strPassword = Settings.Default.DtlpPassword; strPassword = this.DecryptPasssword(strPassword); this.textBox_dtlpPassword.Text = strPassword; } // DTLP协议 this.DtlpChannelArray.AskAccountInfo += new AskDtlpAccountInfoEventHandle(channelArray_AskAccountInfo); // 准备唯一的通道 if (this.DtlpChannel == null) { this.DtlpChannel = DtlpChannelArray.CreateChannel(0); } // dp2library协议 this.textBox_dp2AsUrl.Text = Settings.Default.Dp2AsUrl; this.textBox_dp2UserName.Text = Settings.Default.Dp2UserName; this.checkBox_dp2SavePassword.Checked = Settings.Default.Dp2SavePassword; if (this.checkBox_dp2SavePassword.Checked == true) { string strPassword = Settings.Default.Dp2Password; strPassword = this.DecryptPasssword(strPassword); this.textBox_dp2Password.Text = strPassword; } API.PostMessage(this.Handle, WM_LOADSIZE, 0, 0); }
// strStart, // 起始路径, ""表示根 Package GetOneLevelDirPackage(string strStart, out string strError) { strError = ""; int nRet; byte[] baPackage = null; // bool bSetDefault = false; // 表示是否使用过缺省帐户 //bool bFirstLogin = true; Package package = new Package(); // CWaitCursor cursor; if (this.DtlpChannel == null) { this.DtlpChannel = this.DtlpChannelArray.CreateChannel(0); } Debug.Assert(this.DtlpChannel != null, "channel尚未初始化"); Cursor.Current = Cursors.WaitCursor; nRet = this.DtlpChannel.Dir(strStart, out baPackage); Cursor.Current = Cursors.Default; if (nRet == -1) { strError = this.DtlpChannel.GetErrorDescription(); goto ERROR1; } package.LoadPackage(baPackage, this.DtlpChannel.GetPathEncoding(strStart)); package.Parse(PackageFormat.String); return package; ERROR1: return null; }
// 获得日志记录 // return: // -1 出错 // 0 日志文件不存在 // 1 日志文件存在 int GetLogRecords(string strServerAddr, string strLogFileName, out string strError) { strError = ""; int nStartIndex = 0; stop.OnStop += new StopEventHandler(this.DoStop); stop.SetMessage("正在从服务器获得日志记录 ..."); stop.BeginLoop(); this.Update(); this.MainForm.Update(); try { string strPath = strServerAddr + "/log/" + strLogFileName + "/" + nStartIndex.ToString(); bool bFirst = true; string strDate = ""; int nRecID = -1; string strOffset = ""; int nStyle = 0; for (int i = nStartIndex; ; i++) { Application.DoEvents(); // 出让界面控制权 if (stop != null) { if (stop.State != 0) { strError = "用户中断"; return -1; } } byte[] baPackage = null; if (bFirst == true) { } else { strPath = strServerAddr + "/log/" + strDate/*strLogFileName*/ + "/" + nRecID.ToString() + "@" + strOffset; } Encoding encoding = this.Channel.GetPathEncoding(strPath); stop.SetMessage("正在获得日志记录 " + strPath); int nRet = this.Channel.Search(strPath, DtlpChannel.RIZHI_STYLE | nStyle, out baPackage); if (nRet == -1) { int errorcode = this.Channel.GetLastErrno(); if (errorcode == DtlpChannel.GL_NOTEXIST) { if (bFirst == true) break; } // 更换新通道 if (errorcode == DtlpChannel.GL_INTR || errorcode == DtlpChannel.GL_SEND || errorcode == DtlpChannel.GL_RECV) { this.Channel = channelArray.CreateChannel(0); } strError = "获取日志记录:\r\n" + "路径: " + strPath + "\r\n" + "错误码: " + errorcode + "\r\n" + "错误信息: " + this.Channel.GetErrorString(errorcode) + "\r\n"; return -1; } // 解析出记录 Package package = new Package(); package.LoadPackage(baPackage, encoding); package.Parse(PackageFormat.Binary); // 获得下一路径 string strNextPath = ""; strNextPath = package.GetFirstPath(); if (String.IsNullOrEmpty(strNextPath) == true) { if (this.checkBox_loop.Checked == true) { i--; continue; } if (bFirst == true) { strError = "文件 " + strLogFileName + "不存在"; return 0; } // strError = "检索 '" + strPath + "' 响应包中路径部分不存在 ..."; // return -1; break; } // 获得记录内容 byte[] baContent = null; nRet = package.GetFirstBin(out baContent); if (nRet != 1) { baContent = null; // 但是为空包 } // 处理记录 string strMARC = DtlpChannel.GetDt1000LogRecord(baContent, encoding); string strOperCode = ""; string strOperComment = ""; string strOperPath = ""; nRet = DtlpChannel.ParseDt1000LogRecord(strMARC, out strOperCode, out strOperComment, out strOperPath, out strError); if (nRet == -1) { strOperComment = strError; } LogItemInfo info = new LogItemInfo(); info.Index = i; info.Offset = GetStartOffs(strOffset); info.OriginData = baContent; info.Encoding = encoding; ListViewItem item = new ListViewItem(); item.Text = i.ToString(); item.SubItems.Add(info.Offset); item.SubItems.Add(strOperComment); item.SubItems.Add(strOperPath); item.Tag = info; this.listView_records.Items.Add(item); // 将日志记录路径解析为日期、序号、偏移 // 一个日志记录路径的例子为: // /ip/log/19991231/0@1234~5678 // parameters: // strLogPath 待解析的日志记录路径 // strDate 解析出的日期 // nRecID 解析出的记录号 // strOffset 解析出的记录偏移,例如1234~5678 // return: // -1 出错 // 0 正确 nRet = DtlpChannel.ParseLogPath(strNextPath, out strDate, out nRecID, out strOffset, out strError); if (nRet == -1) return -1; // ModiOffset(ref strOffset); bFirst = false; } return 1; // 日志文件存在,已获得了记录 } finally { stop.EndLoop(); stop.OnStop -= new StopEventHandler(this.DoStop); stop.Initial(""); } }
// 编辑配置文件 void menuItem_editCfgFile_Click(object sender, EventArgs e) { string strError = ""; string strContent = ""; if (this.SelectedNode == null) { strError = "尚未选择要编辑的配置文件节点"; goto ERROR1; } if (this.SelectedNode.ImageIndex != OFFS_CFGFILE) { strError = "所选择的节点不是配置文件类型"; goto ERROR1; } string strPath = GetPath(this.SelectedNode, '/'); if (Channel == null) { Channel = channelarray.CreateChannel(0); } Debug.Assert(Channel != null, "channel尚未初始化"); Cursor.Current = Cursors.WaitCursor; int nRet = Channel.GetCfgFile(strPath, out strContent, out strError); Cursor.Current = Cursors.Default; if (nRet == -1) { goto ERROR1; } EditCfgForm dlg = new EditCfgForm(); dlg.StartPosition = FormStartPosition.CenterScreen; dlg.CfgPath = strPath; dlg.Content = strContent; dlg.ShowDialog(this); if (dlg.DialogResult != DialogResult.OK) { return; } if (dlg.Changed == false) { return; } // 保存到(服务器端)配置文件 // return: // -1 出错 // 0 成功 Cursor.Current = Cursors.WaitCursor; nRet = Channel.WriteCfgFile(dlg.CfgPath, dlg.Content, out strError); Cursor.Current = Cursors.Default; if (nRet == -1) { goto ERROR1; } MessageBox.Show(this, "配置文件 '" + dlg.CfgPath + "' 保存成功"); return; ERROR1: MessageBox.Show(this, strError); }
private void DtlpSearchForm_Load(object sender, EventArgs e) { EventLoadFinish.Reset(); this.BinDir = Environment.CurrentDirectory; #if NO stop = new DigitalPlatform.Stop(); stop.Register(MainForm.stopManager, true); // 和容器关联 #endif // 初始化ChannelArray DtlpChannels.appInfo = MainForm.AppInfo; DtlpChannels.AskAccountInfo += new AskDtlpAccountInfoEventHandle(channelArray_AskAccountInfo); /* channelArray.procAskAccountInfo = new Delegate_AskAccountInfo( this.AskAccountInfo); * */ // 准备唯一的通道 if (this.DtlpChannel == null) { this.DtlpChannel = DtlpChannels.CreateChannel(0); } this.dtlpResDirControl1.channelarray = DtlpChannels; dtlpResDirControl1.Channel = this.DtlpChannel; dtlpResDirControl1.Stop = this.stop; /* dtlpResDirControl1.procItemSelected = new Delegate_ItemSelected( this.ItemSelected); dtlpResDirControl1.procItemText = new Delegate_ItemText( this.ItemText); * */ dtlpResDirControl1.FillSub(null); /* * 需要异步执行,避免窗口长时间打不开 string strLastTargetPath = MainForm.applicationInfo.GetString( "dtlpsearchform", "last_targetpath", ""); if (String.IsNullOrEmpty(strLastTargetPath) == false) { this.dtlpResDirControl1.SelectedPath = strLastTargetPath; }*/ // 按照上次保存的路径展开resdircontrol树 string strResDirPath = this.MainForm.AppInfo.GetString( "dtlpsearchform", "last_targetpath", ""); if (String.IsNullOrEmpty(strResDirPath) == false) { object[] pList = { strResDirPath }; this.BeginInvoke(new Delegate_ExpandResDir(ExpandResDir), pList); } else { this.EventLoadFinish.Set(); } string strQueryWord = MainForm.AppInfo.GetString( "dtlpsearchform", "query_content", ""); this.textBox_queryWord.Text = strQueryWord; API.PostMessage(this.Handle, WM_LOADSIZE, 0, 0); }
// 校准转出范围的首尾号 // return: // -1 出错 // 0 没有改变首尾号 // 1 校准后改变了首尾号 // 2 书目库中没有记录 public int VerifyRange(out string strError) { strError = ""; string strPath; byte[] baPackage; string strMinNumber; string strMaxNumber; int nRet; int style = DtlpChannel.JH_STYLE; int nErrorNo; bool bChanged = false; string strVersion; if (this.channel == null) { this.channel = this.Channels.CreateChannel(0); } Debug.Assert(m_strStartNumber != "", "m_strStartNumber值不能为空"); Debug.Assert(m_strEndNumber != "", "m_strEndNumber值不能为空"); // 校准最大号 //REDO1: strPath = m_strDBPath; // GetDTLPVersion(m_strDBPath, strVersion); // 可以将库名再去除,效果更好 strVersion = "0.9"; if (strVersion == "0.9") { strPath += "/ctlno/9999999"; // 7位 } else { strPath += "/ctlno/9999999999"; // 10位 } nRet = channel.Search(strPath, style | DtlpChannel.PREV_RECORD, out baPackage); if (nRet <= 0) { nErrorNo = channel.GetLastErrno(); this.ErrorNo = nErrorNo; if (nErrorNo == DtlpChannel.GL_NOTEXIST) { return(2); } if (nErrorNo == DtlpChannel.GL_INVALIDCHANNEL) { this.channel = null; } /* * channel.ErrorBox(owner, * "dp1Batch", * "校准最大号时发生错误\nSearch() style=PREV_RECORD error"); * */ strError = "校准最大号时发生错误\nSearch() style=PREV_RECORD error: \r\n" + channel.GetErrorDescription(); goto ERROR1; } /// Package package = new Package(); package.LoadPackage(baPackage, channel.GetPathEncoding(strPath)); nRet = package.Parse(PackageFormat.Binary); if (nRet == -1) { strError = "Package::Parse(PackageFormat.Binary) error"; Debug.Assert(false, strError); goto ERROR1; } strPath = package.GetFirstPath(); nRet = GetCtlNoFromPath(strPath, out strMaxNumber); if (nRet == -1) { strError = "GetCtlNoFromPath() error ..."; Debug.Assert(false, strError); goto ERROR1; } // 2007/8/18 if (strVersion == "0.9") { strMaxNumber = strMaxNumber.PadLeft(7, '0'); // 7位 } else { strMaxNumber = strMaxNumber.PadLeft(10, '0'); // 10位 } if (Convert.ToInt64(m_strStartNumber) <= Convert.ToInt64(m_strEndNumber)) { if (Convert.ToInt64(m_strEndNumber) > Convert.ToInt64(strMaxNumber)) { m_strEndNumber = strMaxNumber; bChanged = true; } } else { if (Convert.ToInt64(m_strStartNumber) > Convert.ToInt64(strMaxNumber)) { m_strStartNumber = strMaxNumber; bChanged = true; } } // 校准最小号 //REDO2: strPath = m_strDBPath; strPath += "/ctlno/0000000000"; // - nRet = channel.Search(strPath, style | DtlpChannel.NEXT_RECORD, out baPackage); if (nRet <= 0) { nErrorNo = channel.GetLastErrno(); this.ErrorNo = nErrorNo; if (nErrorNo == DtlpChannel.GL_NOTEXIST) { return(2); } if (nErrorNo == DtlpChannel.GL_INVALIDCHANNEL) { this.channel = null; } /* * channel.ErrorBox(owner, * "Batch", * "校准最小号时发生错误\nSearch() style=NEXT_RECORD error"); * */ strError = "校准最小号时发生错误\nSearch() style=NEXT_RECORD error: \r\n" + channel.GetErrorDescription(); goto ERROR1; } /// package.LoadPackage(baPackage, channel.GetPathEncoding(strPath)); nRet = package.Parse(PackageFormat.Binary); if (nRet == -1) { strError = "Package::Parse(PackageFormat.Binary) error"; Debug.Assert(false, strError); goto ERROR1; } strPath = package.GetFirstPath(); nRet = GetCtlNoFromPath(strPath, out strMinNumber); if (nRet == -1) { strError = "GetCtlNoFromPath() error ..."; Debug.Assert(false, strError); goto ERROR1; } // 2007/8/18 if (strVersion == "0.9") { strMinNumber = strMinNumber.PadLeft(7, '0'); // 7位 } else { strMinNumber = strMinNumber.PadLeft(10, '0'); // 10位 } if (Convert.ToInt64(m_strStartNumber) <= Convert.ToInt64(m_strEndNumber)) { if (Convert.ToInt64(m_strStartNumber) < Convert.ToInt64(strMinNumber)) { m_strStartNumber = strMinNumber; bChanged = true; } } else { if (Convert.ToInt64(m_strEndNumber) < Convert.ToInt64(strMinNumber)) { m_strEndNumber = strMinNumber; bChanged = true; } } if (bChanged == true) { return(1); } else { return(0); } ERROR1: return(-1); }
public bool DestroyChannel(DtlpChannel channel) { channel.Cancel(); this.Remove(channel); return(true); }
// strStart, // 起始路径, ""表示根 Package GetOneLevelDirPackage(string strStart) { int nRet; byte [] baPackage = null; // bool bSetDefault = false; // 表示是否使用过缺省帐户 //bool bFirstLogin = true; Package package = new Package(); // CWaitCursor cursor; if (Channel == null) { Channel = channelarray.CreateChannel(0); } Debug.Assert(Channel != null, "channel尚未初始化"); Cursor.Current = Cursors.WaitCursor; if (Stop != null) { Stop.OnStop += new StopEventHandler(this.DoStop); Stop.SetMessage("正在列目录 '" + strStart + "' ..."); Stop.BeginLoop(); } try { nRet = Channel.Dir(strStart, out baPackage); } finally { if (Stop != null) { Stop.EndLoop(); Stop.OnStop -= new StopEventHandler(this.DoStop); Stop.Initial(""); } Cursor.Current = Cursors.Default; } if (nRet == -1) { Channel.ErrorBox(this, "restree", "列目录发生错误"); goto ERROR1; } package.LoadPackage(baPackage, Channel.GetPathEncoding(strStart)); package.Parse(PackageFormat.String); return(package); ERROR1: return(null); }
public bool DestroyChannel(DtlpChannel channel) { channel.Cancel(); this.Remove(channel); return true; }
// 校准转出范围的首尾号 // return: // -1 出错 // 0 没有改变首尾号 // 1 校准后改变了首尾号 // 2 书目库中没有记录 public int VerifyRange(out string strError) { strError = ""; string strPath; byte[] baPackage; string strMinNumber; string strMaxNumber; int nRet; int style = DtlpChannel.JH_STYLE; int nErrorNo; bool bChanged = false; string strVersion; if (this.channel == null) this.channel = this.Channels.CreateChannel(0); Debug.Assert(m_strStartNumber != "", "m_strStartNumber值不能为空"); Debug.Assert(m_strEndNumber != "", "m_strEndNumber值不能为空"); // 校准最大号 //REDO1: strPath = m_strDBPath; // GetDTLPVersion(m_strDBPath, strVersion); // 可以将库名再去除,效果更好 strVersion = "0.9"; if (strVersion == "0.9") strPath += "/ctlno/9999999"; // 7位 else strPath += "/ctlno/9999999999"; // 10位 nRet = channel.Search(strPath, style | DtlpChannel.PREV_RECORD, out baPackage); if (nRet <= 0) { nErrorNo = channel.GetLastErrno(); this.ErrorNo = nErrorNo; if (nErrorNo == DtlpChannel.GL_NOTEXIST) return 2; if (nErrorNo == DtlpChannel.GL_INVALIDCHANNEL) this.channel = null; /* channel.ErrorBox(owner, "dp1Batch", "校准最大号时发生错误\nSearch() style=PREV_RECORD error"); * */ strError = "校准最大号时发生错误\nSearch() style=PREV_RECORD error: \r\n" + channel.GetErrorDescription(); goto ERROR1; } /// Package package = new Package(); package.LoadPackage(baPackage, channel.GetPathEncoding(strPath)); nRet = package.Parse(PackageFormat.Binary); if (nRet == -1) { strError = "Package::Parse(PackageFormat.Binary) error"; Debug.Assert(false, strError); goto ERROR1; } strPath = package.GetFirstPath(); nRet = GetCtlNoFromPath(strPath, out strMaxNumber); if (nRet == -1) { strError = "GetCtlNoFromPath() error ..."; Debug.Assert(false, strError); goto ERROR1; } // 2007/8/18 if (strVersion == "0.9") strMaxNumber = strMaxNumber.PadLeft(7, '0'); // 7位 else strMaxNumber = strMaxNumber.PadLeft(10, '0'); // 10位 if (Convert.ToInt64(m_strStartNumber) <= Convert.ToInt64(m_strEndNumber)) { if (Convert.ToInt64(m_strEndNumber) > Convert.ToInt64(strMaxNumber)) { m_strEndNumber = strMaxNumber; bChanged = true; } } else { if (Convert.ToInt64(m_strStartNumber) > Convert.ToInt64(strMaxNumber)) { m_strStartNumber = strMaxNumber; bChanged = true; } } // 校准最小号 //REDO2: strPath = m_strDBPath; strPath += "/ctlno/0000000000"; // - nRet = channel.Search(strPath, style | DtlpChannel.NEXT_RECORD, out baPackage); if (nRet <= 0) { nErrorNo = channel.GetLastErrno(); this.ErrorNo = nErrorNo; if (nErrorNo == DtlpChannel.GL_NOTEXIST) return 2; if (nErrorNo == DtlpChannel.GL_INVALIDCHANNEL) this.channel = null; /* channel.ErrorBox(owner, "Batch", "校准最小号时发生错误\nSearch() style=NEXT_RECORD error"); * */ strError = "校准最小号时发生错误\nSearch() style=NEXT_RECORD error: \r\n" + channel.GetErrorDescription(); goto ERROR1; } /// package.LoadPackage(baPackage, channel.GetPathEncoding(strPath)); nRet = package.Parse(PackageFormat.Binary); if (nRet == -1) { strError = "Package::Parse(PackageFormat.Binary) error"; Debug.Assert(false, strError); goto ERROR1; } strPath = package.GetFirstPath(); nRet = GetCtlNoFromPath(strPath, out strMinNumber); if (nRet == -1) { strError = "GetCtlNoFromPath() error ..."; Debug.Assert(false, strError); goto ERROR1; } // 2007/8/18 if (strVersion == "0.9") strMinNumber = strMinNumber.PadLeft(7, '0'); // 7位 else strMinNumber = strMinNumber.PadLeft(10, '0'); // 10位 if (Convert.ToInt64(m_strStartNumber) <= Convert.ToInt64(m_strEndNumber)) { if (Convert.ToInt64(m_strStartNumber) < Convert.ToInt64(strMinNumber)) { m_strStartNumber = strMinNumber; bChanged = true; } } else { if (Convert.ToInt64(m_strEndNumber) < Convert.ToInt64(strMinNumber)) { m_strEndNumber = strMinNumber; bChanged = true; } } if (bChanged == true) return 1; else return 0; ERROR1: return -1; }
// 创建一个新通道 public DtlpChannel CreateChannel(int usrid) { DtlpChannel channel = new DtlpChannel(); channel.Container = this; channel.m_lUsrID = usrid; channel.InitialHostArray(); this.Add(channel); return channel; }
// 得到下一条记录 // return: // -1 出错 // 0 继续 // 1 到达末尾(超过m_strEndNumber) // 2 没有找到记录 public int NextRecord(ref int nRecCount, out string strError) { strError = ""; string strPath; string strNumber; string strNextNumber; byte[] baPackage = null; int nSearchStyle = DtlpChannel.XX_STYLE; int nRet; int nErrorNo; int nDirStyle = 0; // 方向风格 byte[] baMARC = null; if (this.channel == null) this.channel = this.Channels.CreateChannel(0); Debug.Assert(m_strStartNumber != "", "m_strStartNumber值不能为空"); Debug.Assert(m_strEndNumber != "", "m_strEndNumber值不能为空"); // 首次进入本函数 if (nRecCount == -1) { strNumber = m_strStartNumber; nDirStyle = 0; nRecCount = 0; } else { strNumber = m_strNextNumber; if (Convert.ToInt64(m_strStartNumber) <= Convert.ToInt64(m_strEndNumber)) { nDirStyle = DtlpChannel.NEXT_RECORD; if (Convert.ToInt64(strNumber) >= Convert.ToInt64(m_strEndNumber)) return 1; // 结束 } else { nDirStyle = DtlpChannel.PREV_RECORD; if (Convert.ToInt64(strNumber) <= Convert.ToInt64(m_strEndNumber)) return 1; // 结束 } } strPath = m_strDBPath; strPath += "/ctlno/"; strPath += strNumber; // REDO: nRet = channel.Search(strPath, nSearchStyle | nDirStyle, out baPackage); if (nRet == -1) { nErrorNo = channel.GetLastErrno(); if (nErrorNo == DtlpChannel.GL_NOTLOGIN) { // 重新登录的事情,已经被Search()接管了 } else { if (nErrorNo == DtlpChannel.GL_NOTEXIST) { // 增量号码 Int64 n64Number = Convert.ToInt64(strNumber); string strVersion; // GetDTLPVersion(m_strDBPath, strVersion); // 可以将库名再去除,效果更好 strVersion = "0.9"; if (n64Number+1<9999999 && strVersion == "0.9") { //strNumber.Format(_T("%I0764d"), n64Number+1); // 确保7位数字 strNumber = String.Format("{0:D7}", n64Number+1); // "{0,7:D}" BUG!!! 左边实际上是空格 2009/2/26 } else { // strNumber.Format(_T("%I64d"), n64Number+1); strNumber = String.Format("{0:D7}", n64Number + 1); // "{0,7:D}" BUG!!! 左边实际上是空格 2009/2/26 } m_strCurNumber = strNumber; goto NOTFOUND; } this.ErrorNo = nErrorNo; if (nErrorNo == DtlpChannel.GL_INVALIDCHANNEL) this.channel = null; // 得到字符串即可 /* channel.ErrorBox(owner, "DtlpIO", "检索发生错误\nSearch() error"); * */ strError = "检索发生错误\nSearch() error: \r\n" + channel.GetErrorDescription(); goto ERROR1; } m_strPath = strPath; goto ERROR1; } /// Package package = new Package(); package.LoadPackage(baPackage, channel.GetPathEncoding(strPath)); nRet = package.Parse(PackageFormat.Binary); if (nRet == -1) { Debug.Assert(false, "Package::Parse() error"); strError = "Package::Parse() error"; goto ERROR1; } nRet = package.GetFirstBin(out baMARC); if (nRet == -1 || nRet == 0) { Debug.Assert(false, "Package::GetFirstBin() error"); strError = "Package::GetFirstBin() error"; goto ERROR1; } if (baMARC.Length >= 9) { Array.Copy(baMARC, 0, m_baTimeStamp, 0, 9); byte [] baBody = new byte[baMARC.Length - 9]; Array.Copy(baMARC, 9, baBody, 0, baMARC.Length - 9); baMARC = baBody; //baMARC.RemoveAt(0, 9); // 时间戳 } else { // 记录有问题,放入一个空记录? } // ---????????? 编写一个在byte[]末尾追加东西的函数? // baMARC = ByteArray.Add(baMARC, (byte)0); // baMARC.Add(0); // baMARC.Add(0); m_strRecord = channel.GetPathEncoding(strPath).GetString(baMARC); strPath = package.GetFirstPath(); nRet = GetCtlNoFromPath(strPath, out strNextNumber); if (nRet == -1) { Debug.Assert(false, "GetCtlNoFromPath() return error ..."); strError = "GetCtlNoFromPath() error ..."; goto ERROR1; } m_strNextNumber = strNextNumber; if (nRecCount == 0) // 首次 m_strCurNumber = strNumber; else m_strCurNumber = strNextNumber; m_strPath = strPath; // nRecCount ++; return 0; ERROR1: return -1; NOTFOUND: return 2; }
// 获得日志记录 // return: // -1 出错 // 0 日志文件不存在 // 1 日志文件存在 int GetLogRecords(string strServerAddr, string strLogFileName, out string strError) { strError = ""; int nStartIndex = 0; stop.OnStop += new StopEventHandler(this.DoStop); stop.SetMessage("正在从服务器获得日志记录 ..."); stop.BeginLoop(); this.Update(); this.MainForm.Update(); try { string strPath = strServerAddr + "/log/" + strLogFileName + "/" + nStartIndex.ToString(); bool bFirst = true; string strDate = ""; int nRecID = -1; string strOffset = ""; int nStyle = 0; for (int i = nStartIndex; ; i++) { Application.DoEvents(); // 出让界面控制权 if (stop != null) { if (stop.State != 0) { strError = "用户中断"; return(-1); } } byte[] baPackage = null; if (bFirst == true) { } else { strPath = strServerAddr + "/log/" + strDate /*strLogFileName*/ + "/" + nRecID.ToString() + "@" + strOffset; } Encoding encoding = this.Channel.GetPathEncoding(strPath); stop.SetMessage("正在获得日志记录 " + strPath); int nRet = this.Channel.Search(strPath, DtlpChannel.RIZHI_STYLE | nStyle, out baPackage); if (nRet == -1) { int errorcode = this.Channel.GetLastErrno(); if (errorcode == DtlpChannel.GL_NOTEXIST) { if (bFirst == true) { break; } } // 更换新通道 if (errorcode == DtlpChannel.GL_INTR || errorcode == DtlpChannel.GL_SEND || errorcode == DtlpChannel.GL_RECV) { this.Channel = channelArray.CreateChannel(0); } strError = "获取日志记录:\r\n" + "路径: " + strPath + "\r\n" + "错误码: " + errorcode + "\r\n" + "错误信息: " + this.Channel.GetErrorString(errorcode) + "\r\n"; return(-1); } // 解析出记录 Package package = new Package(); package.LoadPackage(baPackage, encoding); package.Parse(PackageFormat.Binary); // 获得下一路径 string strNextPath = ""; strNextPath = package.GetFirstPath(); if (String.IsNullOrEmpty(strNextPath) == true) { if (this.checkBox_loop.Checked == true) { i--; continue; } if (bFirst == true) { strError = "文件 " + strLogFileName + "不存在"; return(0); } // strError = "检索 '" + strPath + "' 响应包中路径部分不存在 ..."; // return -1; break; } // 获得记录内容 byte[] baContent = null; nRet = package.GetFirstBin(out baContent); if (nRet != 1) { baContent = null; // 但是为空包 } // 处理记录 string strMARC = DtlpChannel.GetDt1000LogRecord(baContent, encoding); string strOperCode = ""; string strOperComment = ""; string strOperPath = ""; nRet = DtlpChannel.ParseDt1000LogRecord(strMARC, out strOperCode, out strOperComment, out strOperPath, out strError); if (nRet == -1) { strOperComment = strError; } LogItemInfo info = new LogItemInfo(); info.Index = i; info.Offset = GetStartOffs(strOffset); info.OriginData = baContent; info.Encoding = encoding; ListViewItem item = new ListViewItem(); item.Text = i.ToString(); item.SubItems.Add(info.Offset); item.SubItems.Add(strOperComment); item.SubItems.Add(strOperPath); item.Tag = info; this.listView_records.Items.Add(item); // 将日志记录路径解析为日期、序号、偏移 // 一个日志记录路径的例子为: // /ip/log/19991231/0@1234~5678 // parameters: // strLogPath 待解析的日志记录路径 // strDate 解析出的日期 // nRecID 解析出的记录号 // strOffset 解析出的记录偏移,例如1234~5678 // return: // -1 出错 // 0 正确 nRet = DtlpChannel.ParseLogPath(strNextPath, out strDate, out nRecID, out strOffset, out strError); if (nRet == -1) { return(-1); } // ModiOffset(ref strOffset); bFirst = false; } return(1); // 日志文件存在,已获得了记录 } finally { stop.EndLoop(); stop.OnStop -= new StopEventHandler(this.DoStop); stop.Initial(""); } }