some nirvana

This commit is contained in:
姜鹏辉
2020-11-24 13:12:52 +08:00
parent 6972454742
commit c35dbd1368

View File

@@ -12,52 +12,52 @@
#define ONLINE_SEND 0
#define OFFLINE_SEND 1
#define NAME_SIZE 80
#define NAME_SIZE 128
#define MAX_HTABLE_NUM 24
#define NIRVANA
int QQ_FILE_SEND_VERSION_1_20201109 = 0;
void qq_file_send_version_1_20201109()
int QQ_FILE_SEND_VERSION_1_20201124 = 0;
void qq_file_send_version_1_20201124()
{
//20201109 http
//20201124
}
typedef struct
{
int send_type; // OFFLINE_SEND
uint8_t send_type; // OFFLINE_SEND
char uuid[36];
int content_len;
uint16_t content_len;
char filename[NAME_SIZE];
struct nirvana_streaming_asyctx *ctx;
uint next_flag;
int len;
uint8_t next_flag;
uint64_t file_len;
uchar curdir;
}qq_pme_info,*qq_pme_info_p;
typedef struct
{
int feature_type;
uint8_t feature_type;
char *separator_header;
int header_len;
int uuid_deviation;
uint header_len;
uint uuid_deviation;
char *uuid_suffix;
int uuid_suffix_len;
int content_deviation;
uint uuid_suffix_len;
uint content_deviation;
char *end_suffix;
int end_suffix_len;
uint end_suffix_len;
}struct_separator_feature;
typedef struct
{
char filename[NAME_SIZE];
int len;
uint64_t file_len;
struct nirvana_streaming_asyctx *ctx;
}file_info;
int file_cnt = 0;
uint file_cnt = 0;
struct_separator_feature online_feature,offline_feature;
MESA_htable_handle file_htable;
@@ -268,7 +268,7 @@ void free_fileinfo(void *thisfile)
0: not exist
1: exist
*/
int match_uuid(qq_pme_info **pme,int content_len,int send_type)
int match_uuid(qq_pme_info **pme,int content_len)
{
qq_pme_info_p qq_pme = *pme;
file_info* thisfile = (file_info *) MESA_htable_search(file_htable,(u_char *)qq_pme->uuid,strlen(qq_pme->uuid));
@@ -280,7 +280,7 @@ int match_uuid(qq_pme_info **pme,int content_len,int send_type)
sprintf(qq_pme->filename,"%s/%d-%s",save_directory,file_cnt,qq_pme->uuid);
file_cnt++;
strncpy(newfile->filename,qq_pme->filename,strlen(qq_pme->filename));
newfile->len = content_len;
newfile->file_len = content_len;
#ifdef NIRVANA
// nirvana section
struct nirvana_streaming_asyctx *ctx;
@@ -288,9 +288,9 @@ int match_uuid(qq_pme_info **pme,int content_len,int send_type)
struct streaming_meta streammeta;
struct nvn_opt_unit opt[1];
int opt_num = 0;
memset(&streammeta,0,sizeof(streammeta));
streammeta.msg_type = NVN_MSG_TYPE_DOC_IM;
if(send_type == ONLINE_SEND)
if(qq_pme->send_type == ONLINE_SEND)
streammeta.msg_subtype = NVN_MSG_SUBTYPE_IM_QQ_ONLINE;
else
streammeta.msg_subtype = NVN_MSG_SUBTYPE_IM_QQ_OFFLINE;
@@ -325,9 +325,9 @@ int match_uuid(qq_pme_info **pme,int content_len,int send_type)
{
// there is a file point in htable
// so change the pme
thisfile->len += content_len;
thisfile->file_len += content_len;
strncpy(qq_pme->filename,thisfile->filename,strlen(thisfile->filename));
qq_pme->len = thisfile->len;
qq_pme->file_len = thisfile->file_len;
#ifdef NIRVANA
qq_pme->ctx = thisfile->ctx;
#endif
@@ -379,27 +379,17 @@ uchar qq_file_send_entry(stSessionInfo* session_info,void **pme,int thread_seq,s
url_decoded_len = session_info->buflen;
url_decoded = (char*)malloc(url_decoded_len*sizeof(char));
memcpy(url_decoded, session_info->buf, session_info->buflen);
//printf("%s\n",url_decoded);
res = sscanf(url_decoded,"%*d.%*d.%*d.%*d:%*d/ftn_handler?bmd5=%32s",bmd5);
if(res>0)
{
//printf("bmd5=%s\n",bmd5);
MESA_handle_runtime_log(runtime_log,RLOG_LV_DEBUG,"extract","find header,bmd5=%s",bmd5);
//1aa23fc86a9ea7dbea7c987dcb4bea1f 32Byte
//printf("ip:%u\n",a_tcp->addr.ipv4->saddr);
//printf("ip:%s\n",ip_str);
qq_pme->next_flag = 0;
// separator_flag is 1 means that the next TCP packet contains a separator
}
else
{
return PROT_STATE_DROPME;
}
//printf("%s %s\n",post_content,bmd5);
break;
case HTTP_CONTENT:
{
@@ -425,7 +415,7 @@ uchar qq_file_send_entry(stSessionInfo* session_info,void **pme,int thread_seq,s
nirvana_streaming_asyn_update_end(qq_pme->ctx);
nirvana_streaming_asyn_update_cancel(qq_pme->ctx);
#endif
MESA_handle_runtime_log(runtime_log,RLOG_LV_INFO,"finish","save file uuid=%s,size:%d",qq_pme->uuid,qq_pme->len);
MESA_handle_runtime_log(runtime_log,RLOG_LV_INFO,"finish","save file uuid=%s,size:%d",qq_pme->uuid,qq_pme->file_len);
MESA_handle_runtime_log(runtime_log,RLOG_LV_INFO,"finish","total get %d file",file_cnt);
MESA_htable_del(file_htable,(u_char *)qq_pme->uuid,strlen(qq_pme->uuid),free_fileinfo);
}
@@ -459,27 +449,23 @@ uchar qq_file_send_entry(stSessionInfo* session_info,void **pme,int thread_seq,s
}
qq_pme->next_flag = 1;
content_len = qq_pme->content_len;
match_uuid(&qq_pme,content_len,qq_pme->send_type);
}
else
{
;//may be do nothing
match_uuid(&qq_pme,content_len);
}
if(locally_save == 1)
{
//save file to disk
FILE *fp = fopen(qq_pme->filename,"ab");
fwrite(content,content_len,1,fp);
fclose(fp);
}
#ifdef NIRVANA
nirvana_streaming_asyn_update_data(qq_pme->ctx,content ,content_len);
nirvana_streaming_asyn_update_data(qq_pme->ctx, content, content_len);
#endif
}
break;
}
}
return PROT_STATE_GIVEME;
}
@@ -497,10 +483,10 @@ int suggestion_inform_callback(struct suggest_receive_info *info, struct nirvana
void nirvana_client_init()
{
struct nirvana_parameter *parameter;
ev_base = event_base_new();
parameter = nirvana_client_parameter_new("./plug/protocol/qq_file_send/qq_file_send.inf", "NIRVANA", runtime_log);
instance_asyn = nirvana_client_instance_new(parameter, ev_base, runtime_log, suggestion_inform_callback, NULL);
event_base_dispatch(ev_base);
parameter = nirvana_client_parameter_new("./plug/business/qq_file_send/qq_file_send.inf", "NIRVANA", runtime_log);
//assert(parameter != NULL);
instance_asyn = nirvana_evbase_instance_new(parameter, runtime_log, suggestion_inform_callback, NULL);
//assert(instance_asyn!=NULL);
}
void qq_file_send_init()
@@ -528,11 +514,12 @@ void qq_file_send_init()
if(read_res == 0)
MESA_handle_runtime_log(runtime_log,RLOG_LV_INFO,"init","------------load feature success------------");
else
MESA_handle_runtime_log(runtime_log,RLOG_LV_FATAL,"init","------load feature failed:%d------",read_res);
MESA_handle_runtime_log(runtime_log,RLOG_LV_FATAL,"init","-----------load feature failed:%d---------",read_res);
#ifdef NIRVANA
nirvana_client_init();
#endif
// init a hashtable,key is uuid,value is pme
file_htable = MESA_htable_born();
int *psafe = (int *)malloc(sizeof(int));
@@ -540,9 +527,10 @@ void qq_file_send_init()
*psafe = 1;
*pexpire_time = 60;
MESA_htable_set_opt(file_htable,MHO_THREAD_SAFE,psafe,sizeof(int));
// htable will expire in 60 second
MESA_htable_set_opt(file_htable,MHO_EXPIRE_TIME,pexpire_time,sizeof(int));
MESA_htable_mature(file_htable);
MESA_htable_print_crtl(file_htable,0);
}
}