CMString ExpandPath(const TCHAR *format) { CMString res; if (ServiceExists(MS_VARS_FORMATSTRING)) res = VARST(ptrT(variables_parse((TCHAR*)format, NULL, NULL))); else res = VARST(format); res.Replace(PROFILE_PATHT, szCurrentProfilePath); res.Replace(CURRENT_PROFILET, szCurrentProfile); res.Replace(MIRANDA_PATHT, szMirandaPath); res.Replace(MIRANDA_USERDATAT, szUserDataPath); res.Trim(); // also remove the trailing slash if (!res.IsEmpty()) { int iNewSize = res.GetLength() - 1; switch (res[iNewSize]) { case '\\': case '/': res.Truncate(iNewSize); } } return res; }
void CMSession::OnResponse(UINT32 nCode, const CMHTTPRspHeader* pRespHeader) { UINT32 nRet = MERE_SERVER; if (nCode == MER_OK) { ASSERT(pRespHeader != NULL); UINT32 httpRet = pRespHeader->GetHttpReturn(); if (httpRet == 200 || httpRet == 206) { CMString sVal; //判断是否wap网关的无聊返回,如果是则继续请求一次 if (pRespHeader->GetValue(HH_CTYPE, sVal)) { if (sVal.Find(L"text/vnd.wap.wml") >= 0) { m_pHttp->Request(); return; } } if (pRespHeader->GetValue(HH_CLENGTH, sVal)) { sVal.Trim(); INT32 nLen = _mwtoi(sVal); if (nLen >= SESSION_RET_MAX) { //命令获取返回不能大于最大限制 CM_ERRP("CMSession::OnResponse %d too large", nLen); goto err; } if (nLen > 0) { if (m_pBuf) { delete m_pBuf; m_pBuf = NULL; } m_pBuf = new INT8[nLen + 1]; m_pHttp->Read(m_pBuf, nLen); } else { CM_ERRP("CMSession::OnResponse content-length is %s, not valid", (const CHAR*)sVal); goto err; } } else if(pRespHeader->IsChunked()) { //不支持断点续传 if (m_pBuf) { delete m_pBuf; m_pBuf = NULL; } m_pBuf = new INT8[SESSION_RET_MAX]; m_pHttp->Read(m_pBuf, SESSION_RET_MAX); } else { CM_ERR("CMSession::OnResponse no content-length and no encoder"); goto err; } //对于nLen <= 0的情况不做一般错误处理 return; } else { CM_ERRP("CMSession::OnResponse http ret %d error", httpRet); nRet = httpRet; } } else { CM_ERRP("CMSession::OnResponse ret %d error", nCode); nRet = nCode; } err: //未成功获取信息,清理,等待下次获取 if (m_pBuf) { delete m_pBuf; m_pBuf = NULL; } UINT32 nTmp = m_nCurCmd; m_nCurCmd = 0; m_sParams.Empty(); m_bRun = FALSE; //重置http m_pHttp->Cancel(); if (m_sSequence.length() > 0) { CMSessionSequence::GetInstance()->Remove(this); m_sSequence = ""; } if(m_pNotify) { m_pNotify->OnSessionCmd(nTmp, nRet, NULL); } }
void CMHttpSNotify::OnResponse(UINT32 nCode, const CMHTTPRspHeader* pRespHeader) { UINT32 nRet = MER_OK; if (nCode == MER_OK) { ASSERT(pRespHeader != NULL); UINT32 httpRet = pRespHeader->GetHttpReturn(); if (httpRet == 200 || httpRet == 206) { CMString sVal; //判断是否wap网关的无聊返回,如果是则继续请求一次 if (pRespHeader->GetValue(HH_CTYPE, sVal)) { if (sVal.Find(L"text/vnd.wap.wml") >= 0) { m_pHttpC->Request(); return; } } sVal.Empty(); pRespHeader->GetValue(HH_CRANGE, sVal); sVal.Trim(); CMHTTPRspHeader header; header.SetRet(200, CMString("OK")); header.AddValue(HH_CTYPE, L"application/x-shockwave-flash"); if (!sVal.IsEmpty()) { INT32 nPos1 = sVal.Find(L" "); INT32 nPos2 = sVal.Find(L"-"); INT32 nPos3 = sVal.Find(L"/"); if (nPos1 <= 0 || nPos2 <= 0 || nPos3 <= 0) { CM_ERRP("CMHttpSNotify::OnResponse wrong content-range %s", (const CHAR*)sVal); goto err; } m_nStart= _mwtoi((const WCHAR*)sVal.Mid(nPos1 + 1, nPos2 - nPos1 - 1)); m_nEnd = _mwtoi((const WCHAR*)sVal.Mid(nPos2 + 1, nPos3 - nPos2 - 1)); m_nSize = m_nEnd - m_nStart + 1; if (m_nTotalSize == 0) { //对于第一次http返回,需要返回结果给socket m_nTotalSize = _mwtoi((const WCHAR*)sVal.Mid(nPos3 + 1)); CMString sSendSize; sSendSize.Format(L"%d", m_nTotalSize); header.AddValue(HH_CLENGTH, sSendSize); CMString sHeader = header.ToString(); CM_LOGP(CM_LOGL_INFO, "%s", (const CHAR*)sHeader); m_pSocketC->Send((INT8*)(const CHAR*)sHeader, sHeader.GetLength()); } else { ASSERT(m_nTotalSize == _mwtoi((const WCHAR*)sVal.Mid(nPos3 + 1))); ASSERT(m_nStatus == 2); ASSERT(m_nEnd - m_nStart < REQ_SIZE); UINT32 nLen = m_nSize; if (m_nSize > BUF_SIZE) { nLen = BUF_SIZE; } m_pHttpC->Read(m_pBuf, nLen); } } else { if (!pRespHeader->GetValue(HH_CLENGTH, sVal)) { CM_ERR("CMHttpSNotify::OnResponse no content-length"); goto err; } m_nTotalSize = 0; //此值无效 m_nSize = _mwtoi(sVal); //获取响应头成功,返回结果到Socket处 CMString sSendSize; sSendSize.Format(L"%d", m_nSize); header.AddValue(HH_CLENGTH, sSendSize); CMString sHeader = header.ToString(); CM_LOGP(CM_LOGL_INFO, "%s", (const CHAR*)sHeader); m_pSocketC->Send((INT8*)(const CHAR*)sHeader, sHeader.GetLength()); } return; } else { CM_ERRP("CMHttpSNotify::OnResponse http ret %d error", httpRet); nRet = httpRet; } } else { CM_ERRP("CMHttpSNotify::OnResponse ret %d error", nCode); nRet = nCode; } err: //未成功获取信息,清理,等待下次获取 //if (m_pBuf) //{ // delete m_pBuf; // m_pBuf = NULL; //} m_bInService = FALSE; //if (nCode == MERN_TIMEOUT) //{ // m_pSocketC->Close(); //} //else //{ char response[] = "HTTP/1.1 404 NOT FOUND\r\n\r\n"; m_nSize = 0; m_pSocketC->Send((INT8*)response, strlen(response)); //} //重置http m_pHttpC->Cancel(); }