From ad2deb7a287e97416474c4bdadd8662973504e05 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 25 Apr 2025 10:47:18 +0800 Subject: [PATCH 01/29] fixed:webdav mkloc not create dir --- XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index 1aff403..f7c2521 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -310,6 +310,7 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int _tcsxcpy(tszCreateDir, pSt_HTTPParam->tszHttpUri + 1); BaseLib_String_Replace(tszCreateDir, &nALen, st_StorageBucket.tszBuckKey, st_StorageBucket.tszFilePath, true); + SystemApi_File_CreateMutilFolder(tszCreateDir); st_HDRParam.nHttpCode = 201; HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); From f6b2ab42cdc7ed725d799d503fd703b08f0855ab Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 19 May 2025 15:05:21 +0800 Subject: [PATCH 02/29] ci:added debian and fedora system build support ci:improved build --- .github/workflows/RockyArm64_build.yml | 78 ---------------- ...{RockyX86_64_build.yml => Rocky_build.yml} | 47 +++++----- .github/workflows/UbuntuArm64_build.yml | 74 --------------- .github/workflows/codeql.yml | 3 + .github/workflows/debian_build.yml | 85 ++++++++++++++++++ .github/workflows/fedora_build.yml | 89 +++++++++++++++++++ .github/workflows/macbuild.yml | 16 ++-- .github/workflows/release.yml | 16 ++-- ...ubuntu86_64_build.yml => ubuntu_build.yml} | 57 +++++++++--- 9 files changed, 261 insertions(+), 204 deletions(-) delete mode 100644 .github/workflows/RockyArm64_build.yml rename .github/workflows/{RockyX86_64_build.yml => Rocky_build.yml} (63%) delete mode 100644 .github/workflows/UbuntuArm64_build.yml create mode 100644 .github/workflows/debian_build.yml create mode 100644 .github/workflows/fedora_build.yml rename .github/workflows/{ubuntu86_64_build.yml => ubuntu_build.yml} (54%) diff --git a/.github/workflows/RockyArm64_build.yml b/.github/workflows/RockyArm64_build.yml deleted file mode 100644 index 9201285..0000000 --- a/.github/workflows/RockyArm64_build.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: rocky Arm64 build workflows - -on: - push: - branches: - - 'develop' - paths: - - 'XEngine_Source/**' - - 'XEngine_Release/**' - - '.github/**' - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-24.04 - env: - IMAGE_NAME: rockylinux/rockylinux:9.5 - - strategy: - fail-fast: false - matrix: - arch: [linux/arm64] - - steps: - # 检出您的主仓库代码 - - name: Checkout main repository code - uses: actions/checkout@v4 - with: - ref: 'develop' - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Build ${{ matrix.arch }} - run: | - docker run --platform ${{ matrix.arch }} --rm \ - -v ${{ github.workspace }}:/workspace \ - -w /workspace ${{ env.IMAGE_NAME }} /bin/sh -c ' - set -e - dnf update -y - dnf install --allowerasing git make g++ wget curl jq unzip -y - - git config --global --add safe.directory /workspace - git submodule init - git submodule update - - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_RockyLinux_9_Arm64.zip - unzip ./XEngine_RockyLinux_9_Arm64.zip -d ./XEngine_RockyLinux_9_Arm64 - cd XEngine_RockyLinux_9_Arm64 - - chmod 777 ./XEngine_LINEnv.sh - ./XEngine_LINEnv.sh -i 0 - - cp -rf ./XEngine_Include /usr/local/include - find ./XEngine_Linux -name "*.so" -exec cp {} /usr/lib64 \; - ldconfig - cd .. - - cd XEngine_Source - make ARCH=Arm64 RELEASE=1 - make FLAGS=InstallAll - make FLAGS=CleanAll - cd .. - - cd XEngine_Release - ./XEngine_XStorageApp -t - chown -R $(id -u):$(id -g) . - chmod -R a+r . ' - - - name: Upload folder as artifact with RockyLinux - uses: actions/upload-artifact@v4 - with: - name: XEngine_XStorageApp-RockyLinux_9_Arm64 - path: XEngine_Release/ - retention-days: 1 diff --git a/.github/workflows/RockyX86_64_build.yml b/.github/workflows/Rocky_build.yml similarity index 63% rename from .github/workflows/RockyX86_64_build.yml rename to .github/workflows/Rocky_build.yml index 5b8fc71..1d14689 100644 --- a/.github/workflows/RockyX86_64_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -1,4 +1,4 @@ -name: rocky x86_64 build workflows +name: rocky build workflows on: push: @@ -14,18 +14,28 @@ permissions: jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ matrix.runner }} container: image: rockylinux/rockylinux:9.5 + options: --platform ${{ matrix.platform }} + strategy: + matrix: + include: + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + artifact: x86-64 + - arch: arm64 + runner: ubuntu-24.04-arm + platform: linux/arm64 + artifact: Arm64 steps: - # 检出您的主仓库代码 - name: Checkout main repository code uses: actions/checkout@v4 with: ref: 'develop' - # 检出依赖的xengine仓库到指定的xengine目录 - name: Checkout dependency repository (xengine) uses: actions/checkout@v4 with: @@ -37,28 +47,23 @@ jobs: with: repository: libxengine/XEngine_OPenSource path: XEngine_Source/XEngine_Depend - + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: install system package run: | dnf update -y - dnf install gcc g++ make git jq unzip -y - # 设置依赖库的环境变量 - - name: Set up Dependency rocky linux Environment - run: | - cd libxengine - chmod 777 * - ./XEngine_LINEnv.sh -i 0 + dnf install gcc g++ make git jq unzip wget -y - name: install xengine library - run: | + run: | latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_RockyLinux_9_x86-64.zip - unzip ./XEngine_RockyLinux_9_x86-64.zip -d ./XEngine_RockyLinux_9_x86-64 - cd XEngine_RockyLinux_9_x86-64 + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_RockyLinux_9_${{ matrix.artifact }}.zip + unzip ./XEngine_RockyLinux_9_${{ matrix.artifact }}.zip -d ./XEngine_RockyLinux_9_${{ matrix.artifact }} + cd XEngine_RockyLinux_9_${{ matrix.artifact }} - cp -rf ./XEngine_Include /usr/local/include - find ./XEngine_Linux -name "*.so" -exec cp {} /usr/lib64 \; - ldconfig - + chmod 777 * + ./XEngine_LINEnv.sh -i 3 - name: make run: | cd XEngine_Source @@ -78,6 +83,6 @@ jobs: - name: Upload folder as artifact with RockyLinux uses: actions/upload-artifact@v4 with: - name: XEngine_XStorageApp-RockyLinux_9_x86_64 + name: XEngine_XStorageApp-RockyLinux_9_${{ matrix.artifact }} path: XEngine_Release/ retention-days: 1 diff --git a/.github/workflows/UbuntuArm64_build.yml b/.github/workflows/UbuntuArm64_build.yml deleted file mode 100644 index 628b6ae..0000000 --- a/.github/workflows/UbuntuArm64_build.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: ubuntu Arm64 build workflows - -on: - push: - branches: - - 'develop' - paths: - - 'XEngine_Source/**' - - 'XEngine_Release/**' - - '.github/**' - -jobs: - build: - runs-on: ubuntu-24.04 - env: - IMAGE_NAME: ubuntu:24.04 - - strategy: - fail-fast: false - matrix: - arch: [linux/arm64] - - steps: - - name: Checkout main repository code - uses: actions/checkout@v4 - with: - ref: 'develop' - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Build ${{ matrix.arch }} - run: | - docker run --platform ${{ matrix.arch }} --rm \ - -v ${{ github.workspace }}:/workspace \ - -w /workspace ${{ env.IMAGE_NAME }} /bin/sh -c ' - set -e - apt update -y - apt install git make g++ wget curl jq unzip -y - - git config --global --add safe.directory /workspace - git submodule init - git submodule update - - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_24.04_Arm64.zip - unzip ./XEngine_UBuntu_24.04_Arm64.zip -d ./XEngine_UBuntu_24.04_Arm64 - cd XEngine_UBuntu_24.04_Arm64 - - chmod 777 ./XEngine_LINEnv.sh - ./XEngine_LINEnv.sh -i 0 - - cp -rf ./XEngine_Include /usr/local/include - find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - ldconfig - cd .. - - cd XEngine_Source - make ARCH=Arm64 RELEASE=1 - make FLAGS=InstallAll - make FLAGS=CleanAll - cd .. - - cd XEngine_Release - ./XEngine_XStorageApp -t - chown -R $(id -u):$(id -g) . - chmod -R a+r . ' - - - name: Upload folder as artifact with ubuntu Arm64 - uses: actions/upload-artifact@v4 - with: - name: XEngine_XStorageApp-Ubuntu_24.04_Arm64 - path: XEngine_Release/ - retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1716d18..2c66e5d 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -40,6 +40,9 @@ jobs: git submodule init git submodule update + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: Set up Dependency Environment run: | cd libxengine diff --git a/.github/workflows/debian_build.yml b/.github/workflows/debian_build.yml new file mode 100644 index 0000000..68e6e17 --- /dev/null +++ b/.github/workflows/debian_build.yml @@ -0,0 +1,85 @@ +name: debian build workflows + +on: + push: + branches: + - 'develop' + paths: + - 'XEngine_Source/**' + - 'XEngine_Release/**' + - '.github/**' + +permissions: + contents: read + +jobs: + build: + runs-on: ${{ matrix.runner }} + container: + image: debian:bookworm + options: --platform ${{ matrix.platform }} + strategy: + matrix: + include: + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + artifact: x86-64 + + steps: + - name: Checkout main repository code + uses: actions/checkout@v4 + with: + ref: 'develop' + + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v4 + with: + repository: libxengine/libxengine + path: libxengine + + - name: sub module checkout (opensource) + uses: actions/checkout@v4 + with: + repository: libxengine/XEngine_OPenSource + path: XEngine_Source/XEngine_Depend + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + + - name: install system package + run: | + apt update -y + apt install gcc g++ make git jq unzip curl wget -y + + - name: install xengine library + run: | + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_Debian_12_${{ matrix.artifact }}.zip + unzip ./XEngine_Debian_12_${{ matrix.artifact }}.zip -d ./XEngine_Debian_12_${{ matrix.artifact }} + cd XEngine_Debian_12_${{ matrix.artifact }} + + chmod 777 * + ./XEngine_LINEnv.sh -i 3 + - name: make + run: | + cd XEngine_Source + make + make FLAGS=InstallAll + make FLAGS=CleanAll + + make RELEASE=1 + make FLAGS=InstallAll + make FLAGS=CleanAll + cd .. + - name: test + run: | + cd XEngine_Release + ./XEngine_XStorageApp -t + + - name: Upload folder as artifact + uses: actions/upload-artifact@v4 + with: + name: XEngine_XStorageApp-Debian_12_x86-64 + path: XEngine_Release/ + retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/fedora_build.yml b/.github/workflows/fedora_build.yml new file mode 100644 index 0000000..8b682f6 --- /dev/null +++ b/.github/workflows/fedora_build.yml @@ -0,0 +1,89 @@ +name: fedora build workflows + +on: + push: + branches: + - 'develop' + paths: + - 'XEngine_Source/**' + - 'XEngine_Release/**' + - '.github/**' + +permissions: + contents: read + +jobs: + build: + runs-on: ${{ matrix.runner }} + container: + image: fedora:${{ matrix.fedora-version }} + options: --platform ${{ matrix.platform }} + strategy: + matrix: + include: + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + fedora-version: 42 + artifact: x86-64 + - arch: amd64 + runner: ubuntu-24.04 + platform: linux/amd64 + fedora-version: 41 + artifact: x86-64 + + steps: + - name: Checkout main repository code + uses: actions/checkout@v4 + + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v4 + with: + repository: libxengine/libxengine + path: libxengine + + - name: sub module checkout (opensource) + uses: actions/checkout@v4 + with: + repository: libxengine/XEngine_OPenSource + path: XEngine_Source/XEngine_Depend + + - name: install system package + run: | + dnf update -y + dnf install gcc g++ make git jq unzip wget -y + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + + - name: install xengine library + run: | + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }}.zip + unzip ./XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }}.zip -d ./XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + cd XEngine_Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + + chmod 777 * + ./XEngine_LINEnv.sh -i 3 + - name: make + run: | + cd XEngine_Source + make + make FLAGS=InstallAll + make FLAGS=CleanAll + + make RELEASE=1 + make FLAGS=InstallAll + make FLAGS=CleanAll + cd .. + - name: test + run: | + cd XEngine_Release + ./XEngine_XStorageApp -t + + - name: Upload folder as artifact + uses: actions/upload-artifact@v4 + with: + name: XEngine_XStorageApp-Fedora_${{ matrix.fedora-version }}_${{ matrix.artifact }} + path: XEngine_Release/ + retention-days: 1 \ No newline at end of file diff --git a/.github/workflows/macbuild.yml b/.github/workflows/macbuild.yml index 5c9432b..b3e59ec 100644 --- a/.github/workflows/macbuild.yml +++ b/.github/workflows/macbuild.yml @@ -41,7 +41,10 @@ jobs: - name: brew install run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV + - name: Set up Dependency x86_64 Environment if: matrix.os == 'macos-13' run: | @@ -51,20 +54,13 @@ jobs: - name: Set up Dependency Arm64 Environment if: matrix.os == 'macos-14' run: | - cd libxengine - chmod 777 * - ./XEngine_LINEnv.sh -i 0 - latest_tag=$(git ls-remote --tags --sort="v:refname" https://github.com/libxengine/libxengine.git | awk '{print $2}' | sed 's/refs\/tags\///' | tail -n 1) - wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_Mac_Arm64.zip unzip ./XEngine_Mac_Arm64.zip -d ./XEngine_Mac_Arm64 cd XEngine_Mac_Arm64 - sudo mkdir -p /usr/local/include - sudo mkdir -p /usr/local/lib - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Mac -name "*.dylib" -exec cp {} /usr/local/lib \; + chmod 777 * + ./XEngine_LINEnv.sh -i 3 - name: make debug run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4241540..fe7b00a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,37 +16,37 @@ jobs: with: fetch-depth: 0 - - name: Download x86_64 ubuntubuild + - name: Download ubuntu build uses: dawidd6/action-download-artifact@v6 with: - workflow: ubuntu86_64_build.yml + workflow: ubuntu_build.yml workflow_conclusion: success check_artifacts: false skip_unpack: true if_no_artifact_found: fail path: ./XRelease/ - - name: Download Arm64 ubuntubuild + - name: Download debian build uses: dawidd6/action-download-artifact@v6 with: - workflow: UbuntuArm64_build.yml + workflow: debian_build.yml workflow_conclusion: success check_artifacts: false skip_unpack: true if_no_artifact_found: fail path: ./XRelease/ - - name: Download x86_64 Rockylinux build + - name: Download fedora build uses: dawidd6/action-download-artifact@v6 with: - workflow: RockyX86_64_build.yml + workflow: fedora_build.yml workflow_conclusion: success check_artifacts: false skip_unpack: true if_no_artifact_found: fail path: ./XRelease/ - - name: Download Arm64 Rockylinux build + - name: Download Rocky build uses: dawidd6/action-download-artifact@v6 with: - workflow: RockyArm64_build.yml + workflow: Rocky_build.yml workflow_conclusion: success check_artifacts: false skip_unpack: true diff --git a/.github/workflows/ubuntu86_64_build.yml b/.github/workflows/ubuntu_build.yml similarity index 54% rename from .github/workflows/ubuntu86_64_build.yml rename to .github/workflows/ubuntu_build.yml index 321d54a..2ece2f2 100644 --- a/.github/workflows/ubuntu86_64_build.yml +++ b/.github/workflows/ubuntu_build.yml @@ -1,4 +1,4 @@ -name: ubuntu x86_64 build workflows +name: ubuntu build workflows on: push: @@ -21,16 +21,16 @@ jobs: include: - os: ubuntu-22.04 - os: ubuntu-24.04 + - os: ubuntu-22.04-arm + - os: ubuntu-24.04-arm runs-on: ${{ matrix.os }} steps: - # 检出您的主仓库代码 - name: Checkout main repository code uses: actions/checkout@v4 with: ref: 'develop' - # 检出依赖的xengine仓库到指定的xengine目录 - name: Checkout dependency repository (xengine) uses: actions/checkout@v4 with: @@ -41,28 +41,46 @@ jobs: run: | git submodule init git submodule update + + - name: Set TERM variable + run: echo "TERM=xterm" >> $GITHUB_ENV - - name: Set up Dependency ubuntu24.04 Environment + - name: Set up Dependency ubuntu24.04 x86-64 Environment if: matrix.os == 'ubuntu-24.04' run: | cd libxengine chmod 777 * sudo ./XEngine_LINEnv.sh -i 3 - - name: Set up Dependency ubuntu22.04 Environment + - name: Set up Dependency ubuntu22.04 x86-64 Environment if: matrix.os == 'ubuntu-22.04' run: | - cd libxengine - chmod 777 * - sudo ./XEngine_LINEnv.sh -i 0 - latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_x86-64.zip unzip ./XEngine_UBuntu_22.04_x86-64.zip -d ./XEngine_UBuntu_22.04_x86-64 cd XEngine_UBuntu_22.04_x86-64 - sudo cp -rf ./XEngine_Include /usr/local/include - sudo find ./XEngine_Linux -name "*.so" -exec cp {} /usr/local/lib \; - sudo ldconfig + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 + - name: Set up Dependency ubuntu22.04 Arm64 Environment + if: matrix.os == 'ubuntu-22.04-arm' + run: | + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_Arm64.zip + unzip ./XEngine_UBuntu_22.04_Arm64.zip -d ./XEngine_UBuntu_22.04_Arm64 + cd XEngine_UBuntu_22.04_Arm64 + + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 + - name: Set up Dependency ubuntu24.04 Arm64 Environment + if: matrix.os == 'ubuntu-24.04-arm' + run: | + latest_tag=$(curl -s https://api.github.com/repos/libxengine/libxengine/releases/latest | jq -r .tag_name) + wget https://github.com/libxengine/libxengine/releases/download/$latest_tag/XEngine_UBuntu_22.04_Arm64.zip + unzip ./XEngine_UBuntu_22.04_Arm64.zip -d ./XEngine_UBuntu_22.04_Arm64 + cd XEngine_UBuntu_22.04_Arm64 + + chmod 777 * + sudo ./XEngine_LINEnv.sh -i 3 - name: make run: | @@ -87,11 +105,24 @@ jobs: name: XEngine_XStorageApp-Ubuntu_22.04_x86_64 path: XEngine_Release/ retention-days: 1 - - name: Upload folder as artifact with ubuntu24.04 if: matrix.os == 'ubuntu-24.04' uses: actions/upload-artifact@v4 with: name: XEngine_XStorageApp-Ubuntu_24.04_x86_64 path: XEngine_Release/ + retention-days: 1 + - name: Upload folder as artifact with ubuntu22.04-arm + if: matrix.os == 'ubuntu-22.04-arm' + uses: actions/upload-artifact@v4 + with: + name: XEngine_XStorageApp-Ubuntu_22.04_Arm64 + path: XEngine_Release/ + retention-days: 1 + - name: Upload folder as artifact with ubuntu24.04-arm + if: matrix.os == 'ubuntu-24.04-arm' + uses: actions/upload-artifact@v4 + with: + name: XEngine_XStorageApp-Ubuntu_24.04_Arm64 + path: XEngine_Release/ retention-days: 1 \ No newline at end of file From 68084ee0890876b608ee08618cec8075139176f5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 19 May 2025 15:31:19 +0800 Subject: [PATCH 03/29] fixed:build failure --- .../APIHelp_Distributed/APIHelp_Distributed.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp index 3583b7a..a3fa6f4 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp @@ -59,7 +59,7 @@ bool CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis if (1 == nMode) { XNETHANDLE xhToken = 0; - BaseLib_Handle_Create(&xhToken, 0, pStl_ListAddr->size(), false); + BaseLib_Handle_Create(&xhToken, 0, pStl_ListAddr->size()); if (xhToken == pStl_ListAddr->size()) { xhToken--; @@ -392,7 +392,7 @@ bool CAPIHelp_Distributed::APIHelp_Distributed_UPStorage(list Date: Sat, 24 May 2025 14:40:05 +0800 Subject: [PATCH 04/29] update:make file g++ version improved:make file build flags --- XEngine_Source/Makefile | 33 +++++++------ XEngine_Source/StorageModule_APIHelp/Makefile | 21 +++------ .../StorageModule_BTorrent/Makefile | 47 ++++++++----------- XEngine_Source/StorageModule_Config/Makefile | 23 ++++----- .../StorageModule_Database/Makefile | 21 +++------ .../StorageModule_Protocol/Makefile | 21 +++------ XEngine_Source/StorageModule_Session/Makefile | 21 +++------ XEngine_Source/XEngine_StorageApp/Makefile | 21 +++------ 8 files changed, 79 insertions(+), 129 deletions(-) diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index a538573..3d50d2d 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -16,12 +16,6 @@ BASE_BTORRENT_PATH = ./StorageModule_BTorrent APPSERVICE_STORAGE_PATH = ./XEngine_StorageApp -ifeq ($(PLATFORM),linux) - FILEEXT = so -else ifeq ($(PLATFORM),mac) - FILEEXT = dylib -endif - XENGINE_MODULES = libjsoncpp.so libtinyxml2.so libXEngine_InfoReport.so \ libStorageModule_Database.so libStorageModule_Config.so libStorageModule_Session.so libStorageModule_APIHelp.so libStorageModule_Protocol.so libStorageModule_BTorrent.so \ XEngine_StorageApp.exe @@ -29,38 +23,43 @@ XENGINE_MODULES = libjsoncpp.so libtinyxml2.so libXEngine_InfoReport.so .PHONY:MakeAll MakeAll:$(XENGINE_MODULES) - +ifeq ($(PLATFORM),linux) + FILEEXT = so +else ifeq ($(PLATFORM),mac) + FILEEXT = dylib +endif + libjsoncpp.so: ifeq ($(FLAGS), InstallAll) cp $(THIRD_JSONCPP_PATH)/libjsoncpp.$(FILEEXT) ../XEngine_Release/ else - make -C $(THIRD_JSONCPP_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(THIRD_JSONCPP_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) endif libtinyxml2.so: ifeq ($(FLAGS), InstallAll) cp $(THIRD_TINYXML_PATH)/libtinyxml2.$(FILEEXT) ../XEngine_Release/ else - make -C $(THIRD_TINYXML_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(THIRD_TINYXML_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) endif libXEngine_InfoReport.so: ifeq ($(FLAGS), InstallAll) cp $(THIRD_REPORT_PATH)/libXEngine_InfoReport.$(FILEEXT) ../XEngine_Release/ else - make -C $(THIRD_REPORT_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(THIRD_REPORT_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) endif libStorageModule_Database.so: - make -C $(BASE_SQL_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_SQL_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libStorageModule_Config.so: - make -C $(BASE_CONFIG_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_CONFIG_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libStorageModule_Session.so: - make -C $(BASE_SESSION_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_SESSION_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libStorageModule_APIHelp.so: - make -C $(BASE_APIHELP_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_APIHELP_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libStorageModule_Protocol.so: - make -C $(BASE_PROTOCOL_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_PROTOCOL_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) libStorageModule_BTorrent.so: - make -C $(BASE_BTORRENT_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(BASE_BTORRENT_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) XEngine_StorageApp.exe: - make -C $(APPSERVICE_STORAGE_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + make -C $(APPSERVICE_STORAGE_PATH) PLATFORM=$(PLATFORM) UNICODE=$(UNICODE) RELEASE=$(RELEASE) $(FLAGS) diff --git a/XEngine_Source/StorageModule_APIHelp/Makefile b/XEngine_Source/StorageModule_APIHelp/Makefile index 44624ff..231eeee 100644 --- a/XEngine_Source/StorageModule_APIHelp/Makefile +++ b/XEngine_Source/StorageModule_APIHelp/Makefile @@ -1,11 +1,7 @@ -CC = g++ -Wall -std=c++17 -fPIC -PLATFORM = linux +CC = g++ -Wall -std=c++20 -fPIC PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 -UNICODE = 0 LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -lXEngine_Cryption -lRfcComponents_HttpProtocol -lXEngine_SystemApi -ljsoncpp @@ -13,31 +9,29 @@ LIBEX = OBJECTS = APIHelp_Distributed.o APIHelp_Api.o APIHelp_Cryption.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif ifeq ($(UNICODE),1) -UNICODE = -D _UNICODE +override UNICODE := -D __UNICODE__ else -UNICODE = +override UNICODE := -D __ANSI__ endif ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -46,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl diff --git a/XEngine_Source/StorageModule_BTorrent/Makefile b/XEngine_Source/StorageModule_BTorrent/Makefile index 7afe90b..8f9b8de 100644 --- a/XEngine_Source/StorageModule_BTorrent/Makefile +++ b/XEngine_Source/StorageModule_BTorrent/Makefile @@ -1,11 +1,7 @@ -CC = g++ -Wall -std=c++17 -fPIC -PLATFORM = linux +CC = g++ -Wall -std=c++20 -fPIC PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 -UNICODE = 0 LOADHDR = -I ./ LIB = -lXEngine_BaseLib LIBEX = @@ -18,13 +14,30 @@ ifeq ($(MACRO_VALUE),1) LIB += -ltorrent-rasterbar endif +ifeq ($(RELEASE),1) +FLAGS = -c -D _RELEASE +DEBUG = -O2 +else + ifeq ($(PLATFORM),mac) + FLAGS = -c + DEBUG = -g -D _DEBUG + else + FLAGS = -c -lc_p + DEBUG = -g -pg -D _DEBUG + endif +endif + +ifeq ($(UNICODE),1) +override UNICODE := -D __UNICODE__ +else +override UNICODE := -D __ANSI__ +endif + ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -33,32 +46,12 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl LOADBIN = -Wl,-rpath,@loader_path/../XEngine_BaseLib/ endif -ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = -else - ifeq ($(PLATFORM),mac) - FLAGS = -c - DEBUG = -g - else - FLAGS = -c -lc_p - DEBUG = -g -pg - endif -endif - -ifeq ($(UNICODE),1) -UNICODE = -D _UNICODE -else -UNICODE = -endif - all:$(OBJECTS) $(CC) $(DEBUG) $(OBJECTS) -o libStorageModule_BTorrent.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) diff --git a/XEngine_Source/StorageModule_Config/Makefile b/XEngine_Source/StorageModule_Config/Makefile index 6e493ea..c24f28e 100644 --- a/XEngine_Source/StorageModule_Config/Makefile +++ b/XEngine_Source/StorageModule_Config/Makefile @@ -1,11 +1,7 @@ -CC = g++ -Wall -std=c++17 -fPIC -PLATFORM = linux -PLATVER = -PLATDIR = +CC = g++ -Wall -std=c++20 -fPIC +PLATVER = FILEEXT = LIBFLAG = -RELEASE = 0 -UNICODE = 0 LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp LIB = -ljsoncpp @@ -13,31 +9,29 @@ LIBEX = OBJECTS = Config_Json.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif ifeq ($(UNICODE),1) -UNICODE = -D _UNICODE +override UNICODE := -D __UNICODE__ else -UNICODE = +override UNICODE := -D __ANSI__ endif ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -46,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl diff --git a/XEngine_Source/StorageModule_Database/Makefile b/XEngine_Source/StorageModule_Database/Makefile index 6d8371d..ad177ea 100644 --- a/XEngine_Source/StorageModule_Database/Makefile +++ b/XEngine_Source/StorageModule_Database/Makefile @@ -1,11 +1,7 @@ -CC = g++ -Wall -std=c++17 -fPIC -PLATFORM = linux +CC = g++ -Wall -std=c++20 -fPIC PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 -UNICODE = 0 LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp LOADSO = LIB = -lXEngine_BaseLib -lXEngine_Cryption -lHelpComponents_DataBase -lXEngine_SystemApi @@ -13,31 +9,29 @@ LIBEX = OBJECTS = Database_File.o Database_Memory.o Database_Help.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif ifeq ($(UNICODE),1) -UNICODE = -D _UNICODE +override UNICODE := -D __UNICODE__ else -UNICODE = +override UNICODE := -D __ANSI__ endif ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -46,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl diff --git a/XEngine_Source/StorageModule_Protocol/Makefile b/XEngine_Source/StorageModule_Protocol/Makefile index a6c1fe8..64339a4 100644 --- a/XEngine_Source/StorageModule_Protocol/Makefile +++ b/XEngine_Source/StorageModule_Protocol/Makefile @@ -1,11 +1,7 @@ -CC = g++ -Wall -std=c++17 -fPIC -PLATFORM = linux +CC = g++ -Wall -std=c++20 -fPIC PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 -UNICODE = 0 LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp -I ../XEngine_Depend/XEngine_Module/tinyxml2 LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp -L ../XEngine_Depend/XEngine_Module/tinyxml2 -L ../StorageModule_Session -L ../StorageModule_APIHelp LIB = -lXEngine_BaseLib -lXEngine_SystemApi -ljsoncpp -ltinyxml2 -lStorageModule_Session -lStorageModule_APIHelp @@ -13,31 +9,29 @@ LIBEX = OBJECTS = Protocol_StoragePacket.o Protocol_StorageParse.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif ifeq ($(UNICODE),1) -UNICODE = -D _UNICODE +override UNICODE := -D __UNICODE__ else -UNICODE = +override UNICODE := -D __ANSI__ endif ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -46,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl diff --git a/XEngine_Source/StorageModule_Session/Makefile b/XEngine_Source/StorageModule_Session/Makefile index a2a0fcf..1cb6ef7 100644 --- a/XEngine_Source/StorageModule_Session/Makefile +++ b/XEngine_Source/StorageModule_Session/Makefile @@ -1,11 +1,7 @@ -CC = g++ -Wall -std=c++17 -fPIC -PLATFORM = linux +CC = g++ -Wall -std=c++20 -fPIC PLATVER = -PLATDIR = FILEEXT = LIBFLAG = -RELEASE = 0 -UNICODE = 0 LOADHDR = -I ./ LOADSO = LIB = -lXEngine_BaseLib -lNetHelp_APIAddr @@ -13,31 +9,29 @@ LIBEX = OBJECTS = Session_DLStroage.o Session_UPStroage.o Session_Action.o Session_Webdav.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif ifeq ($(UNICODE),1) -UNICODE = -D _UNICODE +override UNICODE := -D __UNICODE__ else -UNICODE = +override UNICODE := -D __ANSI__ endif ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif FILEEXT = so LIBFLAG = -shared @@ -46,7 +40,6 @@ ifeq ($(PLATFORM),linux) else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac FILEEXT = dylib LIBFLAG = -dynamiclib LIBEX = -lpthread -ldl diff --git a/XEngine_Source/XEngine_StorageApp/Makefile b/XEngine_Source/XEngine_StorageApp/Makefile index b1cdc46..61e66c0 100644 --- a/XEngine_Source/XEngine_StorageApp/Makefile +++ b/XEngine_Source/XEngine_StorageApp/Makefile @@ -1,9 +1,5 @@ -CC = g++ -Wall -std=c++17 -fPIC -PLATFORM = linux +CC = g++ -Wall -std=c++20 -fPIC PLATVER = -PLATDIR = -RELEASE = 0 -UNICODE = 0 LOADHDR = -I ./ LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp -L ../XEngine_Depend/XEngine_Module/tinyxml2 -L ../XEngine_Depend/XEngine_Module/XEngine_InfoReport \ -L ../StorageModule_Database -L ../StorageModule_Config -L ../StorageModule_Session -L ../StorageModule_APIHelp -L ../StorageModule_Protocol -L ../StorageModule_BTorrent @@ -15,38 +11,35 @@ OBJECTS = Storage_TaskPass.o Storage_TaskManage.o Storage_TaskP2p.o Storage_Task StorageApp_Config.o StorageApp_Download.o StorageApp_Network.o StorageApp_Center.o StorageApp_UPLoader.o StorageApp_Webdav.o XEngine_StorageApp.o ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = +FLAGS = -c -D _RELEASE +DEBUG = -O2 else ifeq ($(PLATFORM),mac) FLAGS = -c - DEBUG = -g + DEBUG = -g -D _DEBUG else FLAGS = -c -lc_p - DEBUG = -g -pg + DEBUG = -g -pg -D _DEBUG endif endif ifeq ($(UNICODE),1) -UNICODE = -D _UNICODE +override UNICODE := -D __UNICODE__ else -UNICODE = +override UNICODE := -D __ANSI__ endif ifeq ($(PLATFORM),linux) ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos else PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu endif LIBEX = -lpthread -lrt -ldl LOADBIN = -Wl,-rpath=./,--disable-new-dtags else ifeq ($(PLATFORM),mac) CC += -Wno-deprecated-declarations PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac LIBEX = -lpthread -ldl LOADBIN = -Wl,-rpath,@loader_path/./ endif From 9a516b6dfb80683949433d6970e421683aa0bf3d Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 24 May 2025 14:40:29 +0800 Subject: [PATCH 05/29] update:depend library --- XEngine_Source/XEngine_Depend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index fda9f7d..b9427ac 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit fda9f7d9140cc6a32eecb499e2acb67e8e1c7e6f +Subproject commit b9427ac1eb1183eb76ae73c61b2cf0fb27448aa4 From e28ca8148dff47628dd0af0eedc4a2e0d6e145d5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sat, 24 May 2025 15:01:25 +0800 Subject: [PATCH 06/29] fixed:build failure --- XEngine_Source/Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 3d50d2d..87ae372 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -16,18 +16,18 @@ BASE_BTORRENT_PATH = ./StorageModule_BTorrent APPSERVICE_STORAGE_PATH = ./XEngine_StorageApp +ifeq ($(PLATFORM),linux) + FILEEXT = so +else ifeq ($(PLATFORM),mac) + FILEEXT = dylib +endif + XENGINE_MODULES = libjsoncpp.so libtinyxml2.so libXEngine_InfoReport.so \ libStorageModule_Database.so libStorageModule_Config.so libStorageModule_Session.so libStorageModule_APIHelp.so libStorageModule_Protocol.so libStorageModule_BTorrent.so \ XEngine_StorageApp.exe .PHONY:MakeAll MakeAll:$(XENGINE_MODULES) - -ifeq ($(PLATFORM),linux) - FILEEXT = so -else ifeq ($(PLATFORM),mac) - FILEEXT = dylib -endif libjsoncpp.so: ifeq ($(FLAGS), InstallAll) From 2086486ee2f55d4ed4f8ffc48bd1f8f15beb200e Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 27 May 2025 10:08:15 +0800 Subject: [PATCH 07/29] update:depend library improved:read buffer configure --- .../Config_Json/Config_Json.cpp | 45 ++++--------------- XEngine_Source/XEngine_Depend | 2 +- 2 files changed, 10 insertions(+), 37 deletions(-) diff --git a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp index 5783400..fb24878 100644 --- a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp +++ b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp @@ -61,21 +61,12 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; return false; } - int nCount = 0; - XCHAR tszMsgBuffer[4096]; - while (1) - { - int nRet = fread(tszMsgBuffer + nCount, 1, 2048, pSt_File); - if (nRet <= 0) - { - break; - } - nCount += nRet; - } + XCHAR tszMsgBuffer[8192] = {}; + size_t nRet = fread(tszMsgBuffer, 1, sizeof(tszMsgBuffer), pSt_File); fclose(pSt_File); std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); - if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nCount, &st_JsonRoot, &st_JsonError)) + if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nRet, &st_JsonRoot, &st_JsonError)) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARSE; @@ -282,21 +273,12 @@ bool CConfig_Json::Config_Json_Version(LPCXSTR lpszConfigFile, XENGINE_SERVERCON Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; return false; } - int nCount = 0; - XCHAR tszMsgBuffer[4096]; - while (1) - { - int nRet = fread(tszMsgBuffer + nCount, 1, 2048, pSt_File); - if (nRet <= 0) - { - break; - } - nCount += nRet; - } + XCHAR tszMsgBuffer[8192] = {}; + size_t nRet = fread(tszMsgBuffer, 1, sizeof(tszMsgBuffer), pSt_File); fclose(pSt_File); std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); - if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nCount, &st_JsonRoot, &st_JsonError)) + if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nRet, &st_JsonRoot, &st_JsonError)) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARSE; @@ -356,21 +338,12 @@ bool CConfig_Json::Config_Json_LoadBalance(LPCXSTR lpszConfigFile, XENGINE_LBCON Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; return false; } - int nCount = 0; - XCHAR tszMsgBuffer[4096]; - while (1) - { - int nRet = fread(tszMsgBuffer + nCount, 1, 2048, pSt_File); - if (nRet <= 0) - { - break; - } - nCount += nRet; - } + XCHAR tszMsgBuffer[8192] = {}; + size_t nRet = fread(tszMsgBuffer, 1, sizeof(tszMsgBuffer), pSt_File); fclose(pSt_File); std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); - if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nCount, &st_JsonRoot, &st_JsonError)) + if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nRet, &st_JsonRoot, &st_JsonError)) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARSE; diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index b9427ac..0ba253d 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit b9427ac1eb1183eb76ae73c61b2cf0fb27448aa4 +Subproject commit 0ba253db2b7b1447d7a899a2e16c88891eba2166 From 8bfa5bc30d10453e0423027ff4d5b967daf19232 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 27 May 2025 10:51:02 +0800 Subject: [PATCH 08/29] modify:just release report info --- XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp index 51a56aa..f0dd402 100644 --- a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp +++ b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp @@ -572,6 +572,7 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,转录动作没有启用")); } +#ifndef _DEBUG //发送信息报告 if (st_ServiceCfg.st_XReport.bEnable && !bIsTest) { @@ -589,7 +590,7 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,信息报告给API服务器没有启用")); } - +#endif XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("所有服务成功启动,存储中心服务运行中,发行版本次数:%d,XEngine版本:%s%s 当前运行版本:%s。。。"), st_ServiceCfg.st_XVer.pStl_ListStorage->size(), BaseLib_Version_XNumberStr(), BaseLib_Version_XTypeStr(), st_ServiceCfg.st_XVer.pStl_ListStorage->front().c_str()); while (true) From 34cc505b73438b537cf07e5e19d307510aaae203 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 27 May 2025 11:18:30 +0800 Subject: [PATCH 09/29] modify:request url method for center modify:option method name to get --- .../XEngine_StorageApp/StorageApp_Center.cpp | 81 +++++++++++-------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp index 283f602..088c759 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp @@ -46,19 +46,27 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int int nRVLen = 2048; XCHAR tszSDBuffer[2048] = {}; XCHAR tszRVBuffer[2048] = {}; - XCHAR tszAPIVersion[64]; - XCHAR tszAPIMethod[64]; - XCHAR tszAPIName[64]; - RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; - - memset(tszAPIVersion, '\0', sizeof(tszAPIVersion)); - memset(tszAPIMethod, '\0', sizeof(tszAPIMethod)); - memset(tszAPIName, '\0', sizeof(tszAPIName)); - memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); + XCHAR tszStrKey[MAX_PATH] = {}; + XCHAR tszStrVlu[MAX_PATH] = {}; + RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {}; LPCXSTR lpszMethodPost = _X("POST"); - LPCXSTR lpszMethodOption = _X("OPTIONS"); + LPCXSTR lpszMethodGet = _X("GET"); + XCHAR** pptszUrlList; + XCHAR tszUrlName[128]; + int nUrlCount = 0; + //得到URL参数个数 + HttpProtocol_ServerHelp_GetParament(pSt_HTTPParam->tszHttpUri, &pptszUrlList, &nUrlCount, tszUrlName); + if (nUrlCount < 1) + { + st_HDRParam.nHttpCode = 404; + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen); + BaseLib_Memory_Free((XPPPMEM)&pptszUrlList, nUrlCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return false; + } st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; if (st_ServiceCfg.st_XProxy.bAuthPass) @@ -101,39 +109,48 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int if (0 == _tcsxnicmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodPost))) { - LPCXSTR lpszMethodPass = _X("Pass"); - LPCXSTR lpszMehtodManage = _X("Manage"); - LPCXSTR lpszMehtodAction = _X("Action"); + LPCXSTR lpszAPIPass = _X("Pass"); + LPCXSTR lpszAPIManage = _X("Manage"); + LPCXSTR lpszAPIAction = _X("Action"); - if (!HttpProtocol_ServerHelp_GetUrlApi(pSt_HTTPParam->tszHttpUri, tszAPIVersion, tszAPIMethod, tszAPIName)) - { - Protocol_StoragePacket_HTTPPacket(tszRVBuffer, &nRVLen, ERROR_STORAGE_PROTOCOL_HTTP_MANAGE_APINAME, "api name is incorrect"); - HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求的API不支持"), lpszClientAddr); - return false; - } + BaseLib_String_GetKeyValueA(pptszUrlList[0], "=", tszStrKey, tszStrVlu); //通知类型.用于多服务器 - if (0 == _tcsxnicmp(lpszMethodPass, tszAPIMethod, _tcsxlen(lpszMethodPass))) + if (0 == _tcsxnicmp(lpszAPIPass, tszStrVlu, _tcsxlen(lpszAPIPass))) { - XEngine_Task_Pass(tszAPIName, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); + //http://127.0.0.1:5100/api?function=pass¶m=xxx + memset(tszStrVlu, '\0', sizeof(tszStrVlu)); + BaseLib_String_GetKeyValueA(pptszUrlList[1], "=", tszStrKey, tszStrVlu); + XEngine_Task_Pass(tszStrVlu, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); } - else if (0 == _tcsxnicmp(lpszMehtodManage, tszAPIMethod, _tcsxlen(lpszMehtodManage))) + else if (0 == _tcsxnicmp(lpszAPIManage, tszStrVlu, _tcsxlen(lpszAPIManage))) { - XEngine_Task_Manage(tszAPIName, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); + //http://127.0.0.1:5100/api?function=pass¶m=xxx + memset(tszStrVlu, '\0', sizeof(tszStrVlu)); + BaseLib_String_GetKeyValueA(pptszUrlList[1], "=", tszStrKey, tszStrVlu); + XEngine_Task_Manage(tszStrVlu, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); } - else if (0 == _tcsxnicmp(lpszMehtodAction, tszAPIMethod, _tcsxlen(lpszMehtodAction))) + else if (0 == _tcsxnicmp(lpszAPIAction, tszStrVlu, _tcsxlen(lpszAPIAction))) { - Storage_TaskAction(tszAPIName, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam); + //http://127.0.0.1:5100/api?function=pass¶m=xxx + memset(tszStrVlu, '\0', sizeof(tszStrVlu)); + BaseLib_String_GetKeyValueA(pptszUrlList[1], "=", tszStrKey, tszStrVlu); + Storage_TaskAction(tszStrVlu, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam); } } - else if (0 == _tcsxnicmp(lpszMethodOption, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodOption))) + else if (0 == _tcsxnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodGet))) { //用于心跳 - LPCXSTR lpszHdrBuffer = _X("Allow: POST GET PUT\r\n"); - HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, lpszHdrBuffer); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求OPTIONS心跳方法成功"), lpszClientAddr); + //http://127.0.0.1:5100/api?function=heart + LPCXSTR lpszAPIHeart = _X("heart"); + + BaseLib_String_GetKeyValueA(pptszUrlList[0], "=", tszStrKey, tszStrVlu); + if (0 == _tcsxnicmp(lpszAPIHeart, tszStrVlu, _tcsxlen(lpszAPIHeart))) + { + LPCXSTR lpszHdrBuffer = _X("Allow: POST GET PUT\r\n"); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, lpszHdrBuffer); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求GET心跳方法成功"), lpszClientAddr); + } } else { From 263ea475767aaa37fc47921f68d6c521d7a9125f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 27 May 2025 11:19:51 +0800 Subject: [PATCH 10/29] delete:more parameter for manage and pass --- XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp | 4 ++-- .../XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp | 2 +- .../XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h | 2 +- .../XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp | 2 +- .../XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp index 088c759..1993aaa 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp @@ -120,14 +120,14 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int //http://127.0.0.1:5100/api?function=pass¶m=xxx memset(tszStrVlu, '\0', sizeof(tszStrVlu)); BaseLib_String_GetKeyValueA(pptszUrlList[1], "=", tszStrKey, tszStrVlu); - XEngine_Task_Pass(tszStrVlu, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); + XEngine_Task_Pass(tszStrVlu, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam); } else if (0 == _tcsxnicmp(lpszAPIManage, tszStrVlu, _tcsxlen(lpszAPIManage))) { //http://127.0.0.1:5100/api?function=pass¶m=xxx memset(tszStrVlu, '\0', sizeof(tszStrVlu)); BaseLib_String_GetKeyValueA(pptszUrlList[1], "=", tszStrKey, tszStrVlu); - XEngine_Task_Manage(tszStrVlu, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); + XEngine_Task_Manage(tszStrVlu, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam); } else if (0 == _tcsxnicmp(lpszAPIAction, tszStrVlu, _tcsxlen(lpszAPIAction))) { diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp index 41859b5..dde270c 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp @@ -1,6 +1,6 @@ #include "../StorageApp_Hdr.h" -bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) +bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam) { int nSDLen = 10240; int nRVLen = 10240; diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h index dd5b8f0..f314bc3 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h @@ -1,3 +1,3 @@ #pragma once -bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file +bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp index 8fd0d24..1aad544 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp @@ -1,6 +1,6 @@ #include "../StorageApp_Hdr.h" -bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) +bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam) { int nSDLen = 2048; XCHAR tszSDBuffer[2048]; diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.h b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.h index 9fb3a73..499f626 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.h +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.h @@ -1,3 +1,3 @@ #pragma once -bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file +bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam); \ No newline at end of file From 5dcbc5010f081e7aeede15704d454fa9dd06babb Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 27 May 2025 16:00:47 +0800 Subject: [PATCH 11/29] update:match x-engine v 9.20 --- .../APIHelp_Api/APIHelp_Api.cpp | 32 +++++++++---------- .../APIHelp_Cryption/APIHelp_Cryption.cpp | 26 +++++++-------- .../BTorrent_Creator/BTorrent_Creator.h | 4 +-- .../BTorrent_DLoader/BTorrent_DLoader.h | 6 ++-- .../StorageModule_BTorrent/BTorrent_Define.h | 12 +++---- .../StorageModule_Config/Config_Define.h | 20 ++++++------ .../StorageModule_Database/Database_Define.h | 4 +-- .../Database_Help/Database_Help.cpp | 16 +++++----- .../Database_Memory/Database_Memory.cpp | 4 +-- .../Protocol_StoragePacket.cpp | 6 ++-- .../StorageModule_Session/Session_Define.h | 4 +-- XEngine_Source/XEngine_Depend | 2 +- XEngine_Source/XEngine_StorageApp/Makefile | 2 +- .../XEngine_StorageApp/StorageApp_Center.cpp | 14 +++----- .../XEngine_StorageApp/StorageApp_Center.h | 2 +- .../StorageApp_Download.cpp | 20 ++++++------ .../XEngine_StorageApp/StorageApp_Download.h | 4 +-- .../XEngine_StorageApp/StorageApp_Network.cpp | 32 +++++++++---------- .../XEngine_StorageApp/StorageApp_Network.h | 32 +++++++++---------- .../StorageApp_UPLoader.cpp | 28 ++++++++-------- .../XEngine_StorageApp/StorageApp_UPLoader.h | 4 +-- .../XEngine_StorageApp/StorageApp_Webdav.cpp | 14 ++++---- .../XEngine_StorageApp/StorageApp_Webdav.h | 2 +- .../Storage_APPTask/Storage_TaskManage.cpp | 22 ++++++------- .../Storage_APPTask/Storage_TaskP2p.cpp | 12 +++---- .../Storage_APPTask/Storage_TaskPass.cpp | 12 +++---- .../XEngine_StorageApp/XEngine_StorageApp.cpp | 2 +- XEngine_Source/XStorage_Protocol.h | 14 ++++---- 28 files changed, 174 insertions(+), 178 deletions(-) diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp index cb03b41..ad4b541 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp @@ -55,12 +55,12 @@ bool CAPIHelp_Api::APIHelp_Api_ProxyAuth(XCHAR* ptszUser, XCHAR* ptszPass, XCHAR APIHelp_IsErrorOccur = false; int nAuthType = 0; - int nAuthLen = MAX_PATH; + int nAuthLen = XPATH_MAX; - XCHAR tszAuthStr[MAX_PATH]; + XCHAR tszAuthStr[XPATH_MAX]; XCHAR tszSDBuffer[1024]; - memset(tszAuthStr, '\0', MAX_PATH); + memset(tszAuthStr, '\0', XPATH_MAX); memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); //是否有验证信息 if (!HttpProtocol_ServerHelp_GetAuthInfo(&pptszListHdr, nHdrCount, tszAuthStr, &nAuthLen, &nAuthType)) @@ -207,8 +207,8 @@ bool CAPIHelp_Api::APIHelp_Api_VerHash(LPCXSTR lpszFileHash, XCHAR** pptszListHd APIHelp_IsErrorOccur = false; LPCXSTR lpszKeyStr = _X("FileHash"); - XCHAR tszValueStr[MAX_PATH]; - memset(tszValueStr, '\0', MAX_PATH); + XCHAR tszValueStr[XPATH_MAX]; + memset(tszValueStr, '\0', XPATH_MAX); if (!HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, lpszKeyStr, tszValueStr)) { @@ -321,11 +321,11 @@ bool CAPIHelp_Api::APIHelp_Api_UrlParse(XCHAR*** ppptszList, int nListCount, XCH for (int i = 0; i < nListCount; i++) { - XCHAR tszKey[MAX_PATH]; - XCHAR tszValue[MAX_PATH]; + XCHAR tszKey[XPATH_MAX]; + XCHAR tszValue[XPATH_MAX]; - memset(tszKey, '\0', MAX_PATH); - memset(tszValue, '\0', MAX_PATH); + memset(tszKey, '\0', XPATH_MAX); + memset(tszValue, '\0', XPATH_MAX); BaseLib_String_GetKeyValue((*ppptszList)[i], _X("="), tszKey, tszValue); @@ -333,8 +333,8 @@ bool CAPIHelp_Api::APIHelp_Api_UrlParse(XCHAR*** ppptszList, int nListCount, XCH { //编码格式是utf8,需要转为ansi #ifdef _MSC_BUILD - XCHAR tszFileName[MAX_PATH]; - memset(tszFileName, '\0', MAX_PATH); + XCHAR tszFileName[XPATH_MAX]; + memset(tszFileName, '\0', XPATH_MAX); Cryption_Codec_UrlDeCodec(tszValue, _tcsxlen(tszValue), tszFileName); @@ -383,15 +383,15 @@ bool CAPIHelp_Api::APIHelp_Api_Boundary(XCHAR*** ppptszList, int nListCount, XCH //Content-Type: multipart/form-data; boundary=AaB03x for (int i = 0; i < nListCount; i++) { - XCHAR tszKeyStr[MAX_PATH] = {}; - XCHAR tszVluStr[MAX_PATH] = {}; + XCHAR tszKeyStr[XPATH_MAX] = {}; + XCHAR tszVluStr[XPATH_MAX] = {}; BaseLib_String_GetKeyValue((*ppptszList)[i], _X(": "), tszKeyStr, tszVluStr); if (0 == _tcsxnicmp(lpszHDRContent, tszKeyStr, _tcsxlen(lpszHDRContent))) { - XCHAR tszKeySub[MAX_PATH] = {}; - XCHAR tszVluSub[MAX_PATH] = {}; + XCHAR tszKeySub[XPATH_MAX] = {}; + XCHAR tszVluSub[XPATH_MAX] = {}; //multipart/form-data; boundary=AaB03x if (BaseLib_String_GetKeyValue(tszVluStr, _X(";"), tszKeySub, tszVluSub)) { @@ -465,7 +465,7 @@ bool CAPIHelp_Api::APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl) { APIHelp_IsErrorOccur = false; - XCHAR tszUrlStr[MAX_PATH] = {}; + XCHAR tszUrlStr[XPATH_MAX] = {}; _tcsxcpy(tszUrlStr, lpszUrl); // 查找第一个 '/' 的位置 XCHAR *ptszFirstStr = _tcsxchr(tszUrlStr, '/'); diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Cryption/APIHelp_Cryption.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Cryption/APIHelp_Cryption.cpp index 52add75..a5a9a5a 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Cryption/APIHelp_Cryption.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Cryption/APIHelp_Cryption.cpp @@ -203,23 +203,23 @@ bool CAPIHelp_Cryption::APIHelp_Cryption_Digest(XCHAR* ptszResponseStr, LPCXSTR { APIHelp_IsErrorOccur = false; - XCHAR tszResponseStr[2048]; + XCHAR tszResponseStr[4096]; XBYTE tszResponseMD5[2048]; - XBYTE tszUserMD5[MAX_PATH]; - XBYTE tszUrlMD5[MAX_PATH]; - XCHAR tszUserStr[MAX_PATH]; - XCHAR tszUrlStr[MAX_PATH]; - XCHAR tszUserHex[MAX_PATH]; - XCHAR tszUrlHex[MAX_PATH]; + XBYTE tszUserMD5[XPATH_MAX]; + XBYTE tszUrlMD5[XPATH_MAX]; + XCHAR tszUserStr[XPATH_MAX]; + XCHAR tszUrlStr[XPATH_MAX]; + XCHAR tszUserHex[XPATH_MAX]; + XCHAR tszUrlHex[XPATH_MAX]; memset(tszResponseStr, '\0', sizeof(tszResponseStr)); memset(tszResponseMD5, '\0', sizeof(tszResponseMD5)); - memset(tszUserMD5, '\0', MAX_PATH); - memset(tszUrlMD5, '\0', MAX_PATH); - memset(tszUserStr, '\0', MAX_PATH); - memset(tszUrlStr, '\0', MAX_PATH); - memset(tszUserHex, '\0', MAX_PATH); - memset(tszUrlHex, '\0', MAX_PATH); + memset(tszUserMD5, '\0', XPATH_MAX); + memset(tszUrlMD5, '\0', XPATH_MAX); + memset(tszUserStr, '\0', XPATH_MAX); + memset(tszUrlStr, '\0', XPATH_MAX); + memset(tszUserHex, '\0', XPATH_MAX); + memset(tszUrlHex, '\0', XPATH_MAX); //计算HA1 的MD5字符串 MD5(USER:PASS:REAL) int nRet = _xstprintf(tszUserStr, _X("%s:%s:%s"), lpszUser, lpszRealm, lpszPass); diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.h b/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.h index d0ccbf8..15466f1 100644 --- a/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.h +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.h @@ -14,8 +14,8 @@ typedef struct { XCHAR tszComment[4096]; XCHAR tszPEMCert[4096]; - XCHAR tszBTPath[MAX_PATH]; - XCHAR tszCreate[MAX_PATH]; + XCHAR tszBTPath[XPATH_MAX]; + XCHAR tszCreate[XPATH_MAX]; int m_nPieceSize; list* pStl_ListNode; diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.h b/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.h index d6f768f..2b6c9d9 100644 --- a/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.h +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.h @@ -19,9 +19,9 @@ typedef struct #endif BTORRENT_DLOADER st_DLStatus; //下载状态 - XCHAR tszAddr[MAX_PATH]; //下载地址 - XCHAR tszFile[MAX_PATH]; //保存地址 - XCHAR tszTemp[MAX_PATH]; //临时文件 + XCHAR tszAddr[XPATH_MAX]; //下载地址 + XCHAR tszFile[XPATH_MAX]; //保存地址 + XCHAR tszTemp[XPATH_MAX]; //临时文件 bool bIsResume; //是否续传 XPVOID lPClass; //指向类的指针 }BTORRENT_DLOADINFO, * LPBTORRENT_DLOADINFO; diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_Define.h b/XEngine_Source/StorageModule_BTorrent/BTorrent_Define.h index 5b4673a..39586b5 100644 --- a/XEngine_Source/StorageModule_BTorrent/BTorrent_Define.h +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_Define.h @@ -39,7 +39,7 @@ typedef enum ////////////////////////////////////////////////////////////////////////// typedef struct { - XCHAR tszFileName[MAX_PATH]; //文件名 + XCHAR tszFileName[XPATH_MAX]; //文件名 __int64x nDLoadTotal; //总大小 __int64x nDLCount; //已下载大小 __int64x nUPCount; //已上传大小 @@ -51,15 +51,15 @@ typedef struct }BTORRENT_DLOADER; typedef struct { - XCHAR tszValue[MAX_PATH]; + XCHAR tszValue[XPATH_MAX]; int nValue; }BTORRENT_PARSEMAP; typedef struct { - XCHAR tszFileHash[MAX_PATH]; //文件HASH - XCHAR tszFilePath[MAX_PATH]; //文件路径 - XCHAR tszFileName[MAX_PATH]; //文件名称 - XCHAR tszFileLink[MAX_PATH]; //文件连接,如果有的话 + XCHAR tszFileHash[XPATH_MAX]; //文件HASH + XCHAR tszFilePath[XPATH_MAX]; //文件路径 + XCHAR tszFileName[XPATH_MAX]; //文件名称 + XCHAR tszFileLink[XPATH_MAX]; //文件连接,如果有的话 __int64x nFileOffset; //文件偏移 __int64x nFileSize; //文件大小 time_t nFileTime; //文件时间戳 diff --git a/XEngine_Source/StorageModule_Config/Config_Define.h b/XEngine_Source/StorageModule_Config/Config_Define.h index e2bd859..a4fbf27 100644 --- a/XEngine_Source/StorageModule_Config/Config_Define.h +++ b/XEngine_Source/StorageModule_Config/Config_Define.h @@ -47,7 +47,7 @@ typedef struct tag_XEngine_ServerConfig }st_XTime; struct { - XCHAR tszLogFile[MAX_PATH]; + XCHAR tszLogFile[XPATH_MAX]; int nMaxSize; int nMaxCount; int nLogLeave; @@ -73,9 +73,9 @@ typedef struct tag_XEngine_ServerConfig bool bUPPass; bool bDLPass; bool bAuthPass; - XCHAR tszUPPass[MAX_PATH]; - XCHAR tszDLPass[MAX_PATH]; - XCHAR tszAuthPass[MAX_PATH]; + XCHAR tszUPPass[XPATH_MAX]; + XCHAR tszDLPass[XPATH_MAX]; + XCHAR tszAuthPass[XPATH_MAX]; }st_XProxy; struct { @@ -94,9 +94,9 @@ typedef struct tag_XEngine_ServerConfig }st_P2xp; struct { - XCHAR tszCertChain[MAX_PATH]; - XCHAR tszCertServer[MAX_PATH]; - XCHAR tszCertKey[MAX_PATH]; + XCHAR tszCertChain[XPATH_MAX]; + XCHAR tszCertServer[XPATH_MAX]; + XCHAR tszCertKey[XPATH_MAX]; bool bDLEnable; bool bUPEnable; bool bCHEnable; @@ -104,7 +104,7 @@ typedef struct tag_XEngine_ServerConfig }st_XCert; struct { - XCHAR tszAPIUrl[MAX_PATH]; + XCHAR tszAPIUrl[XPATH_MAX]; XCHAR tszServiceName[128]; bool bEnable; }st_XReport; @@ -122,8 +122,8 @@ typedef struct tag_XEngine_ServerConfig typedef struct { - XCHAR tszFilePath[MAX_PATH]; - XCHAR tszFileName[MAX_PATH]; + XCHAR tszFilePath[XPATH_MAX]; + XCHAR tszFileName[XPATH_MAX]; XCHAR tszBuckKey[128]; XCHAR tszBuckSize[64]; int nLevel; diff --git a/XEngine_Source/StorageModule_Database/Database_Define.h b/XEngine_Source/StorageModule_Database/Database_Define.h index 38dc2e3..d17ed55 100644 --- a/XEngine_Source/StorageModule_Database/Database_Define.h +++ b/XEngine_Source/StorageModule_Database/Database_Define.h @@ -16,8 +16,8 @@ typedef struct { XENGINE_PROTOCOL_FILE st_ProtocolFile; - XCHAR tszBuckKey[MAX_PATH]; //路径的关键字 - XCHAR tszTableName[MAX_PATH]; //日期表名称,插入:表示自定义插入日期表,获取:表示导出这个文件所属日期表 + XCHAR tszBuckKey[XPATH_MAX]; //路径的关键字 + XCHAR tszTableName[XPATH_MAX]; //日期表名称,插入:表示自定义插入日期表,获取:表示导出这个文件所属日期表 }XSTORAGECORE_DBFILE, *LPXSTORAGECORE_DBFILE; typedef struct { diff --git a/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp b/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp index 00370b9..3ba9cf3 100644 --- a/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp +++ b/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp @@ -232,8 +232,8 @@ bool CDatabase_Help::Database_Help_Packet(XCHAR* ptszSQLBuffer, LPCXSTR lpszBuck Database_IsErrorOccur = false; bool bInit = false; - XCHAR tszSQLQuery[MAX_PATH]; - memset(tszSQLQuery, '\0', MAX_PATH); + XCHAR tszSQLQuery[XPATH_MAX]; + memset(tszSQLQuery, '\0', XPATH_MAX); //文件所属BUCKET if (NULL != lpszBuckKey) { @@ -247,7 +247,7 @@ bool CDatabase_Help::Database_Help_Packet(XCHAR* ptszSQLBuffer, LPCXSTR lpszBuck { _tcsxcat(ptszSQLBuffer, _X(" WHERE ")); } - memset(tszSQLQuery, '\0', MAX_PATH); + memset(tszSQLQuery, '\0', XPATH_MAX); _xstprintf(tszSQLQuery, _X("BuckKey = '%s'"), lpszBuckKey); _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; @@ -266,7 +266,7 @@ bool CDatabase_Help::Database_Help_Packet(XCHAR* ptszSQLBuffer, LPCXSTR lpszBuck { _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } - memset(tszSQLQuery, '\0', MAX_PATH); + memset(tszSQLQuery, '\0', XPATH_MAX); _xstprintf(tszSQLQuery, _X("FilePath = '%s'"), lpszFilePath); _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; @@ -285,7 +285,7 @@ bool CDatabase_Help::Database_Help_Packet(XCHAR* ptszSQLBuffer, LPCXSTR lpszBuck { _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } - memset(tszSQLQuery, '\0', MAX_PATH); + memset(tszSQLQuery, '\0', XPATH_MAX); _xstprintf(tszSQLQuery, _X("FileName = '%s'"), lpszFileName); _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; @@ -304,7 +304,7 @@ bool CDatabase_Help::Database_Help_Packet(XCHAR* ptszSQLBuffer, LPCXSTR lpszBuck { _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } - memset(tszSQLQuery, '\0', MAX_PATH); + memset(tszSQLQuery, '\0', XPATH_MAX); _xstprintf(tszSQLQuery, _X("FileHash = '%s'"), lpszFileHash); _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; @@ -323,7 +323,7 @@ bool CDatabase_Help::Database_Help_Packet(XCHAR* ptszSQLBuffer, LPCXSTR lpszBuck { _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } - memset(tszSQLQuery, '\0', MAX_PATH); + memset(tszSQLQuery, '\0', XPATH_MAX); _xstprintf(tszSQLQuery, _X("FileUser = '%s'"), lpszFileUser); _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; @@ -342,7 +342,7 @@ bool CDatabase_Help::Database_Help_Packet(XCHAR* ptszSQLBuffer, LPCXSTR lpszBuck { _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } - memset(tszSQLQuery, '\0', MAX_PATH); + memset(tszSQLQuery, '\0', XPATH_MAX); _xstprintf(tszSQLQuery, _X("BETWEEN '%s' AND '%s'"), lpszTimeStart, lpszTimeEnd); _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; diff --git a/XEngine_Source/StorageModule_Database/Database_Memory/Database_Memory.cpp b/XEngine_Source/StorageModule_Database/Database_Memory/Database_Memory.cpp index ad429b8..d5418a3 100644 --- a/XEngine_Source/StorageModule_Database/Database_Memory/Database_Memory.cpp +++ b/XEngine_Source/StorageModule_Database/Database_Memory/Database_Memory.cpp @@ -288,10 +288,10 @@ bool CDatabase_Memory::Database_Memory_Flush() int nHashLen = 0; struct _xtstat st_FileStatus; - XBYTE tszHashStr[MAX_PATH]; + XBYTE tszHashStr[XPATH_MAX]; XSTORAGECORE_DBFILE st_DBFile; - memset(tszHashStr, '\0', MAX_PATH); + memset(tszHashStr, '\0', XPATH_MAX); memset(&st_DBFile, '\0', sizeof(XSTORAGECORE_DBFILE)); _xtstat(pptszListFile[i], &st_FileStatus); diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp index 18bf62a..9c4a94f 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp @@ -612,7 +612,7 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_Bucket(XCHAR* ptszMsgBuffer Json::Value st_JsonArray; auto stl_ListIterator = pStl_ListBucket->begin(); - for (int i = 0; stl_ListIterator != pStl_ListBucket->end(); stl_ListIterator++) + for (; stl_ListIterator != pStl_ListBucket->end(); stl_ListIterator++) { Json::Value st_JsonObject; Json::Value st_JsonSub; @@ -700,7 +700,7 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBu for (int i = 0; i < nFileCount; i++) { - XCHAR tszFileName[MAX_PATH] = {}; + XCHAR tszFileName[XPATH_MAX] = {}; SYSTEMAPI_FILE_ATTR st_FileAttr = {}; BaseLib_String_GetFileAndPath((*ppptszListFile)[i], NULL, tszFileName); SystemApi_File_GetFileAttr((*ppptszListFile)[i], &st_FileAttr); @@ -714,7 +714,7 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBu //文件 XCHAR tszSourceStr[128] = {}; XCHAR tszDestStr[128] = {}; - XCHAR tszFileAlis[MAX_PATH] = {}; + XCHAR tszFileAlis[XPATH_MAX] = {}; _tcsxcpy(tszFileAlis, (*ppptszListFile)[i] + 1); APIHelp_Api_UrlStr(tszSourceStr, (*ppptszListFile)[i]); diff --git a/XEngine_Source/StorageModule_Session/Session_Define.h b/XEngine_Source/StorageModule_Session/Session_Define.h index ee49025..d653fea 100644 --- a/XEngine_Source/StorageModule_Session/Session_Define.h +++ b/XEngine_Source/StorageModule_Session/Session_Define.h @@ -17,11 +17,11 @@ typedef struct { struct { - XCHAR tszBoundStr[MAX_PATH]; //boundary信息 + XCHAR tszBoundStr[XPATH_MAX]; //boundary信息 bool bBoundMode; //是否是bound上传模式 bool bBoundStart; }st_Boundary; - XCHAR tszFileDir[MAX_PATH]; //文件地址 + XCHAR tszFileDir[XPATH_MAX]; //文件地址 XCHAR tszClientAddr[128]; //操作的用户地址 XCHAR tszFileHash[128]; //文件HASH值 XCHAR tszBuckKey[128]; //BUCKKey diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index 0ba253d..75f8d6c 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit 0ba253db2b7b1447d7a899a2e16c88891eba2166 +Subproject commit 75f8d6cd77f1cd82506fe07f674891f68caea372 diff --git a/XEngine_Source/XEngine_StorageApp/Makefile b/XEngine_Source/XEngine_StorageApp/Makefile index 61e66c0..d72db36 100644 --- a/XEngine_Source/XEngine_StorageApp/Makefile +++ b/XEngine_Source/XEngine_StorageApp/Makefile @@ -1,4 +1,4 @@ -CC = g++ -Wall -std=c++20 -fPIC +CC = g++ -Wall -std=c++20 -fPIC -Wno-format-overflow PLATVER = LOADHDR = -I ./ LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp -L ../XEngine_Depend/XEngine_Module/tinyxml2 -L ../XEngine_Depend/XEngine_Module/XEngine_InfoReport \ diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp index 1993aaa..09b97e5 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -XHTHREAD CALLBACK XEngine_Center_HTTPThread(XPVOID lParam) +XHTHREAD XCALLBACK XEngine_Center_HTTPThread(XPVOID lParam) { int nThreadPos = *(int*)lParam; nThreadPos++; @@ -43,11 +43,9 @@ XHTHREAD CALLBACK XEngine_Center_HTTPThread(XPVOID lParam) bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) { int nSDLen = 2048; - int nRVLen = 2048; XCHAR tszSDBuffer[2048] = {}; - XCHAR tszRVBuffer[2048] = {}; - XCHAR tszStrKey[MAX_PATH] = {}; - XCHAR tszStrVlu[MAX_PATH] = {}; + XCHAR tszStrKey[XPATH_MAX] = {}; + XCHAR tszStrVlu[XPATH_MAX] = {}; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {}; LPCXSTR lpszMethodPost = _X("POST"); @@ -60,7 +58,7 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int HttpProtocol_ServerHelp_GetParament(pSt_HTTPParam->tszHttpUri, &pptszUrlList, &nUrlCount, tszUrlName); if (nUrlCount < 1) { - st_HDRParam.nHttpCode = 404; + st_HDRParam.nHttpCode = 400; HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen); BaseLib_Memory_Free((XPPPMEM)&pptszUrlList, nUrlCount); @@ -78,7 +76,6 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int memset(tszUserPass, '\0', sizeof(tszUserPass)); if (!APIHelp_Api_ProxyAuth(tszUserName, tszUserPass, pptszListHdr, nHdrCount)) { - st_HDRParam.bIsClose = true; st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = 401; @@ -94,7 +91,6 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszAuthPass, tszSDBuffer, &nResponseCode, &ptszBody, &nSDLen); if (200 != nResponseCode) { - st_HDRParam.bIsClose = true; st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = nResponseCode; @@ -102,7 +98,7 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } - BaseLib_Memory_FreeCStyle((VOID**)&ptszBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszBody); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.tszAuthPass, tszUserName, tszUserPass); st_HDRParam.bAuth = true; } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h index 9ce548a..aace083 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h @@ -10,5 +10,5 @@ // Purpose: HTTP管理服务处理类 // History: *********************************************************************/ -XHTHREAD CALLBACK XEngine_Center_HTTPThread(XPVOID lParam); +XHTHREAD XCALLBACK XEngine_Center_HTTPThread(XPVOID lParam); bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp index c8f4d3d..2472889 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -XHTHREAD CALLBACK XEngine_Download_HTTPThread(XPVOID lParam) +XHTHREAD XCALLBACK XEngine_Download_HTTPThread(XPVOID lParam) { int nThreadPos = *(int*)lParam; nThreadPos++; @@ -40,7 +40,7 @@ XHTHREAD CALLBACK XEngine_Download_HTTPThread(XPVOID lParam) return 0; } -void CALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { int nMsgLen = 4096; int nListCount = 0; @@ -69,12 +69,12 @@ void CALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, X { if (st_ServiceCfg.st_XProxy.bDLPass) { - int nPLen = MAX_PATH; + int nPLen = XPATH_MAX; int nHttpCode = 0; - XCHAR tszProxyStr[MAX_PATH]; + XCHAR tszProxyStr[XPATH_MAX]; SESSION_STORAGEINFO st_StorageInfo; - memset(tszProxyStr, '\0', MAX_PATH); + memset(tszProxyStr, '\0', XPATH_MAX); memset(&st_StorageInfo, '\0', sizeof(SESSION_STORAGEINFO)); Session_DLStroage_GetInfo(lpszClientAddr, &st_StorageInfo); @@ -191,7 +191,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } Protocol_StorageParse_SpeedLimit(ptszBody, nSDLen, &nCode, &nLimit); - BaseLib_Memory_FreeCStyle((VOID**)&ptszBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszBody); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s,值:%d"), lpszClientAddr, st_ServiceCfg.st_XProxy.tszAuthPass, tszUserName, tszUserPass, nCode); st_HDRParam.bAuth = true; } @@ -264,11 +264,11 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in BaseLib_String_FixPath(tszFileDir, nPathType); int nHashLen = 0; - XBYTE tszHashKey[MAX_PATH]; - XCHAR tszFieldStr[MAX_PATH]; + XBYTE tszHashKey[XPATH_MAX]; + XCHAR tszFieldStr[XPATH_MAX]; XCHAR tszHashStr[128]; - memset(tszHashKey, '\0', MAX_PATH); - memset(tszFieldStr, '\0', MAX_PATH); + memset(tszHashKey, '\0', XPATH_MAX); + memset(tszFieldStr, '\0', XPATH_MAX); memset(tszHashStr, '\0', sizeof(tszHashStr)); //得到文件HASH Cryption_Api_Digest(tszFileDir, tszHashKey, &nHashLen, true, st_ServiceCfg.st_XStorage.nHashMode); diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h index 5f989e7..0eb93ab 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h @@ -1,7 +1,7 @@ #pragma once -XHTHREAD CALLBACK XEngine_Download_HTTPThread(XPVOID lParam); -void CALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +XHTHREAD XCALLBACK XEngine_Download_HTTPThread(XPVOID lParam); +void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); bool XEngine_Task_SendDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp index 2f9237e..fbbd38e 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -bool CALLBACK XEngine_Callback_DownloadLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +bool XCALLBACK XEngine_Callback_DownloadLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bDLEnable) { @@ -11,7 +11,7 @@ bool CALLBACK XEngine_Callback_DownloadLogin(LPCXSTR lpszClientAddr, XSOCKET hSo XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,进入了服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Callback_DownloadRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) +void XCALLBACK XEngine_Callback_DownloadRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bDLEnable) { @@ -36,12 +36,12 @@ void CALLBACK XEngine_Callback_DownloadRecv(LPCXSTR lpszClientAddr, XSOCKET hSoc SocketOpt_HeartBeat_ActiveAddrEx(xhHBDownload, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("下载客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); } -void CALLBACK XEngine_Callback_DownloadLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +void XCALLBACK XEngine_Callback_DownloadLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPDOWNLOAD); } ////////////////////////////////////////////////////////////////////////// -bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +bool XCALLBACK XEngine_Callback_UPLoaderLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bUPEnable) { @@ -53,7 +53,7 @@ bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCXSTR lpszClientAddr, XSOCKET hSo XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,进入了服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Callback_UPLoaderRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) +void XCALLBACK XEngine_Callback_UPLoaderRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bUPEnable) { @@ -78,12 +78,12 @@ void CALLBACK XEngine_Callback_UPLoaderRecv(LPCXSTR lpszClientAddr, XSOCKET hSoc SocketOpt_HeartBeat_ActiveAddrEx(xhHBUPLoader, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("上传客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); } -void CALLBACK XEngine_Callback_UPLoaderLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +void XCALLBACK XEngine_Callback_UPLoaderLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPUPLOADER); } ////////////////////////////////////////////////////////////////////////// -bool CALLBACK XEngine_Callback_CenterLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +bool XCALLBACK XEngine_Callback_CenterLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bCHEnable) { @@ -94,7 +94,7 @@ bool CALLBACK XEngine_Callback_CenterLogin(LPCXSTR lpszClientAddr, XSOCKET hSock XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,进入了服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Callback_CenterRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) +void XCALLBACK XEngine_Callback_CenterRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bCHEnable) { @@ -119,12 +119,12 @@ void CALLBACK XEngine_Callback_CenterRecv(LPCXSTR lpszClientAddr, XSOCKET hSocke SocketOpt_HeartBeat_ActiveAddrEx(xhHBCenter, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("业务客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); } -void CALLBACK XEngine_Callback_CenterLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +void XCALLBACK XEngine_Callback_CenterLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPCENTER); } ////////////////////////////////////////////////////////////////////////// -bool CALLBACK XEngine_Callback_WebdavLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +bool XCALLBACK XEngine_Callback_WebdavLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bWDEnable) { @@ -135,7 +135,7 @@ bool CALLBACK XEngine_Callback_WebdavLogin(LPCXSTR lpszClientAddr, XSOCKET hSock XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,进入了服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Callback_WebdavRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) +void XCALLBACK XEngine_Callback_WebdavRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bWDEnable) { @@ -160,24 +160,24 @@ void CALLBACK XEngine_Callback_WebdavRecv(LPCXSTR lpszClientAddr, XSOCKET hSocke SocketOpt_HeartBeat_ActiveAddrEx(xhHBWebdav, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("WEBDAV客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); } -void CALLBACK XEngine_Callback_WebdavLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) +void XCALLBACK XEngine_Callback_WebdavLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPWEBDAV); } ////////////////////////////////////////////////////////////////////////// -void CALLBACK XEngine_Callback_HBDownload(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) +void XCALLBACK XEngine_Callback_HBDownload(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_HEARTBEAT, STORAGE_NETTYPE_HTTPDOWNLOAD); } -void CALLBACK XEngine_Callback_HBUPLoader(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) +void XCALLBACK XEngine_Callback_HBUPLoader(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_HEARTBEAT, STORAGE_NETTYPE_HTTPUPLOADER); } -void CALLBACK XEngine_Callback_HBCenter(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) +void XCALLBACK XEngine_Callback_HBCenter(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_HEARTBEAT, STORAGE_NETTYPE_HTTPCENTER); } -void CALLBACK XEngine_Callback_HBWebdav(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) +void XCALLBACK XEngine_Callback_HBWebdav(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_HEARTBEAT, STORAGE_NETTYPE_HTTPWEBDAV); } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h index a0c1a0c..ac3dfaa 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h @@ -1,22 +1,22 @@ #pragma once -bool CALLBACK XEngine_Callback_DownloadLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Callback_DownloadRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); -void CALLBACK XEngine_Callback_DownloadLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Callback_UPLoaderRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); -void CALLBACK XEngine_Callback_UPLoaderLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -bool CALLBACK XEngine_Callback_CenterLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Callback_CenterRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); -void CALLBACK XEngine_Callback_CenterLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -bool CALLBACK XEngine_Callback_WebdavLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Callback_WebdavRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); -void CALLBACK XEngine_Callback_WebdavLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +bool XCALLBACK XEngine_Callback_DownloadLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Callback_DownloadRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void XCALLBACK XEngine_Callback_DownloadLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +bool XCALLBACK XEngine_Callback_UPLoaderLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Callback_UPLoaderRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void XCALLBACK XEngine_Callback_UPLoaderLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +bool XCALLBACK XEngine_Callback_CenterLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Callback_CenterRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void XCALLBACK XEngine_Callback_CenterLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +bool XCALLBACK XEngine_Callback_WebdavLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void XCALLBACK XEngine_Callback_WebdavRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void XCALLBACK XEngine_Callback_WebdavLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Callback_HBDownload(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); -void CALLBACK XEngine_Callback_HBUPLoader(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); -void CALLBACK XEngine_Callback_HBCenter(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); -void CALLBACK XEngine_Callback_HBWebdav(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +void XCALLBACK XEngine_Callback_HBDownload(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +void XCALLBACK XEngine_Callback_HBUPLoader(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +void XCALLBACK XEngine_Callback_HBCenter(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +void XCALLBACK XEngine_Callback_HBWebdav(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); bool XEngine_Net_CloseClient(LPCXSTR lpszClientAddr, int nLeaveType, int nClientType = STORAGE_NETTYPE_HTTPDOWNLOAD); bool XEngine_Net_SendMsg(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nType = STORAGE_NETTYPE_HTTPDOWNLOAD); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp index a53c9e9..28aabb2 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(XPVOID lParam) +XHTHREAD XCALLBACK XEngine_UPLoader_HTTPThread(XPVOID lParam) { int nThreadPos = *(int*)lParam; nThreadPos++; @@ -39,7 +39,7 @@ XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(XPVOID lParam) } return 0; } -void CALLBACK XEngine_UPLoader_UPFlow(XHANDLE xhToken, bool bSDFlow, bool bRVFlow, bool bTime, __int64u nSDFlow, __int64u nRVFlow, __int64u nTimeFlow, XPVOID lParam) +void XCALLBACK XEngine_UPLoader_UPFlow(XHANDLE xhToken, bool bSDFlow, bool bRVFlow, bool bTime, __int64u nSDFlow, __int64u nRVFlow, __int64u nTimeFlow, XPVOID lParam) { XCHAR tszIPAddr[128] = {}; _tcsxcpy(tszIPAddr, (LPCXSTR)lParam); @@ -128,7 +128,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } Protocol_StorageParse_SpeedLimit(ptszBody, nSDLen, &nCode, &nLimit); - BaseLib_Memory_FreeCStyle((VOID**)&ptszBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszBody); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.tszAuthPass, tszUserName, tszUserPass); st_HDRParam.bAuth = true; } @@ -155,10 +155,10 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in int nRVMode = 0; int nRVCount = 0; int nHDSize = 0; - XCHAR tszFileName[MAX_PATH]; + XCHAR tszFileName[XPATH_MAX]; XENGINE_STORAGEBUCKET st_StorageBucket; - memset(tszFileName, '\0', MAX_PATH); + memset(tszFileName, '\0', XPATH_MAX); memset(&st_StorageBucket, '\0', sizeof(XENGINE_STORAGEBUCKET)); //解析参数 XCHAR** pptszParamList; @@ -287,8 +287,8 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in return false; } } - XCHAR tszTmpPath[MAX_PATH]; - memset(tszTmpPath, '\0', MAX_PATH); + XCHAR tszTmpPath[XPATH_MAX]; + memset(tszTmpPath, '\0', XPATH_MAX); BaseLib_String_GetFileAndPath(tszFileDir, tszTmpPath); if (0 != _xtaccess(tszTmpPath, 0)) @@ -310,7 +310,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in if (nLimit > 0 || (st_ServiceCfg.st_XLimit.bLimitMode && st_ServiceCfg.st_XLimit.nMaxUPLoader > 0)) { //处理限速情况 - XCHAR* ptszIPClient = (XCHAR*)malloc(MAX_PATH); + XCHAR* ptszIPClient = (XCHAR*)malloc(XPATH_MAX); if (NULL == ptszIPClient) { st_HDRParam.bIsClose = true; @@ -321,7 +321,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,插入用户请求失败,文件:%s,内存申请失败,服务器错误"), lpszClientAddr, tszFileDir); return false; } - memset(ptszIPClient, '\0', MAX_PATH); + memset(ptszIPClient, '\0', XPATH_MAX); _tcsxcpy(ptszIPClient, lpszClientAddr); nLimit = nLimit == 0 ? st_ServiceCfg.st_XLimit.nMaxUPLoader : nLimit; @@ -341,7 +341,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in return false; } //检查上传模式 - XCHAR tszBoundStr[MAX_PATH] = {}; + XCHAR tszBoundStr[XPATH_MAX] = {}; if (APIHelp_Api_Boundary(&pptszListHdr, nHdrCount, tszBoundStr)) { Session_UPStroage_SetBoundary(lpszClientAddr, tszBoundStr); @@ -396,8 +396,8 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in HttpProtocol_Server_GetRecvModeEx(xhUPHttp, lpszClientAddr, &nRVMode, &nRVCount, &nHDSize); if (nHDSize >= nRVCount) { - int nPLen = MAX_PATH; - XCHAR tszPassNotify[MAX_PATH] = {}; + int nPLen = XPATH_MAX; + XCHAR tszPassNotify[XPATH_MAX] = {}; Session_UPStroage_GetInfo(lpszClientAddr, &st_StorageInfo); if (!st_StorageInfo.st_Boundary.bBoundMode) @@ -415,10 +415,10 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in } } int nHashLen = 0; - XBYTE tszHashStr[MAX_PATH]; + XBYTE tszHashStr[XPATH_MAX]; XSTORAGECORE_DBFILE st_ProtocolFile; - memset(tszHashStr, '\0', MAX_PATH); + memset(tszHashStr, '\0', XPATH_MAX); memset(&st_ProtocolFile, '\0', sizeof(XSTORAGECORE_DBFILE)); _tcsxcpy(st_ProtocolFile.st_ProtocolFile.tszFilePath, st_StorageBucket.tszFilePath); diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h index 67f18a9..de89641 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h @@ -1,5 +1,5 @@ #pragma once -XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(XPVOID lParam); -void CALLBACK XEngine_UPLoader_UPFlow(XHANDLE xhToken, bool bSDFlow, bool bRVFlow, bool bTime, XPVOID lParam); +XHTHREAD XCALLBACK XEngine_UPLoader_HTTPThread(XPVOID lParam); +void XCALLBACK XEngine_UPLoader_UPFlow(XHANDLE xhToken, bool bSDFlow, bool bRVFlow, bool bTime, XPVOID lParam); bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index f7c2521..be8281a 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -XHTHREAD CALLBACK XEngine_Webdav_HTTPThread(XPVOID lParam) +XHTHREAD XCALLBACK XEngine_Webdav_HTTPThread(XPVOID lParam) { int nThreadPos = *(int*)lParam; nThreadPos++; @@ -94,7 +94,7 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int } int nListCount = 0; XCHAR** pptszListFile; - XCHAR tszFindStr[MAX_PATH] = {}; + XCHAR tszFindStr[XPATH_MAX] = {}; //得到是否是文件 if (APIHelp_Api_UrlStr(st_StorageBucket.tszBuckKey, pSt_HTTPParam->tszHttpUri)) { @@ -103,7 +103,7 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int BaseLib_String_Replace(tszFindStr, &nALen, st_StorageBucket.tszBuckKey, st_StorageBucket.tszFilePath, true); //如果是文件 nListCount = 1; - BaseLib_Memory_Malloc((XPPPMEM)&pptszListFile, nListCount, MAX_PATH); + BaseLib_Memory_Malloc((XPPPMEM)&pptszListFile, nListCount, XPATH_MAX); _tcsxcpy(pptszListFile[0], tszFindStr); } else @@ -178,8 +178,8 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int int nRLen = 0; BaseLib_String_Replace(tszHostStr, &nRLen, tszPortWebdav, tszPortDownload, true); //转换地址 - XCHAR tszStroageKey[MAX_PATH] = {}; - XCHAR tszFileName[MAX_PATH] = {}; + XCHAR tszStroageKey[XPATH_MAX] = {}; + XCHAR tszFileName[XPATH_MAX] = {}; int nRet = _stxscanf(pSt_HTTPParam->tszHttpUri + 1, _X("%99[^/]/%199[^\n]"), tszStroageKey, tszFileName); if (2 != nRet) @@ -259,7 +259,7 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int return false; } int nFLen = 0; - XCHAR tszFileName[MAX_PATH] = {}; + XCHAR tszFileName[XPATH_MAX] = {}; _tcsxcpy(tszFileName, pSt_HTTPParam->tszHttpUri + 1); BaseLib_String_Replace(tszFileName, &nFLen, st_StorageBucket.tszBuckKey, st_StorageBucket.tszFilePath); @@ -306,7 +306,7 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int return false; } int nALen = 0; - XCHAR tszCreateDir[MAX_PATH] = {}; + XCHAR tszCreateDir[XPATH_MAX] = {}; _tcsxcpy(tszCreateDir, pSt_HTTPParam->tszHttpUri + 1); BaseLib_String_Replace(tszCreateDir, &nALen, st_StorageBucket.tszBuckKey, st_StorageBucket.tszFilePath, true); diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.h index 3e9ed28..6038b0e 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.h @@ -10,5 +10,5 @@ // Purpose: WEBDAV // History: *********************************************************************/ -XHTHREAD CALLBACK XEngine_Webdav_HTTPThread(XPVOID lParam); +XHTHREAD XCALLBACK XEngine_Webdav_HTTPThread(XPVOID lParam); bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp index dde270c..2b7157b 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp @@ -34,16 +34,16 @@ bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lp int nMode = 0; int nListCount = 0; int nMsgLen = 10240; - XCHAR tszFileName[MAX_PATH]; - XCHAR tszFileHash[MAX_PATH]; + XCHAR tszFileName[XPATH_MAX]; + XCHAR tszFileHash[XPATH_MAX]; XCHAR tszBucketKey[128]; XCHAR tszTimeStart[128]; XCHAR tszTimeEnd[128]; XCHAR tszMsgBuffer[10240]; XSTORAGECORE_DBFILE** ppSt_ListFile; - memset(tszFileName, '\0', MAX_PATH); - memset(tszFileHash, '\0', MAX_PATH); + memset(tszFileName, '\0', XPATH_MAX); + memset(tszFileHash, '\0', XPATH_MAX); memset(tszBucketKey, '\0', sizeof(tszBucketKey)); memset(tszTimeStart, '\0', sizeof(tszTimeStart)); memset(tszTimeEnd, '\0', sizeof(tszTimeEnd)); @@ -280,14 +280,14 @@ bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lp int nOPCode = 0; int nListCount = 0; XCHAR** ppszListDir = NULL; - XCHAR tszUserDir[MAX_PATH]; - XCHAR tszBuckKey[MAX_PATH]; - XCHAR tszBuckPath[MAX_PATH]; + XCHAR tszUserDir[XPATH_MAX]; + XCHAR tszBuckKey[XPATH_MAX]; + XCHAR tszBuckPath[XPATH_MAX]; XCHAR tszRealDir[1024]; - memset(tszUserDir, '\0', MAX_PATH); - memset(tszBuckKey, '\0', MAX_PATH); - memset(tszBuckPath, '\0', MAX_PATH); + memset(tszUserDir, '\0', XPATH_MAX); + memset(tszBuckKey, '\0', XPATH_MAX); + memset(tszBuckPath, '\0', XPATH_MAX); memset(tszRealDir, '\0', sizeof(tszRealDir)); Protocol_StorageParse_DirOperator(lpszMsgBuffer, tszUserDir, tszBuckKey, &nOPCode); @@ -343,7 +343,7 @@ bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lp } else if (0 == _tcsxnicmp(lpszAPIBucket, lpszAPIName, _tcsxlen(lpszAPIBucket))) { - XCHAR tszBuckKey[MAX_PATH] = {}; + XCHAR tszBuckKey[XPATH_MAX] = {}; Protocol_StorageParse_DirOperator(lpszMsgBuffer, NULL, tszBuckKey, NULL); if (_tcsxlen(tszBuckKey) > 0) { diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskP2p.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskP2p.cpp index 35e1412..d71240d 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskP2p.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskP2p.cpp @@ -6,9 +6,9 @@ XHTHREAD XEngine_Task_P2PThread() XCHAR tszIPAddr[128]; XCHAR tszTimeStart[64]; XCHAR tszTimeEnd[64]; - XCHAR tszBuckKey[MAX_PATH]; - XCHAR tszFileName[MAX_PATH]; - XCHAR tszFileHash[MAX_PATH]; + XCHAR tszBuckKey[XPATH_MAX]; + XCHAR tszFileName[XPATH_MAX]; + XCHAR tszFileHash[XPATH_MAX]; while (bIsRun) { @@ -17,9 +17,9 @@ XHTHREAD XEngine_Task_P2PThread() memset(tszIPAddr, '\0', sizeof(tszIPAddr)); memset(tszTimeStart, '\0', sizeof(tszTimeStart)); memset(tszTimeEnd, '\0', sizeof(tszTimeEnd)); - memset(tszBuckKey, '\0', MAX_PATH); - memset(tszFileName, '\0', MAX_PATH); - memset(tszFileHash, '\0', MAX_PATH); + memset(tszBuckKey, '\0', XPATH_MAX); + memset(tszFileName, '\0', XPATH_MAX); + memset(tszFileHash, '\0', XPATH_MAX); if (NetCore_BroadCast_Recv(hBroadSocket, tszMsgBuffer, &nMsgLen, tszIPAddr)) { diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp index 1aad544..fe1ca14 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp @@ -29,14 +29,14 @@ bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpsz else if (0 == _tcsxnicmp(lpszAPIDLFile, lpszAPIName, _tcsxlen(lpszAPIDLFile))) { __int64x nFileSize = 0; - XCHAR tszPathKey[MAX_PATH]; - XCHAR tszFileName[MAX_PATH]; - XCHAR tszFileHash[MAX_PATH]; + XCHAR tszPathKey[XPATH_MAX]; + XCHAR tszFileName[XPATH_MAX]; + XCHAR tszFileHash[XPATH_MAX]; XCHAR tszClientAddr[128]; - memset(tszPathKey, '\0', MAX_PATH); - memset(tszFileName, '\0', MAX_PATH); - memset(tszFileHash, '\0', MAX_PATH); + memset(tszPathKey, '\0', XPATH_MAX); + memset(tszFileName, '\0', XPATH_MAX); + memset(tszFileHash, '\0', XPATH_MAX); memset(tszClientAddr, '\0', sizeof(tszClientAddr)); Protocol_StorageParse_ProxyNotify(lpszMsgBuffer, nMsgLen, tszClientAddr, tszPathKey, tszFileName, tszFileHash, &nFileSize); diff --git a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp index f0dd402..3fe9c3a 100644 --- a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp +++ b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp @@ -123,7 +123,7 @@ static int ServiceApp_Deamon(int wait) LONG WINAPI Coredump_ExceptionFilter(EXCEPTION_POINTERS* pExceptionPointers) { static int i = 0; - XCHAR tszFileStr[MAX_PATH] = {}; + XCHAR tszFileStr[XPATH_MAX] = {}; XCHAR tszTimeStr[128] = {}; BaseLib_Time_TimeToStr(tszTimeStr); _xstprintf(tszFileStr, _X("./XEngine_Coredump/dumpfile_%s_%d.dmp"), tszTimeStr, i++); diff --git a/XEngine_Source/XStorage_Protocol.h b/XEngine_Source/XStorage_Protocol.h index fc6ddb4..d05127c 100644 --- a/XEngine_Source/XStorage_Protocol.h +++ b/XEngine_Source/XStorage_Protocol.h @@ -34,9 +34,9 @@ //文件传输头文件,可用于P2XP文件传输和组包管理模块文件传输 typedef struct tag_XEngine_Protocol_File { - XCHAR tszFilePath[MAX_PATH]; //文件路径 - XCHAR tszFileName[MAX_PATH]; //文件名称,文件传输的时候才需要,其他时候不需要 - XCHAR tszFileHash[MAX_PATH]; //文件HASH值,MD5或者HASH1 256等...不能超过260字节大小 + XCHAR tszFilePath[XPATH_MAX]; //文件路径 + XCHAR tszFileName[XPATH_MAX]; //文件名称,文件传输的时候才需要,其他时候不需要 + XCHAR tszFileHash[XPATH_MAX]; //文件HASH值,MD5或者HASH1 256等...不能超过260字节大小 XCHAR tszFileUser[128]; //文件所属用户 XCHAR tszFileTime[64]; //文件创建时间,如果这个参数不填,那么服务器将会设置为接受到的文件时间 __int64x nFileSize; //文件大小 @@ -77,15 +77,15 @@ typedef struct //服务器动作处理 typedef struct { - XCHAR tszFileUrl[MAX_PATH]; //文件的URL - XCHAR tszFileName[MAX_PATH]; //本地文件路径 - XCHAR tszBucketStr[MAX_PATH]; //存储的KEY + XCHAR tszFileUrl[XPATH_MAX]; //文件的URL + XCHAR tszFileName[XPATH_MAX]; //本地文件路径 + XCHAR tszBucketStr[XPATH_MAX]; //存储的KEY XBYTE byType; //操作类型,0 HTTP,1 FTP,2 BT }XENGINE_ACTIONINFO; //WEBDAV协议 typedef struct { - XCHAR tszToken[MAX_PATH]; //令牌 + XCHAR tszToken[XPATH_MAX]; //令牌 XCHAR tszOwner[128]; //所属用户 XCHAR tszTimeout[64]; //超时时间 XBYTE byLockType; //0未知,1独占,2共享 From f3546618aac41a0e1de9dfb842208e2706459e9f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 29 May 2025 10:47:24 +0800 Subject: [PATCH 12/29] fixed:PROPFIND sometime have no name field modify:PROPFIND reply contact modify time and size --- .../APIHelp_Api/APIHelp_Api.cpp | 40 ++++++++++++ .../APIHelp_Api/APIHelp_Api.h | 1 + .../StorageModule_APIHelp/APIHelp_Define.h | 19 ++++++ .../StorageModule_APIHelp.def | 3 +- XEngine_Source/StorageModule_APIHelp/pch.cpp | 4 ++ .../StorageModule_Config/Config_Define.h | 1 + .../Config_Json/Config_Json.cpp | 3 +- .../Protocol_StoragePacket.cpp | 26 ++++---- .../StorageModule_Protocol.vcxproj | 4 +- XEngine_Source/XEngine_Depend | 2 +- .../XEngine_StorageApp/StorageApp_Center.cpp | 4 +- .../XEngine_StorageApp/StorageApp_Webdav.cpp | 65 ++++++++++--------- 12 files changed, 125 insertions(+), 47 deletions(-) diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp index ad4b541..587c91b 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp @@ -486,5 +486,45 @@ bool CAPIHelp_Api::APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl) // 添加字符串结束符 ptszKeyStr[nLen] = '\0'; + return true; +} +/******************************************************************** +函数名称:APIHelp_Api_GetLastName +函数功能:获取最后文件名 + 参数.一:ptszLastName + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出获取到的文件名 + 参数.二:lpszPathStr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要获取的字符串 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CAPIHelp_Api::APIHelp_Api_GetLastName(XCHAR* ptszLastName, LPCXSTR lpszPathStr) +{ + APIHelp_IsErrorOccur = false; + + xstring m_StrPath = lpszPathStr; + // 如果以斜杠结尾,去掉末尾的斜杠 + if (!m_StrPath.empty() && m_StrPath.back() == '/') + { + m_StrPath.pop_back(); + } + // 找到最后一个斜杠的位置 + size_t nPos = m_StrPath.find_last_of('/'); + if (nPos == std::string::npos) + { + _tcsxcpy(ptszLastName, m_StrPath.c_str()); + } + else + { + _tcsxcpy(ptszLastName, m_StrPath.substr(nPos + 1).c_str()); + } return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h index a2bfaa4..11f8275 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h @@ -26,6 +26,7 @@ class CAPIHelp_Api bool APIHelp_Api_Boundary(XCHAR*** ppptszList, int nListCount, XCHAR* ptszBoundStr); bool APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u* pInt_DIRSize); bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl); + bool APIHelp_Api_GetLastName(XCHAR* ptszLastName, LPCXSTR lpszPathStr); protected: private: }; \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h b/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h index dbebf30..959dda7 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h @@ -371,6 +371,25 @@ extern "C" bool APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u* pInt_DIRSiz 备注: *********************************************************************/ extern "C" bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl); +/******************************************************************** +函数名称:APIHelp_Api_GetLastName +函数功能:获取最后文件名 + 参数.一:ptszLastName + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出获取到的文件名 + 参数.二:lpszPathStr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要获取的字符串 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool APIHelp_Api_GetLastName(XCHAR* ptszLastName, LPCXSTR lpszPathStr); /************************************************************************/ /* 加解密函数 */ /************************************************************************/ diff --git a/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def b/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def index 5502b76..fe3a389 100644 --- a/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def +++ b/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def @@ -17,4 +17,5 @@ EXPORTS APIHelp_Api_UrlParse APIHelp_Api_Boundary APIHelp_Api_GetDIRSize - APIHelp_Api_UrlStr \ No newline at end of file + APIHelp_Api_UrlStr + APIHelp_Api_GetLastName \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/pch.cpp b/XEngine_Source/StorageModule_APIHelp/pch.cpp index 48d651a..b44bdb4 100644 --- a/XEngine_Source/StorageModule_APIHelp/pch.cpp +++ b/XEngine_Source/StorageModule_APIHelp/pch.cpp @@ -92,6 +92,10 @@ extern "C" bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl) { return m_APIHelp.APIHelp_Api_UrlStr(ptszKeyStr, lpszUrl); } +extern "C" bool APIHelp_Api_GetLastName(XCHAR* ptszLastName, LPCXSTR lpszPathStr) +{ + return m_APIHelp.APIHelp_Api_GetLastName(ptszLastName, lpszPathStr); +} /************************************************************************/ /* 加解密函数 */ /************************************************************************/ diff --git a/XEngine_Source/StorageModule_Config/Config_Define.h b/XEngine_Source/StorageModule_Config/Config_Define.h index a4fbf27..39c0b4b 100644 --- a/XEngine_Source/StorageModule_Config/Config_Define.h +++ b/XEngine_Source/StorageModule_Config/Config_Define.h @@ -66,6 +66,7 @@ typedef struct tag_XEngine_ServerConfig { bool bResumable; bool bUPHash; + bool bWDLocation; int nHashMode; }st_XStorage; struct diff --git a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp index fb24878..1cf16db 100644 --- a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp +++ b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp @@ -135,7 +135,7 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG _tcsxcpy(pSt_ServerConfig->st_XSql.tszSQLUser, st_JsonXSql["SQLUser"].asCString()); _tcsxcpy(pSt_ServerConfig->st_XSql.tszSQLPass, st_JsonXSql["SQLPass"].asCString()); - if (st_JsonRoot["XStorage"].empty() || (3 != st_JsonRoot["XStorage"].size())) + if (st_JsonRoot["XStorage"].empty() || (4 != st_JsonRoot["XStorage"].size())) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XSTORAGE; @@ -145,6 +145,7 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG pSt_ServerConfig->st_XStorage.nHashMode = st_JsonXStorage["nHashMode"].asInt(); pSt_ServerConfig->st_XStorage.bUPHash = st_JsonXStorage["bUPHash"].asBool(); pSt_ServerConfig->st_XStorage.bResumable = st_JsonXStorage["bResumable"].asBool(); + pSt_ServerConfig->st_XStorage.bWDLocation = st_JsonXStorage["bWDLocation"].asBool(); if (st_JsonRoot["XProxy"].empty() || (6 != st_JsonRoot["XProxy"].size())) { diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp index 9c4a94f..ad2ab3b 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp @@ -733,21 +733,25 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBu pSt_XMLPropstat->InsertEndChild(pSt_XMLProp); //属性名称 XMLElement* pSt_XMLPropName = m_XMLDocument.NewElement("d:displayname"); - pSt_XMLPropName->SetText(tszFileName); + if (_tcsxlen(tszFileName) <= 0) + { + APIHelp_Api_GetLastName(tszFileName, (*ppptszListFile)[i]); + } + pSt_XMLPropName->SetText(tszFileName); pSt_XMLProp->InsertEndChild(pSt_XMLPropName); + XCHAR tszFileSize[128] = {}; + _xstprintf(tszFileSize, _X("%llu"), st_FileAttr.nFileSize); + //属性大小 + XMLElement* pSt_XMLLength = m_XMLDocument.NewElement("d:getcontentlength"); + pSt_XMLLength->SetText(tszFileSize); + pSt_XMLProp->InsertEndChild(pSt_XMLLength); + //属性修改时间 + XMLElement* pSt_XMLModifyTime = m_XMLDocument.NewElement("d:getlastmodified"); + pSt_XMLModifyTime->SetText(tszGMTTime); + pSt_XMLProp->InsertEndChild(pSt_XMLModifyTime); if (st_FileAttr.bFile) { - XCHAR tszFileSize[128] = {}; - _xstprintf(tszFileSize, _X("%llu"), st_FileAttr.nFileSize); - //属性大小 - XMLElement* pSt_XMLLength = m_XMLDocument.NewElement("d:getcontentlength"); - pSt_XMLLength->SetText(tszFileSize); - pSt_XMLProp->InsertEndChild(pSt_XMLLength); - //属性修改时间 - XMLElement* pSt_XMLModifyTime = m_XMLDocument.NewElement("d:getlastmodified"); - pSt_XMLModifyTime->SetText(tszGMTTime); - pSt_XMLProp->InsertEndChild(pSt_XMLModifyTime); //增加会话属性 //获得会话 XENGINE_WEBDAVLOCK st_WDLocker = {}; diff --git a/XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.vcxproj b/XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.vcxproj index 834429a..a4eca74 100644 --- a/XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.vcxproj +++ b/XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.vcxproj @@ -104,7 +104,7 @@ false - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;../XEngine_Depend/XEngine_Module/tinyxml2;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;../XEngine_Depend/XEngine_Module/tinyxml2;..\StorageModule_Protocol;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) @@ -119,7 +119,7 @@ false - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;../XEngine_Depend/XEngine_Module/tinyxml2;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;../XEngine_Depend/XEngine_Module/tinyxml2;..\StorageModule_Protocol;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index 75f8d6c..78d2ea2 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit 75f8d6cd77f1cd82506fe07f674891f68caea372 +Subproject commit 78d2ea2cfcfa4701e122ee3e4ac536f712831f86 diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp index 09b97e5..9fff87c 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp @@ -120,14 +120,14 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int } else if (0 == _tcsxnicmp(lpszAPIManage, tszStrVlu, _tcsxlen(lpszAPIManage))) { - //http://127.0.0.1:5100/api?function=pass¶m=xxx + //http://127.0.0.1:5100/api?function=manage¶m=xxx memset(tszStrVlu, '\0', sizeof(tszStrVlu)); BaseLib_String_GetKeyValueA(pptszUrlList[1], "=", tszStrKey, tszStrVlu); XEngine_Task_Manage(tszStrVlu, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam); } else if (0 == _tcsxnicmp(lpszAPIAction, tszStrVlu, _tcsxlen(lpszAPIAction))) { - //http://127.0.0.1:5100/api?function=pass¶m=xxx + //http://127.0.0.1:5100/api?function=action¶m=xxx memset(tszStrVlu, '\0', sizeof(tszStrVlu)); BaseLib_String_GetKeyValueA(pptszUrlList[1], "=", tszStrKey, tszStrVlu); Storage_TaskAction(tszStrVlu, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam); diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index be8281a..93b15a7 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -60,7 +60,7 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int st_HDRParam.bIsClose = false; st_HDRParam.nHttpCode = 200; - + //http://127.0.0.1:5103/storagekey1 if (0 == _tcsxnicmp(lpszMethodOption, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodOption))) { //用于心跳 @@ -162,39 +162,46 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int } else if (0 == _tcsxnicmp(lpszMethodPut, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodPut))) { - //使用重定向实现上传 - st_HDRParam.bIsClose = false; - st_HDRParam.nHttpCode = 302; + if (st_ServiceCfg.st_XStorage.bWDLocation) + { + //使用重定向实现上传 + st_HDRParam.bIsClose = false; + st_HDRParam.nHttpCode = 302; - XCHAR tszRequestAddr[1024] = {}; - XCHAR tszHostStr[128] = {}; - HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, _X("Host"), tszHostStr); + XCHAR tszRequestAddr[1024] = {}; + XCHAR tszHostStr[128] = {}; + HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, _X("Host"), tszHostStr); - XCHAR tszPortWebdav[64] = {}; - XCHAR tszPortDownload[64] = {}; - _xstprintf(tszPortWebdav, _X("%d"), st_ServiceCfg.nWebdavPort); - _xstprintf(tszPortDownload, _X("%d"), st_ServiceCfg.nStorageUPPort); - //转换端口 - int nRLen = 0; - BaseLib_String_Replace(tszHostStr, &nRLen, tszPortWebdav, tszPortDownload, true); - //转换地址 - XCHAR tszStroageKey[XPATH_MAX] = {}; - XCHAR tszFileName[XPATH_MAX] = {}; + XCHAR tszPortWebdav[64] = {}; + XCHAR tszPortDownload[64] = {}; + _xstprintf(tszPortWebdav, _X("%d"), st_ServiceCfg.nWebdavPort); + _xstprintf(tszPortDownload, _X("%d"), st_ServiceCfg.nStorageUPPort); + //转换端口 + int nRLen = 0; + BaseLib_String_Replace(tszHostStr, &nRLen, tszPortWebdav, tszPortDownload, true); + //转换地址 + XCHAR tszStroageKey[XPATH_MAX] = {}; + XCHAR tszFileName[XPATH_MAX] = {}; - int nRet = _stxscanf(pSt_HTTPParam->tszHttpUri + 1, _X("%99[^/]/%199[^\n]"), tszStroageKey, tszFileName); - if (2 != nRet) - { - st_HDRParam.nHttpCode = 413; - HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + int nRet = _stxscanf(pSt_HTTPParam->tszHttpUri + 1, _X("%99[^/]/%199[^\n]"), tszStroageKey, tszFileName); + if (2 != nRet) + { + st_HDRParam.nHttpCode = 413; + HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("WEBDAV客户端:%s,处理WEBDAV协议上传方法失败,文件请求路径不正确,URL:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return false; + } + _xstprintf(tszRequestAddr, _X("Location: http://%s/api?filename=%s&storeagekey=%s\r\n"), tszHostStr, tszFileName, tszStroageKey); + + HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszRequestAddr); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("WEBDAV客户端:%s,处理WEBDAV协议上传方法失败,文件请求路径不正确,URL:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return false; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,请求文件上传被重定向到:%s"), lpszClientAddr, tszRequestAddr); + } + else + { + XEngine_Task_HttpUPLoader(lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); } - _xstprintf(tszRequestAddr, _X("Location: http://%s/api?filename=%s&storeagekey=%s\r\n"), tszHostStr, tszFileName, tszStroageKey); - - HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszRequestAddr); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,请求文件上传被重定向到:%s"), lpszClientAddr, tszRequestAddr); } else if (0 == _tcsxnicmp(lpszMethodLock, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodLock))) { From 8441a6f9d86fa24b6180a58041f6ee56b674ff84 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 29 May 2025 11:11:44 +0800 Subject: [PATCH 13/29] update:configure --- XEngine_Release/XEngine_Config/XEngine_Config.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 36b24e1..19b9757 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -39,6 +39,7 @@ "XStorage":{ "bResumable":true, "bUPHash":false, + "bWDLocation":false, "nHashMode":2 }, "XProxy":{ @@ -65,7 +66,7 @@ "XCert":{ "bDLEnable":false, "bUPEnable":false, - "bCHEnable":false, + "bCHEnable":true, "bWDEnable":false, "tszCertChain":"./XEngine_Cert/server.crt", "tszCertServer":"", From 6698d7d4ec3b507e7b6002ad048138ce57bcee37 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 12 Jun 2025 10:53:14 +0800 Subject: [PATCH 14/29] update:depend library --- XEngine_Source/XEngine_Depend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index 78d2ea2..7a6b18a 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit 78d2ea2cfcfa4701e122ee3e4ac536f712831f86 +Subproject commit 7a6b18a4e50d6042e2a1147cf5d9f60757c09300 From e79374fc6dd76e303362b07bf625bbac2e06b45c Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 12 Jun 2025 10:54:05 +0800 Subject: [PATCH 15/29] improved:set log level though start command --- .../XEngine_StorageApp/StorageApp_Config.cpp | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp index bdfe294..1381a00 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp @@ -53,39 +53,51 @@ bool StorageApp_Config_Parament(int argc,char **argv) StorageApp_Config_ParamentHelp(); return false; } - if ((0 == _tcsxcmp("-v",argv[i])) || (0 == _tcsxcmp("-V",argv[i]))) + if ((0 == _tcsxcmp("-v", argv[i])) || (0 == _tcsxcmp("-V", argv[i]))) { string m_StrVersion = st_ServiceCfg.st_XVer.pStl_ListStorage->front(); printf("Version:%s\n", m_StrVersion.c_str()); return false; } - else if (0 == _tcsxcmp("-l",argv[i])) + else if (0 == _tcsxcmp("-l", argv[i])) { st_ServiceCfg.st_XLog.nLogLeave = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-d",argv[i])) + else if (0 == _tcsxcmp("-d", argv[i])) { st_ServiceCfg.bDeamon = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-r", argv[i])) - { + else if (0 == _tcsxcmp("-r", argv[i])) + { st_ServiceCfg.st_Memory.bReload = true; - } - else if (0 == _tcsxcmp("-u", argv[i])) - { - st_ServiceCfg.bReuseraddr = true; - } - else if (0 == _tcsxcmp("-lt", argv[i])) - { - st_ServiceCfg.st_XLog.nLogType = _ttxoi(argv[++i]); - } - else if (0 == _tcsxcmp("-ll", argv[i])) - { - st_ServiceCfg.st_XLog.nLogLeave = _ttxoi(argv[++i]); - } - else if (0 == _tcsxcmp("-t", argv[i])) - { + } + else if (0 == _tcsxcmp("-u", argv[i])) + { + st_ServiceCfg.bReuseraddr = true; + } + else if (0 == _tcsxcmp("-lt", argv[i])) + { + st_ServiceCfg.st_XLog.nLogType = _ttxoi(argv[++i]); + } + else if (0 == _tcsxcmp("-ll", argv[i])) + { + st_ServiceCfg.st_XLog.nLogLeave = _ttxoi(argv[++i]); + } + else if (0 == _tcsxcmp("-t", argv[i])) + { bIsTest = true; + } + else if (0 == _tcsxcmp("-l", argv[i])) + { + LPCXSTR lpszLogLevel = argv[++i]; + if (0 == _tcsxcmp("debug", lpszLogLevel)) + { + st_ServiceCfg.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG; + } + else if (0 == _tcsxcmp("info", lpszLogLevel)) + { + st_ServiceCfg.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO; + } } } From b7ad84ca2e1474282b2887afa6d5973472c93a81 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 16 Jun 2025 16:35:16 +0800 Subject: [PATCH 16/29] modify:download and upload support specifies the network type --- .../StorageApp_Download.cpp | 37 +++++++------- .../XEngine_StorageApp/StorageApp_Download.h | 4 +- .../XEngine_StorageApp/StorageApp_Hdr.h | 1 - .../StorageApp_UPLoader.cpp | 48 +++++++++---------- .../XEngine_StorageApp/StorageApp_UPLoader.h | 2 +- .../XEngine_StorageApp/StorageApp_Webdav.cpp | 2 +- 6 files changed, 47 insertions(+), 47 deletions(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp index 2472889..f745edd 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp @@ -28,7 +28,7 @@ XHTHREAD XCALLBACK XEngine_Download_HTTPThread(XPVOID lParam) //获得指定下载客户端触发信息 if (HttpProtocol_Server_GetMemoryEx(xhDLHttp, ppSt_PKTClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParam, &ppszListHdr, &nHdrCount)) { - XEngine_Task_HttpDownload(ppSt_PKTClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_HTTPParam, ppszListHdr, nHdrCount); + XEngine_Task_HttpDownload(ppSt_PKTClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_HTTPParam, ppszListHdr, nHdrCount, STORAGE_NETTYPE_HTTPDOWNLOAD); } BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); BaseLib_Memory_Free((XPPPMEM)&ppszListHdr, nHdrCount); @@ -44,6 +44,7 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, { int nMsgLen = 4096; int nListCount = 0; + int nNetType = *(int*)lParam; __int64u nTimeWait = 0; XCHAR tszMsgBuffer[4096]; SESSION_STORAGEINFO st_StorageInfo; @@ -59,7 +60,7 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, if (nLimitTime > (__int64u)st_StorageInfo.nLimit) { //当前平均速度大于限制速度,不做处理 - NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend); + NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend, lParam); return; } } @@ -98,7 +99,7 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, { Algorithm_Calculation_ADDSDFlow(st_StorageInfo.xhToken, nMsgLen); } - XEngine_Task_SendDownload(lpszClientAddr, tszMsgBuffer, nMsgLen); + XEngine_Task_SendDownload(lpszClientAddr, tszMsgBuffer, nMsgLen, nNetType); } } else @@ -115,7 +116,7 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, } } -bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) +bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount, int nNetType) { int nSDLen = 2048; int nLimit = 0; @@ -137,7 +138,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 405; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,发送的方法不支持"), lpszClientAddr); return false; } @@ -150,7 +151,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 503; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,请求失败,连接数超过限制:%d,无法继续"), lpszClientAddr, st_ServiceCfg.st_XLimit.nMaxDNConnect); return false; } @@ -170,7 +171,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 401; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); return false; } @@ -187,7 +188,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = nResponseCode; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } Protocol_StorageParse_SpeedLimit(ptszBody, nSDLen, &nCode, &nLimit); @@ -211,7 +212,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in _xstprintf(tszHdrBuffer, _X("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,请求的文件被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); return true; } @@ -244,7 +245,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 404; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,请求文件失败,可能BUCKET:%s 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); return false; } @@ -254,7 +255,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 404; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,请求文件失败,请求的BUCKET:%s 已经被禁用"), lpszClientAddr, st_StorageBucket.tszBuckKey); return false; } @@ -285,7 +286,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 404; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,插入用户请求失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return false; } @@ -310,24 +311,24 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in } _xstprintf(tszFieldStr, _X("FileHash: %s\r\n"), tszHashStr); HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize, tszFieldStr); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); //不能在send之前调用 - if (!NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend)) + if (!NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend, &nNetType)) { st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,设置回调下载失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return false; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,请求下载文件成功,文件名:%s,总大小:%llu,发送大小:%llu,范围:%d - %d"), lpszClientAddr, tszFileDir, ullCount, ullSize, nPosStart, nPosEnd); return true; } -bool XEngine_Task_SendDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen) +bool XEngine_Task_SendDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nNetType) { - if (!XEngine_Net_SendMsg(lpszClientAddr, lpszMsgBuffer, nMsgLen, STORAGE_NETTYPE_HTTPDOWNLOAD)) + if (!XEngine_Net_SendMsg(lpszClientAddr, lpszMsgBuffer, nMsgLen, nNetType)) { if (Session_DLStorage_SetSeek(lpszClientAddr, -nMsgLen)) { @@ -335,7 +336,7 @@ bool XEngine_Task_SendDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in } else { - XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_CLOSE, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_CLOSE, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,正在发送文件数据,大小:%d,发送超过重试次数,无法继续,移除发送队列"), lpszClientAddr, nMsgLen); } return false; diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h index 0eb93ab..f4f30ab 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h @@ -3,5 +3,5 @@ XHTHREAD XCALLBACK XEngine_Download_HTTPThread(XPVOID lParam); void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); -bool XEngine_Task_SendDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen); \ No newline at end of file +bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount, int nNetType); +bool XEngine_Task_SendDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nNetType); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h index 39b52ed..1d1a2e1 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h @@ -67,7 +67,6 @@ using namespace std; #include "../XEngine_Depend/XEngine_Module/XEngine_InfoReport/InfoReport_Define.h" #include "../XEngine_Depend/XEngine_Module/XEngine_InfoReport/InfoReport_Error.h" - #define STORAGE_LEAVETYPE_HEARTBEAT 1 #define STORAGE_LEAVETYPE_BYSELF 2 #define STORAGE_LEAVETYPE_CLOSE 3 diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp index 28aabb2..ca6862a 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp @@ -28,7 +28,7 @@ XHTHREAD XCALLBACK XEngine_UPLoader_HTTPThread(XPVOID lParam) //获得指定上传客户端触发信息 if (HttpProtocol_Server_GetMemoryEx(xhUPHttp, ppSt_PKTClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParam, &ppszListHdr, &nHdrCount)) { - XEngine_Task_HttpUPLoader(ppSt_PKTClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_HTTPParam, ppszListHdr, nHdrCount); + XEngine_Task_HttpUPLoader(ppSt_PKTClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_HTTPParam, ppszListHdr, nHdrCount, STORAGE_NETTYPE_HTTPUPLOADER); } BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); BaseLib_Memory_Free((XPPPMEM)&ppszListHdr, nHdrCount); @@ -53,7 +53,7 @@ void XCALLBACK XEngine_UPLoader_UPFlow(XHANDLE xhToken, bool bSDFlow, bool bRVFl } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("上传客户端:%s,接受数据标志:%d,当前平均流量:%llu"), tszIPAddr, bSDFlow, nSDFlow); } -bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) +bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount, int nNetType) { int nSDLen = 2048; int nLimit = 0; @@ -74,7 +74,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 405; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,发送的方法:%s 不支持"), lpszClientAddr, pSt_HTTPParam->tszHttpMethod); return false; } @@ -87,7 +87,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 503; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求失败,连接数超过限制:%d,无法继续"), lpszClientAddr, st_ServiceCfg.st_XLimit.nMaxUPConnect); return false; } @@ -107,7 +107,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 401; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); return false; } @@ -124,7 +124,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = nResponseCode; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } Protocol_StorageParse_SpeedLimit(ptszBody, nSDLen, &nCode, &nLimit); @@ -148,7 +148,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in _xstprintf(tszHdrBuffer, _X("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求的文件被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); return true; } @@ -168,7 +168,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in { st_HDRParam.nHttpCode = 413; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); BaseLib_Memory_Free((XPPPMEM)&pptszParamList, nParamCount); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求上传文件失败,提供的参数:%s 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, HttpProtocol_GetLastError()); return false; @@ -184,7 +184,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 413; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求上传文件失败,可能BUCKET:% 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); return false; } @@ -197,7 +197,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 413; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求上传文件失败,可能BUCKET:% 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); return false; } @@ -221,7 +221,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 403; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,准备上传文件:%s 失败,文件已经存在"), lpszClientAddr, tszFileDir); return true; } @@ -232,7 +232,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 403; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,准备上传文件:%s 失败,创建文件失败"), lpszClientAddr, tszFileDir); return true; } @@ -241,7 +241,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.bIsClose = false; st_HDRParam.nHttpCode = 201; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,准备上传文件:%s 成功"), lpszClientAddr, tszFileDir); return true; } @@ -250,7 +250,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 403; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,准备上传文件:%s 失败,服务器关闭了UPReady,无法继续"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); return true; } @@ -268,7 +268,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 411; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,没有用户数据大小字段,无法继续"), lpszClientAddr); return false; } @@ -282,7 +282,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 416; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求断点续传上传文件失败,服务端关闭了此功能,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return false; } @@ -300,7 +300,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 404; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求上传文件失败,上传文件夹不存在,权限错误,文件:%s"), lpszClientAddr, tszFileDir); return false; } @@ -317,7 +317,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 500; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,插入用户请求失败,文件:%s,内存申请失败,服务器错误"), lpszClientAddr, tszFileDir); return false; } @@ -336,7 +336,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 500; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,插入用户请求失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return false; } @@ -409,7 +409,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 200; Protocol_StoragePacket_UPDown(tszPassNotify, &nPLen, st_StorageInfo.tszBuckKey, st_StorageInfo.tszFileDir, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWLen, false); HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("上传客户端:%s,请求上传文件成功,文件名:%s,总大小:%lld,写入大小:%lld,文件不完整,需要等待断点续传完毕"), lpszClientAddr, tszFileDir, st_StorageInfo.ullCount, st_StorageInfo.ullRWLen); return true; } @@ -442,7 +442,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 403; _xtremove(tszFileDir); HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,上传的文件信息HASH校验失败,无法继续,文件:%s 已被删除,HASH:%s,错误:%lX"), lpszClientAddr, tszFileDir, st_ProtocolFile.st_ProtocolFile.tszFileHash, StorageHelp_GetLastError()); return false; @@ -469,7 +469,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d"), lpszClientAddr, tszFileDir, nRVCount); } else @@ -478,7 +478,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 403; _xtremove(st_StorageInfo.tszFileDir); HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求上传文件失败,插入数据库失败:%s,错误:%lX"), lpszClientAddr, tszFileDir, Database_GetLastError()); } } @@ -487,7 +487,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d,数据库没有启用,不插入数据库"), lpszClientAddr, tszFileDir, nRVCount); } } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h index de89641..afd1a98 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h @@ -2,4 +2,4 @@ XHTHREAD XCALLBACK XEngine_UPLoader_HTTPThread(XPVOID lParam); void XCALLBACK XEngine_UPLoader_UPFlow(XHANDLE xhToken, bool bSDFlow, bool bRVFlow, bool bTime, XPVOID lParam); -bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file +bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount, int nNetType); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index 93b15a7..6f44066 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -200,7 +200,7 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int } else { - XEngine_Task_HttpUPLoader(lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); + XEngine_Task_HttpUPLoader(lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount, STORAGE_NETTYPE_HTTPWEBDAV); } } else if (0 == _tcsxnicmp(lpszMethodLock, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodLock))) From 166966d7d9ed0c7620e14b72e8000fd99fde890b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 16 Jun 2025 16:52:01 +0800 Subject: [PATCH 17/29] fixed:webdav url convert to x storage format --- .../APIHelp_Api/APIHelp_Api.cpp | 48 +++++++++++++++++++ .../APIHelp_Api/APIHelp_Api.h | 1 + .../StorageModule_APIHelp/APIHelp_Define.h | 19 ++++++++ .../StorageModule_APIHelp.def | 3 +- XEngine_Source/StorageModule_APIHelp/pch.cpp | 4 ++ .../XEngine_StorageApp/StorageApp_Webdav.cpp | 5 ++ 6 files changed, 79 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp index 587c91b..fbb9b88 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp @@ -527,4 +527,52 @@ bool CAPIHelp_Api::APIHelp_Api_GetLastName(XCHAR* ptszLastName, LPCXSTR lpszPath _tcsxcpy(ptszLastName, m_StrPath.substr(nPos + 1).c_str()); } return true; +} +/******************************************************************** +函数名称:APIHelp_Api_WDToUrl +函数功能:webdav的路径转为存储服务标准路径 + 参数.一:lpszUrl + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要转换的路径 + 参数.二:ptszUrl + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出转换后的路径 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CAPIHelp_Api::APIHelp_Api_WDToUrl(LPCXSTR lpszUrl, XCHAR* ptszUrl) +{ + APIHelp_IsErrorOccur = false; + + xstring m_StrUrl = lpszUrl; + // 确保路径以 "/" 开头 + if (m_StrUrl.empty() || m_StrUrl[0] != '/') + { + return false; + } + if (0 == _tcsxnicmp("api", m_StrUrl.c_str() + 1, 3)) + { + _tcsxcpy(ptszUrl, lpszUrl); + return true; + } + // 找到第一个 '/' 和第二个 '/' + size_t nFirstSlash = m_StrUrl.find('/', 1); + if (nFirstSlash == std::string::npos) + { + return false; + } + //提取bucket + xstring m_StrBucket = m_StrUrl.substr(1, nFirstSlash - 1); + //提取剩余路径 + xstring m_StrFile = m_StrUrl.substr(nFirstSlash + 1); + // 构造目标URL + xstring m_XUrl = "/api?filename=" + m_StrFile + "&storeagekey=" + m_StrBucket; + _tcsxcpy(ptszUrl, m_XUrl.c_str()); + return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h index 11f8275..61b8606 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h @@ -27,6 +27,7 @@ class CAPIHelp_Api bool APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u* pInt_DIRSize); bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl); bool APIHelp_Api_GetLastName(XCHAR* ptszLastName, LPCXSTR lpszPathStr); + bool APIHelp_Api_WDToUrl(LPCXSTR lpszUrl, XCHAR* ptszUrl); protected: private: }; \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h b/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h index 959dda7..05a5bb5 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h @@ -390,6 +390,25 @@ extern "C" bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl); 备注: *********************************************************************/ extern "C" bool APIHelp_Api_GetLastName(XCHAR* ptszLastName, LPCXSTR lpszPathStr); +/******************************************************************** +函数名称:APIHelp_Api_WDToUrl +函数功能:webdav的路径转为存储服务标准路径 + 参数.一:lpszUrl + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要转换的路径 + 参数.二:ptszUrl + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出转换后的路径 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool APIHelp_Api_WDToUrl(LPCXSTR lpszUrl, XCHAR* ptszUrl); /************************************************************************/ /* 加解密函数 */ /************************************************************************/ diff --git a/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def b/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def index fe3a389..a881c7f 100644 --- a/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def +++ b/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def @@ -18,4 +18,5 @@ EXPORTS APIHelp_Api_Boundary APIHelp_Api_GetDIRSize APIHelp_Api_UrlStr - APIHelp_Api_GetLastName \ No newline at end of file + APIHelp_Api_GetLastName + APIHelp_Api_WDToUrl \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/pch.cpp b/XEngine_Source/StorageModule_APIHelp/pch.cpp index b44bdb4..18c15bf 100644 --- a/XEngine_Source/StorageModule_APIHelp/pch.cpp +++ b/XEngine_Source/StorageModule_APIHelp/pch.cpp @@ -96,6 +96,10 @@ extern "C" bool APIHelp_Api_GetLastName(XCHAR* ptszLastName, LPCXSTR lpszPathStr { return m_APIHelp.APIHelp_Api_GetLastName(ptszLastName, lpszPathStr); } +extern "C" bool APIHelp_Api_WDToUrl(LPCXSTR lpszUrl, XCHAR* ptszUrl) +{ + return m_APIHelp.APIHelp_Api_WDToUrl(lpszUrl, ptszUrl); +} /************************************************************************/ /* 加解密函数 */ /************************************************************************/ diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index 6f44066..d408e1a 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -200,6 +200,11 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int } else { + //转换参数格式:/storagekey1/webdav/clash-verge-rev-backup/backup.zip 为 /api?filename=webdav/clash-verge-rev-backup/backup.zip&storeagekey=storagekey1 + XCHAR tszConvertStr[XPATH_MAX] = {}; + APIHelp_Api_WDToUrl(pSt_HTTPParam->tszHttpUri, tszConvertStr); + memset(pSt_HTTPParam->tszHttpUri, '\0', sizeof(pSt_HTTPParam->tszHttpUri)); + _tcsxcpy(pSt_HTTPParam->tszHttpUri, tszConvertStr); XEngine_Task_HttpUPLoader(lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount, STORAGE_NETTYPE_HTTPWEBDAV); } } From f9c2d18ac00ee75d26eee478443c3699e62e2e03 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 16 Jun 2025 16:53:39 +0800 Subject: [PATCH 18/29] fixed:http verification function not export --- .../StorageModule_APIHelp/StorageModule_APIHelp.def | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def b/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def index a881c7f..10d5103 100644 --- a/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def +++ b/XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def @@ -19,4 +19,8 @@ EXPORTS APIHelp_Api_GetDIRSize APIHelp_Api_UrlStr APIHelp_Api_GetLastName - APIHelp_Api_WDToUrl \ No newline at end of file + APIHelp_Api_WDToUrl + + APIHelp_Cryption_BasicEncoder + APIHelp_Cryption_BasicDecoder + APIHelp_Cryption_Digest \ No newline at end of file From 8713938fd4ec0fb1293dc43670f1051006170401 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 16 Jun 2025 16:55:40 +0800 Subject: [PATCH 19/29] fixed:have no error code export for help module --- .../StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp index fbb9b88..15ba738 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp @@ -471,12 +471,16 @@ bool CAPIHelp_Api::APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl) XCHAR *ptszFirstStr = _tcsxchr(tszUrlStr, '/'); if (ptszFirstStr == NULL) { + APIHelp_IsErrorOccur = true; + APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_FORMAT; return false; } // 查找第二个 '/' 的位置 XCHAR* ptszSecondStr = _tcsxchr(ptszFirstStr + 1, '/'); if (ptszSecondStr == NULL) { + APIHelp_IsErrorOccur = true; + APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_FORMAT; return false; } // 计算提取字符串的长度 @@ -554,6 +558,8 @@ bool CAPIHelp_Api::APIHelp_Api_WDToUrl(LPCXSTR lpszUrl, XCHAR* ptszUrl) // 确保路径以 "/" 开头 if (m_StrUrl.empty() || m_StrUrl[0] != '/') { + APIHelp_IsErrorOccur = true; + APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_FORMAT; return false; } if (0 == _tcsxnicmp("api", m_StrUrl.c_str() + 1, 3)) @@ -565,6 +571,8 @@ bool CAPIHelp_Api::APIHelp_Api_WDToUrl(LPCXSTR lpszUrl, XCHAR* ptszUrl) size_t nFirstSlash = m_StrUrl.find('/', 1); if (nFirstSlash == std::string::npos) { + APIHelp_IsErrorOccur = true; + APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_FORMAT; return false; } //提取bucket From 26048ca27e2ba4af781d0881fbb615f7cb865ff2 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 17 Jun 2025 09:53:22 +0800 Subject: [PATCH 20/29] fixed:webdav response type is incorrect modify:upload method mix support added:not found response for web dav --- .../Protocol_StoragePacket.cpp | 64 +++++++++++++++++++ .../Protocol_Packet/Protocol_StoragePacket.h | 1 + .../StorageModule_Protocol.def | 1 + .../StorageProtocol_Define.h | 24 +++++++ XEngine_Source/StorageModule_Protocol/pch.cpp | 4 ++ .../XEngine_StorageApp/StorageApp_Webdav.cpp | 39 +++++------ 6 files changed, 115 insertions(+), 18 deletions(-) diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp index ad2ab3b..e54d542 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp @@ -640,6 +640,70 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_Bucket(XCHAR* ptszMsgBuffer return true; } /******************************************************************** +函数名称:Protocol_StoragePacket_Notfound +函数功能:没有找到 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出打好包的XML数据 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出大小 + 参数.三:lpszFileName + In/Out:Out + 类型:常量字符指针 + 可空:N + 意思:输入要打包的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocol_StoragePacket::Protocol_StoragePacket_Notfound(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName) +{ + Protocol_IsErrorOccur = false; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; + return false; + } + // 创建一个 XML 文档 + XMLDocument m_XMLDocument; + // XML 声明 + XMLDeclaration* pSt_XMLDeclaration = m_XMLDocument.NewDeclaration(R"(xml version="1.0" encoding="utf-8")"); + m_XMLDocument.InsertFirstChild(pSt_XMLDeclaration); + + // 根元素 + XMLElement* pSt_XMLRoot = m_XMLDocument.NewElement("d:error"); + pSt_XMLRoot->SetAttribute("xmlns:d", "DAV:"); + m_XMLDocument.InsertEndChild(pSt_XMLRoot); + + // 子元素 + XMLElement* pSt_XMLHerf = m_XMLDocument.NewElement("d:href"); + pSt_XMLHerf->SetText(lpszFileName); + pSt_XMLRoot->InsertEndChild(pSt_XMLHerf); + // 子元素 + XMLElement* pSt_XMLStatus = m_XMLDocument.NewElement("d:status"); + pSt_XMLStatus->SetText(_X("HTTP/1.1 404 Not Found")); + pSt_XMLRoot->InsertEndChild(pSt_XMLStatus); + // 子元素 + XMLElement* pSt_XMLResponseDesc = m_XMLDocument.NewElement("d:responsedescription"); + pSt_XMLResponseDesc->SetText(_X("Not found")); + pSt_XMLRoot->InsertEndChild(pSt_XMLResponseDesc); + // 将 XML 数据保存到字符串 + XMLPrinter m_XMLPrinter; + m_XMLDocument.Print(&m_XMLPrinter); + + *pInt_MsgLen = m_XMLPrinter.CStrSize() - 1; + memcpy(ptszMsgBuffer, m_XMLPrinter.CStr(), *pInt_MsgLen); + return true; +} +/******************************************************************** 函数名称:Protocol_StoragePacket_WDPropfind 函数功能:propfind协议打包处理函数 参数.一:ptszMsgBuffer diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h index 2ff4ce8..82eba76 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h @@ -27,6 +27,7 @@ class CProtocol_StoragePacket bool Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XNETHANDLE xhToken, XENGINE_ACTIONINFO* pSt_ActionInfo); bool Protocol_StoragePacket_Bucket(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListBucket); public: + bool Protocol_StoragePacket_Notfound(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName); bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey); bool Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock); bool Protocol_StoragePacket_WDPropPatch(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName, std::list* pStl_ListName); diff --git a/XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.def b/XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.def index dff1032..a8a1b5c 100644 --- a/XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.def +++ b/XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.def @@ -23,6 +23,7 @@ EXPORTS Protocol_StoragePacket_REQFile Protocol_StoragePacket_Action Protocol_StoragePacket_Bucket + Protocol_StoragePacket_Notfound Protocol_StoragePacket_WDPropfind Protocol_StoragePacket_WDLock Protocol_StoragePacket_WDPropPatch \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h b/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h index 581b70d..5c3ea11 100644 --- a/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h +++ b/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h @@ -618,6 +618,30 @@ extern "C" bool Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer, int* pInt_Ms *********************************************************************/ extern "C" bool Protocol_StoragePacket_Bucket(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListBucket); /******************************************************************** +函数名称:Protocol_StoragePacket_Notfound +函数功能:没有找到 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出打好包的XML数据 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出大小 + 参数.三:lpszFileName + In/Out:Out + 类型:常量字符指针 + 可空:N + 意思:输入要打包的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool Protocol_StoragePacket_Notfound(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName); +/******************************************************************** 函数名称:Protocol_StoragePacket_WDPropfind 函数功能:propfind协议打包处理函数 参数.一:ptszMsgBuffer diff --git a/XEngine_Source/StorageModule_Protocol/pch.cpp b/XEngine_Source/StorageModule_Protocol/pch.cpp index ba256dc..16c4cf0 100644 --- a/XEngine_Source/StorageModule_Protocol/pch.cpp +++ b/XEngine_Source/StorageModule_Protocol/pch.cpp @@ -104,6 +104,10 @@ extern "C" bool Protocol_StoragePacket_Bucket(XCHAR* ptszMsgBuffer, int* pInt_Ms { return m_StoragePacket.Protocol_StoragePacket_Bucket(ptszMsgBuffer, pInt_MsgLen, pStl_ListBucket); } +extern "C" bool Protocol_StoragePacket_Notfound(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName) +{ + return m_StoragePacket.Protocol_StoragePacket_Notfound(ptszMsgBuffer, pInt_MsgLen, lpszFileName); +} extern "C" bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey) { return m_StoragePacket.Protocol_StoragePacket_WDPropfind(ptszMsgBuffer, pInt_MsgLen, ppptszListFile, nFileCount, lpszBucketPath, lpszBucketKey); diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index d408e1a..3ff371a 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -60,6 +60,7 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int st_HDRParam.bIsClose = false; st_HDRParam.nHttpCode = 200; + _tcsxcpy(st_HDRParam.tszMimeType, _X("xml")); //http://127.0.0.1:5103/storagekey1 if (0 == _tcsxnicmp(lpszMethodOption, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodOption))) { @@ -94,17 +95,28 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int } int nListCount = 0; XCHAR** pptszListFile; - XCHAR tszFindStr[XPATH_MAX] = {}; //得到是否是文件 - if (APIHelp_Api_UrlStr(st_StorageBucket.tszBuckKey, pSt_HTTPParam->tszHttpUri)) + int nALen = 0; + XCHAR tszFileUrl[XPATH_MAX] = {}; + SYSTEMAPI_FILE_ATTR st_FileAttr = {}; + _tcsxcpy(tszFileUrl, pSt_HTTPParam->tszHttpUri + 1); + BaseLib_String_Replace(tszFileUrl, &nALen, st_StorageBucket.tszBuckKey, st_StorageBucket.tszFilePath); + + if (!SystemApi_File_GetFileAttr(tszFileUrl, &st_FileAttr)) + { + st_HDRParam.nHttpCode = 404; + Protocol_StoragePacket_Notfound(tszRVBuffer, &nRVLen, pSt_HTTPParam->tszHttpUri); + HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("WEBDAV客户端:%s,处理WEBDAV协议PROPFIND方法失败,文件没有找到,URL:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return false; + } + if (st_FileAttr.bFile) { - int nALen = 0; - _tcsxcpy(tszFindStr, pSt_HTTPParam->tszHttpUri + 1); - BaseLib_String_Replace(tszFindStr, &nALen, st_StorageBucket.tszBuckKey, st_StorageBucket.tszFilePath, true); //如果是文件 nListCount = 1; BaseLib_Memory_Malloc((XPPPMEM)&pptszListFile, nListCount, XPATH_MAX); - _tcsxcpy(pptszListFile[0], tszFindStr); + _tcsxcpy(pptszListFile[0], tszFileUrl); } else { @@ -113,29 +125,20 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, _X("Depth"), tszVluStr); if (1 == _ttxoi(tszVluStr)) { - SystemApi_File_EnumFile(tszFindStr, &pptszListFile, &nListCount, false, 3); + SystemApi_File_EnumFile(tszFileUrl, &pptszListFile, &nListCount, false, 3); } else { - SystemApi_File_EnumFile(tszFindStr, &pptszListFile, &nListCount); + SystemApi_File_EnumFile(tszFileUrl, &pptszListFile, &nListCount); } } - //枚举文件 - if (0 == nListCount) - { - st_HDRParam.nHttpCode = 404; - HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("WEBDAV客户端:%s,处理WEBDAV协议PROPFIND方法失败,文件没有找到,URL:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return false; - } Protocol_StoragePacket_WDPropfind(tszRVBuffer, &nRVLen, &pptszListFile, nListCount, st_StorageBucket.tszFilePath, st_StorageBucket.tszBuckKey); st_HDRParam.nHttpCode = 207; _tcsxcpy(st_HDRParam.tszMimeType, _X("xml")); HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,处理WEBDAV协议PROPFIND方法成功,文件名称:%s"), lpszClientAddr, tszFindStr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,处理WEBDAV协议PROPFIND方法成功,文件名称:%s"), lpszClientAddr, tszFileUrl); } else if (0 == _tcsxnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodGet))) { From faa5ca9e89a23b629604f2e38b198c5ce6fa598a Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 17 Jun 2025 10:24:40 +0800 Subject: [PATCH 21/29] fixed:repeat response for download failure modify:download mix message support --- .../StorageApp_Download.cpp | 34 ++++++++++++--- .../XEngine_StorageApp/StorageApp_Webdav.cpp | 41 +++++++++++-------- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp index f745edd..155da4a 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp @@ -60,7 +60,14 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, if (nLimitTime > (__int64u)st_StorageInfo.nLimit) { //当前平均速度大于限制速度,不做处理 - NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend, lParam); + if (STORAGE_NETTYPE_HTTPWEBDAV == nNetType) + { + NetCore_TCPXCore_CBSendEx(xhNetWebdav, lpszClientAddr, XEngine_Download_CBSend, lParam); + } + else + { + NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend, lParam); + } return; } } @@ -89,7 +96,15 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,请求完成通知失败,可能对方服务没有开启,文件:%s,地址:%s"), lpszClientAddr, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.tszDLPass); } } - NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr); + if (STORAGE_NETTYPE_HTTPWEBDAV == nNetType) + { + NetCore_TCPXCore_CBSendEx(xhNetWebdav, lpszClientAddr); + } + else + { + NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr); + } + Session_DLStroage_Delete(lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,文件已经发送完毕,用户已经被移除发送列表"), lpszClientAddr); } @@ -310,10 +325,17 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in st_HDRParam.bIsClose = true; } _xstprintf(tszFieldStr, _X("FileHash: %s\r\n"), tszHashStr); - HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize, tszFieldStr); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); //不能在send之前调用 - if (!NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend, &nNetType)) + bool bRet = false; + if (STORAGE_NETTYPE_HTTPWEBDAV == nNetType) + { + bRet = NetCore_TCPXCore_CBSendEx(xhNetWebdav, lpszClientAddr, XEngine_Download_CBSend, &nNetType); + } + else + { + bRet = NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend, &nNetType); + } + if (!bRet) { st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; @@ -323,6 +345,8 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,设置回调下载失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return false; } + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize, tszFieldStr); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,请求下载文件成功,文件名:%s,总大小:%llu,发送大小:%llu,范围:%d - %d"), lpszClientAddr, tszFileDir, ullCount, ullSize, nPosStart, nPosEnd); return true; } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index 3ff371a..fca3a79 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -142,26 +142,33 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int } else if (0 == _tcsxnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodGet))) { - //使用重定向实现下载 - st_HDRParam.bIsClose = true; - st_HDRParam.nHttpCode = 302; + if (st_ServiceCfg.st_XStorage.bWDLocation) + { + //使用重定向实现下载 + st_HDRParam.bIsClose = true; + st_HDRParam.nHttpCode = 302; - XCHAR tszRequestAddr[512] = {}; - XCHAR tszHostStr[128] = {}; - HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, _X("Host"), tszHostStr); + XCHAR tszRequestAddr[512] = {}; + XCHAR tszHostStr[128] = {}; + HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, _X("Host"), tszHostStr); - XCHAR tszPortWebdav[64] = {}; - XCHAR tszPortDownload[64] = {}; - _xstprintf(tszPortWebdav, _X("%d"), st_ServiceCfg.nWebdavPort); - _xstprintf(tszPortDownload, _X("%d"), st_ServiceCfg.nStorageDLPort); - //转换端口 - int nReplaceLen = 0; - BaseLib_String_Replace(tszHostStr, &nReplaceLen, tszPortWebdav, tszPortDownload, true); - _xstprintf(tszRequestAddr, _X("Location: http://%s%s\r\n"), tszHostStr, pSt_HTTPParam->tszHttpUri); + XCHAR tszPortWebdav[64] = {}; + XCHAR tszPortDownload[64] = {}; + _xstprintf(tszPortWebdav, _X("%d"), st_ServiceCfg.nWebdavPort); + _xstprintf(tszPortDownload, _X("%d"), st_ServiceCfg.nStorageDLPort); + //转换端口 + int nReplaceLen = 0; + BaseLib_String_Replace(tszHostStr, &nReplaceLen, tszPortWebdav, tszPortDownload, true); + _xstprintf(tszRequestAddr, _X("Location: http://%s%s\r\n"), tszHostStr, pSt_HTTPParam->tszHttpUri); - HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszRequestAddr); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,请求文件下载被重定向到:%s"), lpszClientAddr, tszRequestAddr); + HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszRequestAddr); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,请求文件下载被重定向到:%s"), lpszClientAddr, tszRequestAddr); + } + else + { + XEngine_Task_HttpDownload(lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount, STORAGE_NETTYPE_HTTPWEBDAV); + } } else if (0 == _tcsxnicmp(lpszMethodPut, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodPut))) { From dc81cb1f1e2b37fe3b06df5eab7c88f8352ea900 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 17 Jun 2025 13:41:09 +0800 Subject: [PATCH 22/29] fixed:net type value is incorrect for download improved:cb send get failure process --- .../StorageApp_Download.cpp | 45 +++++++++++-------- .../XEngine_StorageApp/StorageApp_Webdav.cpp | 26 +++++------ 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp index 155da4a..027b7d4 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp @@ -44,7 +44,7 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, { int nMsgLen = 4096; int nListCount = 0; - int nNetType = *(int*)lParam; + int nNetType = 0; __int64u nTimeWait = 0; XCHAR tszMsgBuffer[4096]; SESSION_STORAGEINFO st_StorageInfo; @@ -52,7 +52,15 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); memset(&st_StorageInfo, '\0', sizeof(SESSION_STORAGEINFO)); - Session_DLStroage_GetInfo(lpszClientAddr, &st_StorageInfo); + if (NULL != lParam) + { + nNetType = *(int*)lParam; + } + if (!Session_DLStroage_GetInfo(lpszClientAddr, &st_StorageInfo)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,获取用户对应文件内容失败,错误:%lX"), lpszClientAddr, Session_GetLastError()); + return; + } if (st_ServiceCfg.st_XLimit.bLimitMode && st_StorageInfo.nLimit > 0) { __int64u nLimitTime = 0; @@ -104,7 +112,7 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, { NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr); } - + free(lParam); Session_DLStroage_Delete(lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,文件已经发送完毕,用户已经被移除发送列表"), lpszClientAddr); } @@ -116,18 +124,14 @@ void XCALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, } XEngine_Task_SendDownload(lpszClientAddr, tszMsgBuffer, nMsgLen, nNetType); } - } - else - { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,获取用户对应文件内容失败,错误:%lX"), lpszClientAddr, Session_GetLastError()); - } - //限速,如果没有单独限速,默认全局限速 - if (st_ServiceCfg.st_XLimit.bLimitMode && (0 == st_StorageInfo.nLimit)) - { - Session_DLStroage_GetCount(&nListCount); - Algorithm_Calculation_SleepFlow(xhLimit, &nTimeWait, st_ServiceCfg.st_XLimit.nMaxDNLoader, nListCount, 4096); - //WINDOWS下sleep_for精度可能不准 - std::this_thread::sleep_for(std::chrono::microseconds(nTimeWait)); + //限速,如果没有单独限速,默认全局限速 + if (st_ServiceCfg.st_XLimit.bLimitMode && (0 == st_StorageInfo.nLimit)) + { + Session_DLStroage_GetCount(&nListCount); + Algorithm_Calculation_SleepFlow(xhLimit, &nTimeWait, st_ServiceCfg.st_XLimit.nMaxDNLoader, nListCount, 4096); + //WINDOWS下sleep_for精度可能不准 + std::this_thread::sleep_for(std::chrono::microseconds(nTimeWait)); + } } } @@ -326,14 +330,19 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in } _xstprintf(tszFieldStr, _X("FileHash: %s\r\n"), tszHashStr); //不能在send之前调用 + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize, tszFieldStr); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); + //发送 bool bRet = false; + int* pInt_NetType = (int*)malloc(sizeof(int)); + *pInt_NetType = nNetType; if (STORAGE_NETTYPE_HTTPWEBDAV == nNetType) { - bRet = NetCore_TCPXCore_CBSendEx(xhNetWebdav, lpszClientAddr, XEngine_Download_CBSend, &nNetType); + bRet = NetCore_TCPXCore_CBSendEx(xhNetWebdav, lpszClientAddr, XEngine_Download_CBSend, pInt_NetType); } else { - bRet = NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend, &nNetType); + bRet = NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend, pInt_NetType); } if (!bRet) { @@ -345,8 +354,6 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,设置回调下载失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return false; } - HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize, tszFieldStr); - XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,请求下载文件成功,文件名:%s,总大小:%llu,发送大小:%llu,范围:%d - %d"), lpszClientAddr, tszFileDir, ullCount, ullSize, nPosStart, nPosEnd); return true; } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index fca3a79..17c953b 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -143,6 +143,10 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int else if (0 == _tcsxnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodGet))) { if (st_ServiceCfg.st_XStorage.bWDLocation) + { + XEngine_Task_HttpDownload(lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount, STORAGE_NETTYPE_HTTPWEBDAV); + } + else { //使用重定向实现下载 st_HDRParam.bIsClose = true; @@ -165,14 +169,19 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,请求文件下载被重定向到:%s"), lpszClientAddr, tszRequestAddr); } - else - { - XEngine_Task_HttpDownload(lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount, STORAGE_NETTYPE_HTTPWEBDAV); - } } else if (0 == _tcsxnicmp(lpszMethodPut, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodPut))) { if (st_ServiceCfg.st_XStorage.bWDLocation) + { + //转换参数格式:/storagekey1/webdav/clash-verge-rev-backup/backup.zip 为 /api?filename=webdav/clash-verge-rev-backup/backup.zip&storeagekey=storagekey1 + XCHAR tszConvertStr[XPATH_MAX] = {}; + APIHelp_Api_WDToUrl(pSt_HTTPParam->tszHttpUri, tszConvertStr); + memset(pSt_HTTPParam->tszHttpUri, '\0', sizeof(pSt_HTTPParam->tszHttpUri)); + _tcsxcpy(pSt_HTTPParam->tszHttpUri, tszConvertStr); + XEngine_Task_HttpUPLoader(lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount, STORAGE_NETTYPE_HTTPWEBDAV); + } + else { //使用重定向实现上传 st_HDRParam.bIsClose = false; @@ -208,15 +217,6 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,请求文件上传被重定向到:%s"), lpszClientAddr, tszRequestAddr); } - else - { - //转换参数格式:/storagekey1/webdav/clash-verge-rev-backup/backup.zip 为 /api?filename=webdav/clash-verge-rev-backup/backup.zip&storeagekey=storagekey1 - XCHAR tszConvertStr[XPATH_MAX] = {}; - APIHelp_Api_WDToUrl(pSt_HTTPParam->tszHttpUri, tszConvertStr); - memset(pSt_HTTPParam->tszHttpUri, '\0', sizeof(pSt_HTTPParam->tszHttpUri)); - _tcsxcpy(pSt_HTTPParam->tszHttpUri, tszConvertStr); - XEngine_Task_HttpUPLoader(lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount, STORAGE_NETTYPE_HTTPWEBDAV); - } } else if (0 == _tcsxnicmp(lpszMethodLock, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodLock))) { From 0f5e67f32bd0ccd7254b47f8c20decc93d49fa5a Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 17 Jun 2025 13:59:34 +0800 Subject: [PATCH 23/29] added:user verification for webdav added:pass authorize type field --- .../Protocol_StoragePacket.cpp | 22 +++++++----- .../Protocol_Packet/Protocol_StoragePacket.h | 2 +- .../StorageProtocol_Define.h | 21 ++++++----- XEngine_Source/StorageModule_Protocol/pch.cpp | 4 +-- .../XEngine_StorageApp/StorageApp_Center.cpp | 2 +- .../StorageApp_Download.cpp | 2 +- .../StorageApp_UPLoader.cpp | 2 +- .../XEngine_StorageApp/StorageApp_Webdav.cpp | 36 +++++++++++++++++++ 8 files changed, 69 insertions(+), 22 deletions(-) diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp index e54d542..4317f06 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp @@ -316,37 +316,42 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_DirOperator(XCHAR* ptszMsgB /******************************************************************** 函数名称:Protocol_StoragePacket_BasicAuth 函数功能:基本验证协议代理转发 - 参数.一:lpszMethod + 参数.一:lpszRequestType + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:请求的业务类型 + 参数.二:lpszMethod In/Out:In 类型:常量字符指针 可空:N 意思:方法名称 - 参数.二:lpszPostUrl + 参数.三:lpszPostUrl In/Out:In 类型:常量字符指针 可空:N 意思:用户提交的地址 - 参数.三:lpszClientAddr + 参数.四:lpszClientAddr In/Out:In 类型:常量字符指针 可空:N 意思:用户发送的客户端地址 - 参数.四:lpszUser + 参数.五:lpszUser In/Out:In 类型:常量字符指针 可空:N 意思:用户 - 参数.五:lpszPass + 参数.六:lpszPass In/Out:In 类型:常量字符指针 可空:N 意思:密码 - 参数.六:ptszMsgBuffer + 参数.七:ptszMsgBuffer In/Out:Out 类型:字符指针 可空:N 意思:转发数据包 - 参数.七:pInt_MsgLen + 参数.八:pInt_MsgLen In/Out:Out 类型:整数型 可空:N @@ -356,7 +361,7 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_DirOperator(XCHAR* ptszMsgB 意思:是否成功 备注: *********************************************************************/ -bool CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR* ptszMsgBuffer, int* pInt_MsgLen) +bool CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(int nRequestType, LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR* ptszMsgBuffer, int* pInt_MsgLen) { Protocol_IsErrorOccur = false; @@ -368,6 +373,7 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(LPCXSTR lpszMetho } Json::Value st_JsonRoot; + st_JsonRoot["Type"] = nRequestType; st_JsonRoot["lpszMethod"] = lpszMethod; st_JsonRoot["lpszPostUrl"] = lpszPostUrl; st_JsonRoot["lpszClientAddr"] = lpszClientAddr; diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h index 82eba76..e95a8eb 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h @@ -21,7 +21,7 @@ class CProtocol_StoragePacket bool Protocol_StoragePacket_QueryFile(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XSTORAGECORE_DBFILE*** pppSt_DBFile, int nListCount, LPCXSTR lpszTimeStart = NULL, LPCXSTR lpszTimeEnd = NULL, XNETHANDLE xhToken = 0); bool Protocol_StoragePacket_Info(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, SESSION_STORAGEINFO*** pppSt_DLInfo, SESSION_STORAGEINFO*** pppSt_UPInfo, int nDLCount, int nUPCount); bool Protocol_StoragePacket_DirOperator(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** pppszListEnum, int nListCount); - bool Protocol_StoragePacket_BasicAuth(LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); + bool Protocol_StoragePacket_BasicAuth(int nRequestType, LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); bool Protocol_StoragePacket_UPDown(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszBuckKey, LPCXSTR lpszFileName, LPCXSTR lpszClientAddr, __int64x nFileSize, bool bDown, LPCXSTR lpszFileHash = NULL); bool Protocol_StoragePacket_REQFile(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName = NULL, LPCXSTR lpszFileHash = NULL, XNETHANDLE xhToken = 0); bool Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XNETHANDLE xhToken, XENGINE_ACTIONINFO* pSt_ActionInfo); diff --git a/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h b/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h index 5c3ea11..9615ec6 100644 --- a/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h +++ b/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h @@ -328,37 +328,42 @@ extern "C" bool Protocol_StoragePacket_HTTPPacket(XCHAR* ptszMsgBuffer, int* pIn /******************************************************************** 函数名称:Protocol_StoragePacket_BasicAuth 函数功能:基本验证协议代理转发 - 参数.一:lpszMethod + 参数.一:lpszRequestType + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:请求的业务类型 + 参数.二:lpszMethod In/Out:In 类型:常量字符指针 可空:N 意思:方法名称 - 参数.二:lpszPostUrl + 参数.三:lpszPostUrl In/Out:In 类型:常量字符指针 可空:N 意思:用户提交的地址 - 参数.三:lpszClientAddr + 参数.四:lpszClientAddr In/Out:In 类型:常量字符指针 可空:N 意思:用户发送的客户端地址 - 参数.四:lpszUser + 参数.五:lpszUser In/Out:In 类型:常量字符指针 可空:N 意思:用户 - 参数.五:lpszPass + 参数.六:lpszPass In/Out:In 类型:常量字符指针 可空:N 意思:密码 - 参数.六:ptszMsgBuffer + 参数.七:ptszMsgBuffer In/Out:Out 类型:字符指针 可空:N 意思:转发数据包 - 参数.七:pInt_MsgLen + 参数.八:pInt_MsgLen In/Out:Out 类型:整数型 可空:N @@ -368,7 +373,7 @@ extern "C" bool Protocol_StoragePacket_HTTPPacket(XCHAR* ptszMsgBuffer, int* pIn 意思:是否成功 备注: *********************************************************************/ -extern "C" bool Protocol_StoragePacket_BasicAuth(LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR * ptszMsgBuffer, int* pInt_MsgLen); +extern "C" bool Protocol_StoragePacket_BasicAuth(int nRequestType, LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR * ptszMsgBuffer, int* pInt_MsgLen); /******************************************************************** 函数名称:Protocol_StoragePacket_UPDown 函数功能:上传下载完成代理通知协议 diff --git a/XEngine_Source/StorageModule_Protocol/pch.cpp b/XEngine_Source/StorageModule_Protocol/pch.cpp index 16c4cf0..6520771 100644 --- a/XEngine_Source/StorageModule_Protocol/pch.cpp +++ b/XEngine_Source/StorageModule_Protocol/pch.cpp @@ -72,9 +72,9 @@ extern "C" bool Protocol_StoragePacket_HTTPPacket(XCHAR* ptszMsgBuffer, int* pIn { return m_StoragePacket.Protocol_StoragePacket_HTTPPacket(ptszMsgBuffer, pInt_MsgLen, nCode, lpszMSGInfo); } -extern "C" bool Protocol_StoragePacket_BasicAuth(LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR * ptszMsgBuffer, int* pInt_MsgLen) +extern "C" bool Protocol_StoragePacket_BasicAuth(int nRequestType, LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR * ptszMsgBuffer, int* pInt_MsgLen) { - return m_StoragePacket.Protocol_StoragePacket_BasicAuth(lpszMethod, lpszPostUrl, lpszClientAddr, lpszUser, lpszPass, ptszMsgBuffer, pInt_MsgLen); + return m_StoragePacket.Protocol_StoragePacket_BasicAuth(nRequestType, lpszMethod, lpszPostUrl, lpszClientAddr, lpszUser, lpszPass, ptszMsgBuffer, pInt_MsgLen); } extern "C" bool Protocol_StoragePacket_UPDown(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszBuckKey, LPCXSTR lpszFileName, LPCXSTR lpszClientAddr, __int64x nFileSize, bool bDown, LPCXSTR lpszFileHash) { diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp index 9fff87c..0448450 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp @@ -87,7 +87,7 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int int nResponseCode = 0; XCHAR* ptszBody = NULL; - Protocol_StoragePacket_BasicAuth(pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); + Protocol_StoragePacket_BasicAuth(STORAGE_NETTYPE_HTTPCENTER, pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszAuthPass, tszSDBuffer, &nResponseCode, &ptszBody, &nSDLen); if (200 != nResponseCode) { diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp index 027b7d4..f508826 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp @@ -198,7 +198,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in int nResponseCode = 0; XCHAR* ptszBody = NULL; - Protocol_StoragePacket_BasicAuth(pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); + Protocol_StoragePacket_BasicAuth(STORAGE_NETTYPE_HTTPDOWNLOAD, pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszAuthPass, tszSDBuffer, &nResponseCode, &ptszBody, &nSDLen); if (200 != nResponseCode) { diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp index ca6862a..f81879e 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp @@ -115,7 +115,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in int nResponseCode = 0; XCHAR* ptszBody = NULL; - Protocol_StoragePacket_BasicAuth(pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); + Protocol_StoragePacket_BasicAuth(STORAGE_NETTYPE_HTTPUPLOADER, pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszAuthPass, tszSDBuffer, &nResponseCode, &ptszBody, &nSDLen); if (200 != nResponseCode) { diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index 17c953b..8156133 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -61,6 +61,42 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int st_HDRParam.bIsClose = false; st_HDRParam.nHttpCode = 200; _tcsxcpy(st_HDRParam.tszMimeType, _X("xml")); + + if (st_ServiceCfg.st_XProxy.bAuthPass) + { + XCHAR tszUserName[64]; + XCHAR tszUserPass[64]; + + memset(tszUserName, '\0', sizeof(tszUserName)); + memset(tszUserPass, '\0', sizeof(tszUserPass)); + if (!APIHelp_Api_ProxyAuth(tszUserName, tszUserPass, pptszListHdr, nHdrCount)) + { + st_HDRParam.bAuth = true; + st_HDRParam.nHttpCode = 401; + + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("WEBDAV客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); + return false; + } + int nResponseCode = 0; + XCHAR* ptszBody = NULL; + + Protocol_StoragePacket_BasicAuth(STORAGE_NETTYPE_HTTPWEBDAV, pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszAuthPass, tszSDBuffer, &nResponseCode, &ptszBody, &nSDLen); + if (200 != nResponseCode) + { + st_HDRParam.bAuth = true; + st_HDRParam.nHttpCode = nResponseCode; + + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("WEBDAV客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); + } + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszBody); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.tszAuthPass, tszUserName, tszUserPass); + st_HDRParam.bAuth = true; + } //http://127.0.0.1:5103/storagekey1 if (0 == _tcsxnicmp(lpszMethodOption, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodOption))) { From 6e82409302676526c6470fda075ed4ecdea8d0fd Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 17 Jun 2025 14:41:27 +0800 Subject: [PATCH 24/29] added:file lock and create time attribute support for webdav --- .../Protocol_StoragePacket.cpp | 32 +++++++++++++++++++ .../StorageApp_UPLoader.cpp | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp index 4317f06..96d2af7 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp @@ -820,6 +820,15 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBu XMLElement* pSt_XMLModifyTime = m_XMLDocument.NewElement("d:getlastmodified"); pSt_XMLModifyTime->SetText(tszGMTTime); pSt_XMLProp->InsertEndChild(pSt_XMLModifyTime); + //属性创建时间 +#if XENGINE_VERSION_KERNEL >= 9 && XENGINE_VERSION_MAIN >= 22 + XCHAR tszISOTime[128] = {}; + BaseLib_Time_ISOTime(tszISOTime, st_FileAttr.nCreateTime); + + XMLElement* pSt_XMLCreateTime = m_XMLDocument.NewElement("d:creationdate"); + pSt_XMLCreateTime->SetText(tszISOTime); + pSt_XMLProp->InsertEndChild(pSt_XMLCreateTime); +#endif if (st_FileAttr.bFile) { //增加会话属性 @@ -880,6 +889,29 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBu pSt_XMHTokenRef->SetText(st_WDLocker.tszToken); pSt_XMLLockToken->InsertEndChild(pSt_XMHTokenRef); } + else + { + //没有锁定 + // 子元素 + XMLElement* pSt_XMLLockSupport = m_XMLDocument.NewElement("d:supportedlock"); + pSt_XMLProp->InsertEndChild(pSt_XMLLockSupport); + + XMLElement* pSt_XMLLockEntry = m_XMLDocument.NewElement("d:lockentry"); + pSt_XMLLockSupport->InsertEndChild(pSt_XMLLockEntry); + + XMLElement* pSt_XMLLockScope = m_XMLDocument.NewElement("d:lockscope"); + pSt_XMLLockEntry->InsertEndChild(pSt_XMLLockScope); + XMLElement* pSt_XMLLockExclusive = m_XMLDocument.NewElement("d:exclusive"); + pSt_XMLLockScope->InsertEndChild(pSt_XMLLockExclusive); + + XMLElement* pSt_XMLLockType = m_XMLDocument.NewElement("d:locktype"); + pSt_XMLLockEntry->InsertEndChild(pSt_XMLLockType); + XMLElement* pSt_XMLLockWrite = m_XMLDocument.NewElement("d:write"); + pSt_XMLLockType->InsertEndChild(pSt_XMLLockWrite); + + XMLElement* pSt_XMLLockDiscovery = m_XMLDocument.NewElement("d:lockdiscovery"); + pSt_XMLProp->InsertEndChild(pSt_XMLLockDiscovery); + } } else { diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp index f81879e..331bcd8 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp @@ -324,7 +324,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in memset(ptszIPClient, '\0', XPATH_MAX); _tcsxcpy(ptszIPClient, lpszClientAddr); - nLimit = nLimit == 0 ? st_ServiceCfg.st_XLimit.nMaxUPLoader : nLimit; + nLimit = nLimit == 0 ? (int)st_ServiceCfg.st_XLimit.nMaxUPLoader : nLimit; xhUPSpeed = Algorithm_Calculation_Create(); Algorithm_Calculation_PassiveOPen(xhUPSpeed, XEngine_UPLoader_UPFlow, nLimit, 0, 0, false, ptszIPClient); NetCore_TCPXCore_PasueRecvEx(xhNetUPLoader, lpszClientAddr, false); From db93aeb0d04f01b232e06293a2cf82437171de66 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 19 Jun 2025 09:42:37 +0800 Subject: [PATCH 25/29] fixed:name space is incorrect for web dav --- .../Protocol_StoragePacket.cpp | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp index 96d2af7..3caa8d0 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp @@ -373,7 +373,7 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(int nRequestType, } Json::Value st_JsonRoot; - st_JsonRoot["Type"] = nRequestType; + st_JsonRoot["nRequestType"] = nRequestType; st_JsonRoot["lpszMethod"] = lpszMethod; st_JsonRoot["lpszPostUrl"] = lpszPostUrl; st_JsonRoot["lpszClientAddr"] = lpszClientAddr; @@ -837,55 +837,55 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBu if (Session_Webdav_Get(tszFileAlis, &st_WDLocker)) { // 子元素 - XMLElement* pSt_XMLLockDiscovery = m_XMLDocument.NewElement("D:lockdiscovery"); + XMLElement* pSt_XMLLockDiscovery = m_XMLDocument.NewElement("d:lockdiscovery"); pSt_XMLProp->InsertEndChild(pSt_XMLLockDiscovery); // 子元素 - XMLElement* pSt_XMLLockActive = m_XMLDocument.NewElement("D:activelock"); + XMLElement* pSt_XMLLockActive = m_XMLDocument.NewElement("d:activelock"); pSt_XMLLockDiscovery->InsertEndChild(pSt_XMLLockActive); // 子元素 - XMLElement* pSt_XMLLockType = m_XMLDocument.NewElement("D:locktype"); + XMLElement* pSt_XMLLockType = m_XMLDocument.NewElement("d:locktype"); pSt_XMLLockActive->InsertEndChild(pSt_XMLLockType); if (1 == st_WDLocker.byLockOP) { - XMLElement* pSt_XMLLockWrite = m_XMLDocument.NewElement("D:write"); + XMLElement* pSt_XMLLockWrite = m_XMLDocument.NewElement("d:write"); pSt_XMLLockType->InsertEndChild(pSt_XMLLockWrite); } else if (2 == st_WDLocker.byLockOP) { - XMLElement* pSt_XMLLockRead = m_XMLDocument.NewElement("D:read"); + XMLElement* pSt_XMLLockRead = m_XMLDocument.NewElement("d:read"); pSt_XMLLockType->InsertEndChild(pSt_XMLLockRead); } // 子元素 - XMLElement* pSt_XMLLockScope = m_XMLDocument.NewElement("D:lockscope"); + XMLElement* pSt_XMLLockScope = m_XMLDocument.NewElement("d:lockscope"); pSt_XMLLockActive->InsertEndChild(pSt_XMLLockScope); if (1 == st_WDLocker.byLockType) { - XMLElement* pSt_XMLLockExclusive = m_XMLDocument.NewElement("D:exclusive"); + XMLElement* pSt_XMLLockExclusive = m_XMLDocument.NewElement("d:exclusive"); pSt_XMLLockScope->InsertEndChild(pSt_XMLLockExclusive); } else if (2 == st_WDLocker.byLockType) { - XMLElement* pSt_XMLLockShared = m_XMLDocument.NewElement("D:shared"); + XMLElement* pSt_XMLLockShared = m_XMLDocument.NewElement("d:shared"); pSt_XMLLockScope->InsertEndChild(pSt_XMLLockShared); } // 子元素 - XMLElement* pSt_XMLDepth = m_XMLDocument.NewElement("D:depth"); + XMLElement* pSt_XMLDepth = m_XMLDocument.NewElement("d:depth"); pSt_XMLDepth->SetText(_X("Infinity")); pSt_XMLLockActive->InsertEndChild(pSt_XMLDepth); // 子元素 - XMLElement* pSt_XMLOwner = m_XMLDocument.NewElement("D:owner"); + XMLElement* pSt_XMLOwner = m_XMLDocument.NewElement("d:owner"); pSt_XMLLockActive->InsertEndChild(pSt_XMLOwner); - XMLElement* pSt_XMHRef = m_XMLDocument.NewElement("D:href"); + XMLElement* pSt_XMHRef = m_XMLDocument.NewElement("d:href"); pSt_XMHRef->SetText(st_WDLocker.tszOwner); pSt_XMLOwner->InsertEndChild(pSt_XMHRef); // 子元素 - XMLElement* pSt_XMLTimeout = m_XMLDocument.NewElement("D:timeout"); + XMLElement* pSt_XMLTimeout = m_XMLDocument.NewElement("d:timeout"); pSt_XMLTimeout->SetText(st_WDLocker.tszTimeout); pSt_XMLLockActive->InsertEndChild(pSt_XMLTimeout); // 子元素 - XMLElement* pSt_XMLLockToken = m_XMLDocument.NewElement("D:locktoken"); + XMLElement* pSt_XMLLockToken = m_XMLDocument.NewElement("d:locktoken"); pSt_XMLLockActive->InsertEndChild(pSt_XMLLockToken); - XMLElement* pSt_XMHTokenRef = m_XMLDocument.NewElement("D:href"); + XMLElement* pSt_XMHTokenRef = m_XMLDocument.NewElement("d:href"); pSt_XMHTokenRef->SetText(st_WDLocker.tszToken); pSt_XMLLockToken->InsertEndChild(pSt_XMHTokenRef); } @@ -979,55 +979,55 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer pSt_XMLRoot->SetAttribute("xmlns:d", "DAV:"); m_XMLDocument.InsertEndChild(pSt_XMLRoot); // 子元素 - XMLElement* pSt_XMLLockDiscovery = m_XMLDocument.NewElement("D:lockdiscovery"); + XMLElement* pSt_XMLLockDiscovery = m_XMLDocument.NewElement("d:lockdiscovery"); pSt_XMLRoot->InsertEndChild(pSt_XMLLockDiscovery); // 子元素 - XMLElement* pSt_XMLLockActive = m_XMLDocument.NewElement("D:activelock"); + XMLElement* pSt_XMLLockActive = m_XMLDocument.NewElement("d:activelock"); pSt_XMLLockDiscovery->InsertEndChild(pSt_XMLLockActive); // 子元素 - XMLElement* pSt_XMLLockType = m_XMLDocument.NewElement("D:locktype"); + XMLElement* pSt_XMLLockType = m_XMLDocument.NewElement("d:locktype"); pSt_XMLLockActive->InsertEndChild(pSt_XMLLockType); if (1 == pSt_WDLock->byLockOP) { - XMLElement* pSt_XMLLockWrite = m_XMLDocument.NewElement("D:write"); + XMLElement* pSt_XMLLockWrite = m_XMLDocument.NewElement("d:write"); pSt_XMLLockType->InsertEndChild(pSt_XMLLockWrite); } else if (2 == pSt_WDLock->byLockOP) { - XMLElement* pSt_XMLLockRead = m_XMLDocument.NewElement("D:read"); + XMLElement* pSt_XMLLockRead = m_XMLDocument.NewElement("d:read"); pSt_XMLLockType->InsertEndChild(pSt_XMLLockRead); } // 子元素 - XMLElement* pSt_XMLLockScope = m_XMLDocument.NewElement("D:lockscope"); + XMLElement* pSt_XMLLockScope = m_XMLDocument.NewElement("d:lockscope"); pSt_XMLLockActive->InsertEndChild(pSt_XMLLockScope); if (1 == pSt_WDLock->byLockType) { - XMLElement* pSt_XMLLockExclusive = m_XMLDocument.NewElement("D:exclusive"); + XMLElement* pSt_XMLLockExclusive = m_XMLDocument.NewElement("d:exclusive"); pSt_XMLLockScope->InsertEndChild(pSt_XMLLockExclusive); } else if (2 == pSt_WDLock->byLockType) { - XMLElement* pSt_XMLLockShared = m_XMLDocument.NewElement("D:shared"); + XMLElement* pSt_XMLLockShared = m_XMLDocument.NewElement("d:shared"); pSt_XMLLockScope->InsertEndChild(pSt_XMLLockShared); } // 子元素 - XMLElement* pSt_XMLDepth = m_XMLDocument.NewElement("D:depth"); + XMLElement* pSt_XMLDepth = m_XMLDocument.NewElement("d:depth"); pSt_XMLDepth->SetText(_X("Infinity")); pSt_XMLLockActive->InsertEndChild(pSt_XMLDepth); // 子元素 - XMLElement* pSt_XMLOwner = m_XMLDocument.NewElement("D:owner"); + XMLElement* pSt_XMLOwner = m_XMLDocument.NewElement("d:owner"); pSt_XMLLockActive->InsertEndChild(pSt_XMLOwner); - XMLElement* pSt_XMHRef = m_XMLDocument.NewElement("D:href"); + XMLElement* pSt_XMHRef = m_XMLDocument.NewElement("d:href"); pSt_XMHRef->SetText(pSt_WDLock->tszOwner); pSt_XMLOwner->InsertEndChild(pSt_XMHRef); // 子元素 - XMLElement* pSt_XMLTimeout = m_XMLDocument.NewElement("D:timeout"); + XMLElement* pSt_XMLTimeout = m_XMLDocument.NewElement("d:timeout"); pSt_XMLTimeout->SetText(pSt_WDLock->tszTimeout); pSt_XMLLockActive->InsertEndChild(pSt_XMLTimeout); // 子元素 - XMLElement* pSt_XMLLockToken = m_XMLDocument.NewElement("D:locktoken"); + XMLElement* pSt_XMLLockToken = m_XMLDocument.NewElement("d:locktoken"); pSt_XMLLockActive->InsertEndChild(pSt_XMLLockToken); - XMLElement* pSt_XMHTokenRef = m_XMLDocument.NewElement("D:href"); + XMLElement* pSt_XMHTokenRef = m_XMLDocument.NewElement("d:href"); pSt_XMHTokenRef->SetText(pSt_WDLock->tszToken); pSt_XMLLockToken->InsertEndChild(pSt_XMHTokenRef); // 将 XML 数据保存到字符串 @@ -1087,17 +1087,17 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropPatch(XCHAR* ptszMsgB pSt_XMLRoot->SetAttribute("xmlns:d", "DAV:"); m_XMLDocument.InsertEndChild(pSt_XMLRoot); // 子元素 - XMLElement* pSt_XMLResponse = m_XMLDocument.NewElement("D:response"); + XMLElement* pSt_XMLResponse = m_XMLDocument.NewElement("d:response"); pSt_XMLRoot->InsertEndChild(pSt_XMLResponse); // 子元素 - XMLElement* pSt_XMLHRef = m_XMLDocument.NewElement("D:href"); + XMLElement* pSt_XMLHRef = m_XMLDocument.NewElement("d:href"); pSt_XMLHRef->SetText(lpszFileName); pSt_XMLResponse->InsertEndChild(pSt_XMLHRef); // 子元素 - XMLElement* pSt_XMLPropStat = m_XMLDocument.NewElement("D:propstat"); + XMLElement* pSt_XMLPropStat = m_XMLDocument.NewElement("d:propstat"); pSt_XMLResponse->InsertEndChild(pSt_XMLPropStat); // 子元素 - XMLElement* pSt_XMLProp = m_XMLDocument.NewElement("D:prop"); + XMLElement* pSt_XMLProp = m_XMLDocument.NewElement("d:prop"); pSt_XMLPropStat->InsertEndChild(pSt_XMLProp); // 子元素 for (auto stl_ListIterator = pStl_ListName->begin(); stl_ListIterator != pStl_ListName->end(); stl_ListIterator++) @@ -1106,7 +1106,7 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropPatch(XCHAR* ptszMsgB pSt_XMLProp->InsertEndChild(pSt_XMLListValue); } // 子元素 - XMLElement* pSt_XMLStatus = m_XMLDocument.NewElement("D:status"); + XMLElement* pSt_XMLStatus = m_XMLDocument.NewElement("d:status"); pSt_XMLStatus->SetText("HTTP/1.1 200 OK"); pSt_XMLPropStat->InsertEndChild(pSt_XMLStatus); // 将 XML 数据保存到字符串 From ccaf71cf94f97683c68895b2076b3bca0205bfcc Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 19 Jun 2025 09:43:37 +0800 Subject: [PATCH 26/29] fixed:empty Folders handle incorrect --- XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp index 8156133..d8055a1 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp @@ -167,6 +167,13 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int { SystemApi_File_EnumFile(tszFileUrl, &pptszListFile, &nListCount); } + //如果是空的文件夹 + if (0 == nListCount) + { + nListCount = 1; + BaseLib_Memory_Malloc((XPPPMEM)&pptszListFile, nListCount, XPATH_MAX); + _tcsxcpy(pptszListFile[0], tszFileUrl); + } } Protocol_StoragePacket_WDPropfind(tszRVBuffer, &nRVLen, &pptszListFile, nListCount, st_StorageBucket.tszFilePath, st_StorageBucket.tszBuckKey); From 6981613511c9a97218814d5dd1ae11f6e9a97e67 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 19 Jun 2025 16:32:01 +0800 Subject: [PATCH 27/29] fixed:parameter conflict --- .../XEngine_StorageApp/StorageApp_Config.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp index 1381a00..61d3880 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp @@ -59,10 +59,6 @@ bool StorageApp_Config_Parament(int argc,char **argv) printf("Version:%s\n", m_StrVersion.c_str()); return false; } - else if (0 == _tcsxcmp("-l", argv[i])) - { - st_ServiceCfg.st_XLog.nLogLeave = _ttxoi(argv[++i]); - } else if (0 == _tcsxcmp("-d", argv[i])) { st_ServiceCfg.bDeamon = _ttxoi(argv[++i]); @@ -75,6 +71,10 @@ bool StorageApp_Config_Parament(int argc,char **argv) { st_ServiceCfg.bReuseraddr = true; } + else if (0 == _tcsxcmp("-t", argv[i])) + { + bIsTest = true; + } else if (0 == _tcsxcmp("-lt", argv[i])) { st_ServiceCfg.st_XLog.nLogType = _ttxoi(argv[++i]); @@ -82,10 +82,6 @@ bool StorageApp_Config_Parament(int argc,char **argv) else if (0 == _tcsxcmp("-ll", argv[i])) { st_ServiceCfg.st_XLog.nLogLeave = _ttxoi(argv[++i]); - } - else if (0 == _tcsxcmp("-t", argv[i])) - { - bIsTest = true; } else if (0 == _tcsxcmp("-l", argv[i])) { From d5ba321918668d27ce1e7c89543fdfa9599406f2 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 20 Jun 2025 11:16:46 +0800 Subject: [PATCH 28/29] modify:Parameters are not case sensitive --- .../XEngine_StorageApp/StorageApp_Config.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp index 61d3880..529fc22 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp @@ -48,49 +48,49 @@ bool StorageApp_Config_Parament(int argc,char **argv) for (int i = 0;i < argc;i++) { - if ((0 == _tcsxcmp("-h",argv[i])) || (0 == _tcsxcmp("-H",argv[i]))) + if ((0 == _tcsxicmp("-h",argv[i])) || (0 == _tcsxcmp("-H",argv[i]))) { StorageApp_Config_ParamentHelp(); return false; } - if ((0 == _tcsxcmp("-v", argv[i])) || (0 == _tcsxcmp("-V", argv[i]))) + if ((0 == _tcsxicmp("-v", argv[i])) || (0 == _tcsxcmp("-V", argv[i]))) { string m_StrVersion = st_ServiceCfg.st_XVer.pStl_ListStorage->front(); printf("Version:%s\n", m_StrVersion.c_str()); return false; } - else if (0 == _tcsxcmp("-d", argv[i])) + else if (0 == _tcsxicmp("-d", argv[i])) { st_ServiceCfg.bDeamon = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-r", argv[i])) + else if (0 == _tcsxicmp("-r", argv[i])) { st_ServiceCfg.st_Memory.bReload = true; } - else if (0 == _tcsxcmp("-u", argv[i])) + else if (0 == _tcsxicmp("-u", argv[i])) { st_ServiceCfg.bReuseraddr = true; } - else if (0 == _tcsxcmp("-t", argv[i])) + else if (0 == _tcsxicmp("-t", argv[i])) { bIsTest = true; } - else if (0 == _tcsxcmp("-lt", argv[i])) + else if (0 == _tcsxicmp("-lt", argv[i])) { st_ServiceCfg.st_XLog.nLogType = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-ll", argv[i])) + else if (0 == _tcsxicmp("-ll", argv[i])) { st_ServiceCfg.st_XLog.nLogLeave = _ttxoi(argv[++i]); } - else if (0 == _tcsxcmp("-l", argv[i])) + else if (0 == _tcsxicmp("-l", argv[i])) { LPCXSTR lpszLogLevel = argv[++i]; - if (0 == _tcsxcmp("debug", lpszLogLevel)) + if (0 == _tcsxicmp("debug", lpszLogLevel)) { st_ServiceCfg.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG; } - else if (0 == _tcsxcmp("info", lpszLogLevel)) + else if (0 == _tcsxicmp("info", lpszLogLevel)) { st_ServiceCfg.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO; } From 1773c51b8153ddf4e349eb78495670e58258c89b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 20 Jun 2025 11:24:27 +0800 Subject: [PATCH 29/29] modify:cancel sensitive update:configure file and document --- CHANGELOG | 51 +++++++ XEngine_Docment/Docment_en.docx | Bin 126207 -> 126666 bytes XEngine_Docment/Docment_zh.docx | Bin 129322 -> 130033 bytes .../XEngine_Config/XEngine_Config.json | 144 +++++++++--------- .../XEngine_Config/XEngine_VersionConfig.json | 1 + .../XEngine_StorageApp/StorageApp_Config.cpp | 22 +-- 6 files changed, 135 insertions(+), 83 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0c33829..15d9475 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,54 @@ +XEngine_Storage V3.20.0.1001 + +增加:更多的系统发布支持 +增加:webdav没有找到文件的时候响应问题 +增加:webdav用户授权验证 +增加:http hook 验证字段类型 +增加:webdav响应文件锁定类型和创建时间属性 +更新:g++版本 +更新:依赖库 +优化:编译选项 +优化:设置日志级别通过启动命令 +优化:回调发送失败处理 +修改:仅发布版本发送报告 +修改:center请求url方法 +修改:option方法改为get +修改:PROPFIND响应内存时间和大小 +修改:上传下载代码支持指定网络类型了 +修改:上传下载复用消息支持 +修正:http验证函数没有导出 +修正:帮助模块没有错误码的问题 +修正:webdav响应类型错误 +修正:webdav mkloc没有创建目录问题 +修正:webdav名词空间不正确 +修正:webdav空目录处理问题 +删除:http管理接口多余参数 + +added:ci debian and fedora system build support +added:not found file response for web dav +added:user verification for webdav +added:pass authorize type field +added:file lock and create time attribute support for webdav +update:make file g++ version +update:depend library +improved:make file build flags +improved:set log level though start command +improved:cb send get failure process +modify:just release report info +modify:request url method for center +modify:option method name to get +modify:PROPFIND reply contact modify time and size +modify:download and upload support specifies the network type +modify:upload and download method mix support +fixed:http verification function not export +fixed:have no error code export for help module +fixed:webdav response type is incorrect +fixed:webdav mkloc not create dir +fixed:PROPFIND sometime have no name field +fixed:name space is incorrect for web dav +fixed:empty Folders handle incorrect +delete:more parameter for manage and pass +====================================================================================== XEngine_Storage V3.19.0.1001 增加:获取bucket列表信息功能 diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index 00d5d415fb1e3755cd99098bd3a8015e73bc7c2d..0440d75ede4e2b903bd150aa1f8d2cd440490729 100644 GIT binary patch delta 88133 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 N zisP-z(FZ(bW$ybW#Ak{latlu>Ipwv5nnrK4&`@!6>L?4n(Bm_8c_-Fg0zW~$`C;Fc z({dg-E$w(y^{>x(Y#Wgl2l4|U`^AV`yF46{o;m)w5hc+y}je#HX>3 zxOwmNQ3IdtzJCIDCpsgf!24~4IxwDiL~2;ydz|xO&BGbZxDUFJ!rd5;OU;RA0GIofXc z=5BN~Ga@NP)S;Z48+VC6x8#eNyK`Iqu)X(u)JUKE8h5NduhfIFfb+UHn_#3yR6v~P zvrK6xUVr&)+y_I5O|*PBh(Y3QcEx*nTC|WfFjjM2g@W@~ZV>0hiDWknZ(obZEE6@F zvMuppT=|9_3~kj7S~cuOa%0LFqeWMYxbcccOAo83Z)~Mv4ovSRJ@f&6^ES*g-BjhH zxd8@{SuTI>gmO!jpA#suP*2IDbGHXcL9hfR^IQ*A2XGd1pg4-L+Xd zM(TyMjO^)(b7ibJxWy7zxHytgYbeCKsUb4z!90^|Kn9-eTlU9{>#H-L_}OZ%8*>su zyy+n#_K|bFwT6p+{q>og82!4n)rQ>v)*d#hpKsMAj9Dv3cnrTt;W>Pf6q6;d}w z^M7uA^3L$gwa}Q0-Iij-+w8Vi5?cS;qYtA;BuAd+EyOme5O4pZ>rAp_S#cn`C0YSP z+WjvnO_9^<^=kC(M1}_r!qk~cD41swl37pa_U^+W5ScbnXW{nM67Pedn+f%i97!0J zy4uvNMsmka3FBhdqm$StA*6N8tllYx!e+PG%(Y_#GH(_JFI7$vyt1)lXMBnMRBzB{yuij;S!k0~;DH~IC9 z^b}DeN{Ck|A~MrMo_P048ME?2D(l1Ew{A!QgD8LUN7tDo$&$iQ@Jb8pc z)}Hoz)oxiCNr2F-m9ay5ka9_P5&07KPzh2OMG-^}Pj(c!1*buZygEqRi1~Zv@LT9r zLIj^6#yC?(RFIh8j%2yhjoxFN(%==1YFg@b6y(<$xHXLbhzv_K8$3w=sEbQv8ahsh z61jg;h4`;MnXb5QQjr?vsfx^wGkQf<$LtxAuVNm45S?OtKVw^FIXbfp2K=6x9s7@p zv{p$I>QThls1{CSXmRk_Wa(YfR7JjMDM3W)b*Egzu;nUFX%x}X=C`nFI(!4h#4E}% z6ZtB3?}&JKn;)+AI;E3k6hvnjch!37$H{-v%idJc8zel{NT#kJ{>)5+CHXg{aN+ye zF?ohbi7|jktPXy2`$u;?k)^GTJAQv1ySE2%w10Y%*_f$*E=XVewj+d0UMUf;SdT6; z>c?92nKe;fjmWaed-S&4se4Dneo`ZAO5~FQg?s02pA@YSIlYpfucwz&AzL#dqzQk! zF^aU@29qcVoJ)J$1>K^j)@iCpfc&?6wQQG*o89j%Y3;P`M2vJ_J6 zCnT~YulWfgbVqBQqrWrx{Y75%93+x;PVvslF%<#jL5>`2iU^4G+^FNb$Y|JS`=1Qd zh=Y9Oix&A}n-VEe%Y(nPwDeGO5V3zm)i)xuVU}BHNO9QJ@SwCsCM4uj}Ky%yzX7sth93cjOofEZ>vbNO&&mz?v?x@BBNJ| z+=(oolqV$e`J?PJk!_B*OtvRQ1lO&lgxP07@61LP zB3Cv#p6wYvKwO=f;uIqZTL!;p){GrJg))cZv3DSwh6EG@sworbz@=ElCxEPH%KSyzp{y1W&)647WVePEe-w#hjyy~0kz(mXwbrlrpF+GDxpJ-K!_(S_AzhRs5 zZi6^>UlW;j(bCIOPZsO`BKHS*KGCmSQq^+PXG*fLnvk^qF!~aOmsoKivg${miGwjVRqThqw$&#bTG`;O0hjKkch7Zb25ZN)M3W%`7a*>+nGQbg1M8_%J%)(qg}SoDgcKBf3l?)$ z`PojIlw%eoYW$I0X?=7WOUPH$UG#dSk>c-ZH6_%DMao0JOKGhR$_f)1+&5h0ONlza zh;08*B9*AHr~H4>UiykbP)N>?IAGDmSkQA?TmY@=|Eyce)fHK(qHPxBp}io|7y49- zl($ATL%j?ME6Rux=_zAOF9_zYhedGW4VMbeW0TFn=|9%YSg=qV{NW`Xz4r&GsgJ6eB=qh%x#V;Yf2t)NZE`~;tFXMCsoab0K-!~U>A zV%Q&%lejaFNR4@>NM_%tb(SOTn&uD&X$hk|MK1yK@I`XR>H(3MZI91(XUmkcE%I?M z5E0#sXz72Im(oICwDd~DeDWaCB?F1>dcIFz_&V`zzveiND>4JkSQC;4$zHbdmSwag z%G;$JNQ`5fbU>$*O<38rBC#=R#e8bj#En6LRs*<>?=F z;O;e4e9E^B(y$&wB)5S!Q!UZWhxWCIaTZlA%h;DzCH@zl;2IMx(0Z2zC}o35>{5K& z`ViJU#8AalF}@&T8BcJnk-W)IaO(K+dqR>U2|bnHf(+M$_d=C^%@KAH9aP*^Hu}XF zrM`dP7E1qWpKMxw0*P{}tP3JV4Oi5n{sz}TI{8D-X>HPKFkYgwlN>F*s!dQR8&yP# zFGlXFq#Jt)s_ZtL6B(rA^eU0C0da>!wKG~dwM+0}bh-A`ICCTj_E-}+1?NPHT<6$f z?avzCCDmiBA+Cw1zqpOT}GpuHXBqda_(8RKq| z>`0Fwa*G}h-|21E(SuQMm^1jc@3h78;ND--|6b`7xNi4)rCOd|UpPIOm}iV)SD6?U zGgw8uQTG86w~g5*^^J-(L;qy6jDLSqW;(8c1S02gS&EEuS{+L{EzD)J6gMh8n}zon zJu(&=KKdNOahp*pTTT+CB$cIzm4(tp#GLwvh^)$1n@E4S6D?*BV9ZrSS`D33lRiAr z$0ZV7U6Dk4OFDBVUD;8ylPTq!`qhY3?)56t>_eTx>d1w<4vYLxwnDOXFW`UMu2)-* zcA|)LE{@fwfA|EJCHU}rw4@hpjHq1hD9QEz^M{(Zh;$cxYLildzIC$~`BFrrY&^6v zthJVDYLUn+h8m>xV~d}yhGf7L z5*wd!Zjp_hIcLGfm4=UGri_2R14U+Z4nndcZyd?ZIMY_-wSyMFt&*|(XAnCy8&AZ- zMam>pY$UD&jIwHta?zI2W$HNRPGr}_l45N?=vlCJ?eMApO2_$gB30rIpWqwOR|&}{ z>5sej`)r_XW>K?>{!!b-uxDHlDa5#@oWf=~3@9kx?gB z?3k_#$D9QbZ`A2qWc9?F(ETEz9LdfHt06>eWBkWrf)`fb*nRD>UiJR#{*dHS(AErc z(6?^SW#!=NJokq=3-*6zW)Gl6o;TmLk7HBuilk*{@(;IIm0 zy9?e6t$uZ521Khb^M3o!*hYJNA8IIV#r$oO{%y6ksmq(lf1(bOVFmSrwsg-?m!00e zk_PqN7tu*YuTNbcwu43LMf*pFbIItbZ^zTXczuj!;L7_5 zM^DsHq7{2(NpY?vzO!zM?qf(S`hg&E-SsFB?)Xu8(xiWfOum_}EOGSaMbTmBTju42 zvob}jJ9@*L3`*85qkQ3@ZPwoG*cq-zGmwJ%PJ1tZXh}png@PRmM7&@Yd=&o|wAz9k zlm|V9dO-J2Pv=KgauftQ-hfex*6>Cb=@}(#mkwP~x`?>*Q^&21nOC~ZvE*5{upq%^FOGyuXkka7`P8JsFb)rVx%S<>!Ic{J-c-Ke5%l`4#UW~scQgh8{ z?TYw^IX@9DFKGXC>6`=ey!8%jVnuuew6NQf$nk~Jh6^rdwhvQJ4K1i{%vBC{5( zGYZ#2M@b=*CFHfj*iOL|%7mFqf4{h2$s%7+;1=)Bnh{T)&BvCMm z5^2afL~oun^;)PylgO+Gdl~fTfrmbnK8`td@94ATirKYY2CY#~B@v6b1d>)B`Yrn! zE#rT!+1Jeb;XYW$64sXY&m8A`i?mWFuG`lmtB{Fr)T_D#70!|qSu*zU{Cqdc$B;aG zd}r+z(}#@X!VL~t&8zt=2c|-Z`7itZsmpgftMjM zhEE-}JiG?cFAaSGUQXtk2QNBwnBgTNk-$&=8b`jp>V2c`;&ny^HIi)yEj_OgL994^qhIEXG(^)rq5Dv zo_G-bQv5wr|KWY=(-Ys@K1c0nn@M|=<%&B|+Yl$c_GljR&_DW5Fjnm`zY%}^y)IKG zV{W*|taG%@d~L%%v?8Z8me=e4u+98Sg)_}X8u!xiPu3agZ~l3dHXs?5yK;)Ohnj=y zkg_)D-!AvZQ@?UCpU-#ljs7Z+v?uDoEg};GV~4&a{n3BmTdEaHmp!7<8i zm!l;iV&9J^I6Q?mNYwixx#@qR-%`XfMhK%wf^8X(?#3)bqTLfl*!?tHSZn1mY?e>S zS(S4zWSi=O#=R32NG!>3mgD8@?Ic74p zb78sjn(kBlYp+%AHQ{g7AN%^ntUZ2$TRAs;q?Gax5|ueWNaNVlNY;NFp2m@yOfC97 zBSoWpT7!|iI9dfGT6ADl*+{z-w9Q1!FsE@Oy;FQYBPZ@8En*p`I0tE5fi!ZYi{TUG zNSelVi`F98S!Co${pIg@nRE9=8dsHtpRwajJ4)+@o~%*AgUw_VoO~8U#uR_%*+WZ0 zq;2dzJ*xB&UeQ{O{Z)UX4xV)`GPP{Dt76U`Mioc>Do1d~|HwLA1B>|>__nRYJUJwh zGJvaN=A1P#OnU^a(3k<}7^56|)j!^X?R3!_KJ4h!{UEubjXq4;0am_BH=Oc4u#Rkj;NPv7J28gCSy-X;KtLa5B&HZ|Ge^zA*Jub$m($2&Me9O$YjAc zHzG=k?`ITQ$he|1S8&3Oh;(K2BaIRMDtrs$RGgz0#JDuK4)iOJFD0A^ z6C|eGAj!Hn`7_#X=)o8~AQIV`drgS+j?v|DQ~UAPbTt;tEgHAf!*Aj0uEiMGxHB!xrwDRb zOS`i)?AAPDwhEu%XJLvX8J&C2jJMlFNj_7FavmfR;-~#KQ>1ax@0qDroTDb9ivf4M zNSQy#Z0&ys`6Ag5$u2k*M?}^xYA7>B7iC&Ek$x~XrPch=xo<|c30gT*b_vc06p2b2 zeCj+JYj#tb%fMSxq;<5Nr>q>DOB%!zR;$dgzj%j~TpONk?dll1g=E%?-Tr3Td7}O{ z%kzSD1+zxl1lx^q^t^u1!}dy458Jjr0n#^8VaooO`{JaalB>0!pe)Hb;2Ii1lb z3uW(Yt`mfBu8nq4_Rc0ThV`^F=9B;Uo+oPt|5{7{!VHzEE10X!XY{N_&0$98W0d5x z>(<0R3sZV0&S4js{?Klm+65fno?iXKije7%Xa80L@_jJER(@y{}3)>P3SGN<{E)zJ?!-lJ0z0dAX3TlYCu(#$RW0R3-sA00>B2m928UF+t)KRk`|Sd1({(#pjeC~fQX_tW<~OH8+>ED{G<2TjK*--e`h|g10%)rt(-AmY`&d8jGtnU;3FJ{?ZjQXi+9EX~aBbVdYvj#y&)(Z186+u|!(A_ki@;1#`ofg|>mDCC_M|u9honw@X&Np?$hqPlhw9 zR`hG*GuLM1;v@Nf^rBkrL@@%AS6D|9sS9ggR+sY6zqI?08DcuwC1IxD>brj!-kQ3} z+Qi#=MM@!BQ%esp(WAK{l?-*hGBcL2PCr<^m;7+A{hqBmid8_&$lgJ9Y1!^ zue^pucM&A*M=zZ4c!qlLV7EeAb6B6Xr?d+q&WrtOM;x4cJBGLH7G zQ+%Rsxla3`kBYQ|8vZ)kihM6fQ+*i8U(!c8`+415F6PLrTV#IVFTH=YbnI2RuEmTf zB<=_Egw~a*hj~IG(J}|g^M*d5^-_5lr(Lg<&A0Qbl{=S<_=j~L>v;rbkgWV+Zr+lr zK5-4cl%qz4o9xgqhCF@h`7cml+ihjT5qw8z}h8~)`}xDNTtw{Ns^ zq=od2cF9+y2w`+tBudhe=+fjjSN=z&GwB@1_)5%u;qRGsV|?K&S2h#w#9H-BaSf_v zo@Vz+73ArBB2tm~Gco0qKO^l8#-B8qDle(nx%inS^b~YywDT;MYRmZ zsz2+MeF2}{%>CbF<%NxmWVDC5pd!(w7Rih@Z%DRtr<6|uiDwsnvKB7(0{Qx|iIMM5 za&KXN{1=)p`W(K#rS#!G@EkqHkZ32OCL|p?v9=zSV->w$pX+YMn7BwY)M397;ve7K zkde+3X~^6~ukL?0BApsnba>lXLHsvd>OZOY8S4tZwfn=q zY$DDcvu~Y#`2BpTUX03rGP5|w@_nlm^f`Rr?S>lHxAlLrF~tCEeW14f-I_oC%$2V3<1?$U|LwawhCmQ`C2^Ng5xeO1_+&Wq42tiKAJPBs z%@|*ZM6!R1CDPOBVR`+I@l4zA-DEiZZKs?ZbBjdk!+O9N6=OJmVM|+Im;oWuI^y(AYpxaVg&hMWFs`{{HUvhoW$FIN zX4ukUdD8f^??LAbwikc%~|JNoKkF7>wA2HuU^ zR^zORZQHqqW83wEI_$QWE8bZ_KCD#VEsB@%m$s6*Khkb7RRiC4Oq#&EWVg>h>_N1p zt!IDK)_3H)@ajaq3tBlbX4TP;v}4LO>aZd{QNP~3r16W?hIz!gw#z`BZ%40h?8G5r z6Z^mI=+uZ>^zISx#IqflTv)%b!(!ll-B03v_}i;Jj5}`+Esa0ZV;Uk7mo)7h8P+&=e~`4zV#i`uX$fDNh`G8MReKoUpqg#v+hqS7shEtjA!GCv>(6p3m<=?R*J5h>=V~+t5 z+q`#lxDQ%wd#}R1YxfS*2!H8`B3L|)M^-h~iSP48|6C@vSrCF&3Pu0ui3ZP@>wdBs&yha4mxo%-$-{pfvw=>Y z-ceGV9GSoT*LJl1MRL=`7|SWqKaqCtDWzTPyK;)O0E~Q}a*b<~jzqkphbelHAC#6N z^~V~-U`3QWr^f6V+*LK2Y4c}#mMVl~#5e^e(jIVE)n$hI^{HRwp0XmoFz$S68A4~b5wHv9R8~gW0jcI@7H)l~;fIB37x~Rh*lZKD^Zz8$#n=`!~)X9%*wt?A! zK_+I6AG`fx{^*JJ`h0?A6f}&riL{G#IY(9~&xDpnksf+vMD!uL7ewr$Cph$z$7|h| zZd(4HuX62wkjCrQcHxe$B2pdj1jlS7?0zF@-FOn>X|G@G?|*uV_QHQia@2$%iH0or zY<=nk;TrU>@_gFk(MbSTG)6+B=O^yW4}A_tcH>}q?b5i=GCD53ilwse%3T|dpE~(7 zBOA|AJ24&|V~0`(YeBtAvN{*^PKwlpRideR}3C4?RC;zPRX!tfb3~ zi7rRh($>ga%OfH!jmc>fdpF5kh_UKSdPghte6I6@tMd)37%4vA%v?c!zSA$ipKV^y z2YLRTgZLJ9vx%O$vwIr6d$*UuJAU8ls9&G`O2ce!5$|Zzp3{Fk@n=N1()OGg(RU;< zfe3$TSbEqgG3SAbCXsF@5WoCtKv?)G13;l=f=oV{5|)jjuqEO z>OsZ$oQN%!d@uW9UF_A&{awzRd11x%c`KSJ)l$<>G&S6A6Df68n)GaZ}3!dr{rwI`#BUW#g2DzRsIg;+|wzHX!FP>9<5H zGbAN?zBBO;Eil=jg|pA1!5LeWSC-zuEch!+?_!1j%_no0HxXMHUB0DzN6*|Xx&V0% zV!9>z{jX$y!c5s)W8LsGF((ZDF0vK++?p5Q(>nH3B!r@1R8~9XfHwjfioNj@!QED62%GMj45;a(;8|M3op4NjLQ3 zT)onR`snSg@T9P?*)n!bz5UgL7V?#ZUuYFvuZbg(BDtcKBhofzJ4Sa{$9VnqX&+W8 zTwjGdB8z``!%U?+EOCYZ9m5Ro;5&9s7|Xds+6G3Xue4~++lT}eo-%i**~Yw@E5)Dt zsoqsWAKlyS8%||7eiTJ#Ow-B>(Zw`cD@| zNiK8S`2cTGG~qt%=h;7meH!dchro!vWW5gIX$s%X#SoZEs2rD1Y>;LPkRcpCW0J{eTdlL z`{#d^s1ie>YYy$k`=Yu6rOVrPF(>Q3^P`XROD%1bRWI~W%tLw6%@nnOmqyzt$zM)= z<9>?_=ZE=;FOUA~ugzRhPkedXz?k^U|A8|m&2h(zc*0&SFTeg_M~O&JEU1&elGDR^ zMj}2?6Ve7L2`hG9@$_L;nMf3=5veU_)NX&DY|w(%l=LtwnCC4bn+ey=a_!hhM%&sZ z#uuJ+*o~H}NS~-hi+Dq;`q|N1^Ao(h_$}Bo?ltjRZjP4gYqjuX``2QABd$*Se)P?I zP2wN5Xh~j4OOlCE70ONOqrC{rSdC-w&cQjF|~9=DB}jkM=jqj|{vwn^n|M-gMcGxT15F$M@;{68Dc6 zsU7Fby!mA5@n>R67D~(L-Gp^hZ^@`;iL~?%(2{uJQe~ZD^|~=b@-5xlyw+c*O%Xe2XT5zh+kim^dM8E7#+)=50}+4SBqT>grWt89 zL3m!Z$TKG`&286ErYhQeExY>`t_9dJy79=_!BaxLueppYdaQA;g5osv=Y-^Q7{_7z1 zBa2^Tx6PVEyf~IF(Ibi_?AHx*+5X9;Y}9a5c1DnnHEJTWE}BRAPd-8|D$m5YN^qb|@l6 zh@$@@O}Ychs?&d^ljAQvUVg0G83k)af>@*Yk4W^R=U@6o(`+W@WKoJ7?q%Tm66-7v zZj4UH@3~QMhO2XBBC|$(w{5C)(j_Owm!+7j9JHN9%of>9A~Av+pY4q{_@0x+;uN2g z2-PJ+nJ^xS?vDE{%lgRFfm@^}?C&Bn64qmg%>2l|6QqB1TlT)%pGht$)t z`NTS?Yn~y`6hY*q1s;H;Qn0G(^7SaSo!D!#x@k#rd2@w>`=R61n*+Dy4qz#IAiVR5vT(`(NqL_rpP3Q?0dG&{+_*!|? z6(D~|n^c)9((Umc{YGa?JbyZkyyL%TSh3@}Xmg_OYe8&Mv|OZBC%>}DNSI3?^3_7I zP?4S3(#tzC5O9x*-~>s}QbLU47(r^~w{WCbq0b?o!hOGjv`)DZBG$3Hm&lYtjB9&`10nMxFe6VdWebjh}B6^Y>~!&zeHkWH9qy5w$K7A(HWI0sziz%sw)r~5lBEXQ^KHhdV*;}FL@;|{jT_UqO&9DsOm7-%JU$`fc?D~IE z4V1_$EGa~KLk+SNoqF`uh}eg^aw)PKG4fDK%bB8zBExaIrO4Me^-J^6C^l6#c&X85 z4p&Dq>_Zt}s#!%1MI>7LB3bpK4>IzyCwfjxJ#o=6X_a!aL~i==enePvknW`4gKt3+ zq*3L)h)2sqCVlhovFIp{=SP-=Q)YjU$d+Pr>)mZz1&1b%jm_4F;vd-t<83+r>w|o8~s(KZS4a*KV7yS#hpc3 zDU`)4B6Xc&??GBeE41{_CQXqE63HG&j+7eyYm(QLQ5dA*M01gw8{abhrHOw&2N5f1 zn-#aTFz#GD6m}+4DmMO7-wh|hdl^M$3I4SaQ_z`chobc^FCl2QfeUYuZ z9^b+^X`=;J#;Xaf&>#h41tr>oQnjQ=&NyK}L}D4Wr!ph66rXyIA9)TUy`d-TkFGP_ zwd=aF^Q##89i>*^2yp?cO&oueD*=Q&z?Dc#gxP_-Dwh-F-D}KC(Xx~8{3Fk}`<%5` zGuIrm4gGKp)*6PhdZLKvLZ`~4LXuAuoi3!gNKw{8y2FSCl1SHmle!&cR#>dzA^<=};_=kdro_5)HZWep@cFH7_i0TN{6o;IV6j5Rq!M z!&>U+qRdAjxmIN2!3yV5tqCEGYnBQ*r6OlCq#oujgdv6H~ z?IGbM_!uS9t*%kVfgyh}P<RYwOWT7o$w|YNfp#`kA87kv(@p62?wes}tGK9~}J&8|?>C6nSD?O$=UCi}rO4 zu~xKXMKfEX92FAT^Btw84U})zjto0zNaQ$I`F*sg1@DDu@l}76n52V^WlN=C~-qFT@lqN0|}rL>xiV^q_w5QX!Xjuh?9om~A0b zbQ5PZZJ+tuM1!$Dg|YnyOhQOHl(#D+*Mc67n2Vdps$*W2wP>v<=Qj$uVWEZ}i=^K-wZL%4r$m3MGRHkd^Rb|vA`Xc@-XWu; z!ebj25QK9*THeTmqjdjEIVnPBNGwC9t_8GhnCRVTAB{8R#<$sAnpAwBWd&++u9rrD z5t4EF+WG!jAvb=XCGCYJ`I1n^$kMo)?q{6QwVY#}LI_)a;?@8#+C)gcl#?RFTV5F= zITef(io1VU*DFL;K9ti{<8eMH{HEFnF1&y-^9C_{u) z_D!XfB=~R@QY(R1J54w6o=Z}C*`sDHH3sq@A=y*LTeVP=je5LplGyOnr`&a&;`xi%yF7+twiJwWKA!kZmI}t70$?97o%SnIT>ZPF+>r)pKBRW~A5gSs_1C{zN*iT%@ zwT`NU3@^cqD>qVlFzR8u2j5hhD*H9lus|*zK@-uzH61-ojG{_oNEJgFGETafsUcFG zC;BmjNQ&Xuril@p>)Fgoi%54I888UuSi3r8hn8-@`7&t-%?|#~&H<}by%e&>%5bKt`v+r_YMU`;JDr#g z#&M;S!bYD&l0MqeBQ15fU_US+r#!f2&UFVFSh~?=^c@Pxi>kK^83{X@*KAp{m_?FZ zs|C-Glz8a@G^5!am(cbkgln)GlCXbslaL!4X3}J{>Y{Ze`Mi_gXEoT)a zQjViwk9Z+728=NilCgK85b3>WN3yPP4&y_FXb01d&r(&fx0et-h5p8zdclA0Aws4E z5AKj0LPcwl6{KX_laN~QY-b6biM%9RWp1>G7pi}0ZircO5Xpff)^gW{!6&$Pab!FTed?~~XQWeLWNEgN z^BD6Z5*!!CspgSmqzV~AhC8UcWO!}LuPc?6Tpz%SXx>O zaK0O74~h5N?CD_kbe^Le%+$zp=gsGI-o$JwFDC>?uw3Q1=)7{6$RvOAS~>BXN`Ldz zy-LUlfp5)q;=*_eA%(LT^LCMa{MlN8V5F>$yi|F-OZJElR(oHEy%Y@b5pAkj3Q9-z zk*(w|T7HD&gcTU_+3|ryx+${VGGCn^zUS^NSZP(r(!}AY@8PZlwKz#Jyv>B9h1M@= zj}dFm8&WU&7sQu5b|rrh(p*H}M{z^9Gk@C*39YTgZ3zpS>*8*lsQX)ON%n;bDFts$ zUE7f(ON({Xz>KP5J*tpn6sbE6?W4ta*Qhe75Yy85ccya~4_o|7Y;7&Ur;47t5_B

*$xU_NUm{q}u7h-fM=$>G*f9PrM4cFBaxNl^9$_nJ9lGO^kIfFj7krRX#FZFIqVTHBugma4oT9vkULB14IN{3OERk=?t`?F=h;cC z20kU}xPuX&QdBKg7Lk+!W+)rNwvCdr_h_dmFRCgd;;k6XQ1WntccRpQi@Z^qm~;yM zwv!j?E=58l;{AUk#FzmhRw(}gk{7>EiP~5wk;G01#cvyg<9NrepV zaqxm1)Dw%|%MLXzwlEQtVOg^kHSM5ZQmVB10}iG9Key%834A9Ey<0 zIk;tLSD_urkcIkN8OypMB692I8J)gzwX!nvgQ!<2Rnj1F<>u8~qdZtvGaG+L3Q|G7 zU`^E>#t~bC^om|MQMPiBFO*f2NIxTWqIPRWWsg=VYYLq(-%N z9JScTU|sB#8u*quQaI3>SB^*^=5$#Ree88^NUa!GBOTte#aW2u-60ZlLR+UL#T=^a zTdnkR#wgx$H8kFDxA~4f*hFfTVt9s9iRh_IQ36o0j(@eLjAxB$yA){>Mfdp z_D=Q9vz5S#3>=K>6q2y_rx0`M(Fv|0#fdkqr6jV4-O{5tr_0h+BKpx^LYdKvZQ+}V zS37@>#PXoVBmRMN9Zzv+F{?==9b@xq3SpoprKVUnTBT}AWuSFmq(m1Wol|qMU$k}B zB<g_yg%%A!AiRArGR3g=Drl)VkAy zecfUS$aZU+mU4~A@(piVN#r__XVo6u<{jTHY65@95X_DeQask|sojz4H2~~wY)C3-F{^V{?73yl3ZlbkMt|So?Cuxx zxw@w%b25?+kKm-#Slc)$b8Wi%Qmzwc^w>tg5u6n{gRh=#Auoi8eO&au2nn3OP;b<( z!uvp^#k6{RQdNm|h^olgsJy(A!Zf?1X znvf97AV9=?diXn{G7&w+&1c6ItDA3De;SeQB6`;3DZorV6;{I zBw@ZxGh;M$4-qo0uLdI9Z_G_KZ-)RT%=rs#`snygXUYyEVVc#dL{4i>2@Ym|wppzcAtF5uUY|J} z*ZC0=6YAGOD)y%pauWB{X!Ba~Fd<7y1xAtyDH|DOThXe+Au_CO5F%oLEJv3#2R?J_ z1dg(9J9xIOw{87$aMXK9^5E{>>yfnF*CmX|6_PUMthN)=!uWrKCf%R26xu0{ZG%Em zr|$7)Sa6pm(rH$M4v}M;Cn7g-mbM`USx&p&H`cgBFb;C`c2ne7>UMKJyhE;?EFAT1 z={^|SNS8H~d!#wwYU`^4T28z3f%i^#!!_*8(52yTtbfqG3k72^x)0%^-?{rDm4bGN z)r1bnF}if}gjRo?F3r2+9_=B9i@t&$l9i`JWESk9EaU|C)AlHqgWkSw9igeevyc=g zdZ2pDVPHObw{EwXf7)XY8zXyq6vsf_Ux;=H&OzKUqP3_ei!#6wq{96uty4|ph_#+{ z`|z8J)pMj@&)qGw?sw_E8{@d7hQz=-u|zjf#&@g8jCOyDUMxk6Bt}mb;ZtJ1As(Aq*YU3JFBtBsI($L)(W|anj7$)cGsc(+ zsR5;!Aq(@Sdeu#f9in=@aiO-}MF81zC&W6)BjV%4D%ZV*$~|^^i)o-Gt2fIK!#8b~ zX@v4XL~DOyJYR1*3wUpLDHR1HOS?o;;t}+uvxVQ*UviWYX>OqvwD(aDOP6k8Ex4v4 z+guT>_nSM$8usC&MB~a0v0(JIbt$j`@8CXqYG^U*);kKTqV+L@LqB>S*W!2yna*)7 z5Fv4({wBf_xlV}?%P&VnG6W+Eg?R2a)u%Zua20=M(>=$(Gh;;WOP@P)bVi>ia<$n$ zZ{}#AzI?bC&)1h$l*eY74X9uDU0r8TQ(dK|3(!0{T2oV$%r8jAU@&eKk zNFoY~5V{bM5@`a`A@mY@uhIl0bVvw<-Vz`;@64V1&3DhQ{miq@+Ou{$d-k0Dtf>P% zcRPFG5GWcwe;%VO3L;#$sooWfiAI*D?cYvFV1!d)u2@#X@pkVWZ|G^FIs}*!ezaM! zTndh+310%C4zHhSF1!ukm&ohKDx(L?kxuOd0*9v z?fWT8eva)1ElFbn-&A=Al%hogSsKjE#mWOyHjiJOjP669`<_slhn$&;;ks^yLfvM08dFO zY4)~&V0H;prSgc!%?mlS~ z<&Vm(G>bdQyqVtAmr0U%Q4SPffN{oY701~4cCBCAQWa31r-`)ikj%g$7T)hcaS}sH z>=^W55M>?DviP&VkjvM+I9_Pu)})hkgab#%g+@yCC-pM_(Vrhx zeltlgZ$Eg`^0kSK!S}I%(@p+?IC1k*g!G6}OHGd518C)seDM8#yQAl^W<$1NK)N9| zh+aDBASJi7B7P8BTfEtT<5NKNxp}Asu5w;Jw_O;Ap+!j_MvBv(JDmY)IBt)B%6K(< z#BB1-BhRE-F@N^kpQ;WY#}-#~e2Ut2>i+ZIzMPBhAd#=7?jWWzcm)r1!YF8mT>NPl zkrQxm6xQYI&ek-HTqugnJ9`BRfW*Tg4{E6?7TXKd`^tG;(?f0~VC(g8^-|7j^En^( z?`m?N=I_$p<^R&Xipv}^p?rQL8LakCm^0a;Q z`o6vH1t|^N?k>#&(rK17w;yP*6{N?qTOOr?-9mva{0a2&F*HIWIuku`5* z=h6F4N^-sLI7%CRgELt!YB>hl3R9G0_EtsH%#5gARwVL&aKE9YWq`U3F*qw z&IWaUp{j;;M}HpqqP{gm4K_beKr9&GrlYffZ%(DEj*tRE+u=&P^mHwc=bA-xHN*sc zZ~a;KS$k5j9{jjZ2j&^v>JqM7rYGI?yOe1h*R4V~xT7M&Oqw9CV=Ez{wJTwf-(Eh8 z;xLi5cCkE?HyFH?ftCVWzk8EA{iaWwZizO)!*D3#-Vvn-L zX!8d-unVtz)`ZaG8d*r44x3(UYJNqP#hneU(!abG*5*7}xpw9#@GJiuQ^)<(FoZ$E z>)z4H4$l3mGHSOt`|g~uvp}PIw{oj>D?duUspJvl3rVx61e^NmX=aMGw`_w|;?E4N z{qw?18T_(UaWs;7{~(l0Zi``O9L3WP+02s2dtI}4hEgV6Oq(DHU+KQu7*9>cM@;um zg`n7tEAfSFvjn+KRiEl9^FFs#=0rNZlM>m36;t+!_a*rPc?!^%R;%G{!a;u#WB8h% zhAg=eGe?XTh4BN)gy~6EUGP1ZFVl}7GSB5iOtx2 zKiD5e*wRRxhdU#Bv929@WU4KyzcUkH_8=MTs)~(zxY?@$@HJo9iKP?KuWO1`b@$l) z+ur=paD+RE)89b-)O}t9_PIu@cG1(xxx>(t6+c|7nLyaVy;}JF?jLRG@bRarU5P=H zeCHqKbb%1sK88A%biUllk#WM(_iL40P;*o^AzWdX`}JO-`c8#z0sCx!Zb>5RFYUun4t3z$K21t96bra_meDvlOx*FwLz9f=!p600s3mX;raTpSW+TnsPEV&&hcBj zQMc@M)v1bFkFn zgke&CNl)a$OmFizfkh)pzbpi~N=RK7fh!bF+30#v4QGr!rXKp(!XIbme zo@SvYwnSFX(}c{N%R&?u$8Wa`zl=+1P|t__a$MU@;XlzT|871+?dpdLwq&&I_jc~M zJ@`1(wKV14AZn`SXFaW>vQ1HtVGH+#hBcnSYT-1t;b0p*R+;>2cbO4?=d@L&UCFDL z)_VDS7Fyr{4-(X?{Jo$dL_ZxETSK$4*dXM@_R}L%OqTZ<(1u;8v0JvDH~Od6(RFjk za?eUdQW#TlVNB$;;ol~}4kcFcidk9DXRKr1_Tqf4xnJHzuLqT62nrt9@M4#t8s1o0 zw*4|qvzVLb8GPFX>PBz*tupc()X>lU{{nC34|-QqI#20myjhLa#N~zEdKP!aXwEaC zEJA-duP>&hV?DfI^DZ!IHT~4WckL_;ww&*OJ=>F%4BBok_MyEc5Mswv0$~G5 ze2hG`E_;)st6~{-Yc9uFLrN_O&Z2;~iBQ{9g|7@eO79dMw?%l<>~rr@@kNMlVFs$I zIwM&zsEZ*(z%$+NvE(C0vvV``iv#-<;zpT1{#3b7N;HB>jQrkG)B94#`CC1TJE|1J zyD6*tcf}@)$11rv7nQKE#!v8wL#ld683fdx7bx8}j(y%=@V@wSG*E=W_kH+e_rZ_k zj)b8C$vt;H zU@}$uk((&EzC^En=<73^amN4&moHvz35Gfzm(Z1lkmUGy8Tn&q3iI0l9Y{$sC%^3q zy}1K0%3(Vyen6u|e&Lfy5Z|oRPkfr_yJH3|AWGul z#&F$gzg55SQ92DxNfKQV&-=?tPe4g@=}JAJT^2^Kx1Z&2s}p@VYd3Raq@CgGYG61} zZnZElmj1A91pG2g8yG8L3kjf0AZ1GMc*NK%>(djw(%P>X1W&I|8cC@78`R6|<=@27 z4`|BB@-@*fCNyZz-Nh;1y!rr^mtE*s&>yu`&IvqEmA>8pJ^8|DL3Pr|DPS;&?P?oK z^k0zTwjA--cT7WVMty&DbYd%QO6{Ivw|LN2kH8je)}ygP-7-xNA<;|MUu#&w_ajXM zJo_Hx78v?91#g3VKbbD%aQk#l9uGNHuM{fPvg=|wzD~#TB;c60SalAx2*)u371!Rc zhK@x%o=evhvGw#R$~LzH`m@XaIK=Yf(>w=Sb7l;HTj>4fqK)Xr)cb6QI(${Wog$g( zU1%92VC0ENnNDLC1e<}{)@keOb~j^dW-F_i>Mj)ElXWb~=Hti>@{$5ONgNMP*$&~D zOyq)jJngcx^Y^W67*R2evg$K^Ez(oR`_7L+PH=3^iKAP4eSX(hRGzpUYlTTv{Ln3~ zh;PH21^4aauP^%WPHHka#yHUwsm!O+OX;4fw-)&~X@#snYSKO*YJc5IF~x2vlkQWm@!dw4emZ*=%~S>87}7Cfx_ zK#_eDwCN3iwA>0bh0B;=%3jNd17RC6O@U86D6cY;xEI@V5L^IoovBNY*L*Me{>=pF zBh}yPBi9ig?1_~=5lo_=l&%ZseF``T@msSntaj8u-)bmW`{<22m4I95Cyp)Gw};d^ zrGH`)gyW`PloQoF>(;s0g@pOV0p z+F~;?inxb2=GADq3RxrAgU@KegdMh}!={2duib(IUL?76(jl(N+)D%Ux14x%uv-U# zgyN4TycP*q`_K+!`*R2Lnenk>Jz0jZOP36!FO4 z%pOTRfq;lHSEqQ);o;fE1_pAvc(Dsd+7j_DSCCKwhQPa1si^_FINMk+;sqZdi5olV za4`7fpYlbQiVJSSDT13x*3YczuhkY(v|`^&n;J>qVzbkg2d zClVZV)k)x8ygJybQRpjX)C7~@E*zeviEM*I!1yyO)nyE5NcYlabg>b2N% zb?Q2NSgbg@c!4|YRV+uTUlMkaG&s7im&fIc8kfhN(xb$^y3ez`kc(cgpyQ(wq2Qa8 z#3M#V2$Cy`=qkZU!16A-Q9y_@ftsN~1pi^;A?!4muyJ^JT25+?;NYu0jQ9!MP6mE7 zt$C&GYD^41SL^mE)th5eBGQl8FA=N%HqLAwd)R4&il4M1J!&$%V1k|78}ClmiC4jX zq;3FDzs6sT5&>jnL?Q**GeZhWR0#k1R?A3i~1FUdTI;K45uk)A(2m>IthMh93pLeN< z5Bovs2*SJYT8d;_Wu_7lRK(FgbP8`$y8JIse=baWC^bJB@#R7JCi=C)Oe-jy9+k?m z>Qhqv2(qQE85s+yq;?glh%HJqt@(JP=GC|w5^31*vsq#9?OXaDnu;(*QNxCju^#28 zvbCWUiL-qy18n9s2}9?QTuZ0nGev6(BkD9qn%Lwa*}pUo)!E0NTOMc^L7q&}8N_Cj z(+pU0>C0+VGe8lFcklyLq7m*7{^}ZchoP)xKRlh#9WK-dU9m%?>{0mV53?I>y|vz3 z`3%s@n5T!%H?rDiG%c78HRjtN8fcyW*(jx}6}<{s%)SYHSI2Ai z1^WnHGxkD6sw6&VR+{8gt?V#TcTLxwE&%udkf+9-GB;WT_IZDyEa&L2J+x!u)Zscy zG+W{l^1PF9?|CBM$*#A#$isL1!USb77))c+9C$CJlc}b9usMVE{bw_ke2?lO_%Cd3 zwOaIJ3n6HA{ZJkIAssk~EUx|ijmJ(yksUoQsGn=29MM(XMqM3#i6 zg&=my4VbZe3X)OEou}bu*(wJD4jM99$b4d=m~aSazhN$TW%ZfEW(=@zmtZ9ST*|*q zk5vp7UgY;BG{E32wLRBO=D-K=PvlZJ)vfaqiGsGz>}I9ZI``xfCXObQE7U2aS`@9K zbgvz%N`8tiGn(x*@}HI`n@5r(`Z?F{p&^KMs)|ci&l(|m*X|pCm=as>e!m-f=e&QV z-duU3BBf&~Ds-tv=4Kd(qQWPWEk$IO{pPBB=s|MRmgMQ*HBnde) z)#WV#wy)6&4_1tSGbJMvoP>Sf1Q?V5wSi$b0a9GR?vmbGax$_3Ix;e5(o6q&yzF5Q z&;Y@Epg5lE|5|jBEN=dXCY4Mb$;bk|e4M3SJe^@$XaEN+6%F7dS8;(M&;T`h5x4)P zUwe7^!H{SG8;li0;&TFFG8lj`*O`$?_dP8D*)6kc|Ie{52N#eh40mR53cEH-U02<`6 zJtq{DMx@aiNQ&;iBNJMHA+Z1fuKyd)Bnzhhiv8Cj t>Xp(=j{{bTps)GOk delta 87670 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 F@;?Q~tQr6S diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index 32ed6d17e614fa67252838f308ec53c9298e724a..79bb112149cb853ee75cbd613cfe52eb1127aba3 100644 GIT binary patch delta 99805 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 delta 99040 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 ZEM+Xt6z5ya`HtOU(c$o)Vj6$)e*jvIIeGv9 diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 19b9757..0a4c13f 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -1,85 +1,85 @@ { - "tszIPAddr":"10.0.1.88", - "bDeamon":0, - "nCenterPort":5100, - "nStorageDLPort":5101, - "nStorageUPPort":5102, - "nWebdavPort":5103, - "XMax":{ - "MaxClient":10000, - "MaxQueue":10000, - "IOThread":2, - "CenterThread":2, - "nStorageUPThread":2, - "nStorageDLThread":2, - "nWebdavThread":2 + "tszIPAddr": "10.0.1.88", + "bDeamon": 0, + "nCenterPort": 5100, + "nStorageDLPort": 5101, + "nStorageUPPort": 5102, + "nWebdavPort": 5103, + "XMax": { + "MaxClient": 10000, + "MaxQueue": 10000, + "IOThread": 2, + "CenterThread": 2, + "nStorageUPThread": 2, + "nStorageDLThread": 2, + "nWebdavThread": 2 }, - "XTime":{ - "bHBTime":0, - "nDBMonth":3, - "nTimeCheck":3, - "nCenterTimeOut":5, - "nStorageTimeOut":5, - "nWebdavTimeOut":5 + "XTime": { + "bHBTime": 0, + "nDBMonth": 3, + "nTimeCheck": 3, + "nCenterTimeOut": 5, + "nStorageTimeOut": 5, + "nWebdavTimeOut": 5 }, - "XLog":{ - "LogFile":"./XEngine_XLog/XEngine_StorageApp.log", - "MaxSize":1024000, - "MaxCount":10, - "LogLeave":32, - "LogType":17 + "XLog": { + "LogFile": "./XEngine_XLog/XEngine_StorageApp.log", + "MaxSize": 1024000, + "MaxCount": 10, + "LogLeave": 32, + "LogType": 17 }, - "XSql":{ - "SQLEnable":false, - "SQLAddr":"192.168.1.10", - "SQLPort":3306, - "SQLUser":"root", - "SQLPass":"123123aa" + "XSql": { + "SQLEnable": false, + "SQLAddr": "192.168.1.10", + "SQLPort": 3306, + "SQLUser": "root", + "SQLPass": "123123aa" }, - "XStorage":{ - "bResumable":true, - "bUPHash":false, - "bWDLocation":false, - "nHashMode":2 + "XStorage": { + "bResumable": true, + "bUPHash": false, + "bWDLocation": false, + "nHashMode": 2 }, - "XProxy":{ - "bUPPass":false, - "bDLPass":false, - "bAuthPass":false, - "tszUPPass":"http://192.168.1.7:5200/Api/Pass/UPFile", - "tszDLPass":"http://192.168.1.7:5200/Api/Pass/UPFile", - "tszAuthPass":"" + "XProxy": { + "bUPPass": false, + "bDLPass": false, + "bAuthPass": false, + "tszUPPass": "http://192.168.1.7:5200/Api/Pass/UPFile", + "tszDLPass": "http://192.168.1.7:5200/Api/Pass/UPFile", + "tszAuthPass": "" }, - "XLimit":{ - "bLimitMode":true, - "nMaxUPLoad":0, - "nMaxDNLoad":4096000, - "nMaxUPConnect":2, - "nMaxDNConnect":2 + "XLimit": { + "bLimitMode": true, + "nMaxUPLoad": 0, + "nMaxDNLoad": 4096000, + "nMaxUPConnect": 2, + "nMaxDNConnect": 2 }, - "XP2xp":{ - "bEnable":true, - "nTime":2, - "nRVPort":15000, - "nSDPort":15001 + "XP2xp": { + "bEnable": true, + "nTime": 2, + "nRVPort": 15000, + "nSDPort": 15001 }, - "XCert":{ - "bDLEnable":false, - "bUPEnable":false, - "bCHEnable":true, - "bWDEnable":false, - "tszCertChain":"./XEngine_Cert/server.crt", - "tszCertServer":"", - "tszCertKey":"./XEngine_Cert/server.key" + "XCert": { + "bDLEnable": false, + "bUPEnable": false, + "bCHEnable": false, + "bWDEnable": false, + "tszCertChain": "./XEngine_Cert/server.crt", + "tszCertServer": "", + "tszCertKey": "./XEngine_Cert/server.key" }, - "XReport":{ - "bEnable":true, - "tszServiceName":"XEngine_Storage", - "tszAPIUrl":"http://app.xyry.org:5501/api?function=machine" + "XReport": { + "bEnable": true, + "tszServiceName": "XEngine_Storage", + "tszAPIUrl": "http://app.xyry.org:5501/api?function=machine" }, - "XAction":{ - "bEnable":true, - "nSDMax":1024000, - "nRVMax":1024000 + "XAction": { + "bEnable": true, + "nSDMax": 1024000, + "nRVMax": 1024000 } } \ No newline at end of file diff --git a/XEngine_Release/XEngine_Config/XEngine_VersionConfig.json b/XEngine_Release/XEngine_Config/XEngine_VersionConfig.json index d03c56d..6513f65 100644 --- a/XEngine_Release/XEngine_Config/XEngine_VersionConfig.json +++ b/XEngine_Release/XEngine_Config/XEngine_VersionConfig.json @@ -1,5 +1,6 @@ { "XVer":[ + "3.20.0.1001 Build20250620", "3.19.0.1001 Build20250320", "3.18.0.1001 Build20250103", "3.17.0.1001 Build20241106", diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp index 529fc22..61d3880 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp @@ -48,49 +48,49 @@ bool StorageApp_Config_Parament(int argc,char **argv) for (int i = 0;i < argc;i++) { - if ((0 == _tcsxicmp("-h",argv[i])) || (0 == _tcsxcmp("-H",argv[i]))) + if ((0 == _tcsxcmp("-h",argv[i])) || (0 == _tcsxcmp("-H",argv[i]))) { StorageApp_Config_ParamentHelp(); return false; } - if ((0 == _tcsxicmp("-v", argv[i])) || (0 == _tcsxcmp("-V", argv[i]))) + if ((0 == _tcsxcmp("-v", argv[i])) || (0 == _tcsxcmp("-V", argv[i]))) { string m_StrVersion = st_ServiceCfg.st_XVer.pStl_ListStorage->front(); printf("Version:%s\n", m_StrVersion.c_str()); return false; } - else if (0 == _tcsxicmp("-d", argv[i])) + else if (0 == _tcsxcmp("-d", argv[i])) { st_ServiceCfg.bDeamon = _ttxoi(argv[++i]); } - else if (0 == _tcsxicmp("-r", argv[i])) + else if (0 == _tcsxcmp("-r", argv[i])) { st_ServiceCfg.st_Memory.bReload = true; } - else if (0 == _tcsxicmp("-u", argv[i])) + else if (0 == _tcsxcmp("-u", argv[i])) { st_ServiceCfg.bReuseraddr = true; } - else if (0 == _tcsxicmp("-t", argv[i])) + else if (0 == _tcsxcmp("-t", argv[i])) { bIsTest = true; } - else if (0 == _tcsxicmp("-lt", argv[i])) + else if (0 == _tcsxcmp("-lt", argv[i])) { st_ServiceCfg.st_XLog.nLogType = _ttxoi(argv[++i]); } - else if (0 == _tcsxicmp("-ll", argv[i])) + else if (0 == _tcsxcmp("-ll", argv[i])) { st_ServiceCfg.st_XLog.nLogLeave = _ttxoi(argv[++i]); } - else if (0 == _tcsxicmp("-l", argv[i])) + else if (0 == _tcsxcmp("-l", argv[i])) { LPCXSTR lpszLogLevel = argv[++i]; - if (0 == _tcsxicmp("debug", lpszLogLevel)) + if (0 == _tcsxcmp("debug", lpszLogLevel)) { st_ServiceCfg.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG; } - else if (0 == _tcsxicmp("info", lpszLogLevel)) + else if (0 == _tcsxcmp("info", lpszLogLevel)) { st_ServiceCfg.st_XLog.nLogLeave = XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO; }