#include "wnetutility.h"
#include <memory>
//#include <QDebug>
#include "LHQLogAPI.h"
#ifdef Q_OS_WIN
#include <windows.h>
#endif

//------------------------------------------------------------------------
//函    数:WNetTryConnect(const QString &strPath,const QString &strUser,const QString &strPwd)
//
//说    明:测试WNet连接,远程访问时用到
//
//参    数:
//[传入]strPath 路径
//[传入]strUser 用户名
//[传入]strPwd 密码
//
//返 回 值:是否成功
//------------------------------------------------------------------------
bool WNetUtility::WNetTryConnect(const QString &strPath,const QString &strUser,const QString &strPwd)
{
    bool bRet = false;
#ifdef Q_OS_WIN
    QString remotePath(strPath);
    int index = remotePath.indexOf("\\\\");
    if (index >= 0) {
        index = remotePath.indexOf("\\", index + 2);
        if (index > 0) {
            remotePath = remotePath.left(index);
        }
    }
    NETRESOURCE nr;
    nr.dwScope = RESOURCE_GLOBALNET;
    nr.dwType = RESOURCETYPE_DISK;
    nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
    nr.dwUsage = RESOURCEUSAGE_CONTAINER;
    nr.lpLocalName = nullptr;
    size_t len = wcslen(remotePath.toStdWString().data()) + 1;
    std::unique_ptr<wchar_t[]> wcs(new wchar_t[len]{0});
    wcscpy_s(wcs.get(), len, remotePath.toStdWString().data());
    nr.lpRemoteName = wcs.get();
    nr.lpProvider = nullptr;

    size_t userLen = wcslen(strUser.toStdWString().data()) + 1;
    std::unique_ptr<wchar_t[]> lpszUser(new wchar_t[userLen]{0});
    wcscpy_s(lpszUser.get(), userLen, strUser.toStdWString().data());
    size_t pdLen = wcslen(strPwd.toStdWString().data()) + 1;
    std::unique_ptr<wchar_t[]> lpszPwd(new wchar_t[pdLen]{0});
    wcscpy_s(lpszPwd.get(), pdLen, strPwd.toStdWString().data());
    // 取消连接
    DWORD dwReturn1 = WNetCancelConnection2(wcs.get(),CONNECT_UPDATE_PROFILE, true);
    if (NO_ERROR != dwReturn1) {
        DoLog(QString("远程共享目录断开连接失败!错误码:%1").arg(dwReturn1));
    }
    DWORD dwReturn = WNetAddConnection2(&nr, lpszPwd.get(), lpszUser.get(), 0);
    DoLog(QString("远程共享目录连接结果:%1").arg(dwReturn));
    if (NO_ERROR == dwReturn ||
            ERROR_DEVICE_ALREADY_REMEMBERED == dwReturn ||
            (ERROR_SESSION_CREDENTIAL_CONFLICT == dwReturn && dwReturn1 != ERROR_NOT_CONNECTED)) {
        bRet = true;
    } else {
        qInfo() << QString("远程共享目录登陆失败!错误码:%1").arg(dwReturn);
        if (ERROR_LOGON_FAILURE == dwReturn) {
            //DoLog("连接失败!");
        }
        bRet = false;
    }
#else
    // Linux挂载?
#endif
    return bRet;
}