TEST(TS_SU_LOGIN, valid) { RzTest test; TestConnectionChannel game(TestConnectionChannel::Client, CONFIG_GET()->game.ip, CONFIG_GET()->game.port, false); game.addCallback([](TestConnectionChannel* channel, TestConnectionChannel::Event event) { ASSERT_EQ(TestConnectionChannel::Event::Connection, event.type); TS_SU_LOGIN loginPacket; TS_MESSAGE::initMessage(&loginPacket); strcpy(loginPacket.server_name, "game002"); channel->sendPacket(&loginPacket); }); game.addCallback([](TestConnectionChannel* channel, TestConnectionChannel::Event event) { const TS_US_LOGIN_RESULT* packet = AGET_PACKET(TS_US_LOGIN_RESULT); EXPECT_EQ(TS_RESULT_SUCCESS, packet->result); channel->closeSession(); }); game.start(); test.addChannel(&game); test.run(); }
TEST(TS_GA_CLIENT_LOGIN, long_account) { RzTest test; TestConnectionChannel game(TestConnectionChannel::Client, CONFIG_GET()->game.ip, CONFIG_GET()->game.port, false); addGameLoginScenario(game, 7, "Server name 10", "http://www.example.com/index10.html", true, "127.0.0.1", 4517, [](TestConnectionChannel* channel, TestConnectionChannel::Event event) { AuthServer::sendClientLogin( channel, "61_chars_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 'a'); }); game.addCallback([](TestConnectionChannel* channel, TestConnectionChannel::Event event) { const TS_AG_CLIENT_LOGIN* packet = AGET_PACKET(TS_AG_CLIENT_LOGIN); EXPECT_EQ(TS_RESULT_ACCESS_DENIED, packet->result); EXPECT_STREQ("61_chars_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", packet->account); EXPECT_EQ(0, packet->nAccountID); EXPECT_EQ(0, packet->nPCBangUser); EXPECT_EQ(0, packet->nEventCode); EXPECT_EQ(0, packet->nAge); EXPECT_EQ(0, packet->nContinuousPlayTime); EXPECT_EQ(0, packet->nContinuousLogoutTime); channel->closeSession(); }); game.start(); test.addChannel(&game); test.run(); }
TEST(TS_CA_VERSION, nonnullterminated) { RzTest test; TestConnectionChannel auth(TestConnectionChannel::Client, CONFIG_GET()->auth.ip, CONFIG_GET()->auth.port, true); auth.addCallback([](TestConnectionChannel* channel, TestConnectionChannel::Event event) { ASSERT_EQ(TestConnectionChannel::Event::Connection, event.type); TS_CA_VERSION version; TS_MESSAGE::initMessage(&version); memset(version.szVersion, 1, sizeof(version.szVersion)); channel->sendPacket(&version); strcpy(version.szVersion, "INFO"); channel->sendPacket(&version); }); auth.addCallback([](TestConnectionChannel* channel, TestConnectionChannel::Event event) { TS_SC_RESULT packet; DESERIALIZE_PACKET(packet, EPIC_LATEST); uint32_t versionHex = ((uint32_t) packet.value) ^ 0xADADADAD; EXPECT_NE(0, versionHex); EXPECT_NE(INT32_MIN, versionHex); EXPECT_NE(INT32_MAX, versionHex); EXPECT_NE(UINT32_MAX, versionHex); EXPECT_EQ(0, packet.result); channel->closeSession(); }); test.addChannel(&auth); auth.start(); test.run(); }
TEST(TS_CA_VERSION, playercount) { RzTest test; TestConnectionChannel auth(TestConnectionChannel::Client, CONFIG_GET()->auth.ip, CONFIG_GET()->auth.port, true); auth.addCallback([](TestConnectionChannel* channel, TestConnectionChannel::Event event) { ASSERT_EQ(TestConnectionChannel::Event::Connection, event.type); TS_CA_VERSION version; TS_MESSAGE::initMessage(&version); strcpy(version.szVersion, "TEST"); channel->sendPacket(&version); }); auth.addCallback([](TestConnectionChannel* channel, TestConnectionChannel::Event event) { // const TS_SC_RESULT* packet = AGET_PACKET(TS_SC_RESULT); TS_SC_RESULT packet; DESERIALIZE_PACKET(packet, EPIC_LATEST); int playerCount = packet.value ^ 0xADADADAD; EXPECT_EQ(0, playerCount); EXPECT_EQ(0, packet.result); channel->closeSession(); }); test.addChannel(&auth); auth.start(); test.run(); }
void radiator_loop() { temp_t tab [] = { DS18B20_COLLECTOR, DS18B20_OUTSIDE, }; ds18b20_get_temp_tab(sizeof(tab)/sizeof(temp_t), RESOLUTION_9, 7, tab); temp_t outside = MIN(tab[0], tab[1]); temp_t read_0 = ds18b20_get_temp(DS18B20_RADIATOR_U, RESOLUTION_11, 7); _delay_ms(1000); temp_t read_1 = ds18b20_get_temp(DS18B20_RADIATOR_U, RESOLUTION_11, 7); temp_t curr = read_1 + (read_1 - read_0) * 16; temp_t goal = CONFIG_GET(radiator_goal); CONFIG static uint8_t radiator_factor = 24; if (outside < goal) goal += (CONFIG_GET(radiator_factor) * ((uint32_t)goal - outside)) >> 4; bool dir = curr > goal; temp_t diff = dir ? curr - goal : goal - curr; valve_state_t amount = (VALVE_STATE_MAX * (uint32_t)diff) >> (8 + 6); if (dir) valve_close_for(VALVE_RADIATOR, amount); else valve_open_for (VALVE_RADIATOR, amount); if (valve_closed(VALVE_RADIATOR) || outside > TEMP(15)) // quick dirty hack - father wants radiator in bathroom warm, maybe we can achieve that by heating without pump relay_off(RELAY_PUMP_RADIATOR); else relay_on (RELAY_PUMP_RADIATOR); }
void radiator_loop_new() { temp_t tab [] = { DS18B20_RADIATOR_U, DS18B20_RADIATOR_D, DS18B20_HOUSE_S_T, }; ds18b20_temp_tab_fill(RESOLUTION_11, 7, tab); CONFIG static temp_t ambient_temp = TEMP(23); CONFIG static uint8_t heating_f = 4.0 * 0x10; CONFIG static temp_t storage_off = TEMP(10); temp_t goal = CONFIG_GET(ambient_temp); goal += (uint32_t)(tab[0] - tab[1]) * CONFIG_GET(heating_f) / 0x10; goal = MIN(goal, tab[2] - storage_off); valve_state_t amount = VALVE_STATE_MAX * 5 / 100; if (goal > tab[1]) valve_open_for (VALVE_RADIATOR, amount); else valve_close_for(VALVE_RADIATOR, amount); if (valve_closed(VALVE_RADIATOR)) relay_off(RELAY_PUMP_RADIATOR); else relay_on (RELAY_PUMP_RADIATOR); }
void Environment::beforeTests() { std::string authExec = CONFIG_GET()->authExecutable.get(); std::string gameReconnectExec = CONFIG_GET()->gameReconnectExecutable.get(); std::string connectionString = CONFIG_GET()->connectionString.get(); DbConnectionPool dbConnectionPool; DbConnection* connection = dbConnectionPool.getConnection(connectionString.c_str()); ASSERT_NE(nullptr, connection); ASSERT_NE(false, connection->execute("DROP TABLE IF EXISTS account;")); ASSERT_NE(false, connection->execute("CREATE TABLE account (\r\n" " \"account_id\" INTEGER NOT NULL,\r\n" " \"account\" VARCHAR(61) NOT NULL,\r\n" " \"password\" VARCHAR(61),\r\n" " \"last_login_server_idx\" INTEGER,\r\n" " \"server_idx_offset\" INTEGER,\r\n" " \"security_no\" VARCHAR(61),\r\n" " PRIMARY KEY(account_id)\r\n);")); connection->setAutoCommit(false); // clang-format off ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(0,'test0','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(1,'test1','613b5247e3398350918cb622a3ec19e9',NULL,NULL,'613b5247e3398350918cb622a3ec19e9');")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(2,'test2','613b5247e3398350918cb622a3ec19e9',4,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(3,'test3','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(4,'test4','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(5,'test5','613b5247e3398350918cb622a3ec19e9',11,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(6,'test6','613b5247e3398350918cb622a3ec19e9',12,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(7,'test7','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(8,'test8','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(9,'test9','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(10,'test10','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(11,'test11','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(12,'test12','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(13,'test13','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(14,'test14','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(15,'test15','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(16,'test16','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(17,'test17','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(18,'test18','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(19,'test19','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(20,'test20','613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(21,'test' || char(233),'613b5247e3398350918cb622a3ec19e9',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(1000000001,'testPw47Chars','c8d8079110d491e6d115dc0755c7e5eb',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(1000000002,'testPw60Chars','33410d89b4a115d9ac9c7aaaff255b91',NULL,NULL,NULL);")); ASSERT_NE(false, connection->execute("INSERT INTO account VALUES(1000000003,'testPw64Chars','0504f832c91bc39001f67f4209f7f077',NULL,NULL,NULL);")); // clang-format on connection->endTransaction(true); connection->releaseAndClose(); std::string connectionStringArg = "/auth.db.connectionstring:"; connectionStringArg += connectionString; spawnProcess(4500, authExec.c_str(), 2, "/configfile:./auth-test.opt", connectionStringArg.c_str()); if(testGameReconnect) spawnProcess(4802, gameReconnectExec.c_str(), 1, "/configfile:./rzgamereconnect-test.opt"); }
template<> void DbQueryJob<GameServer::DB_StorageBinding>::init(DbConnectionPool* dbConnectionPool) { createBinding(dbConnectionPool, CONFIG_GET()->game.telecaster.connectionString, "select * from item where account_id = ? AND owner_id = 0 AND auction_id = 0 AND keeping_id = 0", DbQueryBinding::EM_MultiRows); addParam("account_id", &InputType::account_id); addColumn("sid", &OutputType::sid); addColumn("account_id", &OutputType::account_id); addColumn("summon_id", &OutputType::summon_id); addColumn("idx", &OutputType::idx); addColumn("code", &OutputType::code); addColumn("cnt", &OutputType::count); addColumn("level", &OutputType::level); addColumn("enhance", &OutputType::enhance); addColumn("ethereal_durability", &OutputType::ethereal_durability); addColumn("endurance", &OutputType::endurance); addColumn("flag", &OutputType::flag); addColumn("gcode", &OutputType::gcode); addColumn("wear_info", &OutputType::wear_info); addColumn("socket_0", &OutputType::socket, 0); addColumn("socket_1", &OutputType::socket, 1); addColumn("socket_2", &OutputType::socket, 2); addColumn("socket_3", &OutputType::socket, 3); addColumn("awaken_sid", &OutputType::awaken_sid); addColumn("remain_time", &OutputType::remain_time); addColumn("elemental_effect_type", &OutputType::elemental_effect_type); addColumn("elemental_effect_expire_time", &OutputType::elemental_effect_expire_time); addColumn("elemental_effect_attack_point", &OutputType::elemental_effect_attack_point); addColumn("elemental_effect_magic_point", &OutputType::elemental_effect_magic_point); addColumn("appearance_code", &OutputType::appearance_code); addColumn("create_time", &OutputType::create_time); addColumn("update_time", &OutputType::update_time); }
void ClientSession::updateOpenedFile(const struct tm& date) { if(!serverName.empty() && (file == nullptr || isDateNeedNewFile(date))) { if(file) fclose(file); fileDate.year = date.tm_year; fileDate.month = date.tm_mon; fileDate.day = date.tm_mday; fileDate.hour = date.tm_hour; char filename[512]; sprintf(filename, "%s_%04d-%02d-%02d %02d.txt", serverName.c_str(), fileDate.year, fileDate.month, fileDate.day, fileDate.hour); std::string absoluteDir = CONFIG_GET()->log.logDir.get(); std::string fullFileName = absoluteDir + "/" + filename; file = fopen(fullFileName.c_str(), "wt"); } }
void IconServerSession::sendIcon(const std::string& filename) { std::string fullFileName = CONFIG_GET()->upload.client.uploadDir.get() + "/" + filename; FILE* file = fopen(fullFileName.c_str(), "rb"); if(!file) { getStream()->write(htmlNotFound, htmlNotFoundSize); } else { fseek(file, 0, SEEK_END); size_t fileSize = ftell(file); fseek(file, 0, SEEK_SET); if(fileSize > 64000) fileSize = 64000; size_t bufferSize = htmlFoundSize + 10 + fileSize; char* buffer = new char[bufferSize]; size_t fileContentBegin = sprintf(buffer, htmlFound, (long int) fileSize); size_t bytesTransferred = 0; size_t nbrw = 0; while(bytesTransferred < fileSize) { nbrw = fread(buffer + fileContentBegin + bytesTransferred, 1, fileSize - bytesTransferred, file); if(nbrw <= 0) break; bytesTransferred += nbrw; } fclose(file); if(nbrw > 0) { getStream()->write(buffer, fileContentBegin + fileSize); } else { getStream()->write(htmlNotFound, htmlNotFoundSize); } delete[] buffer; } }
for (i=0; i<v.argNum; i++) { WARN("arg %d: %s",i,v.argument[i]); } for (i=0; i<v.argNum; i++) { fieldid = atol(v.argument[i]); mDefaultPhraseField |= (1L << fieldid); } WARN("mDefaultPhraseField:%x",mDefaultPhraseField); } // FIXME QPP_OP_PHRASE have setting BEGIN_OP_PHRASE and END_OP_PHRASE.. static config_t config[] = { CONFIG_GET("QPP_OP_DEFAULT",set_default_querynode,1,\ "default operator which is used for blank"), CONFIG_GET("QPP_OP_AND",set_op_and,VAR_ARG,"string for AND operator"), CONFIG_GET("QPP_OP_OR",set_op_or,VAR_ARG,"string for OR operator"), CONFIG_GET("QPP_OP_NOT",set_op_not,VAR_ARG,"string for NOT operator"), CONFIG_GET("QPP_OP_PARA",set_op_paragraph,VAR_ARG,"string for NEAR operator"), CONFIG_GET("QPP_OP_WITHIN",set_op_within,VAR_ARG,"string for WITHIN operator"), CONFIG_GET("QPP_OP_FUZZY",set_op_fuzzy,VAR_ARG,"string for FUZZY operator"), CONFIG_GET("QPP_OP_FIELD",set_op_field,VAR_ARG,"string for FIELD operator"), CONFIG_GET("QPP_OP_STAR",set_op_star,VAR_ARG,"string for * operator"), CONFIG_GET("QPP_OP_PHRASE",set_op_phrase,VAR_ARG,"string for phrase operator"), CONFIG_GET("BEGIN_OP_PHRASE",set_begin_op_phrase,1,"one character for check begin op-phrase"), CONFIG_GET("END_OP_PHRASE",set_end_op_phrase,1,"one character for check end op-phrase"), CONFIG_GET("Field",set_fieldname,VAR_ARG, "string used for field search"), CONFIG_GET("VirtualField",set_virtual_fieldname,VAR_ARG, \ "string used for virtualfield search"),
enums[i][MAX_ENUM_LEN-1] = '\0'; constants[i] = enums[i]; /* 세번째 인자 base(진법?) 가 0이면, 문자열의 처음 2글자에 따라 * base가 결정된다. * "0x1234..." -> 16진수 * "01234..." -> 8진수 * "1234..." -> 10진수 */ constants_value[i] = atoi( v.argument[1] ); INFO("Enum[%s]: %lld", constants[i], constants_value[i]); } static config_t config[] = { CONFIG_GET("Enum", get_enum, 2, "constant"), {NULL} }; static void register_hooks(void) { sb_hook_docattr_compare_function(compare_function, NULL, NULL, HOOK_MIDDLE); // sb_hook_docattr_compare2_function(compare2_function, NULL, NULL, HOOK_MIDDLE); sb_hook_docattr_mask_function(mask_function, NULL, NULL, HOOK_MIDDLE); sb_hook_docattr_sort_function(compare_function_for_qsort, NULL, NULL, HOOK_MIDDLE); // sb_hook_docattr_hit_sort_function(compare_hit_for_qsort, NULL, NULL, HOOK_MIDDLE); sb_hook_docattr_set_docattr_function(set_docattr_function, NULL, NULL, HOOK_MIDDLE); sb_hook_docattr_get_docattr_function(get_docattr_function, NULL, NULL, HOOK_MIDDLE); sb_hook_docattr_set_doccond_function(set_doccond_function, NULL, NULL, HOOK_MIDDLE); sb_hook_docattr_set_docmask_function(set_docmask_function, NULL, NULL, HOOK_MIDDLE);
{ *mServerUptime = atoi(timestr); return "OK"; } static char* get_server_uptime() { //static char buf[11]; /* "4294967295" + '\0' */ static char buf[SHORT_STRING_SIZE]; /* "4294967295" + '\0' */ sprintf(buf, "%d[%p]", *mServerUptime,mServerUptime); return buf; } /** config stuff **/ static config_t config[] = { CONFIG_GET("ClearModuleList", clearModuleList, 1, "a module name and the name of a shared object file to load it from"), CONFIG_GET("AddModule", doAddModule, 1, "a module name and the name of a shared object file to load it from"), CONFIG_GET("LoadModule", doLoadModule, VAR_ARG, "a module name and the name of a shared object file to load it from"), CONFIG_GET("TestModule", doLoadTestModule, 2,\ "a module name and the name of a shared object file to load it from"), CONFIG_GET("LogLevel", setLogLevel, 1, \ "write error log messages of this level or above"), CONFIG_GET("ErrorLog", setErrorLog, 1, \ "path to error log file"), CONFIG_GET("QueryLog", setQueryLog, 1, \ "path to query log file"), CONFIG_GET("DebugModulePolicy", setDebugModulePolicy, 1, \ "debug message only with these modules or only without these modules"), CONFIG_GET("DebugModuleName", setDebugModuleName, VAR_ARG, \
void Environment::beforeTests() { std::string gameReconnectExec = CONFIG_GET()->gameReconnectExec.get(); spawnProcess(4802, gameReconnectExec.c_str(), 1, "/configfile:./rzgamereconnect-test.opt"); }
static void add_index_word ( index_word_t *index_word , token_t *token , int32_t pos) { index_word->pos = pos; index_word->len = token->len; strncpy(index_word->word, token->string, MAX_WORD_LEN); return; } static void set_minimum_token_length(configValue v) { minimum_token_length = atoi(v.argument[0]); } static config_t config[] = { CONFIG_GET("MinimumTokenLength", set_minimum_token_length,1,\ "Minimum token length, default 3"), {NULL} }; static void register_hooks(void) { sb_hook_new_index_word_extractor(new_bigram_generator,NULL,NULL,HOOK_MIDDLE); sb_hook_index_word_extractor_set_text(_bigram_set_text,NULL,NULL,HOOK_MIDDLE); sb_hook_get_index_words(_bigram_generator,NULL,NULL,HOOK_MIDDLE); sb_hook_delete_index_word_extractor(_delete_bigram_generator,NULL,NULL,HOOK_MIDDLE); } module bigram_module = { STANDARD_MODULE_STUFF, config, /* config */ NULL, /* registry */
if ( strcmp(name_space, "search") != 0 ){ return DECLINE; } *tab = search_handler_tbl; return SUCCESS; } static void set_elapsed_time(configValue v) { print_elapsed_time = strcasecmp(v.argument[0], "true") == 0; } static config_t config[] = { CONFIG_GET("ServerId", set_server_id, 1, "set server id : [string]"), CONFIG_GET("NodeId", set_node_id, 1, "set node id : NodeId [no]"), CONFIG_GET("Enum", set_enum, 2, "constant"), CONFIG_GET("TimeOut", set_timeout, 1, "constant"), CONFIG_GET("KeepAliveTimeOut", set_keep_alive_timeout, 1, "constant"), CONFIG_GET("KeepAliveMax", set_keep_alive_max, 1, "constant"), CONFIG_GET("KeepAlive", set_keep_alive, 1, "constant"), CONFIG_GET("PrintElapsedTime", set_elapsed_time, 1, "default is True"), {NULL} }; static void register_hooks(void) { sb_hook_sbhandler_get_table(get_table,NULL,NULL,HOOK_MIDDLE); return; }
strcpy( unicode_name, "UTF-16LE" ); #else strcpy( unicode_name, "UNICODE" ); #endif } return SUCCESS; } static void get_unicode_name(configValue v) { strncpy( unicode_name, v.argument[0], sizeof(unicode_name) ); init_unicode_name = 1; } static config_t config[] = { CONFIG_GET("UnicodeName", get_unicode_name, 1, "cp949 -> unicode"), {NULL} }; static void register_hooks(void) { sb_hook_xmlparser_parselen(parselen,NULL,NULL,HOOK_MIDDLE); sb_hook_xmlparser_retrieve_field(retrieve_field,NULL,NULL,HOOK_MIDDLE); sb_hook_xmlparser_free_parser(free_parser,NULL,NULL,HOOK_MIDDLE); // sb_hook_xmlparser_parse(parse,NULL,NULL,HOOK_MIDDLE); // sb_hook_xmlparser_parser_create(parser_create,NULL,NULL,HOOK_MIDDLE); // sb_hook_xmlparser_loaddom(loaddom,NULL,NULL,HOOK_MIDDLE); // sb_hook_xmlparser_loaddom2(loaddom2,NULL,NULL,HOOK_MIDDLE); // sb_hook_xmlparser_savedom(savedom,NULL,NULL,HOOK_MIDDLE); // sb_hook_xmlparser_savedom2(savedom2,NULL,NULL,HOOK_MIDDLE);