xj qian
2024-07-17 b1d01ea6fa62ce12c2e592b3315186f6b3c8359d
jrj/project/business/SystemSettings/Developer.Synch.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,432 @@
#include <wobject/xstring.hpp>
#include <xcontrol/xtreeview.hpp>
#include <xcontrol/xdwgrid.hpp>
#include <wobject/xdouble.hpp>
#include <xcontrol/xlayersheet.hpp>
#include <xcontrol/xdatetimepick.hpp>
#include "vbusiness/vframe/listwin.vframe.vbusiness.hpp"
#include "viewobject/view.base.hpp"
using xml = KXMLDOMDocument;
   class  __declspec(dllexport) DeveloperSynch :  public xframe
   {
   public:
      xtreeview   tv_gs;
      xsedit dw_log;
      int nItems;
      int nCount;
      xstring sContent;
   public:
      DeveloperSynch(void* implPtr, HWND hWnd) :xframe(implPtr, hWnd) {}
   public:
      static DeveloperSynch* CreateInstance(void* implPtr, void* hWnd)
      {
         DeveloperSynch* pWin = new DeveloperSynch(implPtr, (HWND)hWnd);
         return pWin;
      }
      xstring ProcessDevCmd(xstring cmd,xstring ext, xstring aurl=L"", bool needlogin=false)
      {
         if(aurl == L"") aurl = GetServerUrl();
         //alert(aurl);
         xstring d = xaserver::ProcessCmd(aurl,L"uri.hxsoft.com/xaserver/developer "+cmd,ext,needlogin);
         return d;
      }
      xstring ProcessDevCmd2(xstring cmd,xstring ext, xstring aurl=L"", bool needlogin=false)
      {
         if(aurl == L"") aurl = GetServerUrl();
         //alert(aurl);
         xstring d = xaserver::ProcessCmd(aurl,L"uri.hxsoft.com/xaserver/dev:"+cmd,ext,needlogin);
         return d;
      }
      int GetProjectItem(int hItem)
      {
         int pitem = hItem;
         xstring typ;
         while(true)
         {
            int h =tv_gs.GetItemData(tv_gs.GetId(), pitem);
            KXMLDOMElement e = trust(h as KXMLDOMElement);
            typ = GetEleString(e, L"@tagname");
            if(typ==L"project")break;
            pitem =tv_gs.GetParentItem(tv_gs.GetId(), pitem);
            if(pitem<=0)break;
         }
         return pitem;
      }
      int GetP2Item(int hItem)
      {
         int hDomainItem;
         int hP2Item = hItem;
         while(true)
         {
            hDomainItem =tv_gs.GetParentItem(tv_gs.GetId(), hP2Item);
            if(xtreeview::GetParentItem(tv_gs.GetId(), hDomainItem)<=0)break;
            hP2Item = hDomainItem;
         }
         return hP2Item;
      }
      xstring GetItemGuid(int hItem)
      {
         int h =tv_gs.GetItemData(tv_gs.GetId(), hItem);
         KXMLDOMElement e = trust(h as KXMLDOMElement);
         xstring guid = e.GetAttribute(L"guid");
         return guid;
      }
      xaserverarg GetDataArg(int hItem, xaserverarg arg)
      {
         int h =tv_gs.GetItemData(tv_gs.GetId(), hItem);
         KXMLDOMElement e = trust(h as KXMLDOMElement);
         xstring node = GetEleString(e, L"@tagname");
         //WriteLog(e.xml);
         if(node==L"File" || node==L"file")
         {
            xstring caption = e.getAttribute(L"caption");
            int hP2Item = 0;
            int hDomainItem = 0;
            if(xtreeview::GetParentItem(tv_gs.GetId(), hItem)<=0)
            {
               hDomainItem = hItem;
            }else
            {
               hP2Item = GetP2Item(hItem);
               hDomainItem =tv_gs.GetParentItem(tv_gs.GetId(), hP2Item);
            }
            //find project folder
            xstring prjguid=L"";
            int pitem = GetProjectItem(hItem);
            if(pitem > 0)
               prjguid = GetItemGuid(pitem);
            //xaserverarg arg ;
            //;
            arg.AddArg(L"project.guid",prjguid);
            if(hP2Item)
            {
               if(hP2Item != hItem)
               {
                  xstring guid = e.getAttribute(L"guid");
                  arg.AddArg(L"guid",guid);
               }
               xstring guid2 = GetItemGuid(hP2Item);
               arg.AddArg(L"root.guid",guid2);
            }else if(hDomainItem > 0)
            {
               xstring guid3 = GetItemGuid(hDomainItem);
               arg.AddArg(L"domain.guid",guid3);
            }
            return 1;
         }
         else if(node==L"folder" || node==L"project")
            return 2;
         else
            return 0;
      }
      int SaveData(int hItem)
      {
         xcontrol xc = GetControl(L"surl");
         xstring surl = xc.GetText();
         if(surl == L"")
         {
            alert(L"请输入同步服务器地址");
            return 1;
         }
         xstring name =tv_gs.GetItemLabel(hItem);
         xaserverarg arg ;
         ;
         int ret = GetDataArg(hItem, arg);
         //alert(arg.GetString());
         if(ret == 0)
         {
            WriteLog(name+L" å¤±è´¥, åŽŸå› :获取工程或文件夹失败!");
            return -1;
         }
         else if(ret == 2)
         {
            ret = SynchFolder(hItem);
            if(ret == -1)
               WriteLog(name+L" å¤±è´¥, åŽŸå› :获取文件数据失败!");
            else if(ret == 0)
               WriteLog(name+L" å¤±è´¥, åŽŸå› :复制文件失败!");
            else
               WriteLog(name);
            return -1;
         }
         SynchFolder(hItem);
         arg.AddArg(L"__name",name);
         arg.AddArg(L"__url",surl);
         synchServer(arg);
         if(name.right(3) == L".vx" || name.right(5) == L".xpage")
         {
            arg.AddArg(L"__name",name + L"[Code]");
            arg.AddArg(L"iscode",L"yes");
            synchServer(arg);
         }
         return 1;
      }
      xstring GetFolderPath(int hItem)
      {
         int k = hItem;
         if(k == 0) return L"";
         xstring src = L"";
         //xstring name = L"";
         while(k > 0)
         {
            int h =tv_gs.GetItemData(tv_gs.GetId(), k);
            k =tv_gs.GetParentItem(tv_gs.GetId(), k);
            KXMLDOMElement e = trust(h as KXMLDOMElement);
            xstring node = GetEleString(e, L"@tagname");
            if(node != L"File" && node != L"file")
            {
               xstring tmp = GetEleString(e, L"@src");
               //if(name == L"") name = GetEleString(e, L"@caption");
               if(tmp != L"")
               {
                  SynchFolder(k);
                  if(src == L"") src = tmp;
                  else
                  {
                     int j = 1;
                     int s =  tmp.length()();
                     xstring t = tmp.right(j).left(1);
                     while(t != L"\\" && j < s)
                     {
                        //WriteLog(t);
                        j++;
                        t = tmp.right(j).left(1);
                     }
                     if(j >= s)
                        src = tmp+ L"\\" + src;
                     else
                        src = tmp.left(s - j)+ L"\\" + src;
                  }
               }
            }
         }
         if(src == L"")
         {
            //WriteLog(name+L" åŒæ­¥å¤±è´¥, åŽŸå› :获取文件数据失败0!");
            return L"";
         }
         //if(src.left(9) ==L"Projects\\") src = src.mid(9, src.length()());
         src = L"\\" + src;//.replace(L"Projects\\",L"");
         //WriteLog(src);
         return src;
      }
      int SynchFolder(int hItem)
      {
         xstring src =  GetFolderPath(hItem);
         if(src== L"") return -1;
         if(xaserver::FileCopy(L"devfolder8001", src, L"devfolder5001", src) != 1)
            return 0;
         //WriteLog(src);
         return 1;
      }
      int synchServer(xaserverarg arg)
      {
         xstring name = arg.GetArgString(L"__name");
         xstring surl = arg.GetArgString(L"__url");
         xstring d =  ProcessDevCmd(L"getobject",arg.GetString());
         if(d == L"")
         {
            WriteLog(name+L" å¤±è´¥, åŽŸå› :获取文件数据失败!");
            return -1;
         }
         //WriteLog(d);
         arg.AddArg(L"content",d);
         ProcessDevCmd(L"saveobject",arg.GetString(), surl,true);
         WriteLog(name);
         return 1;
      }
      int WriteLog(xstring str)
      {
         if(sContent == L"")
            sContent = str;
         else
            sContent += L"\r\n" + str;
         //alert(sContent);
         dw_log.SetContent(sContent, L"");
         return 1;
      }
      //焦点激活处理函数
      int OnSetFocus(TEvent* evt, LPARAM param)
      {
         //重置工具条
         SetAgent();
         return 1;
      }
      int Add(int hItem)
      {
         if(nCount >99)
         {
            alert(L"同时同步的数量不能大于100个!");
            return 1;
         }
         nItems[nCount] = hItem;
         nCount++;
         return 1;
      }
      int Del(int hItem)
      {
         for(int i=0; i<nCount; i++)
         {
            int p = nItems[i];
            if(p == hItem) break;
         }
         if(i<nCount)
         {
            for(int j=i; j<nCount - 1; j++)
            {
               int k = nItems[j + 1];
               nItems[j] = k;
            }
            nCount --;
         }
         return 1;
      }
      //命令发布函数
      int OnCmdDispatch(xstring comdid)
      {
         if(comdid != L"synch") return 1;
         HCURSOR hCursor = xutil::SetCursorWait();
         sContent = L"";
         for(int i=0; i<nCount; i++)
         {
            int p = nItems[i];
            //int h =tv_gs.GetItemData(tv_gs.GetId(), p);
            //KXMLDOMElement e = trust(h as KXMLDOMElement);
            //alert(e.xml);
            SaveData(p);
            xtreeview::SetChecked(tv_gs.GetId(), p,0);
         }
         xutil::RestoreCursor(hCursor);
         nCount = 0;
         return 0;
      }
      int OnTreeCheckBoxSel(TEvent* evt, LPARAM p)
      {
         TVNNMHDR* nmtv = (TVNNMHDR*)evt->notify.pnmh;
         int hItem = nmtv.FromItem;
         HCURSOR hCursor = xutil::SetCursorWait();
         int hwnd = nmtv.hwndFrom;
         int c = 1 -tv_gs.GetChecked(hwnd, hItem);
         if(c == 1)
            Add(hItem);
         else
            Del(hItem);
         xutil::RestoreCursor(hCursor);
         return 1;
      }
      //命令处理事件
      int OnXCommand(TEvent* evt, LPARAM param)
      {
         return OnCmdDispatch(evt->xcommand.pStrID);
      }
      int OnAttachEvent()
      {
         //绑定工具条点击事件
         AttachEvent(L"WM_XCOMMAND", (FEvent)&DeveloperSynch::OnXCommand);
         //获取焦点事件,用于重置工具条
         //AttachEvent(L"WM_SETFOCUS",OnSetFocus);
         AttachEvent(L"DevExplorer",L"TVN_CHECKBOXSEL", (FEvent)&DeveloperSynch::OnTreeCheckBoxSel);
         AttachEvent(L"DevExplorer", L"TVN_ITEMEXPANDING", (FEvent)&DeveloperSynch::OnTreeExpanding);
         return 1;
      }
      int OnTreeExpanding(TEvent* evt, LPARAM lparam)
      {
         TVNNMHDR* nmtv = (TVNNMHDR*)evt->notify.pnmh;
         int hItem = nmtv.itemNew.hItem;
         int cItem=xtreeview::GetChildItem(tv_gs.GetId(), hItem);
         if(cItem > 0) return 1;
         int p =tv_gs.GetItemData(tv_gs.GetId(), hItem);
         KXMLDOMElement ele = trust(p as KXMLDOMElement);
         xstring src =GetEleString(ele, L"@src");
         xstring tagname =GetEleString(ele, L"@tagname");
         if (src == L"" || tagname == L"file" || tagname == L"File") return 1;
         OnSetTree(hItem, GetFolderPath(hItem));
         return 1;
      }
      int OnSetTree(int pItem, KXMLDOMElement e)
      {
         KXMLDOMNodeList li=e.selectNodes(L"*");
         int i=0;
         int s=li.length();
         for (i=0;i<s;i++){
            KXMLDOMElement  ele= li.item(s - i - 1);
            xstring caption = GetEleString(ele, L"@caption");
            xstring src =GetEleString(ele, L"@src");
            xstring image =GetEleString(ele, L"@image");
            int p = trust(ele as int);
            int hItem=xtreeview::InsertItem(tv_gs.GetId(), pItem,0,caption,p,image.toInt());
            xstring tagname =GetEleString(ele, L"@tagname");
            if (src != L"" && tagname != L"file" && tagname != L"File")
               xtreeview::SetItemChild1(tv_gs.GetId(), hItem,1);
            OnSetTree(hItem, ele);
         }
         return 1;
      }
      int OnSetTree(int hItem, xstring src)
      {
         xml x=new xml;
         xaserverarg arg;
         ;
         arg.AddArg(L"src",src);
         if(xaserver::ExecXQuery(GetServerUrl(),L"[Developer.Tree.xq]",arg.GetString(),x)!=1)
         {
            alert(L"读取节点失败!");
            return 1;
         }
         KXMLDOMElement e = x.documentElement();
         OnSetTree(hItem, e);
         return 1;
      }
      int onload()
      {
         nCount = 0;
         tv_gs = GetControl(L"DevExplorer");
         dw_log = GetControl(L"xlog");
         OnAttachEvent();
         return 1;
      }
      int onloaded()
      {
         OnSetTree(0, L"Projects/projects.xhw");
         return 1;
      }
   };