util & tools compiler succ

This commit is contained in:
jarodruan 2020-01-27 20:13:21 +08:00
parent cb2954eb61
commit 0b2175e5dc
45 changed files with 1096 additions and 792 deletions

View File

@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 2.8)
project(tars_cpp)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
set(CMAKE_VERBOSE_MAKEFILE off)
set(MYSQL_DIR_INC "/usr/local/mysql/include")
@ -16,6 +16,18 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O2 -Wall -Wno-deprecated")
#set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "set build type to release default")
IF (CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE "Release")
ENDIF()
message("CMAKE_BUILD_TYPE TYPE = " ${CMAKE_BUILD_TYPE})
#
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(TARS_VERSION "1.4.0")
add_definitions(-DTARS_VERSION="${TARS_VERSION}")
set(TARS_SSL 0)
@ -29,14 +41,83 @@ set(OPENTRACKING_INC "/usr/local/include")
add_definitions(-D_USE_OPENTRACKING=${_USE_OPENTRACKING})
endif()
IF (UNIX)
#set(LIB_MYSQL "mysqlclient")
set(INSTALL_PREFIX "/usr/local/tars/cpp")
ELSE()
set(INSTALL_PREFIX "c:\\taf\\cpp")
set(LIB_MYSQL "libmysql")
ENDIF()
set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX})
IF (WIN32)
set(MYSQL_PATH "${CMAKE_SOURCE_DIR}/thirdparty/win_64")
include_directories("${MYSQL_PATH}/include/mysql")
link_directories("${MYSQL_PATH}/lib")
ELSE()
find_package(MySQL REQUIRED)
add_definitions(-DMySQL)
include_directories(${MYSQL_INCLUDE_DIR})
list(APPEND LIB_MYSQL ${MYSQL_LIBRARIES})
link_libraries(${LIB_MYSQL})
link_libraries(pthread dl)
ENDIF()
IF (APPLE)
link_libraries(iconv)
ENDIF(APPLE)
IF (UNIX)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++11 -Wno-deprecated -fno-strict-aliasing -Wno-overloaded-virtual")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-builtin-macro-redefined -D__FILE__='\"$(notdir $(abspath $<))\"'")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -Wall -g")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O2 -Wall -fno-strict-aliasing")
IF(APPLE)
message("mac.....")
SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wmismatched-tags -Wself-assign")
ENDIF(APPLE)
ELSEIF (WIN32)
message("window.....")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4101 /wd4244 /wd4996 /wd4091 /wd4503 /wd4819 /wd4200 /wd4800")
# set(BUILD_USE_64BITS on)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj " )
#set(CMAKE_CXX_FLAGS_RELEASE "/GL" )
ELSE ()
MESSAGE(STATUS "================ ERROR: This platform is unsupported!!! ================")
ENDIF (UNIX)
IF(WIN32)
set(TARS2CPP "${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}/tars2cpp.exe")
ELSE()
set(TARS2CPP "${CMAKE_BINARY_DIR}/bin/tars2cpp")
ENDIF()
IF(WIN32)
include_directories(${CMAKE_SOURCE_DIR}/util/src/epoll_windows)
ENDIF()
add_subdirectory(util)
add_subdirectory(tools)
set(TARS2CPP "${tools_BINARY_DIR}/tars2cpp/tars2cpp")
# set(TARS2CPP "${tools_BINARY_DIR}/tars2cpp/tars2cpp")
add_subdirectory(servant)

View File

@ -30,11 +30,11 @@
#include "tup/RequestF.h"
#endif
#ifdef __GNUC__
# if __GNUC__ >3 || __GNUC_MINOR__ > 3
# include <ext/pool_allocator.h>
# endif
#endif
// #ifdef __GNUC__
// # if __GNUC__ >3 || __GNUC_MINOR__ > 3
// # include <ext/pool_allocator.h>
// # endif
// #endif
using namespace std;
using namespace tars;
@ -673,13 +673,13 @@ public:
};
#ifdef __GNUC__
# if __GNUC__ >3 || __GNUC_MINOR__ > 3
typedef UniAttribute<BufferWriter,BufferReader, __gnu_cxx::__pool_alloc> UniAttrPoolAlloc;
typedef UniPacket<BufferWriter,BufferReader, __gnu_cxx::__pool_alloc> UniPacketPoolAlloc;
typedef TarsUniPacket<BufferWriter,BufferReader, __gnu_cxx::__pool_alloc> TarsUniPacketPoolAlloc;
# endif
#endif
// #ifdef __GNUC__
// # if __GNUC__ >3 || __GNUC_MINOR__ > 3
// typedef UniAttribute<BufferWriter,BufferReader, __gnu_cxx::__pool_alloc> UniAttrPoolAlloc;
// typedef UniPacket<BufferWriter,BufferReader, __gnu_cxx::__pool_alloc> UniPacketPoolAlloc;
// typedef TarsUniPacket<BufferWriter,BufferReader, __gnu_cxx::__pool_alloc> TarsUniPacketPoolAlloc;
// # endif
// #endif
}
////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -1117,7 +1117,7 @@ string Tars2Java::generateJava(const StructPtr& pPtr, const NamespacePtr& nPtr)
string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".java";
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()), 0755);
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()));
tars::TC_File::save2file(fileJava, s.str());
return s.str();
@ -1288,7 +1288,7 @@ string Tars2Java::generateJava(const EnumPtr& pPtr, const NamespacePtr& nPtr) co
s << TAB << "}" << endl;
string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + ".java";
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()), 0755);
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()));
tars::TC_File::save2file(fileJava, s.str());
@ -1331,7 +1331,7 @@ void Tars2Java::generateJava(const ConstPtr& pPtr, const NamespacePtr& nPtr) con
s << TAB << "}" << endl;
string fileJava = getFilePath(nPtr->getId()) + "/cnst/" + pPtr->getTypeIdPtr()->getId() + ".java";
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId() + "/cnst/"), 0755);
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId() + "/cnst/"));
tars::TC_File::save2file(fileJava, s.str());
return;
@ -2011,7 +2011,7 @@ string Tars2Java::generateAndroidStub(const InterfacePtr &pPtr, const NamespaceP
string fileJava = getFilePath(nPtr->getId()) + pPtr->getId() + "Agent.java";
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()), 0755);
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()));
tars::TC_File::save2file(fileJava, s.str());
return s.str();

View File

@ -343,7 +343,7 @@ string Tars2C::generateH(const StructPtr &pPtr, const string& namespaceId) const
s << TAB << "Int32 (*writeTo)( const "<<sStructName<<"*, TarsOutputStream *);" << endl;
s << TAB << "Int32 (*readFrom)( "<<sStructName<<"*, TarsInputStream *);" << endl;
//定义成员变量
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
for (size_t j = 0; j < member.size(); j++)
{
@ -374,7 +374,7 @@ string Tars2C::generateC(const StructPtr &pPtr, const string& namespaceId) const
ostringstream s;
string sStructName = namespaceId + "_" + pPtr->getId();
//定义成员变量
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
////////////////////////////////////////////////////////////
@ -463,7 +463,7 @@ string Tars2C::generateC(const StructPtr &pPtr, const string& namespaceId) const
for (size_t j = 0; j < member.size(); j++)
{
BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[j]->getTypePtr());
//string值要转义
//stringֵҪת<EFBFBD><EFBFBD>
if (bPtr && bPtr->kind() == Builtin::KindString)
{
s << TAB << "this->" << member[j]->getId() << " = JString_new();" << endl;
@ -537,7 +537,7 @@ string Tars2C::generateC(const StructPtr &pPtr, const string& namespaceId) const
for (size_t j = 0; j < member.size(); j++)
{
BuiltinPtr bPtr = BuiltinPtr::dynamicCast(member[j]->getTypePtr());
//string值要转义
//stringֵҪת<EFBFBD><EFBFBD>
if (bPtr && bPtr->kind() == Builtin::KindString)
{
if (member[j]->hasDefault())
@ -704,7 +704,7 @@ void Tars2C::generateH(const ContextPtr &pPtr) const
s << endl;
s << "#endif" << endl;
tars::TC_File::makeDirRecursive(m_sBaseDir, 0755);
tars::TC_File::makeDirRecursive(m_sBaseDir);
tars::TC_File::save2file(fileH, s.str());
}
@ -731,7 +731,7 @@ void Tars2C::generateC(const ContextPtr &pPtr) const
s << endl;
tars::TC_File::makeDirRecursive(m_sBaseDir, 0755);
tars::TC_File::makeDirRecursive(m_sBaseDir);
tars::TC_File::save2file(fileC, s.str());
}
@ -754,7 +754,7 @@ StructPtr Tars2C::findStruct(const ContextPtr &pPtr,const string &id)
{
string sid = id;
//在当前namespace中查找
//<EFBFBD>ڵ<EFBFBD>ǰnamespace<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>
vector<NamespacePtr> namespaces = pPtr->getNamespaces();
for (size_t i = 0; i < namespaces.size(); i++)
{

View File

@ -49,7 +49,7 @@ string Tars2Cs::toTypeInit(const TypePtr &pPtr) const
VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
if (vPtr)
{
//数组特殊处理
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
string sType;
size_t iPosBegin, iPosEnd;
sType = tostr(vPtr->getTypePtr());
@ -57,7 +57,7 @@ string Tars2Cs::toTypeInit(const TypePtr &pPtr) const
{
sType = sType.substr(0, iPosBegin) + sType.substr(iPosEnd+1);
}
//[] (数组)的数组变为[1]
//[] (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ[1]
sType = tars::TC_Common::replace(sType, "[]" , "[1]");
return "(" + tostr(vPtr->getTypePtr()) + "[]) new " + sType + "[1];";;
}
@ -186,7 +186,7 @@ string Tars2Cs::generateCs(const StructPtr &pPtr, const NamespacePtr &nPtr) cons
s << TAB << "{" << endl;
INC_TAB;
//定义成员变量set;get函数
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>set;get<65><74><EFBFBD><EFBFBD>
for (size_t i = 0; i < member.size(); i++)
{
string sDefault;
@ -281,7 +281,7 @@ string Tars2Cs::generateCs(const StructPtr &pPtr, const NamespacePtr &nPtr) cons
s << endl;
string fileCs = getFilePath(nPtr->getId()) + pPtr->getId() + ".cs";
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()), 0755);
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()));
tars::TC_File::save2file(fileCs, s.str());
return s.str();
@ -307,7 +307,6 @@ void Tars2Cs::generateCs(const vector<EnumPtr> &es,const vector<ConstPtr> &cs,co
s << TAB << "class Const " << endl;
s << TAB << "{" << endl;
INC_TAB;
//-----------------const类型开始------------------------------------
for (size_t i = 0; i < cs.size(); i++)
{
if (cs[i]->getConstGrammarPtr()->t == ConstGrammar::STRING)
@ -330,10 +329,8 @@ void Tars2Cs::generateCs(const vector<EnumPtr> &es,const vector<ConstPtr> &cs,co
DEL_TAB;
s << TAB << "}" << endl;
}
//-----------------const类型结束--------------------------------
if (es.size()>0)
{
//-----------------枚举类型开始---------------------------------
for (size_t i = 0; i < es.size(); i++)
{
s << TAB << "public enum "<<es[i]->getId()<<endl;
@ -354,12 +351,11 @@ void Tars2Cs::generateCs(const vector<EnumPtr> &es,const vector<ConstPtr> &cs,co
s<< TAB <<"}"<<endl;
}
}
//-----------------枚举类型结束---------------------------------
DEL_TAB;
s << TAB << "}" << endl;
string fileCs = getFilePath(nPtr->getId()) + nPtr->getId()+"_const.cs";
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()), 0755);
tars::TC_File::makeDirRecursive(getFilePath(nPtr->getId()));
tars::TC_File::save2file(fileCs, s.str());
return;
@ -377,7 +373,7 @@ void Tars2Cs::generateCs(const NamespacePtr &pPtr) const
generateCs(ss[i], pPtr);
}
generateCs(es,cs,pPtr);//c#里面的枚举、const都放到一起。
generateCs(es,cs,pPtr);
return;
}

View File

@ -381,7 +381,7 @@ bool CodeGenerator::generateJS(const ContextPtr &pPtr)
sstr << estr.str() << endl;
string sFileName = TC_File::excludeFileExt(_sToPath + TC_File::extractFileName(pPtr->getFileName())) + IDL_TYPE + ".js";
TC_File::makeDirRecursive(_sToPath, 0755);
TC_File::makeDirRecursive(_sToPath);
makeUTF8File(sFileName, sstr.str());
return true;

View File

@ -226,6 +226,6 @@ void CodeGenerator::generateDTS(const ContextPtr &pPtr)
string sFileName = TC_File::excludeFileExt(_sToPath + TC_File::extractFileName(pPtr->getFileName())) + IDL_TYPE + ".d.ts";
TC_File::makeDirRecursive(_sToPath, 0755);
TC_File::makeDirRecursive(_sToPath);
makeUTF8File(sFileName, sstr.str());
}

View File

@ -376,7 +376,7 @@ bool CodeGenerator::generateJSProxy(const ContextPtr &cPtr)
string sFileName = TC_File::excludeFileExt(_sToPath + TC_File::extractFileName(cPtr->getFileName())) + "Proxy.js";
TC_File::makeDirRecursive(_sToPath, 0755);
TC_File::makeDirRecursive(_sToPath);
makeUTF8File(sFileName, sstr.str());
return true;

View File

@ -168,6 +168,6 @@ void CodeGenerator::generateDTSProxy(const ContextPtr &cPtr)
sstr << estr.str() << endl;
string sFileName = TC_File::excludeFileExt(_sToPath + TC_File::extractFileName(cPtr->getFileName())) + "Proxy.d.ts";
TC_File::makeDirRecursive(_sToPath, 0755);
TC_File::makeDirRecursive(_sToPath);
makeUTF8File(sFileName, sstr.str());
}

View File

@ -374,7 +374,7 @@ bool CodeGenerator::generateJSServer(const ContextPtr &pPtr)
string sFileName = TC_File::excludeFileExt(_sToPath + TC_File::extractFileName(pPtr->getFileName())) + ".js";
TC_File::makeDirRecursive(_sToPath, 0755);
TC_File::makeDirRecursive(_sToPath);
makeUTF8File(sFileName, str.str());
return true;

View File

@ -144,6 +144,6 @@ void CodeGenerator::generateDTSServer(const ContextPtr &pPtr)
string sFileName = TC_File::excludeFileExt(_sToPath + TC_File::extractFileName(pPtr->getFileName())) + ".d.ts";
TC_File::makeDirRecursive(_sToPath, 0755);
TC_File::makeDirRecursive(_sToPath);
makeUTF8File(sFileName, str.str());
}

View File

@ -118,6 +118,6 @@ void CodeGenerator::generateJSServerImp(const ContextPtr &cPtr)
str << generateJSServerImp(cPtr, namespaces[i]);
}
TC_File::makeDirRecursive(_sToPath, 0755);
TC_File::makeDirRecursive(_sToPath);
makeUTF8File(sFileName, str.str());
}

View File

@ -99,7 +99,7 @@ string Tars2OC::toAddtionalClassName(const TypePtr &pPtr) const
if (vPtr)
{
string s = "";
//vector<byte>不用添加附加信息编码
//vector<byte><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (toClassName(vPtr) == "list<char>")
{
s = "ONSData";
@ -121,7 +121,7 @@ string Tars2OC::toAddtionalClassName(const TypePtr &pPtr) const
ostringstream osKeyLen;
{
int iLen = sKey.length();
//规定不能超过99
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><EFBFBD><EFBFBD>99
assert(iLen <= 99 && iLen >=0);
char sLen[3];
snprintf(&sLen[0],3,"%.2d",iLen);
@ -133,14 +133,14 @@ string Tars2OC::toAddtionalClassName(const TypePtr &pPtr) const
StructPtr sPtr = StructPtr::dynamicCast(pPtr);
if (sPtr)
{
//struct当做Object处理
//struct<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Object<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return "O" + tostrStruct(sPtr);//TC_Common::replace(sPtr->getSid(), "::", "");
}
EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
if (ePtr)
{
//Enum当做Object处理
//Enum<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Object<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return "ONSNumber";
}
@ -302,14 +302,14 @@ string Tars2OC::toTarsV2Procstr(const TypeIdPtr &pPtr) const
if (bPtr)
{
//普通类型使用JV2_PROP_NM
//<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>JV2_PROP_NM
s << "JV2_PROP_NM(" << getReqOptionType(pPtr) << "," << pPtr->getTag() <<","<< pPtr->getId() << ")";
}
VectorPtr vPtr = VectorPtr::dynamicCast(pPtr->getTypePtr());
if (vPtr)
{
//vector<byte>不用添加附加信息编码
//vector<byte><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (toClassName(vPtr) == "list<char>")
{
s << "JV2_PROP_NM(" << getReqOptionType(pPtr) << "," << pPtr->getTag() << "," << pPtr->getId() << ")";
@ -369,7 +369,7 @@ string Tars2OC::tostrEnum(const EnumPtr &pPtr) const
void Tars2OC::toIncludeName(const TypePtr &pPtr,map<string,int>& mReference) const
{
//基本类型没有依赖其它结构
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
if (bPtr)
{
@ -420,7 +420,7 @@ map<string,int> Tars2OC::getReferences(const StructPtr &pPtr, const string& name
map<string,int> mTemp;
vector<TypeIdPtr>& vMember = pPtr->getAllMemberPtr();
//查看成员变量是否依赖其它的结构体
//<EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľṹ<EFBFBD><EFBFBD>
for (size_t j = 0; j < vMember.size(); j++)
{
BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vMember[j]->getTypePtr());
@ -432,7 +432,7 @@ map<string,int> Tars2OC::getReferences(const StructPtr &pPtr, const string& name
VectorPtr vPtr = VectorPtr::dynamicCast(vMember[j]->getTypePtr());
if (vPtr)
{
//vector<byte>不用添加附加信息编码
//vector<byte><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (toClassName(vPtr) == "list<char>")
{
continue;
@ -467,7 +467,7 @@ map<string,int> Tars2OC::getReferences(const StructPtr &pPtr, const string& name
}
bool Tars2OC::IsRetainType(const TypePtr &pPtr) const
{
//对象类型用retain,enum is NSInteger
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>retain,enum is NSInteger
BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
if((bPtr && bPtr->kind() != Builtin::KindString) || ePtr)
@ -539,7 +539,7 @@ string Tars2OC::generateH(const StructPtr &pPtr, const string& namespaceId) cons
s << "@interface " << sStructName << " : TarsObjectV2"<< endl;
s << endl;
//定义成员变量
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector<TypeIdPtr>& vMember = pPtr->getAllMemberPtr();
for (size_t j = 0; j < vMember.size(); j++)
{
@ -552,7 +552,7 @@ string Tars2OC::generateH(const StructPtr &pPtr, const string& namespaceId) cons
s << endl;
s << "@end" << endl;
tars::TC_File::makeDirRecursive(m_sBaseDir, 0755);
tars::TC_File::makeDirRecursive(m_sBaseDir);
tars::TC_File::save2file(fileH, s.str());
return "";
@ -570,7 +570,7 @@ string Tars2OC::writeInit(const vector<TypeIdPtr>& vMember) const
INC_TAB;
for (size_t j = 0; j < vMember.size(); j++)
{
//基本类型初始化,有默认值或者说string类型才初始化
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>ʼ<EFBFBD><EFBFBD>,<2C><>Ĭ<EFBFBD><C4AC>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>˵string<6E><67><EFBFBD>Ͳų<CDB2>ʼ<EFBFBD><CABC>
BuiltinPtr bPtr = BuiltinPtr::dynamicCast(vMember[j]->getTypePtr());
if(bPtr)
{
@ -595,10 +595,10 @@ string Tars2OC::writeInit(const vector<TypeIdPtr>& vMember) const
{
s <<TAB << getPropertyName(vMember[j]->getId()) << " = " << vMember[j]->def() << ";" << endl;
}
//其它情况的基本类型不用初始化,系统提供默认值
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD>ó<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD>ṩĬ<EFBFBD><EFBFBD>ֵ
}
//是否require字段,且是retain属性
//<EFBFBD>Ƿ<EFBFBD>require<EFBFBD>ֶ<EFBFBD>,<2C><><EFBFBD><EFBFBD>retain<69><6E><EFBFBD><EFBFBD>
if(vMember[j]->isRequire() && IsRetainType(vMember[j]->getTypePtr()))
{
VectorPtr vPtr = VectorPtr::dynamicCast(vMember[j]->getTypePtr());
@ -644,7 +644,7 @@ string Tars2OC::writedealloc(const vector<TypeIdPtr>& vMember) const
INC_TAB;
for (size_t j = 0; j < vMember.size(); j++)
{
//对象类型才需要=nil,NSString是对象类型
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>Ҫ=nil,NSString<6E>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(IsRetainType(vMember[j]->getTypePtr()))
{
s <<TAB << getPropertyName(vMember[j]->getId()) << " = nil;" <<endl;
@ -742,7 +742,7 @@ string Tars2OC::generateM(const EnumPtr &pPtr, const string& namespaceId) const
s << "@implementation " <<sEnumPrefix<<"Helper"<<endl;
s << endl;
//生成枚举转字符串函数
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD>ת<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s << "+ (NSString *)etos:(" << sEnumPrefix << ")e" << endl;
s << "{" << endl;
@ -767,7 +767,7 @@ string Tars2OC::generateM(const EnumPtr &pPtr, const string& namespaceId) const
s << endl;
//生成字符串转枚举函数
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>תö<EFBFBD>ٺ<EFBFBD><EFBFBD><EFBFBD>
s << "+ (" << sEnumPrefix << ")stoe:(NSString *)s" << endl;
s << "{" << endl;
@ -789,7 +789,7 @@ string Tars2OC::generateM(const EnumPtr &pPtr, const string& namespaceId) const
s << "#endif" <<endl;
tars::TC_File::makeDirRecursive(m_sBaseDir, 0755);
tars::TC_File::makeDirRecursive(m_sBaseDir);
tars::TC_File::save2file(fileH, s.str());
return "";
@ -805,7 +805,7 @@ string Tars2OC::generateM(const StructPtr &pPtr, const string& namespaceId) cons
string fileM = m_sBaseDir + "/" + sStructName + ".m";
s << g_parse->printHeaderRemark();
//定义成员变量
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
////////////////////////////////////////////////////////////
@ -832,7 +832,7 @@ string Tars2OC::generateM(const StructPtr &pPtr, const string& namespaceId) cons
s << "@end" << endl;
tars::TC_File::makeDirRecursive(m_sBaseDir, 0755);
tars::TC_File::makeDirRecursive(m_sBaseDir);
tars::TC_File::save2file(fileM, s.str());
return "";
}
@ -899,7 +899,7 @@ string Tars2OC::generateH(const EnumPtr &pPtr, const string& namespaceId) const
s << "@end" <<endl;
s << endl;
s << "#endif" <<endl;
tars::TC_File::makeDirRecursive(m_sBaseDir, 0755);
tars::TC_File::makeDirRecursive(m_sBaseDir);
tars::TC_File::save2file(fileH, s.str());
return "";
@ -913,14 +913,14 @@ string Tars2OC::generate(const NamespacePtr &pPtr) const
vector<StructPtr>&ss = pPtr->getAllStructPtr();
vector<EnumPtr>&es = pPtr->getAllEnumPtr();
//先遍历枚举类型,单独生成文件
//<EFBFBD>ȱ<EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
for (size_t i = 0; i < es.size(); i++)
{
generateH(es[i], pPtr->getId());
generateM(es[i], pPtr->getId());
}
//遍历结构体类型,单独生成文件
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
for (size_t i = 0; i < ss.size(); i++)
{
generateH(ss[i], pPtr->getId());

View File

@ -45,7 +45,7 @@ string Tars2Php::readFrom(const TypeIdPtr &pPtr, bool bIsRequire) const
}
/*******************************获取定长数组坐标********************************/
/*******************************<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>********************************/
int Tars2Php::getSuffix(const TypeIdPtr &pPtr) const
{
BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
@ -63,7 +63,7 @@ int Tars2Php::getSuffix(const TypeIdPtr &pPtr) const
return -1;
}
/*******************************定长数组坐标********************************/
/*******************************<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>********************************/
string Tars2Php::toStrSuffix(const TypeIdPtr &pPtr) const
{
@ -180,7 +180,7 @@ string Tars2Php::generatePHP(const StructPtr &pPtr, const string& namespaceId) c
s << TAB << "class " << pPtr->getId() << " extends c_struct" << endl;
s << TAB << "{" << endl;
INC_TAB;
//变量声明
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(size_t k = 0;k < member.size();k++)
{
s<< TAB << "public $" <<member[k]->getId()<<";"<<endl;
@ -299,7 +299,7 @@ void Tars2Php::generatePHP(const ContextPtr &pPtr) const
s << "?>"<<endl;
tars::TC_File::makeDirRecursive(m_sBaseDir, 0755);
tars::TC_File::makeDirRecursive(m_sBaseDir);
tars::TC_File::save2file(fileH, s.str());
}
@ -325,7 +325,7 @@ void Tars2Php::generatePHP_Pdu(const ContextPtr &pPtr) const
}
s << "?>";
tars::TC_File::makeDirRecursive(m_sBaseDir, 0755);
tars::TC_File::makeDirRecursive(m_sBaseDir);
tars::TC_File::save2file(fileH, s.str());
}
@ -336,7 +336,7 @@ void Tars2Php::createFile(const string &file, const vector<string> &vsCoder)
{
if(file == contexts[i]->getFileName())
{
//tup版本的
//tup<EFBFBD><EFBFBD><EFBFBD>
generatePHP(contexts[i]);
}
}

View File

@ -34,7 +34,7 @@ string Tars2Python::generatePython(const EnumPtr &pPtr, const std::string &sName
s << TAB << "class " << pPtr->getId() << ":" << endl;
INC_TAB;
//成员变量
//<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nenum = -1;
vector<TypeIdPtr>& member = pPtr->getAllMemberPtr();
for (size_t i = 0; i < member.size(); i++)
@ -233,7 +233,7 @@ string Tars2Python::generatePython(const StructPtr & pPtr, const NamespacePtr &
s << TAB << "class " << pPtr->getId() << "(tarscore.struct):"<< endl;
INC_TAB;
//STEP01 开始定义类需要的类型
//STEP01 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s << TAB << "__tars_class__ = \"" << nPtr->getId() << "." << pPtr->getId() << "\";" << endl;
for (size_t i = 0, len = member.size(); i < len; i++)
{
@ -255,7 +255,7 @@ string Tars2Python::generatePython(const StructPtr & pPtr, const NamespacePtr &
}
}
//STEP02 定义数据成员
//STEP02 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD>Ա
s << TAB << endl;
s << TAB << "def __init__(self):" << endl;
INC_TAB;
@ -265,7 +265,7 @@ string Tars2Python::generatePython(const StructPtr & pPtr, const NamespacePtr &
}
DEL_TAB;
//STEP03 开始生成writeTo函数
//STEP03 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>writeTo<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s << TAB << endl;
s << TAB << "@staticmethod" << endl;
s << TAB << "def writeTo(oos, value):" << endl;
@ -277,7 +277,7 @@ string Tars2Python::generatePython(const StructPtr & pPtr, const NamespacePtr &
}
DEL_TAB;
//STEP04 开始生成readFrom函数
//STEP04 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>readFrom<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s << TAB << endl;
s << TAB << "@staticmethod" << endl;
s << TAB << "def readFrom(ios):" << endl;
@ -424,7 +424,7 @@ string Tars2Python::generatePython(const InterfacePtr &pPtr)
vector<OperationPtr>& vOperation = pPtr->getAllOperationPtr();
for(size_t i = 0; i < vOperation.size(); i++)
{
//生成每个接口的编解码
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD>ӿڵı<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
str << TAB << "def " << vOperation[i]->getId() << "(self, " << makeParams(vOperation[i]) << "):" << endl;
INC_TAB;
str << makeOperations(vOperation[i]) << endl;
@ -441,7 +441,7 @@ string Tars2Python::generatePython(const NamespacePtr &pPtr)
std::ostringstream str;
/*
//STEP01 开始生成常量
//STEP01 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ɳ<EFBFBD><EFBFBD><EFBFBD>
vector<ConstPtr> &cs = pPtr->getAllConstPtr();
for (size_t i = 0; i < cs.size(); i++)
{
@ -450,21 +450,21 @@ string Tars2Python::generatePython(const NamespacePtr &pPtr)
str << endl;
*/
//STEP02 开始生成枚举值
//STEP02 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD>ֵ
vector<EnumPtr> & es = pPtr->getAllEnumPtr();
for (size_t i = 0; i < es.size(); i++)
{
str << generatePython(es[i], pPtr->getId()) << endl;
}
//STEP03 开始生成结构体编解码函数
//STEP03 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ɽṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector<StructPtr> & ss = pPtr->getAllStructPtr();
for (size_t i = 0; i < ss.size(); i++)
{
str << generatePython(ss[i], pPtr) << endl;
}
//STEP04 开始生成Proxy函数
//STEP04 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Proxy<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector<InterfacePtr> & is = pPtr->getAllInterfacePtr();
for(size_t i = 0; i < is.size(); i++)
{
@ -500,7 +500,7 @@ void Tars2Python::generatePython(const ContextPtr &pPtr)
string sPath = getFilePath() + "/" + namespaces[i]->getId() + "/";
string sFileName = sPath + tars::TC_File::excludeFileExt(tars::TC_File::extractFileName(pPtr->getFileName())) + ".py";
tars::TC_File::makeDirRecursive(sPath, 0755);
tars::TC_File::makeDirRecursive(sPath);
tars::TC_File::save2file(sFileName, str.str());
}

View File

@ -4,7 +4,13 @@ project(util)
include_directories(${MYSQL_DIR_INC})
link_directories(${MYSQL_DIR_LIB})
enable_language(ASM)
if(CMAKE_ASM_COMPILER)
enable_language(ASM)
else()
message(STATUS "No ASM support")
endif()
# enable_language(ASM)
add_subdirectory(src)
add_subdirectory(include)

View File

@ -33,7 +33,7 @@ namespace tars
* @brief
*/
class TC_DYN_Object;
class TC_DYN_RuntimeClass;
struct TC_DYN_RuntimeClass;
struct TC_DYN_RuntimeClass
{

View File

@ -54,21 +54,10 @@ struct TC_Encoder_Exception : public TC_Exception
class TC_Encoder
{
public:
/**
* @brief gbk utf8.
*
* @param sOut buffer
* @param iMaxOutLen buffer最大的长度/sOut的长度
* @param sIn buffer
* @param iInLen buffer长度
* @throws TC_Encoder_Exception
* @return
*/
static void gbk2utf8(char *sOut, int &iMaxOutLen, const char *sIn, int iInLen);
/**
* @brief gbk utf8.
*
* @brief gbk utf8.
*
* @param sIn buffer*
* @throws TC_Encoder_Exception
* @return utf8编码
@ -76,8 +65,8 @@ public:
static string gbk2utf8(const string &sIn);
/**
* @brief gbk utf8.
*
* @brief gbk utf8.
*
* @param sIn buffer
* @param vtStr gbk的vector
* @throws TC_Encoder_Exception
@ -85,9 +74,49 @@ public:
*/
static void gbk2utf8(const string &sIn, vector<string> &vtStr);
/**
* @brief utf8 gbk.
*
* @brief utf8 gbk.
*
* @param sIn buffer
* @throws TC_Encoder_Exception
* @return gbk编码
*/
static string utf82gbk(const string &sIn);
/**
* @brief string的\n替换掉,
*
* :\n \r\0; \r转换为\,
*
* string记录在一行bin-log的地方;
* @param str
* @param f
* @param t
* @param u
* @return str
*/
static string transTo(const string& str, char f = '\n', char t = '\r', char u = '\0');
/**
* @brief , transTo
*
* :\r\0 \n\r\r还原为,
*
* string记录在一行bin-log的地方
* @param str (transTo后得到的字符串)
* @param f
* @param t
* @param u
* @return str
*/
static string transFrom(const string& str, char f = '\n', char t = '\r', char u = '\0');
protected:
/**
* @brief utf8 gbk.
*
* @param sOut buffer
* @param iMaxOutLen buffer最大的长度/sOut的长度
* @param sIn buffer
@ -96,43 +125,6 @@ public:
* @return
*/
static void utf82gbk(char *sOut, int &iMaxOutLen, const char *sIn, int iInLen);
/**
* @brief utf8 gbk.
*
* @param sIn buffer
* @throws TC_Encoder_Exception
* @return gbk编码
*/
static string utf82gbk(const string &sIn);
/**
* @brief string的\n替换掉,
*
* :\n \r\0; \r转换为\,
*
* string记录在一行bin-log的地方;
* @param str
* @param f
* @param t
* @param u
* @return str
*/
static string transTo(const string& str, char f = '\n', char t = '\r', char u = '\0');
/**
* @brief , transTo
*
* :\r\0 \n\r\r还原为,
*
* string记录在一行bin-log的地方
* @param str (transTo后得到的字符串)
* @param f
* @param t
* @param u
* @return str
*/
static string transFrom(const string& str, char f = '\n', char t = '\r', char u = '\0');
};
}

View File

@ -35,8 +35,8 @@
// #include "util/tc_mmap.h"
// #include "util/tc_fifo.h"
#include "util/tc_network_buffer.h"
#include "util/tc_buffer.h"
#include "util/tc_buffer_pool.h"
// #include "util/tc_buffer.h"
// #include "util/tc_buffer_pool.h"
#include "util/tc_cas_queue.h"
using namespace std;
@ -123,8 +123,8 @@ public:
class Handle;
typedef TC_AutoPtr<Handle> HandlePtr;
class HandleGroup;
typedef TC_AutoPtr<HandleGroup> HandleGroupPtr;
// class HandleGroup;
// typedef TC_AutoPtr<HandleGroup> HandleGroupPtr;
// ////////////////////////////////////////////////////////////////////////////
@ -249,13 +249,13 @@ public:
* handle处理一个或多个Adapter消息
* handle对象一个线程
*/
struct HandleGroup : public TC_HandleBase
{
string name;
TC_ThreadLock monitor;
vector<HandlePtr> handles;
map<string, BindAdapterPtr> adapters;
};
// struct HandleGroup : public TC_HandleBase
// {
// string name;
// TC_ThreadLock monitor;
// vector<HandlePtr> handles;
// map<string, BindAdapterPtr> adapters;
// };
////////////////////////////////////////////////////////////////////////////
/**
* @brief
@ -360,6 +360,11 @@ public:
*/
virtual void notifyFilter();
/**
* ()
*/
virtual void heartbeat() {}
protected:
/**
*
@ -439,11 +444,6 @@ public:
*/
virtual void handleCustomMessage(bool bExpectIdle = false) {}
/**
* ()
*/
virtual void heartbeat() {}
/**
* 线,
*/
@ -467,11 +467,11 @@ public:
virtual bool allFilterIsEmpty();
/**
*
* @param pEpollServer
*/
void setEpollServer(TC_EpollServer *pEpollServer);
// /**
// * 设置服务
// * @param pEpollServer
// */
// void setEpollServer(TC_EpollServer *pEpollServer);
/**
* Adapter
@ -535,7 +535,7 @@ public:
};
using close_functor = std::function<void (void*, EM_CLOSE_T )>;
using auth_process_wrapper_functor = std::function<bool (void*, const std::string& )>;
using auth_process_wrapper_functor = std::function<bool (void*, const std::vector<char>& )>;
////////////////////////////////////////////////////////////////////////////
// 服务端口管理,监听socket信息
@ -1350,7 +1350,7 @@ public:
*/
EnumConnectionType getType() const { return _enType; }
bool IsEmptyConn() const {return _bEmptyConn;}
bool isEmptyConn() const {return _bEmptyConn;}
/**
* Init Auth State;
@ -1798,13 +1798,13 @@ public:
// */
// void send(unsigned int uid, const string &s, const string &ip, uint16_t port);
/**
*
* @param lfd
*
* @return vector<TC_EpollServer::ConnStatus>
*/
vector<TC_EpollServer::ConnStatus> getConnStatus(int lfd);
// /**
// * 获取某一监听端口的连接数
// * @param lfd
// *
// * @return vector<TC_EpollServer::ConnStatus>
// */
// vector<TC_EpollServer::ConnStatus> getConnStatus(int lfd);
/**
*
@ -1954,7 +1954,7 @@ public:
/**
*
*/
bool IsEmptyConnCheck() const;
bool isEmptyConnCheck() const;
friend class BindAdapter;
friend class ConnectionList;
@ -2226,6 +2226,12 @@ public:
*/
BindAdapterPtr getBindAdapter(const string &sName);
/**
* adatapters
* @return
*/
vector<BindAdapterPtr> getBindAdapters();
/**
* 线
*/
@ -2297,7 +2303,7 @@ public:
* INFO日志
* @param s
*/
void tars(const string &s);
void info(const string &s);
/**
*
@ -2323,7 +2329,7 @@ public:
/**
* 线
*/
unsigned int getLogicThreadNum();
size_t getLogicThreadNum();
//回调给应用服务
typedef std::function<void(TC_EpollServer*)> application_callback_functor;

View File

@ -31,9 +31,6 @@ namespace tars
*/
/////////////////////////////////////////////////
/**
* @brief .
*/
class TC_Exception : public exception
{
public:

View File

@ -1668,9 +1668,9 @@ protected:
friend class Block;
friend class BlockAllocator;
friend class HashMapIterator;
friend struct HashMapIterator;
friend class HashMapItem;
friend class HashMapLockIterator;
friend struct HashMapLockIterator;
friend class HashMapLockItem;
//禁止copy构造

View File

@ -1757,9 +1757,9 @@ protected:
friend class Block;
friend class BlockAllocator;
friend class HashMapIterator;
friend struct HashMapIterator;
friend class HashMapItem;
friend class HashMapLockIterator;
friend struct HashMapLockIterator;
friend class HashMapLockItem;
/**

View File

@ -18,6 +18,7 @@
#define __TC_HTTP_ASYNC_H_
#include <functional>
#include "util/tc_platform.h"
#include "util/tc_thread_pool.h"
#include "util/tc_http.h"
#include "util/tc_autoptr.h"
@ -27,188 +28,87 @@ namespace tars
{
/////////////////////////////////////////////////
/**
* @file tc_http_async.h
* @brief http异步调用类.
*
* http同步调用使用TC_HttpRequest::doRequest就可以了
*/
/**
* @file tc_http_async.h
* @brief http异步调用类.
*
* http同步调用使用TC_HttpRequest::doRequest就可以了
* example_http_async.cpp
* :
* 1 线
* 2 http短连接
* 3 RequestCallback回调里面, onSucc和onFailed是对应的, , onSucc/onFailed其中之一会被唯一响应
* @author jarodruan@tencent.com
*/
/////////////////////////////////////////////////
/**
* @brief 线
*/
struct TC_HttpAsync_Exception : public TC_Exception
{
TC_HttpAsync_Exception(const string &buffer) : TC_Exception(buffer){};
TC_HttpAsync_Exception(const string &buffer, int err) : TC_Exception(buffer, err){};
~TC_HttpAsync_Exception() throw(){};
};
///**
//* @brief 线程异常
//*/
//struct TC_HttpAsync_Exception : public TC_Exception
//{
// TC_HttpAsync_Exception(const string &buffer) : TC_Exception(buffer) {};
// TC_HttpAsync_Exception(const string &buffer, int err) : TC_Exception(buffer, err) {};
// ~TC_HttpAsync_Exception() throw() {};
//};
/**
* @brief 线.
*
* HTTP请求 使:
*
*
*
* TC_HttpAsync中线程执行的
*
* new出来,
*
* class AsyncHttpCallback : public
*
* TC_HttpAsync::RequestCallback
*
* {
*
* public:
*
* AsyncHttpCallback(const string &sUrl) : _sUrl(sUrl)
*
* {
*
* }
*
* virtual void onException(const string &ex)
*
* {
*
* cout << "onException:" << _sUrl << ":" << ex << endl;
*
* }
*
* //请求回来的时候onResponse被调用
*
* //bClose表示服务端关闭了连接 ,从而认为收到了一个完整的http响应
*
* virtual void onResponse(bool bClose, TC_HttpResponse
*
* &stHttpResponse)
*
* {
*
* cout << "onResponse:" << _sUrl << ":" <<
*
* TC_Common::tostr(stHttpResponse.getHeaders()) <<
*
* endl;
* }
*
* virtual void onTimeout()
*
* {
*
* cout << "onTimeout:" << _sUrl << endl;
*
* }
*
*
* //连接被关闭时调用
*
* virtual void onClose()
*
* {
*
* cout << "onClose:" << _sUrl << endl;
*
* }
*
* protected:
*
* string _sUrl;
*
* };
*
* //封装一个函数, 根据实际情况处理
*
* int addAsyncRequest(TC_HttpAsync &ast, const string &sUrl) {
*
* TC_HttpRequest stHttpReq; stHttpReq.setGetRequest(sUrl);
*
*
* //new出来一个异步回调对象
*
* TC_HttpAsync::RequestCallbackPtr p = new
*
* AsyncHttpCallback(sUrl);
*
* return ast.doAsyncRequest(stHttpReq, p);
*
* }
*
* //具体使用的示例代码如下:
*
* TC_HttpAsync ast;
*
* ast.setTimeout(1000); //设置异步请求超时时间
*
* ast.start();
*
* //真正的代码需要判断返回值,返回值=0才表示请求已经发送出去了
*
* int ret = addAsyncRequest(ast, "www.baidu.com");
*
* addAsyncRequest(ast, "www.qq.com");
*
* addAsyncRequest(ast, "www.google.com");
*
* addAsyncRequest(ast, "http://news.qq.com/a/20100108/002269.htm");
*
* addAsyncRequest(ast, "http://news.qq.com/zt/2010/mtjunshou/");
*
* addAsyncRequest(ast,"http://news.qq.com/a/20100108/000884.htm");
*
* addAsyncRequest(ast,"http://news.qq.com/a/20100108/000884.htm");
*
* addAsyncRequest(ast,"http://tech.qq.com/zt/2009/renovate/index.htm");
*
* ast.waitForAllDone();
*
* ast.terminate();
* @brief 线.
*/
class TC_HttpAsync : public TC_Thread, public TC_ThreadLock
{
public:
/**
* @brief
* onSucc,
* onFailed,
* onSucc和onFailed是成对出现的, , ,
* onFailed被调用时,
*/
class RequestCallback : public TC_HandleBase
{
public:
/**
* @brief .
*
* @param bClose http完整了
*
*/
enum FAILED_CODE
{
Failed_Net = 0x01, //网络出错
Failed_Connect = 0x02, //连接服务器出错
Failed_Timeout = 0x03, //超时
Failed_Interrupt = 0x04, //中断接收数据
Failed_Close = 0x05, //服务器主动关闭了链接
Failed_ConnectTimeout = 0x06, //链接超时
};
/**
* @brief http头收全了都会调用
* stHttpResponse的数据可能不是完全的http响应数据 ,body数据
* @param stHttpResponse http数据
* @return true:, false:(onFailed, Failed_Interrupt)
*/
virtual bool onContinue(TC_HttpResponse &stHttpResponse) { return true; }
/**
* @brief .
*
* @param stHttpResponse http响应包
*/
virtual void onResponse(bool bClose, TC_HttpResponse &stHttpResponse) = 0;
virtual void onSucc(TC_HttpResponse &stHttpResponse) = 0;
/**
* @brief http头收全了都会调用
* stHttpResponse的数据可能不是完全的http响应数据 ,body数据
* @param stHttpResponse http数据
* @return true:, false:
* @brief , , onClose也会被调用,
*
* @param ret,
* @param info
*/
virtual bool onReceive(TC_HttpResponse &stHttpResponse) { return true;};
/**
* @brief .
*
* @param ex
*/
virtual void onException(const string &ex) = 0;
/**
* @brief
*/
virtual void onTimeout() = 0;
virtual void onFailed(FAILED_CODE ret, const string &info) = 0;
/**
* @brief
*/
virtual void onClose() = 0;
virtual void onClose() {};
};
typedef TC_AutoPtr<RequestCallback> RequestCallbackPtr;
@ -221,12 +121,12 @@ protected:
{
public:
/**
* @brief .
*
* @brief .
*
* @param stHttpRequest
* @param callbackPtr
*/
AsyncRequest(TC_HttpRequest &stHttpRequest, RequestCallbackPtr &callbackPtr);
AsyncRequest(TC_HttpRequest &stHttpRequest, RequestCallbackPtr &callbackPtr, bool bUseProxy);
/**
* @brief
@ -235,30 +135,32 @@ protected:
/**
* @brief
*
*
* @return int
*/
int getfd() { return _fd.getfd(); }
int getfd() const { return _fd.getfd(); }
/**
* fd
*/
// int getNotifyfd() const { return _notify.getfd(); }
/**
* @brief .
*
* @return int
*
*/
int doConnect();
void doConnect();
/**
* @brief addr的连接,DNS解析.
*
* @param addr DNS解析后的地址
* @return int
* @brief
* @return
*/
int doConnect(struct sockaddr* addr);
string getError(const char* sDefault) const;
/**
* @brief
*/
void doException();
* @brief
*/
void doException(RequestCallback::FAILED_CODE ret, const string &e);
/**
* @brief
@ -281,50 +183,78 @@ protected:
void timeout();
/**
* @brief ID.
*
* @brief ID.
*
* @param uniqId
*/
void setUniqId(uint32_t uniqId) { _iUniqId = uniqId;}
/**
* @brief ID.
*
*
* @return uint32_t
*/
uint32_t getUniqId() const { return _iUniqId; }
/**
* @brief http异步线程.
*
*
* @param pHttpAsync 线
*/
void setHttpAsync(TC_HttpAsync *pHttpAsync) { _pHttpAsync = pHttpAsync; }
/**
* @brief ip地址.
*
* @brief ip地址.
*
* @param addr
*/
void setBindAddr(const struct sockaddr* addr);
/**
* @brief
*/
bool isValid() const { return _fd.isValid(); }
/**
* @brief
* @return [description]
*/
bool hasConnected() const { return _isConnected; }
/**
* @brief
* @param isConnected [description]
*/
void setConnected(bool isConnected) { _isConnected = isConnected; }
/**
*
* @param events [description]
*/
void processNet(const epoll_event &ev);
/**
*
*/
void processNotify();
protected:
/**
* @brief .
*
* @brief .
*
* @param buf
* @param len
* @param flag
* @param flag
* @return int
*/
int recv(void* buf, uint32_t len, uint32_t flag);
/**
* @brief .
*
* @brief .
*
* @param buf
* @param len
* @param flag
* @param flag
* @return int
*/
int send(const void* buf, uint32_t len, uint32_t flag);
@ -341,6 +271,8 @@ protected:
RequestCallbackPtr _callbackPtr;
bool _bindAddrSet;
struct sockaddr _bindAddr;
bool _bUseProxy;
bool _isConnected;
};
typedef TC_AutoPtr<AsyncRequest> AsyncRequestPtr;
@ -360,63 +292,66 @@ public:
~TC_HttpAsync();
/**
* @brief .
*
* @brief .
*
* @param stHttpRequest
* @param httpCallbackPtr
* @param bUseProxy,使
* @param addr, bUseProxy为false
* @return int, <0:, strerror()
* =0:
*/
int doAsyncRequest(TC_HttpRequest &stHttpRequest, RequestCallbackPtr &callbackPtr, bool bUseProxy=false, struct sockaddr* addr=NULL);
void doAsyncRequest(TC_HttpRequest &stHttpRequest, RequestCallbackPtr &callbackPtr, bool bUseProxy = false);
/**
* @brief proxy地址
*
*
*/
int setProxyAddr(const char* Host,uint16_t Port);
int setProxyAddr(const char* Host, uint16_t Port);
/**
* @brief .
*
* ,ip地址)
* @brief .
*
* ,ip地址)
* @param sProxyAddr 192.168.1.2:2345 sslproxy.qq.com:2345
*/
int setProxyAddr(const char* sProxyAddr);
/**
* @brief .
*
* @brief .
*
* @param sProxyAddr 192.168.1.2
*/
int setBindAddr(const char* sBindAddr);
/**
* @brief .
*
* @brief .
*
* @param addr addr
*/
void setProxyAddr(const struct sockaddr* addr);
/**
* @brief .
*
* @brief ,
* @return [description]
*/
const struct sockaddr* getProxyAddr() const { return &_proxyAddr; }
/**
* @brief .
*
* (线)
* @param num, 线
*/
void start(int iThreadNum = 1);
void start();
/**
* @brief ().
*
* @brief ().
*
* @param timeout: , s左右
*/
void setTimeout(int millsecond) { _data->setTimeout(millsecond); }
/**
* @brief (100ms左右).
*
* @brief (100ms左右).
*
* @param millsecond, -1
*/
void waitForAllDone(int millsecond = -1);
@ -428,11 +363,12 @@ public:
protected:
using async_process_type = std::function<void (AsyncRequestPtr&, int)>;
// typedef TC_Functor<void, TL::TLMaker<AsyncRequestPtr, int>::Result> async_process_type;
typedef std::function<void(AsyncRequestPtr, int)> async_process_type;
/**
* @brief .
*
* @brief .
*
* @param ptr
*/
static void timeout(AsyncRequestPtr& ptr);
@ -440,7 +376,13 @@ protected:
/**
* @brief
*/
static void process(AsyncRequestPtr &p, int events);
// static void process(AsyncRequestPtr &p, int events);
/**
* @brief 线
* @param _threadId [description]
*/
void assertThreadId() { assert(_threadId == std::this_thread::get_id()); }
/**
* @brief
@ -450,17 +392,40 @@ protected:
/**
* @brief
*/
void erase(uint32_t uniqId);
void erase(uint32_t uniqId);
/**
* @brief
* @param fd [description]
* @param uniqId [description]
* @param events [description]
*/
void addConnection(int fd, uint32_t uniqId, uint32_t events);
/**
* @brief
* @param fd [description]
* @param events [description]
*/
void delConnection(int fd);
friend class AsyncRequest;
protected:
std::thread::id _threadId;
TC_ThreadPool _tpool;
http_queue_type *_data;
TC_Epoller _epoller;
TC_Epoller::NotifyInfo _notify;
std::mutex _mutex;
deque<uint64_t> _events;
bool _terminate;
struct sockaddr _proxyAddr;
@ -469,7 +434,6 @@ protected:
bool _bindAddrSet;
};
}
#endif

View File

@ -573,7 +573,7 @@ namespace tars
//写错误,警告,调试log
DEBUG_LOG_LEVEL = 5,
//给TAF框架打日志用
TAF_LOG_LEVEL = 6,
TARS_LOG_LEVEL = 6,
};
/**
@ -850,7 +850,7 @@ namespace tars
case WARN_LOG_LEVEL:
case DEBUG_LOG_LEVEL:
case INFO_LOG_LEVEL:
case TAF_LOG_LEVEL:
case TARS_LOG_LEVEL:
return true;
break;
}

View File

@ -27,7 +27,7 @@
#include "util/tc_ex.h"
using namespace std;
namespace taf
namespace tars
{
/////////////////////////////////////////////////
/**

View File

@ -20,7 +20,7 @@
#include "util/tc_thread_mutex.h"
#include "util/tc_thread_cond.h"
namespace taf
namespace tars
{
/////////////////////////////////////////////////
/**

View File

@ -2248,9 +2248,9 @@ protected:
friend class Block;
friend class BlockAllocator;
friend class HashMapIterator;
friend struct HashMapIterator;
friend class HashMapItem;
friend class HashMapLockIterator;
friend struct HashMapLockIterator;
friend class HashMapLockItem;
/**

View File

@ -17,11 +17,10 @@
#ifndef __TC_PACK_H_
#define __TC_PACK_H_
#include <netinet/in.h>
#include "util/tc_platform.h"
#include <vector>
#include <map>
#include <string>
#include <assert.h>
#include "util/tc_ex.h"
namespace tars

View File

@ -1743,7 +1743,7 @@ protected:
friend class Block;
friend class BlockAllocator;
friend class RBTreeLockIterator;
friend struct RBTreeLockIterator;
friend class RBTreeLockItem;
//禁止copy构造

View File

@ -25,7 +25,7 @@
#endif
#include "util/tc_ex.h"
namespace taf
namespace tars
{
/////////////////////////////////////////////////
/**

View File

@ -216,7 +216,7 @@ public:
* @throws TC_Socket_Exception
* @return
*/
void getSockName(string &sSockAddress, uint16_t &iSockPort);
void getSockName(string &sSockAddress, uint16_t &iSockPort) const;
/**
* @brief socket选项.
@ -289,7 +289,7 @@ public:
* (),
* @return int
*/
int connectNoThrow(struct sockaddr* addr);
int connectNoThrow(const struct sockaddr* addr);
/**
* @brief socket上监听.
@ -585,7 +585,7 @@ protected:
* @param serverLen pstServerAddr指向的结构的长度
* @return int
*/
int connect(struct sockaddr *pstServerAddr, socklen_t serverLen);
int connect(const struct sockaddr *pstServerAddr, socklen_t serverLen);
/**
* @brief .
@ -595,7 +595,7 @@ protected:
* @throws TC_Socket_Exception
* @return
*/
void getPeerName(struct sockaddr *pstPeerAddr, socklen_t &iPeerLen);
void getPeerName(struct sockaddr *pstPeerAddr, socklen_t &iPeerLen) const;
/**
* @brief ip和端口.
@ -605,7 +605,7 @@ protected:
* @throws TC_Socket_Exception
* @return
*/
void getSockName(struct sockaddr *pstSockAddr, socklen_t &iSockLen);
void getSockName(struct sockaddr *pstSockAddr, socklen_t &iSockLen) const;
private:

View File

@ -9,7 +9,7 @@
using namespace std;
namespace taf
namespace tars
{
/**

View File

@ -29,7 +29,7 @@
using namespace std;
namespace taf
namespace tars
{
/////////////////////////////////////////////////
/**

View File

@ -26,8 +26,8 @@
namespace tars
{
#define TNOW taf::TC_TimeProvider::getInstance()->getNow()
#define TNOWMS taf::TC_TimeProvider::getInstance()->getNowMs()
#define TNOW TC_TimeProvider::getInstance()->getNow()
#define TNOWMS TC_TimeProvider::getInstance()->getNowMs()
/////////////////////////////////////////////////
/**

View File

@ -2,7 +2,7 @@ set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
include_directories(${PROJECT_SOURCE_DIR}/include)
# aux_source_directory(. DIR_SRCS)
aux_source_directory(. DIR_SRCS)
# if (CMAKE_SIZEOF_VOID_P EQUAL 8)
# list(APPEND DIR_SRCS "tc_jump_x86_64_sysv_elf_gas.s")

View File

@ -13,100 +13,170 @@
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
#include "util/tc_platform.h"
#if TARGET_PLATFORM_LINUX || TARGET_PLATFORM_IOS
#include <iconv.h>
#include <errno.h>
#endif
#include <string.h>
#include "util/tc_encoder.h"
#include <iostream>
namespace tars
{
void TC_Encoder::gbk2utf8(char *sOut, int &iMaxOutLen, const char *sIn, int iInLen)
#if TARGET_PLATFORM_WINDOWS
#include <windows.h>
void TC_Encoder::gbk2utf8(const string &sIn, vector<string> &vtStr)
{
char * pIn = (char*)sIn;
char * pEnd = pIn+iInLen;
char * pOut = sOut;
size_t iLeftLen;
size_t iGbkLen;
iconv_t cd;
string sOut;
if (iInLen > iMaxOutLen)
for(string::size_type pos = 0; pos < sIn.length(); ++pos)
{
throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iInLen > iMaxOutLen error : ", errno);
}
cd = iconv_open("UTF-8","GBK");
if (cd == (iconv_t)-1)
{
throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iconv_open error : ", errno);
}
iLeftLen = iMaxOutLen;
while(pIn < pEnd)
{
if((unsigned char)(*pIn)==0x80)
{
//注意GBK的0x80转换为UTF-8时为E2 82 AC
*pOut = 0xe2; pOut++; iLeftLen--;
*pOut = 0x82; pOut++; iLeftLen--;
*pOut = 0xac; pOut++; iLeftLen--;
pIn++;
}
else if((unsigned char)(*pIn)<0x80)
if((unsigned char)sIn[pos] < 0x80)
{
//单字节(GBK: 0x00-0x7F)
*pOut = *pIn;
pIn++;pOut++;iLeftLen--;
}
sOut += sIn[pos];
}
else
{
//双字节
iGbkLen=2;
int iRet=iconv(cd, &pIn, (size_t *)&iGbkLen, (char **)&pOut, (size_t *)&iLeftLen);
if(iRet < 0)
{
*pOut = ' '; //转换不了替换为空格
pIn+=2; pOut++; iLeftLen--;
}
}
}
char pIn[128] = "\0";
iconv_close(cd);
sOut[iMaxOutLen - iLeftLen] = '\0';
iMaxOutLen = iMaxOutLen - iLeftLen;
strncpy(pIn, sIn.c_str() + pos, 2);
sOut = gbk2utf8(pIn);
++pos;
}
vtStr.push_back(sOut);
}
}
std::string TC_Encoder::gbk2utf8(const std::string &strGbk)
{
string outUtf8 = "";
int n = MultiByteToWideChar(CP_ACP, 0, strGbk.c_str(), -1, NULL, 0);
WCHAR *str1 = new WCHAR[n];
MultiByteToWideChar(CP_ACP, 0, strGbk.c_str(), -1,str1, n);
n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
char *str2 = new char[n];
WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
outUtf8 = str2;
delete[]str1;
str1 = NULL;
delete[]str2;
str2 = NULL;
return outUtf8;
}
std::string TC_Encoder::utf82gbk(const std::string &strUtf8)
{
string outGBK = "";
int n = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, NULL, 0);
WCHAR *str1 = new WCHAR[n];
MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, str1, n);
n = WideCharToMultiByte(CP_ACP, 0, str1, -1, NULL, 0, NULL, NULL);
char *str2 = new char[n];
WideCharToMultiByte(CP_ACP, 0, str1, -1, str2, n, NULL, NULL);
outGBK = str2;
delete[] str1;
str1 = NULL;
delete[] str2;
str2 = NULL;
return outGBK;
}
#else
// void TC_Encoder::gbk2utf8(char *sOut, int &iMaxOutLen, const char *sIn, int iInLen)
// {
// char * pIn = (char*)sIn;
// char * pEnd = pIn+iInLen;
// char * pOut = sOut;
// size_t iLeftLen;
// size_t iGbkLen;
// iconv_t cd;
// if (iInLen > iMaxOutLen)
// {
// throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iInLen > iMaxOutLen error : ", errno);
// }
// cd = iconv_open("UTF-8","GBK");
// if (cd == (iconv_t)-1)
// {
// throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iconv_open error : ", errno);
// }
// iLeftLen = iMaxOutLen;
// while(pIn < pEnd)
// {
// if((unsigned char)(*pIn)==0x80)
// {
// //注意GBK的0x80转换为UTF-8时为E2 82 AC
// *pOut = 0xe2; pOut++; iLeftLen--;
// *pOut = 0x82; pOut++; iLeftLen--;
// *pOut = 0xac; pOut++; iLeftLen--;
// pIn++;
// }
// else if((unsigned char)(*pIn)<0x80)
// {
// //单字节(GBK: 0x00-0x7F)
// *pOut = *pIn;
// pIn++;pOut++;iLeftLen--;
// }
// else
// {
// //双字节
// iGbkLen=2;
// int iRet=iconv(cd, &pIn, (size_t *)&iGbkLen, (char **)&pOut, (size_t *)&iLeftLen);
// if(iRet < 0)
// {
// *pOut = ' '; //转换不了替换为空格
// pIn+=2; pOut++; iLeftLen--;
// }
// }
// }
// iconv_close(cd);
// sOut[iMaxOutLen - iLeftLen] = '\0';
// iMaxOutLen = iMaxOutLen - iLeftLen;
// }
string TC_Encoder::gbk2utf8(const string &sIn)
{
iconv_t cd;
iconv_t cd;
cd = iconv_open("UTF-8","GBK");
if (cd == (iconv_t)-1)
cd = iconv_open("UTF-8","GBK");
if (cd == (iconv_t)-1)
{
throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iconv_open error", errno);
TAF_THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::gbk2utf8] iconv_open error");
// throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iconv_open error", TC_Exception::getSystemCode());
}
string sOut;
for(string::size_type pos = 0; pos < sIn.length(); ++pos)
{
if((unsigned char)sIn[pos] == 0x80)
if((unsigned char)sIn[pos] == 0x80)
{
//注意GBK的0x80转换为UTF-8时为E2 82 AC
sOut += 0xe2;
sOut += 0x82;
sOut += 0xac;
}
else if((unsigned char)sIn[pos] < 0x80)
}
else if((unsigned char)sIn[pos] < 0x80)
{
//单字节(GBK: 0x00-0x7F)
sOut += sIn[pos];
}
sOut += sIn[pos];
}
else
{
//双字节
size_t sizeGbkLen = 2;
size_t sizeGbkLen = 2;
char pIn[128] = "\0";
strncpy(pIn, sIn.c_str() + pos, sizeGbkLen);
@ -116,11 +186,11 @@ string TC_Encoder::gbk2utf8(const string &sIn)
char pOut[128] = "\0";
char *o = pOut;
int iRet = iconv(cd, &p, &sizeGbkLen, (char **)&o, &sizeLeftLen);
if(iRet < 0)
if(iRet < 0)
{
//转换不了, 暂时替换为空格
sOut += ' ';
}
sOut += ' ';
}
else
{
sOut += pOut;
@ -128,22 +198,23 @@ string TC_Encoder::gbk2utf8(const string &sIn)
++pos;
}
}
}
}
iconv_close(cd);
return sOut;
iconv_close(cd);
return sOut;
}
void TC_Encoder::gbk2utf8(const string &sIn, vector<string> &vtStr)
{
iconv_t cd;
iconv_t cd;
cd = iconv_open("UTF-8","GBK");
if (cd == (iconv_t)-1)
cd = iconv_open("UTF-8","GBK");
if (cd == (iconv_t)-1)
{
throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iconv_open error", errno);
}
TAF_THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::gbk2utf8] iconv_open error");
// throw TC_Encoder_Exception("[TC_Encoder::gbk2utf8] iconv_open error", TC_Exception::getSystemCode());
}
vtStr.clear();
@ -151,22 +222,22 @@ void TC_Encoder::gbk2utf8(const string &sIn, vector<string> &vtStr)
{
string sOut;
if((unsigned char)sIn[pos] == 0x80)
if((unsigned char)sIn[pos] == 0x80)
{
//注意GBK的0x80转换为UTF-8时为E2 82 AC
sOut += 0xe2;
sOut += 0x82;
sOut += 0xac;
}
else if((unsigned char)sIn[pos] < 0x80)
}
else if((unsigned char)sIn[pos] < 0x80)
{
//单字节(GBK: 0x00-0x7F)
sOut += sIn[pos];
}
sOut += sIn[pos];
}
else
{
//双字节
size_t iGbkLen = 2;
size_t iGbkLen = 2;
char pIn[128] = "\0";
strncpy(pIn, sIn.c_str() + pos, iGbkLen);
@ -176,11 +247,11 @@ void TC_Encoder::gbk2utf8(const string &sIn, vector<string> &vtStr)
char pOut[128] = "\0";
char *o = pOut;
int iRet = iconv(cd, &p, (size_t *)&iGbkLen, (char **)&o, (size_t *)&iLeftLen);
if(iRet < 0)
if(iRet < 0)
{
//转换不了, 暂时替换为空格
sOut += ' ';
}
sOut += ' ';
}
else
{
sOut += pOut;
@ -188,14 +259,61 @@ void TC_Encoder::gbk2utf8(const string &sIn, vector<string> &vtStr)
++pos;
}
}
vtStr.push_back(sOut);
}
}
iconv_close(cd);
iconv_close(cd);
}
// string TC_Encoder::utf82gbk(const string &sIn)
// {
// if(sIn.length() == 0)
// {
// return "";
// }
// iconv_t cd;
// cd = iconv_open("GBK","UTF-8");
// if (cd == (iconv_t)-1)
// {
// throw TC_Encoder_Exception("[TC_Encoder::utf82gbk] iconv_open error", errno);
// }
// size_t sizeLeftLen = sIn.length() * 2 + 1;
// size_t iMaxOutLen = sizeLeftLen;
// // char *pOut = new char[iMaxOutLen];
// char pOut[255];
// // memset(pOut, iMaxOutLen, 0x00);
// const char * pIn = sIn.c_str();
// size_t sizeInLen = sIn.length();
// char *out = pOut;
// cout << sizeInLen << ", " << iMaxOutLen << endl;
// size_t ret = iconv(cd, (char**)&pIn, (size_t*)&sizeInLen, (char **)&out, (size_t*)&sizeLeftLen);
// if (ret == (size_t) - 1)
// {
// // delete[] pOut;
// iconv_close(cd);
// throw TC_Encoder_Exception("[TC_Encoder::utf82gbk] iconv error", errno);
// }
// iconv_close(cd);
// out[iMaxOutLen - sizeLeftLen] = '\0';
// cout << sIn << ", " << iMaxOutLen << "," << sizeLeftLen << "," << out << endl;
// string sOut;
// sOut.assign(out, (iMaxOutLen - sizeLeftLen));
// // delete[] pOut;
// return sOut;
// }
void TC_Encoder::utf82gbk(char *sOut, int &iMaxOutLen, const char *sIn, int iInLen)
{
iconv_t cd;
@ -203,12 +321,13 @@ void TC_Encoder::utf82gbk(char *sOut, int &iMaxOutLen, const char *sIn, int iInL
cd = iconv_open("GBK","UTF-8");
if (cd == (iconv_t)-1)
{
throw TC_Encoder_Exception("[TC_Encoder::utf82gbk] iconv_open error", errno);
TAF_THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::utf82gbk] iconv_open error");
// throw TC_Encoder_Exception("[TC_Encoder::utf82gbk] iconv_open error", TC_Exception::getSystemCode());
}
char * pIn = (char*)sIn;
size_t sizeLeftLen = iMaxOutLen;
size_t sizeInLen = iInLen;
size_t sizeLeftLen = iMaxOutLen;
size_t sizeInLen = iInLen;
char* pOut = sOut;
size_t ret = iconv(cd, &pIn, &sizeInLen, (char **)&sOut, &sizeLeftLen);
@ -216,7 +335,8 @@ void TC_Encoder::utf82gbk(char *sOut, int &iMaxOutLen, const char *sIn, int iInL
{
iMaxOutLen = 0;
iconv_close(cd);
throw TC_Encoder_Exception("[TC_Encoder::utf82gbk] iconv error", errno);
TAF_THROW_EXCEPTION_SYSCODE(TC_Encoder_Exception, "[TC_Encoder::utf82gbk] iconv error");
// throw TC_Encoder_Exception("[TC_Encoder::utf82gbk] iconv error", TC_Exception::getSystemCode());
return;
}
@ -254,31 +374,33 @@ string TC_Encoder::utf82gbk(const string &sIn)
delete[] pOut;
return sOut;
return sOut;
}
#endif
/**
* \n -> \r\0
* \r -> \r\r
*/
string TC_Encoder::transTo(const string& str, char f /*='\n'*/, char t /*= '\r'*/, char u /*= '\0'*/)
{
string ret = str;
string ret = str;
for (size_t i = 0; i < ret.length(); ++i)
{
if (ret[i] == f)
{
ret[i] = t;
for (size_t i = 0; i < ret.length(); ++i)
{
if (ret[i] == f)
{
ret[i] = t;
ret.insert(++i, 1, u);
}
else if (ret[i] == t)
{
ret.insert(++i, 1, t);
}
}
return ret;
ret.insert(++i, 1, u);
}
else if (ret[i] == t)
{
ret.insert(++i, 1, t);
}
}
return ret;
}
/**
@ -287,24 +409,26 @@ string TC_Encoder::transTo(const string& str, char f /*='\n'*/, char t /*= '\r'*
*/
string TC_Encoder::transFrom(const string& str, char f /*= '\n'*/, char t /*= '\r'*/, char u /*= '\0'*/)
{
string ret = "";
string ret = "";
for (string::const_iterator it = str.begin()
; it != str.end()
; ++it)
{
ret.append(1, *it);
for (string::const_iterator it = str.begin()
; it != str.end()
; ++it)
{
ret.append(1, *it);
if (*it == t)
{
if (*(++it) == u)
{
*ret.rbegin() = f;
}
}
}
return ret;
if (*it == t)
{
if (*(++it) == u)
{
*ret.rbegin() = f;
}
}
}
return ret;
}
}

View File

@ -894,7 +894,7 @@ TC_EpollServer::header_filter_functor &TC_EpollServer::BindAdapter::getHeaderFil
// _iHeaderLen = iHeaderLen;
// }
void TC_EpollServer::BindAdapter::setConnProtocol(const TC_EpollServer::conn_protocol_functor& cpf, int iHeaderLen, const TC_EpollServer::header_filter_functor &hf)
void TC_EpollServer::BindAdapter::setConnProtocol(const TC_NetWorkBuffer::protocol_functor& cpf, int iHeaderLen, const TC_EpollServer::header_filter_functor &hf)
{
_cpf = cpf;
@ -908,10 +908,10 @@ void TC_EpollServer::BindAdapter::setConnProtocol(const TC_EpollServer::conn_pro
// return _pf;
// }
TC_EpollServer::header_filter_functor& TC_EpollServer::BindAdapter::getHeaderFilterFunctor()
{
return _hf;
}
// TC_EpollServer::header_filter_functor& TC_EpollServer::BindAdapter::getHeaderFilterFunctor()
// {
// return _hf;
// }
int TC_EpollServer::BindAdapter::getHeaderFilterLen()
{
@ -1168,17 +1168,18 @@ int TC_EpollServer::Connection::parseProtocol()
}
#endif
string ro;
// string ro;
vector<char> ro;
int b = TC_EpollServer::PACKET_LESS;
if (_pBindAdapter->getConnProtocol())
{
b = _pBindAdapter->getConnProtocol()(_recvbuffer, ro, this);
}
else
{
b = _pBindAdapter->getProtocol()(_recvbuffer, ro);
}
// if (_pBindAdapter->getConnProtocol())
// {
// b = _pBindAdapter->getConnProtocol()(_recvbuffer, ro, this);
// }
// else
// {
// b = _pBindAdapter->getProtocol()(_recvbuffer, ro);
// }
if(b == TC_EpollServer::PACKET_LESS)
{
@ -1187,8 +1188,7 @@ int TC_EpollServer::Connection::parseProtocol()
}
else if(b == TC_EpollServer::PACKET_FULL)
{
if (_pBindAdapter->_authWrapper &&
_pBindAdapter->_authWrapper(this, ro))
if (_pBindAdapter->_authWrapper && _pBindAdapter->_authWrapper(this, ro))
continue;
shared_ptr<RecvContext> recv = std::make_shared<RecvContext>(getId(), _ip, _port, getfd(), _pBindAdapter);
@ -2125,9 +2125,9 @@ void TC_EpollServer::NetThread::debug(const string &s)
_epollServer->debug(s);
}
void TC_EpollServer::NetThread::tars(const string &s)
void TC_EpollServer::NetThread::info(const string &s)
{
_epollServer->tars(s);
_epollServer->info(s);
}
void TC_EpollServer::NetThread::error(const string &s)
@ -2645,7 +2645,7 @@ void TC_EpollServer::NetThread::processPipe()
continue;
}
switch(sc->cmd)
switch(sc->cmd())
{
case 'c':
{
@ -2897,7 +2897,7 @@ TC_EpollServer::TC_EpollServer(unsigned int iNetThreadNum)
#if TARGET_PLATFORM_WINDOWS
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata);
#endi
#endif
if(_netThreadNum < 1)
{
@ -3500,6 +3500,11 @@ TC_EpollServer::BindAdapterPtr TC_EpollServer::getBindAdapter(const string &sNam
return NULL;
}
vector<TC_EpollServer::BindAdapterPtr> TC_EpollServer::getBindAdapters()
{
return this->_bindAdapters;
}
// TC_EpollServer::BindAdapterPtr TC_EpollServer::getBindAdapter(const string &sName)
// {
// for(size_t i = 0; i < _netThreads.size(); ++i)
@ -3551,11 +3556,11 @@ void TC_EpollServer::debug(const string &s)
}
}
void TC_EpollServer::tars(const string &s)
void TC_EpollServer::info(const string &s)
{
if(_pLocalLogger)
{
_pLocalLogger->tars() << "[TARS]" << s << endl;
_pLocalLogger->info() << "[TARS]" << s << endl;
}
}
@ -3581,20 +3586,26 @@ vector<TC_EpollServer::ConnStatus> TC_EpollServer::getConnStatus(int lfd)
return vConnStatus;
}
map<int, TC_EpollServer::BindAdapterPtr> TC_EpollServer::getListenSocketInfo()
unordered_map<int, TC_EpollServer::BindAdapterPtr> TC_EpollServer::getListenSocketInfo()
{
map<int, TC_EpollServer::BindAdapterPtr> mListen;
for(size_t i = 0; i < _netThreads.size(); ++i)
{
auto tmp = _netThreads[i]->getListenSocketInfo();
for (const auto& kv : tmp)
{
mListen.insert(kv);
}
}
return mListen;
return _listeners;
}
// map<int, TC_EpollServer::BindAdapterPtr> TC_EpollServer::getListenSocketInfo()
// {
// map<int, TC_EpollServer::BindAdapterPtr> mListen;
// for(size_t i = 0; i < _netThreads.size(); ++i)
// {
// auto tmp = _netThreads[i]->getListenSocketInfo();
// for (const auto& kv : tmp)
// {
// mListen.insert(kv);
// }
// }
// return mListen;
// }
size_t TC_EpollServer::getConnectionCount()
{
size_t iConnTotal = 0;

View File

@ -20,7 +20,7 @@
#include <unistd.h>
#endif
namespace taf
namespace tars
{
TC_Epoller::NotifyInfo::NotifyInfo() : _ep(NULL)

View File

@ -16,32 +16,46 @@
#include "util/tc_http_async.h"
#include "util/tc_common.h"
#include "util/tc_timeprovider.h"
namespace tars
{
TC_HttpAsync::AsyncRequest::AsyncRequest(TC_HttpRequest &stHttpRequest, TC_HttpAsync::RequestCallbackPtr &callbackPtr)
: _pHttpAsync(NULL),_iUniqId(0), _callbackPtr(callbackPtr)
TC_HttpAsync::AsyncRequest::AsyncRequest(TC_HttpRequest &stHttpRequest, TC_HttpAsync::RequestCallbackPtr &callbackPtr, bool bUseProxy)
: _pHttpAsync(NULL), _iUniqId(0), _callbackPtr(callbackPtr), _bUseProxy(bUseProxy), _isConnected(false)
{
memset(&_bindAddr,0,sizeof(struct sockaddr));
memset(&_bindAddr, 0, sizeof(struct sockaddr));
_bindAddrSet = false;
_sReq = stHttpRequest.encode();
stHttpRequest.getHostPort(_sHost, _iPort);
// _notify.createSocket();
}
TC_HttpAsync::AsyncRequest::~AsyncRequest()
{
doClose();
// if (_pHttpAsync)
// _pHttpAsync->delConnection(_notify.getfd());
// _notify.close();
}
void TC_HttpAsync::AsyncRequest::doClose()
{
if(_fd.isValid())
if (_pHttpAsync) _pHttpAsync->assertThreadId();
if (_fd.isValid())
{
if(_callbackPtr) _callbackPtr->onClose();
if(_pHttpAsync) _pHttpAsync->erase(_iUniqId);
try { if (_callbackPtr) _callbackPtr->onClose(); } catch (...) {}
if (_pHttpAsync)
{
_pHttpAsync->delConnection(_fd.getfd());
_pHttpAsync->erase(_iUniqId);
}
_fd.close();
}
}
@ -53,82 +67,58 @@ void TC_HttpAsync::AsyncRequest::setBindAddr(const struct sockaddr* addr)
_bindAddrSet = true;
}
int TC_HttpAsync::AsyncRequest::doConnect()
void TC_HttpAsync::AsyncRequest::doConnect()
{
if (_pHttpAsync)
_pHttpAsync->assertThreadId();
_fd.createSocket();
_fd.setblock();
//不产生TimeWait状态
_fd.setTcpNoDelay();
_fd.setNoCloseWait();
try
{
if(_bindAddrSet)
if (_bindAddrSet)
{
_fd.bind(&_bindAddr,sizeof(_bindAddr));
_fd.bind(&_bindAddr, sizeof(_bindAddr));
}
int ret = _fd.connectNoThrow(_sHost, _iPort);
int ret = 0;
if(ret < 0 && errno != EINPROGRESS)
if (_bUseProxy)
ret = _fd.connectNoThrow(_pHttpAsync->getProxyAddr());
else
ret = _fd.connectNoThrow(_sHost, _iPort);
if (ret < 0 && !TC_Socket::isInProgress())
{
_fd.close();
return ret;
doException(RequestCallback::Failed_Connect, getError("connect server error."));
return;
}
_pHttpAsync->addConnection(_fd.getfd(), _iUniqId, EPOLLIN | EPOLLOUT);
}
catch(exception &ex)
catch (exception &ex)
{
_fd.close();
return -1;
doException(RequestCallback::Failed_Connect, ex.what());
}
return 0;
}
int TC_HttpAsync::AsyncRequest::doConnect(struct sockaddr* proxyAddr)
{
_fd.createSocket();
_fd.setblock();
//不产生TimeWait状态
_fd.setNoCloseWait();
try
{
if(_bindAddrSet)
{
_fd.bind(&_bindAddr,sizeof(_bindAddr));
}
int ret = _fd.connectNoThrow(proxyAddr);
if(ret < 0 && errno != EINPROGRESS)
{
_fd.close();
return ret;
}
}
catch(exception &ex)
{
_fd.close();
return -1;
}
return 0;
}
int TC_HttpAsync::AsyncRequest::recv(void* buf, uint32_t len, uint32_t flag)
{
int ret = ::recv(_fd.getfd(), buf, len, flag);
int ret = ::recv(_fd.getfd(), (char*)buf, len, flag);
if (ret == 0)
{
return 0;
}
else if(ret < 0 && errno == EAGAIN)
else if (ret < 0 && TC_Socket::isPending())
{
return -1;
}
else if(ret < 0)
else if (ret < 0)
{
//其他网络异常
return -2;
@ -140,9 +130,9 @@ int TC_HttpAsync::AsyncRequest::recv(void* buf, uint32_t len, uint32_t flag)
int TC_HttpAsync::AsyncRequest::send(const void* buf, uint32_t len, uint32_t flag)
{
int ret = ::send(_fd.getfd(), buf, len, flag);
int ret = ::send(_fd.getfd(), (char*)buf, len, flag);
if (ret < 0 && errno == EAGAIN)
if (ret < 0 && TC_Socket::isPending())
{
return -1;
}
@ -155,45 +145,67 @@ int TC_HttpAsync::AsyncRequest::send(const void* buf, uint32_t len, uint32_t fla
void TC_HttpAsync::AsyncRequest::timeout()
{
try
{
doClose();
if (_pHttpAsync) _pHttpAsync->assertThreadId();
if (hasConnected())
doException(RequestCallback::Failed_Timeout, "timeout error.");
else
doException(RequestCallback::Failed_ConnectTimeout, "connect timeout error.");
if(_callbackPtr) _callbackPtr->onTimeout();
}
catch(exception &ex)
{
if(_callbackPtr) _callbackPtr->onException(ex.what());
}
catch(...)
{
if(_callbackPtr) _callbackPtr->onException("unknown error.");
}
}
void TC_HttpAsync::AsyncRequest::doException()
string TC_HttpAsync::AsyncRequest::getError(const char* sDefault) const
{
string err("unknown error.");
if(_fd.isValid())
int ret = TC_Exception::getSystemCode();
if(ret!= 0)
{
int error;
socklen_t len = sizeof(error);
_fd.getSockOpt(SO_ERROR, (void*)&error, len, SOL_SOCKET);
err = strerror(error);
doClose();
return TC_Exception::parseError(ret);
}
try { if(_callbackPtr) _callbackPtr->onException(err); } catch(...) { }
return sDefault;
}
// string TC_HttpAsync::AsyncRequest::getError(const string &sDefault) const
// {
// string err;
// if (_fd.isValid())
// {
// int error;
// SOCKET_LEN_TYPE len = sizeof(error);
// _fd.getSockOpt(SO_ERROR, (void*)&error, len, SOL_SOCKET);
// if (error != 0)
// {
// err = strerror(error);
// }
// }
// if (err.empty() && errno != 0)
// {
// err = strerror(errno);
// }
// if (err.empty())
// err = sDefault;
// return err;
// }
void TC_HttpAsync::AsyncRequest::doException(RequestCallback::FAILED_CODE ret, const string &e)
{
doClose();
try { if (_callbackPtr) _callbackPtr->onFailed(ret, e); } catch (...) { }
}
void TC_HttpAsync::AsyncRequest::doRequest()
{
if(!_fd.isValid()) return;
if (_pHttpAsync) _pHttpAsync->assertThreadId();
if (!_fd.isValid()) return;
int ret = -1;
setConnected(true);
do
{
ret = -1;
@ -202,21 +214,22 @@ void TC_HttpAsync::AsyncRequest::doRequest()
{
if ((ret = this->send(_sReq.c_str(), _sReq.length(), 0)) > 0)
{
_sReq = _sReq.substr(ret);
_sReq = _sReq.substr(ret);
}
}
}while(ret > 0);
} while (ret > 0);
//网络异常
if(ret == -2)
if (ret == -2)
{
doException();
doException(RequestCallback::Failed_Net, getError("send error."));
}
}
void TC_HttpAsync::AsyncRequest::doReceive()
{
if(!_fd.isValid()) return;
if (_pHttpAsync) _pHttpAsync->assertThreadId();
if (!_fd.isValid()) return;
int recv = 0;
@ -231,62 +244,102 @@ void TC_HttpAsync::AsyncRequest::doReceive()
}
while (recv > 0);
if(recv == -2)
if (recv == -2)
{
doException();
doException(RequestCallback::Failed_Net, getError("recv error."));
}
else
{
try
//增量decode
bool ret = _stHttpResp.incrementDecode(_sRsp);
//有头部数据了
if (_callbackPtr && !_stHttpResp.getHeaders().empty())
{
//增量decode
bool ret = _stHttpResp.incrementDecode(_sRsp);
//有头部数据了
if(_callbackPtr && !_stHttpResp.getHeaders().empty())
bool bContinue = _callbackPtr->onContinue(_stHttpResp);
if (!bContinue)
{
bool bContinue = _callbackPtr->onReceive(_stHttpResp);
if(!bContinue)
{
doClose();
return;
}
doException(RequestCallback::Failed_Interrupt, getError("receive interrupt."));
return;
}
}
//数据接收完毕
if (ret)
{
//只支持短连接, 数据收取完毕, 关闭链接
doClose();
try { if (_callbackPtr) _callbackPtr->onSucc(_stHttpResp); } catch (...) { }
return;
}
else
{
//服务器关闭了连接
bool bClose = (recv == 0);
//如果远程关闭连接或者增量decode完毕
if(bClose || ret)
if (bClose)
{
doClose();
if(_callbackPtr) _callbackPtr->onResponse(bClose, _stHttpResp);
try { if (_callbackPtr) _callbackPtr->onSucc(_stHttpResp); } catch (...) { }
// doException(RequestCallback::Failed_Close, getError("close by server."));
}
}
catch(exception &ex)
{
if(_callbackPtr) _callbackPtr->onException(ex.what());
}
catch(...)
{
if(_callbackPtr) _callbackPtr->onException("unknown error.");
}
}
}
void TC_HttpAsync::AsyncRequest::processNet(const epoll_event &ev)
{
if (TC_Epoller::readEvent(ev))//events & EPOLLIN)
{
// cout << "readEvent" << endl;
doReceive();
}
if (TC_Epoller::writeEvent(ev))
{
// cout << "writeEvent" << endl;
doRequest();
}
}
void TC_HttpAsync::AsyncRequest::processNotify()
{
//没有建立连接, 发起连接
if (!isValid())
{
// cout << "doConnect" << endl;
doConnect();
}
else
{
// cout << "doRequest" << endl;
doRequest();
}
}
///////////////////////////////////////////////////////////////////////////
#define H64(x) (((uint64_t)x) << 32)
TC_HttpAsync::TC_HttpAsync() : _terminate(false)
{
memset(&_proxyAddr,0,sizeof(struct sockaddr));
memset(&_bindAddr,0,sizeof(struct sockaddr));
memset(&_proxyAddr, 0, sizeof(struct sockaddr));
memset(&_bindAddr, 0, sizeof(struct sockaddr));
_bindAddrSet=false;
_bindAddrSet = false;
_data = new http_queue_type(10000);
_epoller.create(1024);
// _notify.createSocket();
_notify.init(&_epoller);
uint64_t data = H64(_notify.notifyFd()) | 0;
_notify.add(data);
// _epoller.add(_notify.getfd(), data, EPOLLIN);
}
TC_HttpAsync::~TC_HttpAsync()
@ -294,13 +347,21 @@ TC_HttpAsync::~TC_HttpAsync()
terminate();
delete _data;
// _notify.close();
_notify.release();
_epoller.close();
}
void TC_HttpAsync::start(int iThreadNum)
void TC_HttpAsync::start()
{
_tpool.init(1);
_tpool.start();
// TC_Functor<void> cmd(this, &TC_HttpAsync::run);
// TC_Functor<void>::wrapper_type wt(cmd);
_tpool.exec(std::bind(&TC_HttpAsync::run, this));
}
@ -308,9 +369,9 @@ void TC_HttpAsync::waitForAllDone(int millsecond)
{
time_t now = TNOW;
while(_data->size() > 0)
while (_data->size() > 0)
{
if(millsecond < 0)
if (millsecond < 0)
{
TC_ThreadLock::Lock lock(*this);
timedWait(100);
@ -323,7 +384,7 @@ void TC_HttpAsync::waitForAllDone(int millsecond)
timedWait(100);
}
if((TNOW - now) >= (millsecond/1000))
if ((TNOW - now) >= (millsecond / 1000))
break;
}
@ -341,6 +402,9 @@ void TC_HttpAsync::erase(uint32_t uniqId)
void TC_HttpAsync::terminate()
{
_terminate = true;
_notify.notify();
_tpool.waitForAllDone();
}
@ -349,33 +413,15 @@ void TC_HttpAsync::timeout(AsyncRequestPtr& ptr)
ptr->timeout();
}
int TC_HttpAsync::doAsyncRequest(TC_HttpRequest &stHttpRequest, RequestCallbackPtr &callbackPtr, bool bUseProxy,struct sockaddr* addr)
void TC_HttpAsync::doAsyncRequest(TC_HttpRequest &stHttpRequest, RequestCallbackPtr &callbackPtr, bool bUseProxy)
{
int ret;
AsyncRequest * req = new AsyncRequest(stHttpRequest, callbackPtr, bUseProxy);
AsyncRequestPtr req = new AsyncRequest(stHttpRequest, callbackPtr);
if(_bindAddrSet)
if (_bindAddrSet)
{
req->setBindAddr(&_bindAddr);
}
//发起异步连接请求
if(bUseProxy)
{
ret = req->doConnect(&_proxyAddr);
}
else if(NULL != addr)
{
ret = req->doConnect(addr);
}
else
{
ret = req->doConnect();
}
if(ret < 0) return -1;
uint32_t uniqId = _data->generateId();
req->setUniqId(uniqId);
@ -384,14 +430,29 @@ int TC_HttpAsync::doAsyncRequest(TC_HttpRequest &stHttpRequest, RequestCallbackP
_data->push(req, uniqId);
_epoller.add(req->getfd(), uniqId, EPOLLIN | EPOLLOUT);
{
std::lock_guard<std::mutex> lock(_mutex);
_events.push_back(H64(_notify.notifyFd()) | uniqId);
}
_notify.notify();
// addConnection(req->getNotifyfd(), uniqId, EPOLLIN);
}
return 0;
void TC_HttpAsync::addConnection(int fd, uint32_t uniqId, uint32_t events)
{
uint64_t data = H64(fd) | uniqId;
_epoller.add(fd, data, events);
}
void TC_HttpAsync::delConnection(int fd)
{
_epoller.del(fd, 0, 0);
}
int TC_HttpAsync::setBindAddr(const char* sBindAddr)
{
bzero(&_bindAddr,sizeof(_bindAddr));
memset(&_bindAddr, 0x00, sizeof(_bindAddr));
struct sockaddr_in* p = (struct sockaddr_in *)&_bindAddr;
@ -399,7 +460,7 @@ int TC_HttpAsync::setBindAddr(const char* sBindAddr)
{
TC_Socket::parseAddr(sBindAddr, p->sin_addr);
}
catch(exception &ex)
catch (exception &ex)
{
return -1;
}
@ -412,12 +473,11 @@ int TC_HttpAsync::setBindAddr(const char* sBindAddr)
return 0;
}
int TC_HttpAsync::setProxyAddr(const char* sProxyAddr)
{
vector<string> v = TC_Common::sepstr<string>(sProxyAddr, ":");
if(v.size() < 2)
if (v.size() < 2)
return -1;
return setProxyAddr(v[0].c_str(), TC_Common::strto<uint16_t>(v[1]));
@ -425,7 +485,7 @@ int TC_HttpAsync::setProxyAddr(const char* sProxyAddr)
int TC_HttpAsync::setProxyAddr(const char* sHost, uint16_t iPort)
{
bzero(&_proxyAddr,sizeof(_proxyAddr));
memset(&_proxyAddr, 0x00, sizeof(_proxyAddr));
struct sockaddr_in *p = (struct sockaddr_in *)&_proxyAddr;
@ -433,7 +493,7 @@ int TC_HttpAsync::setProxyAddr(const char* sHost, uint16_t iPort)
{
TC_Socket::parseAddr(sHost, p->sin_addr);
}
catch(exception &ex)
catch (exception &ex)
{
return -1;
}
@ -449,34 +509,15 @@ void TC_HttpAsync::setProxyAddr(const struct sockaddr* addr)
memcpy(&_proxyAddr, addr, sizeof(struct sockaddr));
}
void TC_HttpAsync::process(AsyncRequestPtr& p, int events)
{
if (events & (EPOLLERR | EPOLLHUP))
{
p->doException();
return;
}
if(events & EPOLLIN)
{
p->doReceive();
}
if(events & EPOLLOUT)
{
p->doRequest();
}
}
void TC_HttpAsync::run()
{
TC_TimeoutQueue<AsyncRequestPtr>::data_functor df(&TC_HttpAsync::timeout);
_threadId = std::this_thread::get_id();
async_process_type apt(&TC_HttpAsync::process);
TC_TimeoutQueue<AsyncRequestPtr>::data_functor df(&TC_HttpAsync::timeout);
int64_t lastDealTimeout = 0;
while(!_terminate)
while (!_terminate)
{
try
{
@ -493,19 +534,52 @@ void TC_HttpAsync::run()
{
epoll_event ev = _epoller.get(i);
uint32_t uniqId = (uint32_t)ev.data.u64;
if (_terminate)
break;
AsyncRequestPtr p = _data->get(uniqId, false);
uint32_t fd = TC_Epoller::getU32(ev, true);
if(!p) continue;
if ((int)fd == _notify.notifyFd())
{
// cout << "notify" << endl;
deque<uint64_t> events;
// async_process_type::wrapper_type w(apt, p, ev.events);
{
std::lock_guard<std::mutex> lock(_mutex);
// _npool[uniqId%_npool.size()]->exec(w);
process(p, ev.events);
_events.swap(events);
}
for(auto data : events)
{
uint32_t uniqId = (uint32_t)data;
// cout << "socket uniqId:" << uniqId << endl;
AsyncRequestPtr ptr = _data->getAndRefresh(uniqId);
if (!ptr)
continue;
ptr->processNotify();
}
}
else
{
uint32_t uniqId = TC_Epoller::getU32(ev, false);
// cout << "http socket uniqId:" << uniqId << endl;
AsyncRequestPtr ptr = _data->getAndRefresh(uniqId);
if (!ptr)
continue;
// assert(fd == ptr->getfd());
ptr->processNet(ev);
}
}
}
catch(exception &ex)
catch (exception &ex)
{
cerr << "[TC_HttpAsync::run] error:" << ex.what() << endl;
}

View File

@ -27,7 +27,8 @@
#include <cassert>
#include <iostream>
#include "util/tc_file.h"
namespace taf
namespace tars
{
TC_Mmap::TC_Mmap(bool bOwner)

View File

@ -1,26 +1,84 @@
/**
* Tencent is pleased to support the open source community by making Tars available.
*
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
#include "util/tc_platform.h"
#include "util/tc_pack.h"
#include <iostream>
#include <string.h>
#if TARGET_PLATFORM_LINUX
#include <arpa/inet.h>
#endif
namespace tars
{
#if TARGET_PLATFORM_WINDOWS
#pragma comment(lib,"ws2_32.lib")
#endif
#if TARGET_PLATFORM_IOS || TARGET_PLATFORM_WINDOWS
# ifndef __LITTLE_ENDIAN
# define __LITTLE_ENDIAN 1234
# endif
# ifndef __BIG_ENDIAN
# define __BIG_ENDIAN 4321
# endif
# ifndef __BYTE_ORDER
# define __BYTE_ORDER __LITTLE_ENDIAN
# endif
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
# define pack_ntohll(x) (x)
# define pack_htonll(x) (x)
# define pack_ntohf(x) (x)
# define pack_htonf(x) (x)
# define pack_ntohd(x) (x)
# define pack_htond(x) (x)
#else
# if __BYTE_ORDER == __LITTLE_ENDIAN
# define pack_ntohll(x) pack_htonll(x)
union pack_bswap_helper
{
int64_t i64;
int32_t i32[2];
};
inline int64_t pack_htonll(int64_t x)
{
pack_bswap_helper h;
h.i64 = x;
int64_t tmp = htonl(h.i32[1]);
h.i32[1] = htonl(h.i32[0]);
h.i32[0] = tmp;
return h.i64;
}
inline float pack_ntohf(float x)
{
union {
float f;
int32_t i32;
} helper;
helper.f = x;
helper.i32 = htonl( helper.i32 );
return helper.f;
}
# define pack_htonf(x) pack_ntohf(x)
inline double pack_ntohd(double x)
{
union {
double d;
int64_t i64;
} helper;
helper.d = x;
helper.i64 = pack_htonll( helper.i64 );
return helper.d;
}
# define pack_htond(x) pack_ntohd(x)
# endif
#endif
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (bool t)
{
_buffer.append(sizeof(bool), (char)t);
@ -71,9 +129,7 @@ TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (long t)
{
if(sizeof(long) == 8)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
t = pack_htonll(t);
}
else
{
@ -88,9 +144,7 @@ TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned long
{
if(sizeof(unsigned long) == 8)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
t = pack_htonll(t);
}
else
{
@ -103,9 +157,7 @@ TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned long
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (long long t)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
t = pack_htonll(t);
_buffer.append((const char *)&t, sizeof(long long));
return *this;
@ -113,9 +165,7 @@ TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (long long t)
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned long long t)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
t = pack_htonll(t);
_buffer.append((const char *)&t, sizeof(unsigned long long));
@ -124,12 +174,16 @@ TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (unsigned long
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (float t)
{
t = pack_htonf(t);
_buffer.append((const char *)&t, sizeof(float));
return *this;
}
TC_PackIn::TC_PackInInner& TC_PackIn::TC_PackInInner::operator << (double t)
{
t = pack_htond(t);
_buffer.append((const char *)&t, sizeof(double));
return *this;
}
@ -297,9 +351,7 @@ TC_PackOut& TC_PackOut::operator >> (long &t)
if(sizeof(unsigned long) == 8)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
t = pack_ntohll(t);
}
else
{
@ -323,9 +375,7 @@ TC_PackOut& TC_PackOut::operator >> (unsigned long &t)
if(sizeof(unsigned long) == 8)
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
t = pack_ntohll(t);
}
else
{
@ -347,9 +397,7 @@ TC_PackOut& TC_PackOut::operator >> (long long &t)
memcpy(&t, _pbuffer + _pos, len);
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
t = pack_ntohll(t);
_pos += len;
@ -366,9 +414,7 @@ TC_PackOut& TC_PackOut::operator >> (unsigned long long &t)
memcpy(&t, _pbuffer + _pos, len);
#if __BYTE_ORDER == __LITTLE_ENDIAN
t = __bswap_64(t);
#endif
t = pack_ntohll(t);
_pos += len;
@ -383,6 +429,9 @@ TC_PackOut& TC_PackOut::operator >> (float &f)
}
memcpy(&f, _pbuffer + _pos, sizeof(float));
f = pack_ntohf(f);
_pos += sizeof(float);
return *this;
@ -396,6 +445,9 @@ TC_PackOut& TC_PackOut::operator >> (double &f)
}
memcpy(&f, _pbuffer + _pos, sizeof(double));
f = pack_ntohd(f);
_pos += sizeof(double);
return *this;

View File

@ -13,12 +13,11 @@
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
#include "util/tc_sha.h"
#include "util/tc_common.h"
#include <stdio.h>
#include <string.h>
#include <endian.h>
// #include <endian.h>
#include <limits.h>
namespace tars
@ -667,7 +666,7 @@ string TC_SHA::sha1file(const string &fileName)
size_t n;
detail_sha1::sha1_ctx cx[1];
if(( f = fopen( fileName.c_str(), "rb" )) == NULL )
throw TC_SHA_Exception("[TC_SHA::sha1file] fopen '" + fileName + "', error.", errno);
throw TC_SHA_Exception("[TC_SHA::sha1file] fopen '" + fileName + "', error.", true);
detail_sha1::sha1_begin(cx);
while((n = fread( buf, 1, sizeof( buf ),f)) > 0 )
@ -709,7 +708,7 @@ string TC_SHA::sha256file(const string &fileName)
size_t n;
detail_sha2::sha256_ctx cx[1];
if(( f = fopen( fileName.c_str(), "rb" )) == NULL )
throw TC_SHA_Exception("[TC_SHA::sha256file] fopen '" + fileName + "', error.", errno);
throw TC_SHA_Exception("[TC_SHA::sha256file] fopen '" + fileName + "', error.", true);
detail_sha2::sha256_begin(cx);
while((n = fread( buf, 1, sizeof( buf ),f)) > 0 )
@ -751,7 +750,7 @@ string TC_SHA::sha384file(const string &fileName)
size_t n;
detail_sha2::sha384_ctx cx[1];
if(( f = fopen( fileName.c_str(), "rb" )) == NULL )
throw TC_SHA_Exception("[TC_SHA::sha384file] fopen '" + fileName + "', error.", errno);
throw TC_SHA_Exception("[TC_SHA::sha384file] fopen '" + fileName + "', error.", true);
detail_sha2::sha384_begin(cx);
while((n = fread( buf, 1, sizeof( buf ),f)) > 0 )
@ -793,7 +792,7 @@ string TC_SHA::sha512file(const string &fileName)
size_t n;
detail_sha2::sha512_ctx cx[1];
if(( f = fopen( fileName.c_str(), "rb" )) == NULL )
throw TC_SHA_Exception("[TC_SHA::sha512file] fopen '" + fileName + "', error.", errno);
throw TC_SHA_Exception("[TC_SHA::sha512file] fopen '" + fileName + "', error.", true);
detail_sha2::sha512_begin(cx);
while((n = fread( buf, 1, sizeof( buf ),f)) > 0 )
@ -807,4 +806,3 @@ string TC_SHA::sha512file(const string &fileName)
}
}

View File

@ -127,3 +127,5 @@ int TC_Shm::del()
#endif
}
}

View File

@ -109,7 +109,7 @@ void TC_Socket::getPeerName(string &sPeerAddress, uint16_t &iPeerPort)
#if TARGET_PLATFORM_LINUX||TARGET_PLATFORM_IOS
void TC_Socket::getPeerName(string &sPathName)
void TC_Socket::getPeerName(string &sPathName) const
{
assert(_iDomain == AF_LOCAL);
@ -121,7 +121,7 @@ void TC_Socket::getPeerName(string &sPathName)
sPathName = stSock.sun_path;
}
void TC_Socket::getSockName(string &sPathName)
void TC_Socket::getSockName(string &sPathName) const
{
assert(_iDomain == AF_LOCAL);
@ -170,7 +170,7 @@ int TC_Socket::connectNoThrow(const char *sPathName)
#endif
void TC_Socket::getPeerName(struct sockaddr *pstPeerAddr, socklen_t &iPeerLen)
void TC_Socket::getPeerName(struct sockaddr *pstPeerAddr, socklen_t &iPeerLen) const
{
if(getpeername(_sock, pstPeerAddr, &iPeerLen) < 0)
{
@ -178,7 +178,7 @@ void TC_Socket::getPeerName(struct sockaddr *pstPeerAddr, socklen_t &iPeerLen)
}
}
void TC_Socket::getSockName(string &sSockAddress, uint16_t &iSockPort)
void TC_Socket::getSockName(string &sSockAddress, uint16_t &iSockPort) const
{
assert(_iDomain == AF_INET || _iDomain == AF_INET6);
@ -195,7 +195,7 @@ void TC_Socket::getSockName(string &sSockAddress, uint16_t &iSockPort)
iSockPort = (AF_INET6 == _iDomain) ? ntohs(in6.sin6_port) : ntohs(in4.sin_port);
}
void TC_Socket::getSockName(struct sockaddr *pstSockAddr, socklen_t &iSockLen)
void TC_Socket::getSockName(struct sockaddr *pstSockAddr, socklen_t &iSockLen) const
{
if(getsockname(_sock, pstSockAddr, &iSockLen) < 0)
{
@ -427,7 +427,7 @@ int TC_Socket::connectNoThrow(const string &sServerAddr, uint16_t port)
return connect(serverAddr, len);
}
int TC_Socket::connectNoThrow(struct sockaddr* addr)
int TC_Socket::connectNoThrow(const struct sockaddr* addr)
{
assert(_iDomain == AF_INET || _iDomain == AF_INET6);
@ -445,7 +445,7 @@ void TC_Socket::connect(const string &sServerAddr, uint16_t port)
}
int TC_Socket::connect(struct sockaddr *pstServerAddr, socklen_t serverLen)
int TC_Socket::connect(const struct sockaddr *pstServerAddr, socklen_t serverLen)
{
return ::connect(_sock, pstServerAddr, serverLen);

View File

@ -15,6 +15,7 @@
*/
#include "util/tc_thread.h"
#include <sstream>
#include <cerrno>
namespace tars