// 兑现修改。 // 创建数据目录。创建或者修改 opac.xml文件 int DoModify(out string strError) { strError = ""; int nRet = 0; List <OpacAppInfo> infos = null; nRet = OpacAppInfo.GetOpacInfo(out infos, out strError); if (nRet == -1) { return(-1); } for (int i = 0; i < this.listView_instance.Items.Count; i++) { ListViewItem item = this.listView_instance.Items[i]; LineInfo line_info = (LineInfo)item.Tag; string strDataDir = ListViewUtil.GetItemText(item, COLUMN_DATADIR); string strSite = ListViewUtil.GetItemText(item, COLUMN_SITE); string strVirtualDir = ListViewUtil.GetItemText(item, COLUMN_VIRTUALDIR); if (String.IsNullOrEmpty(strDataDir) == true) { strError = "第 " + (i + 1).ToString() + " 行的数据目录尚未设置"; return(-1); } // 探测虚拟目录是否已经创建 // infos 中 // 查找一个虚拟目录是否存在 // return: // -1 不存在 // 其他 数组元素的下标 nRet = OpacAppInfo.Find(infos, strSite, strVirtualDir); if (nRet == -1) { string strAppDir = Path.Combine( Environment.ExpandEnvironmentVariables("%SystemDrive%\\inetpub\\wwwroot"), strVirtualDir.Replace("/", "")); // 注意去掉非法路径字符 PathUtil.CreateDirIfNeed(strAppDir); // 创建程序目录,并复制进基本内容 nRet = CreateNewAppDir(strAppDir, strDataDir, out strError); if (nRet == -1) { return(-1); } // 注册 Web App // 只能用于 IIS 7 以上版本 nRet = OpacAppInfo.RegisterWebApp( strSite, strVirtualDir, strAppDir, out strError); if (nRet == -1) { strError = "创建新的虚拟目录(site=" + strSite + ";virtual_dir=" + strVirtualDir + ";physicalPath=" + strAppDir + ")失败: " + strError; return(-1); } line_info.PhysicalPath = strAppDir; } // 探测数据目录,是否已经存在数据,是不是属于升级情形 // return: // -1 error // 0 数据目录不存在 // 1 数据目录存在,但是xml文件不存在 // 2 xml文件已经存在 nRet = DetectDataDir(strDataDir, out strError); if (nRet == -1) { return(-1); } if (nRet == 2) { // 进行升级检查 } else { // 需要进行最新安装,创建数据目录 nRet = CreateNewDataDir(strDataDir, out strError); if (nRet == -1) { return(-1); } } // 兑现修改 if (line_info.Changed == true) { // 保存信息到 opac.xml文件中 // return: // -1 error // 0 succeed nRet = line_info.SaveToXml(strDataDir, out strError); if (nRet == -1) { return(-1); } line_info.Changed = false; } } #if NO // 删除注册表中多余的instance信息 for (int i = this.listView_instance.Items.Count; ; i++) { // 删除虚拟目录。数据目录不用删除,因为界面操作当时已经删除过了 } #endif return(0); }
// 创建一个实例。 // 创建数据目录。创建或者修改 opac.xml文件 int CreateInstance(ListViewItem item, out string strError) { strError = ""; int nRet = 0; List <OpacAppInfo> all_infos = null; // IIS 中的全部虚拟目录 // 获得全部的虚拟目录信息,不光是 dp2OPAC 有关的 nRet = OpacAppInfo.GetAllVirtualInfoByAppCmd(out all_infos, out strError); if (nRet == -1) { return(-1); } List <OpacAppInfo> infos = null; // dp2OPAC 类型的全部虚拟目录 // 获得全部 dp2OPAC 有关的 nRet = OpacAppInfo.GetOpacInfoByAppCmd(out infos, out strError); if (nRet == -1) { return(-1); } LineInfo line_info = (LineInfo)item.Tag; string strDataDir = ListViewUtil.GetItemText(item, COLUMN_DATADIR); string strSite = ListViewUtil.GetItemText(item, COLUMN_SITE); string strVirtualDir = ListViewUtil.GetItemText(item, COLUMN_VIRTUALDIR); string strPhysicalPath = ListViewUtil.GetItemText(item, COLUMN_PHYSICALPATH); if (String.IsNullOrEmpty(strDataDir) == true) { strError = "数据目录尚未设置"; return(-1); } // 查找一个虚拟目录是否存在 // return: // -1 不存在 // 其他 数组元素的下标 nRet = OpacAppInfo.Find(infos, strSite, strVirtualDir); if (nRet == -1) { nRet = OpacAppInfo.Find(all_infos, strSite, strVirtualDir); if (nRet != -1) { // 这表明这是一个已经存在的虚拟目录,但不是 dp2OPAC 类型的 strError = "虚拟目录 '" + strSite + strVirtualDir + "' 名字和一个非 dp2OPAC 类型的已经存在的虚拟目录发生了冲突,创建或者修改操作失败"; return(-1); } #if NO string strAppDir = Path.Combine( Environment.ExpandEnvironmentVariables("%SystemDrive%\\inetpub\\wwwroot"), strVirtualDir.Replace("/", "")); // 注意去掉非法路径字符 #endif if (string.IsNullOrEmpty(strPhysicalPath) == true) { strPhysicalPath = GetAppPhysicalPath(strSite, strVirtualDir); PathUtil.CreateDirIfNeed(strPhysicalPath); } // 创建程序目录,并复制进基本内容 nRet = CreateNewAppDir(strPhysicalPath, strDataDir, out strError); if (nRet == -1) { return(-1); } // 注册 Web App // 只能用于 IIS 7 以上版本 nRet = OpacAppInfo.RegisterWebApp( strSite, strVirtualDir, strPhysicalPath, out strError); if (nRet == -1) { strError = "创建新的虚拟目录(site=" + strSite + ";virtual_dir=" + strVirtualDir + ";physicalPath=" + strPhysicalPath + ")失败: " + strError; return(-1); } ListViewUtil.ChangeItemText(item, COLUMN_PHYSICALPATH, strPhysicalPath); // line_info.PhysicalPath = strAppDir; } else { // 数据目录有可能修改,因此需要修改程序目录中的 start.xml #if NO OpacAppInfo info = all_infos[nRet]; Debug.Assert(string.IsNullOrEmpty(info.PhysicalPath) == false, ""); #endif Debug.Assert(string.IsNullOrEmpty(strPhysicalPath) == false, ""); // 修改 start.xml nRet = CreateStartXml(Path.Combine(strPhysicalPath, "start.xml"), strDataDir, out strError); if (nRet == -1) { return(-1); } } // 探测数据目录,是否已经存在数据,是不是属于升级情形 // return: // -1 error // 0 数据目录不存在 // 1 数据目录存在,但是xml文件不存在 // 2 xml文件已经存在 nRet = DetectDataDir(strDataDir, out strError); if (nRet == -1) { return(-1); } if (nRet == 2) { // 进行升级检查 // TODO: 是否要为数据目录增配权限 } else { // 需要进行最新安装,创建数据目录 nRet = CreateNewDataDir(strDataDir, out strError); if (nRet == -1) { return(-1); } } // 兑现修改 if (line_info.Changed == true) { // 保存信息到 opac.xml文件中 // return: // -1 error // 0 succeed nRet = line_info.SaveToXml(strDataDir, out strError); if (nRet == -1) { return(-1); } line_info.Changed = false; } return(0); }
// 进行检查 // return: // -1 发现错误 // 0 放弃整个保存操作 // 1 一切顺利 int DoVerify(out string strError) { strError = ""; #if NO List <string> instance_names = new List <string>(); List <string> data_dirs = new List <string>(); // 检查实例名、数据目录是否重复 for (int i = 0; i < this.listView_instance.Items.Count; i++) { ListViewItem item = this.listView_instance.Items[i]; LineInfo info = (LineInfo)item.Tag; string strDataDir = ListViewUtil.GetItemText(item, COLUMN_DATADIR); string strInstanceName = ListViewUtil.GetItemText(item, COLUMN_NAME); string strBindings = ListViewUtil.GetItemText(item, COLUMN_BINDINGS); if (HasDataDirDup(strDataDir, data_dirs) == true) { strError = "行 " + (i + 1).ToString() + " 的数据目录 '" + strDataDir + "' 和前面某行的数据目录发生了重复"; return(-1); } if (instance_names.IndexOf(strInstanceName) != -1) { strError = "行 " + (i + 1).ToString() + " 的实例名 '" + strInstanceName + "' 和前面某行的实例名发生了重复"; return(-1); } data_dirs.Add(strDataDir); instance_names.Add(strInstanceName); if (String.IsNullOrEmpty(strDataDir) == true) { strError = "第 " + (i + 1).ToString() + " 行的数据目录尚未设置"; return(-1); } if (String.IsNullOrEmpty(strBindings) == true) { strError = "第 " + (i + 1).ToString() + " 行的协议绑定尚未设置"; return(-1); } } // TODO: 检查绑定之间的端口是否冲突 for (int i = 0; i < this.listView_instance.Items.Count; i++) { ListViewItem item = this.listView_instance.Items[i]; LineInfo info = (LineInfo)item.Tag; string strInstanceName = ListViewUtil.GetItemText(item, COLUMN_NAME); string strBindings = ListViewUtil.GetItemText(item, COLUMN_BINDINGS); // return: // -1 出错 // 0 不重 // 1 重复 int nRet = IsBindingDup(strBindings, item, out strError); if (nRet != 0) { strError = "实例名为 '" + strInstanceName + "' (第 " + (i + 1).ToString() + " 行)的协议绑定发生错误或者冲突: " + strError; return(-1); } nRet = InstallHelper.IsGlobalBindingDup(strBindings, "dp2Library", out strError); if (nRet != 0) { strError = "实例名为 '" + strInstanceName + "' (第 " + (i + 1).ToString() + " 行)的协议绑定发生错误或者冲突: " + strError; return(-1); } } // 警告XML文件格式不正确、XML文件未找到的错误 for (int i = 0; i < this.listView_instance.Items.Count; i++) { ListViewItem item = this.listView_instance.Items[i]; LineInfo info = (LineInfo)item.Tag; string strDataDir = ListViewUtil.GetItemText(item, COLUMN_DATADIR); if (info.XmlFileNotFound == true) { string strText = "实例 '" + item.Text + "' 的数据目录 '" + strDataDir + "' 中没有找到 library.xml 文件。\r\n\r\n要对这个数据目录进行全新安装么?\r\n\r\n(是)进行全新安装 (否)不进行任何修改和安装 (取消)放弃全部保存操作"; DialogResult result = MessageBox.Show( this, strText, "setup_dp2library", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (result == System.Windows.Forms.DialogResult.No) { info.Changed = false; } if (result == System.Windows.Forms.DialogResult.Yes) { info.XmlFileNotFound = false; info.Changed = true; } if (result == System.Windows.Forms.DialogResult.Cancel) { strError = "放弃全部保存操作"; return(0); } } if (info.XmlFileContentError == true) { string strText = "实例 '" + item.Text + "' 的数据目录 '" + strDataDir + "' 中已经存在的 library.xml 文件(XML)格式不正确。程序无法对它进行读取操作\r\n\r\n要对这个数据目录进行全新安装么? 这将刷新整个目录(包括database.xml文件)到最初状态\r\n\r\n(是)进行全新安装 (否)不进行任何修改和安装 (取消)放弃全部保存操作"; DialogResult result = MessageBox.Show( this, strText, "setup_dp2library", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (result == System.Windows.Forms.DialogResult.No) { info.Changed = false; } if (result == System.Windows.Forms.DialogResult.Yes) { info.Changed = true; info.XmlFileNotFound = false; info.XmlFileContentError = false; // TODO: 是否要进行备份? File.Delete(PathUtil.MergePath(strDataDir, "library.xml")); } if (result == System.Windows.Forms.DialogResult.Cancel) { strError = "放弃全部保存操作"; return(0); } } } #endif return(1); }
// 根据已有的配置,填充InstanceList // TODO: 另外还需要从 IIS 中寻找名为 dp2OPAC 的虚拟目录。这是为了兼容以前的安装形态 // TODO: 创建注册表事项的时候,需要把没有写入注册表的实例信息也添加到注册表中。这样,只要看到有注册表事项,就表示只从注册表中取信息就是完整的了,不需要再从 IIS 中试探性取名为 dp2OPAC 的虚拟目录 int FillInstanceList(out string strError) { strError = ""; this.listView_instance.Items.Clear(); List <OpacAppInfo> infos = null; int nRet = OpacAppInfo.GetOpacInfo(out infos, out strError); if (nRet == -1) { return(-1); } int nErrorCount = 0; foreach (OpacAppInfo info in infos) { string strSite = ""; string strVirtualDir = ""; StringUtil.ParseTwoPart(info.IisPath, "/", out strSite, out strVirtualDir); strVirtualDir = "/" + strVirtualDir; ListViewItem item = new ListViewItem(); ListViewUtil.ChangeItemText(item, COLUMN_SITE, strSite); ListViewUtil.ChangeItemText(item, COLUMN_VIRTUALDIR, strVirtualDir); ListViewUtil.ChangeItemText(item, COLUMN_DATADIR, info.DataDir); ListViewUtil.ChangeItemText(item, COLUMN_PHYSICALPATH, info.PhysicalPath); this.listView_instance.Items.Add(item); LineInfo line_info = new LineInfo(); item.Tag = line_info; // line_info.PhysicalPath = info.PhysicalPath; // return: // -1 error // 0 file not found // 1 succeed nRet = line_info.Build(info.DataDir, out strError); if (nRet == -1) { ListViewUtil.ChangeItemText(item, COLUMN_ERRORINFO, strError); item.BackColor = Color.Red; item.ForeColor = Color.White; nErrorCount++; } } if (nErrorCount > 0) { this.listView_instance.Columns[COLUMN_ERRORINFO].Width = 200; } else { this.listView_instance.Columns[COLUMN_ERRORINFO].Width = 0; } return(0); }