Example #1
0
        // 兑现修改。
        // 创建数据目录。创建或者修改 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);
        }
Example #2
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);
        }
Example #3
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);
        }
Example #4
0
        // 根据已有的配置,填充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);
        }