#include "disable_warning.h"
#include
#include
#include
#include
#include
#include
#include
#include "baselib_string.h"
#include "global_setting.h"
#include "javascript_array.h"
#include "javascript_base.h"
#include "javascript_variant.h"
using std::map;
typedef map global_javascript_variant_table_;
global_javascript_variant_table_ global_javascript_variant_table;
unsigned long get_variant_index(string& variant_name) {
unsigned long index=0;
try {
for (global_javascript_variant_table_::iterator variant_table_iterator=global_javascript_variant_table.begin();
variant_table_iterator!=global_javascript_variant_table.end();
++variant_table_iterator,++index)
if (variant_name==variant_table_iterator->first)
return index;
} catch (...) {
// i dont know why iterate global_javascript_variant_table will make error of access exception ..
}
return INVALID_VALUE;
}
bool is_exist_variant(string& variant_name) {
if (INVALID_VALUE!=get_variant_index(variant_name))
return true;
return false;
}
support_javascript_variant_type get_variant_type(string& variant_name) {
if (!is_exist_variant(variant_name))
return NONE;
return (support_javascript_variant_type)global_javascript_variant_table[variant_name].vt;
}
void set_variant(string variant_name,void* variant_data,support_javascript_variant_type variant_type) {
if (is_exist_variant(variant_name))
if (STRING==global_javascript_variant_table[variant_name].vt)
if (NULL!=global_javascript_variant_table[variant_name].ulVal)
free_memory((void*)global_javascript_variant_table[variant_name].ulVal);
if (NONE==variant_type) {
global_javascript_variant_table[variant_name].vt=NONE;
global_javascript_variant_table[variant_name].wReserved3=0;
global_javascript_variant_table[variant_name].ulVal=0;
} else if (NUMBER==variant_type) {
global_javascript_variant_table[variant_name].vt=NUMBER;
global_javascript_variant_table[variant_name].wReserved3=sizeof(int);
global_javascript_variant_table[variant_name].ulVal=(int)variant_data;
} else if (STRING==variant_type) {
global_javascript_variant_table[variant_name].vt=STRING;
unsigned long conver_new_length=conver_coding((char*)variant_data);
global_javascript_variant_table[variant_name].wReserved3=sizeof(int);
unsigned long alloc_length=sizeof(javascript_variant_string)+conver_new_length+1;
void* alloc_address=alloc_memory(alloc_length);
((javascript_variant_string*)alloc_address)->string_length=conver_new_length;
((javascript_variant_string*)alloc_address)->string_data=(char*)((unsigned long)alloc_address+sizeof(javascript_variant_string));
memcpy((void*)((unsigned long)alloc_address+sizeof(javascript_variant_string)),variant_data,alloc_length-sizeof(javascript_variant_string));
global_javascript_variant_table[variant_name].ulVal=(unsigned long)alloc_address;
} else if (INT_ARRAY==variant_type) {
global_javascript_variant_table[variant_name].vt=INT_ARRAY;
global_javascript_variant_table[variant_name].wReserved3=sizeof(int);
global_javascript_variant_table[variant_name].ulVal=(unsigned long)variant_data;
} else if (OBJECT_ARRAY==variant_type) {
global_javascript_variant_table[variant_name].vt=OBJECT_ARRAY;
global_javascript_variant_table[variant_name].wReserved3=sizeof(int);
global_javascript_variant_table[variant_name].ulVal=(unsigned long)variant_data;
} else if (OBJECT==variant_type) {
global_javascript_variant_table[variant_name].vt=OBJECT;
global_javascript_variant_table[variant_name].wReserved3=sizeof(int);
global_javascript_variant_table[variant_name].ulVal=(unsigned long)variant_data;
}
}
bool get_variant(string variant_name,void* output_variant_data,support_javascript_variant_type* output_variant_type) {
if (is_exist_variant(variant_name)) {
if (NONE!=global_javascript_variant_table[variant_name].vt) {
*(unsigned long*)output_variant_data=global_javascript_variant_table[variant_name].ulVal;
*output_variant_type=(support_javascript_variant_type)global_javascript_variant_table[variant_name].vt;
if (STRING==*output_variant_type)
*(unsigned long*)output_variant_data=(unsigned long)((javascript_variant_string*)global_javascript_variant_table[variant_name].ulVal)->string_data;
else
*(unsigned long*)output_variant_data=global_javascript_variant_table[variant_name].ulVal;
return true;
}
}
*(unsigned long*)output_variant_data=NULL;
*output_variant_type=NONE;
return false;
}
void copy_variant(string destination_variant_name,string source_variant_name) {
unsigned long variant_data=0;
support_javascript_variant_type variant_type=NONE;
get_variant(source_variant_name,(void*)&variant_data,&variant_type);
set_variant(destination_variant_name,(void*)variant_data,variant_type);
}
bool set_variant_array(string variant_name,unsigned long array_index,void* input_variant_data,support_javascript_variant_type input_variant_type) {
if (is_exist_variant(variant_name)) {
if (INT_ARRAY==get_variant_type(variant_name)) {
if (NUMBER==input_variant_type) {
int_array* array_class=NULL;
support_javascript_variant_type variant_type=NONE;
get_variant(variant_name,&array_class,&variant_type);
array_class->set_index(array_index,input_variant_data);
return true;
}
} else {
object_array* array_class=NULL;
support_javascript_variant_type variant_type=NONE;
get_variant(variant_name,&array_class,&variant_type);
javascript_variant_struct object_index_variant={0};
object_index_variant.vt=input_variant_type;
if (STRING==input_variant_type)
object_index_variant.wReserved3=strlen((const char*)input_variant_data);
else
object_index_variant.wReserved3=sizeof(int);
object_index_variant.ulVal=(unsigned long)input_variant_data;
array_class->set_index(array_index,&object_index_variant);
return true;
}
}
return false;
}
bool get_variant_array(string variant_name,unsigned long array_index,void* output_variant_data,support_javascript_variant_type* output_variant_type) {
if (is_exist_variant(variant_name)) {
base_array* array_class=NULL;
support_javascript_variant_type array_type=NONE;
get_variant(variant_name,&array_class,&array_type);
if (INT_ARRAY==array_type) {
*(unsigned long*)output_variant_data=(unsigned long)((int_array*)array_class)->get_index(array_index);
*output_variant_type=NUMBER;
} else {
javascript_variant_struct* array_index_object=(javascript_variant_struct*)((object_array*)array_class)->get_index(array_index);
*(unsigned long*)output_variant_data=array_index_object->ulVal;
*output_variant_type=(support_javascript_variant_type)array_index_object->vt;
}
return true;
}
return false;
}