init
This commit is contained in:
		
							
								
								
									
										641
									
								
								Gateway/common/log/log_sender.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										641
									
								
								Gateway/common/log/log_sender.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,641 @@ | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include "os_def.h" | ||||
| #include "_ast.h" | ||||
|  | ||||
| #include "x_tick.h" | ||||
| #include "x_lock.h" | ||||
| #include "container/queue_list.h" | ||||
| #include "net/base_socket.h" | ||||
| #include "share_util.h" | ||||
| #include "memory/buffer_allocator.h" | ||||
| #include "appitnmsg.h" | ||||
| #include "data_packet.hpp" | ||||
| #include "net/send_packet_pool.h" | ||||
| #include "net/work_socket.h" | ||||
| #include "net/net_client.h" | ||||
| #include "server_def.h" | ||||
| #include "log_def.h" | ||||
| #include "encrypt/CRC.h" | ||||
| #include "encrypt/Encrypt.h" | ||||
| #include "log_sender.h" | ||||
|  | ||||
|  | ||||
|  | ||||
| using namespace SrvDef; | ||||
|  | ||||
| LogSender::LogSender(int ServerType, int ServerIndex, char* ServerName) : NetClient("LogSender") | ||||
| { | ||||
| 	this->ServerType = ServerType; | ||||
| 	this->ServerIndex = ServerIndex; | ||||
| 	_STRNCPY_A(this->ServerName, ServerName); | ||||
| 	this->SetClientName(("logger server")); | ||||
|  | ||||
| 	stop_log_ = false; | ||||
| 	stop_counter_log_ = false; | ||||
| 	stop_economy_log_ = false; | ||||
| } | ||||
|  | ||||
| LogSender::LogSender() : NetClient("LogSender") | ||||
| { | ||||
| 	this->SetClientName(("logger server")); | ||||
|  | ||||
| 	stop_log_ = false; | ||||
| 	stop_counter_log_ = false; | ||||
| 	stop_economy_log_ = false; | ||||
| } | ||||
|  | ||||
| LogSender::~LogSender(void) | ||||
| { | ||||
| } | ||||
|  | ||||
| void LogSender::SetServerName(const char* sServerName) | ||||
| { | ||||
| 	_STRNCPY_S(ServerName, sServerName, ArrayCount(ServerName) - 1); | ||||
| 	ServerName[ArrayCount(ServerName) - 1] = 0; | ||||
| } | ||||
| int LogSender::GetLocalServerType() | ||||
| { | ||||
| 	return ServerType; | ||||
| } | ||||
|  | ||||
| const char* LogSender::GetLocalServerName() | ||||
| { | ||||
| 	return ServerName; | ||||
| } | ||||
|  | ||||
| int LogSender::GetLocalServerIndex() | ||||
| { | ||||
| 	return ServerIndex; | ||||
| } | ||||
|  | ||||
| void LogSender::OnConnected() | ||||
| { | ||||
| 	setRecvBufSize(1024 * 1024); | ||||
| 	setSendBufSize(1024 * 1024); | ||||
| } | ||||
|  | ||||
| void LogSender::LogCounter(ActorId actorId, const char* aid, const char* user_level /*= ""*/, | ||||
|                            const char* counter /*= ""*/, const char* value /*= ""*/, const char* extra /*= ""*/, | ||||
|                            const char* kingdom /*= ""*/, const char* phylum /*= ""*/, const char* classfield /*= ""*/, | ||||
|                            const char* family /*= ""*/, const char* genus /*= ""*/, int flag) | ||||
| { | ||||
| 	if (stop_log_ || stop_counter_log_) return; | ||||
|  | ||||
| 	LCounter data; | ||||
| 	memset(&data, 0, sizeof(data)); | ||||
|  | ||||
| 	data.actorid_ = actorId; | ||||
| 	data.flag_ = flag; | ||||
|  | ||||
| 	if (aid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.aid_, aid); | ||||
| 	} | ||||
|  | ||||
| 	if (user_level) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.user_level_, user_level); | ||||
| 	} | ||||
|  | ||||
| 	if (counter) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.counter_, counter); | ||||
| 	} | ||||
|  | ||||
| 	if (value) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.value_, value); | ||||
| 	} | ||||
|  | ||||
| 	if (extra) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.extra_, extra); | ||||
| 	} | ||||
|  | ||||
| 	if (kingdom) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.kingdom_, kingdom); | ||||
| 	} | ||||
|  | ||||
| 	if (phylum) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.phylum_, phylum); | ||||
| 	} | ||||
|  | ||||
| 	if (classfield) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.classfield_, classfield); | ||||
| 	} | ||||
|  | ||||
| 	if (family) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.family_, family); | ||||
| 	} | ||||
|  | ||||
| 	if (genus) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.genus_, genus); | ||||
| 	} | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmCounter); | ||||
| 	pdata << data; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogDcApiLogByStr(const char* logName, const char* logContent) | ||||
| { | ||||
| 	if (stop_log_) return; | ||||
| 	 | ||||
| 	if(!logName || !logContent)	return; | ||||
| 	LDcApiData data; | ||||
| 	memset(&data, 0, sizeof(data)); | ||||
| 	data.log_type_ = 4; | ||||
| 	_STRNCPY_A(data.log_name_, logName); | ||||
| 	_STRNCPY_A(data.content_ ,logContent); | ||||
| 	DataPacket& pdata = allocProtoPacket(lmDcApiData); | ||||
| 	pdata << data; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
|  | ||||
| void LogSender::LogDcApiProto(const char* openId, int pfId, int serverId, int roleId, int systemId, int protoId, int protoType, int protoResult, const char* svrip, const char* userip) | ||||
| { | ||||
| 	//if (!et || ((Entity*)et)->GetType() != enActor) | ||||
| 	//	return; | ||||
| 	//Actor* pActor =(Entity*)et; | ||||
| 	if (stop_log_) return; | ||||
|  | ||||
| 	if(!openId)	return; | ||||
|  | ||||
| 	LDcApiProtoLog logData; | ||||
| 	memset(&logData, 0, sizeof(logData)); | ||||
|  | ||||
| 	//_STRNCPY_A(logData.openId, pActor->GetAccount()); | ||||
| 	_STRNCPY_A(logData.openId, openId); | ||||
| 	logData.domain = pfId; | ||||
| 	//logData.serverId = ServerInstance()->GetServerIndex(); | ||||
| 	logData.serverId = serverId; | ||||
| 	_STRNCPY_A(logData.svrip, svrip); | ||||
| 	_STRNCPY_A(logData.userip, userip); | ||||
|  | ||||
| 	//logData.roleId = pActor->GetActorId(); | ||||
| 	logData.roleId = roleId; | ||||
| 	logData.protoId = MAKEINT16(protoId, systemId); | ||||
| 	logData.gameFeatrueId = systemId; | ||||
| 	logData.protoType = protoType; | ||||
| 	logData.protoResult = protoResult; | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmDcApiProto); | ||||
| 	pdata << logData; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void LogSender::LogInstall(const char* aid, const char* source /*= ""*/, | ||||
|                            const char* affiliate /*= ""*/, const char* creative /*= ""*/, | ||||
|                            const char* family /*= ""*/, const char* genus /*= ""*/, | ||||
|                            const char* from_uid /*= ""*/ , const char* extra, int flag/* = 3*/) | ||||
| { | ||||
| 	if (stop_log_) return; | ||||
| 	 | ||||
| 	LInstall data; | ||||
| 	memset(&data, 0, sizeof(data)); | ||||
|  | ||||
| 	data.flag_ = flag; | ||||
|  | ||||
| 	if (aid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.aid_, aid); | ||||
| 	} | ||||
|  | ||||
| 	if (source) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.source_, source); | ||||
| 	} | ||||
|  | ||||
| 	if (affiliate) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.affiliate_, affiliate); | ||||
| 	} | ||||
|  | ||||
| 	if (creative) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.creative_, creative); | ||||
| 	} | ||||
|  | ||||
| 	if (family) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.family_, family); | ||||
| 	} | ||||
|  | ||||
| 	if (genus) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.genus_, genus); | ||||
| 	} | ||||
|  | ||||
| 	if (from_uid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.from_uid_, from_uid); | ||||
| 	} | ||||
|  | ||||
| 	if (extra) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.extra_, extra); | ||||
| 	} | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmInstall); | ||||
| 	pdata << data; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogDau(const char* aid, const char* source /*= ""*/, | ||||
|                        const char* affiliate /*= ""*/, const char* creative /*= ""*/, | ||||
|                        const char* family /*= ""*/, const char* genus /*= ""*/, | ||||
|                        const char* ip /*= ""*/, const char* from_uid /*= ""*/, const char* extra, int flag/* = 3*/) | ||||
| { | ||||
| 	if (stop_log_) return; | ||||
|  | ||||
| 	LDau data; | ||||
| 	memset(&data, 0, sizeof(data)); | ||||
|  | ||||
| 	data.flag_ = flag; | ||||
|  | ||||
| 	if (aid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.aid_, aid); | ||||
| 	} | ||||
|  | ||||
| 	if (source) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.source_, source); | ||||
| 	} | ||||
|  | ||||
| 	if (affiliate) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.affiliate_, affiliate); | ||||
| 	} | ||||
|  | ||||
| 	if (creative) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.creative_, creative); | ||||
| 	} | ||||
|  | ||||
| 	if (family) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.family_, family); | ||||
| 	} | ||||
|  | ||||
| 	if (genus) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.genus_, genus); | ||||
| 	} | ||||
|  | ||||
| 	if (ip) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.ip_, ip); | ||||
| 	} | ||||
|  | ||||
| 	if (from_uid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.from_uid_, from_uid); | ||||
| 	} | ||||
|  | ||||
| 	if (extra) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.extra_, extra); | ||||
| 	} | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmDau); | ||||
| 	pdata << data; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogEnconomy(ActorId actorid, const char* aid, const char* currency /*= ""*/, | ||||
|                             const char* amount /*= ""*/, const char* value /*= ""*/, | ||||
|                             const char* kingdom /*= ""*/, const char* phylum /*= ""*/, | ||||
|                             const char* classfield /*= ""*/, const char* family /*= ""*/, | ||||
|                             const char* genus /*= ""*/ , const char* extra, const char* extra2, const char* pf, int flag/* = 3*/, | ||||
| 							bool isPay, const char* openkey, const char* pfkey, const char* pfid) | ||||
| { | ||||
| 	if (stop_log_ || stop_economy_log_) return; | ||||
|  | ||||
| 	LEconomy data; | ||||
| 	memset(&data, 0, sizeof(data)); | ||||
|  | ||||
| 	data.flag_ = flag; | ||||
| 	data.flag_ |= (isPay ? lfiIsPay : 0); | ||||
|  | ||||
| 	data.actorid_ = actorid; | ||||
|  | ||||
| 	if (aid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.aid_, aid); | ||||
| 	} | ||||
|  | ||||
| 	if (currency) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.currency_, currency); | ||||
| 	} | ||||
|  | ||||
| 	if (amount) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.amount_, amount); | ||||
| 	} | ||||
|  | ||||
| 	if (value) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.value_, value); | ||||
| 	} | ||||
|  | ||||
| 	if (kingdom) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.kingdom_, kingdom); | ||||
| 	} | ||||
|  | ||||
| 	if (phylum) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.phylum_, phylum); | ||||
| 	} | ||||
|  | ||||
| 	if (classfield) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.classfield_, classfield); | ||||
| 	} | ||||
|  | ||||
| 	if (family) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.family_, family); | ||||
| 	} | ||||
|  | ||||
| 	if (genus) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.genus_, genus); | ||||
| 	} | ||||
|  | ||||
| 	if (extra) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.extra_, extra); | ||||
| 	} | ||||
|  | ||||
| 	if (extra2) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.extra2_, extra2); | ||||
| 	} | ||||
|  | ||||
| 	if (pf) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.pf_, pf); | ||||
| 	} | ||||
|  | ||||
| 	if (openkey) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.openkey_, openkey); | ||||
| 	} | ||||
|  | ||||
| 	if (pfkey) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.pfkey_, pfkey); | ||||
| 	} | ||||
|  | ||||
| 	if (pfid) { | ||||
| 		_STRNCPY_A(data.pfid_, pfid); | ||||
| 	} | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmEconomy); | ||||
| 	pdata << data; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogMilestone(ActorId actorid, const char* aid, const char* milestone /*= ""*/, const char* value /*= ""*/, const char* extra, int flag/* = 3*/) | ||||
| { | ||||
| 	if (stop_log_) return; | ||||
|  | ||||
| 	LMilestone data; | ||||
| 	memset(&data, 0, sizeof(data)); | ||||
|  | ||||
| 	data.flag_ = flag; | ||||
| 	data.actorid_ = actorid; | ||||
|  | ||||
| 	if (aid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.aid_, aid); | ||||
| 	} | ||||
|  | ||||
| 	if (milestone) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.milestone_, milestone); | ||||
| 	} | ||||
|  | ||||
| 	if (value) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.value_, value); | ||||
| 	} | ||||
|  | ||||
| 	if (extra) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.extra_, extra); | ||||
| 	} | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmMilestone); | ||||
| 	pdata << data; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogPayment(int ret, ActorId actorId, const char* aid, int amount, | ||||
|                            int mstType, int p1, int p2, int p3, | ||||
|                            int value /*= 1*/, const char* kingdom /*= ""*/, const char* phylum /*= ""*/, const char* transactionid /*= ""*/, | ||||
|                            const char* extra /*= ""*/, int p4 /*= 0*/, int p5 /*= 0*/, int flag/* = 3*/) | ||||
| { | ||||
| 	if (stop_log_) return; | ||||
|  | ||||
| 	LPayment data; | ||||
| 	memset(&data, 0, sizeof(data)); | ||||
| 	data.ret_ = ret; | ||||
| 	data.actorId_ = actorId; | ||||
| 	data.amount_ = amount; | ||||
| 	data.value_ = value; | ||||
| 	data.mstType_ = mstType; | ||||
| 	data.p1_ = p1; | ||||
| 	data.p2_ = p2; | ||||
| 	data.p3_ = p3; | ||||
| 	data.p4_ = p4; | ||||
| 	data.p5_ = p5; | ||||
| 	data.flag_ = flag; | ||||
|  | ||||
| 	if (aid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.aid_, aid); | ||||
| 	} | ||||
|  | ||||
| 	if (kingdom) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.kingdom_, kingdom); | ||||
| 	} | ||||
|  | ||||
| 	if (phylum) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.phylum_, phylum); | ||||
| 	} | ||||
|  | ||||
| 	if (transactionid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.transactionid_, transactionid); | ||||
| 	} | ||||
|  | ||||
| 	if (extra) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.extra_, extra); | ||||
| 	} | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmPayment); | ||||
| 	pdata << data; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogGameInfo(const char* aid, const char* user_level /*= ""*/,  | ||||
| 	const char* value /*= ""*/, const char* extra /*= ""*/, const char* kingdom /*= ""*/,  | ||||
| 	const char* phylum /*= ""*/, const char* classfield /*= ""*/, const char* family /*= ""*/,  | ||||
| 	const char* genus /*= ""*/, | ||||
| 	int flag/* = 3*/) | ||||
| { | ||||
| 	if (stop_log_) return; | ||||
|  | ||||
| 	LGameInfo data; | ||||
| 	memset(&data, 0, sizeof(data)); | ||||
|  | ||||
| 	data.flag_ = flag; | ||||
|  | ||||
| 	if (aid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.aid_, aid); | ||||
| 	} | ||||
|  | ||||
| 	if (user_level) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.user_level_, user_level); | ||||
| 	} | ||||
|  | ||||
| 	if (value) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.value_, value); | ||||
| 	} | ||||
|  | ||||
| 	if (extra) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.extra_, extra); | ||||
| 	} | ||||
|  | ||||
| 	if (kingdom) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.kingdom_, kingdom); | ||||
| 	} | ||||
|  | ||||
| 	if (phylum) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.phylum_, phylum); | ||||
| 	} | ||||
|  | ||||
| 	if (classfield) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.classfield_, classfield); | ||||
| 	} | ||||
|  | ||||
| 	if (family) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.family_, family); | ||||
| 	} | ||||
|  | ||||
| 	if (genus) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.genus_, genus); | ||||
| 	} | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmGameInfo); | ||||
| 	pdata << data; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogChat(const char* aid, const char* name, const char* ip, const char* pf, int actorid, int type,  | ||||
| 	const char* content, const char* toaid /* = "" */, const char* toname /* = "" */) | ||||
| { | ||||
| 	if (stop_log_) return; | ||||
|  | ||||
| 	LChat data; | ||||
| 	memset(&data, 0, sizeof(data)); | ||||
|  | ||||
| 	if (aid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.aid_, aid); | ||||
| 	} | ||||
|  | ||||
| 	if (name) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.name_, name); | ||||
| 	} | ||||
|  | ||||
| 	if (pf) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.pf_, pf); | ||||
| 	} | ||||
|  | ||||
| 	if (ip) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.ip_, ip); | ||||
| 	} | ||||
|  | ||||
| 	data.type_ = type; | ||||
|  | ||||
| 	data.actorid_ = actorid; | ||||
|  | ||||
| 	if (content) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.content_, content); | ||||
| 	} | ||||
|  | ||||
| 	if (toaid) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.toaid_, toaid); | ||||
| 	} | ||||
|  | ||||
| 	if (toname) | ||||
| 	{ | ||||
| 		_STRNCPY_A(data.toname_, toname); | ||||
| 	} | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmChat); | ||||
| 	pdata << data; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogOnline(int cnt, int extra) | ||||
| { | ||||
| 	if (stop_log_) return; | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmOnline); | ||||
| 	pdata << (int)cnt; | ||||
| 	pdata << (int)extra; | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogTLog(const char* logstr) | ||||
| { | ||||
| 	if (stop_log_) return; | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmTLog); | ||||
| 	pdata.writeString(logstr); | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
| void LogSender::LogDKMLog(const char* logstr, const char* pf) | ||||
| { | ||||
| 	if (!logstr || !pf) return; | ||||
| 	if (stop_log_) return; | ||||
|  | ||||
| 	DataPacket& pdata = allocProtoPacket(lmDKMLog); | ||||
| 	pdata.writeString(logstr); | ||||
| 	pdata.writeString(pf); | ||||
| 	flushProtoPacket(pdata); | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user