X3DNode* X3D_swigFieldFromString(char* fieldtype, char* values) { /* issue: swig treats C arrays as opaque pointers - not very helpful. How to create an MF from a sequence of SF fields? goal: convert string into a field - sf or mf - for easy use from swigged scripting language /* mf = X3D_fieldFromString("MFString","111.11 222.22"); will do SF as well */ X3DNode* retval; int type,count; char* vals; /* **carray, *c; */ int len,i,n,start,end, inum; float f, *farray, **f2,**f3,**f4; double d,*darray, **d2,**d3,**d4; char *token = NULL; char *delim = " ,"; if(fieldtype == NULL || values == NULL) return NULL; type = findFieldInFIELDTYPES(fieldtype); /* if( type == -1 ) return NULL; Q. is there an error return code? Where is ffift defined? */ /* do some qc */ len = strlen(values); vals = (char*) malloc(len); memcpy(vals,values,len); /* getnumtokens is destructive, and a const string produces error - so use copy from original*/ switch (type) { case FIELDTYPE_SFFloat: /* token = strtok(values,delim); if( sscanf(token,"%f",&f) == 1) retval = X3D_newSFFloat(f); break; */ case FIELDTYPE_MFFloat: case FIELDTYPE_SFVec2f: case FIELDTYPE_MFVec2f: case FIELDTYPE_SFVec3f: case FIELDTYPE_MFVec3f: case FIELDTYPE_SFRotation: case FIELDTYPE_MFRotation: case FIELDTYPE_SFColorRGBA: case FIELDTYPE_MFColorRGBA: case FIELDTYPE_SFColor: case FIELDTYPE_MFColor: count = getnumtokens(vals,delim); farray = MALLOC(float *, count*sizeof(float)); memcpy(vals,values,len); token = strtok(vals,delim); count = 0; while (token != NULL) { if( sscanf(token,"%f",&f)==1 )/* = strtof(tokens);*/ { farray[count] = f; count++; } token = strtok(NULL,delim); } f2 = MALLOC(float **, count*sizeof(float*)); f3 = MALLOC(float **, count*sizeof(float*)); f4 = MALLOC(float **, count*sizeof(float*)); for(i=0;i<count;i++) { f2[i] = &farray[i*2]; f3[i] = &farray[i*3]; f4[i] = &farray[i*4]; } switch(type) { case FIELDTYPE_SFFloat: retval = X3D_newSFFloat(farray[0]); case FIELDTYPE_MFFloat: retval = X3D_newMFFloat(count, farray); break; case FIELDTYPE_SFVec2f: retval = X3D_newSFVec2f(farray[0],farray[1]);break; case FIELDTYPE_SFVec3f: retval = X3D_newSFVec3f(farray[0],farray[1],farray[2]);break; case FIELDTYPE_MFVec3f: retval = X3D_newMFVec3f(count,f3);break; case FIELDTYPE_SFRotation: retval = X3D_newSFRotation(farray[0],farray[1],farray[2],farray[3]);break; case FIELDTYPE_MFRotation: retval = X3D_newMFRotation(count,f4);break; case FIELDTYPE_SFColorRGBA: retval = X3D_newSFColorRGBA(farray[0],farray[1],farray[2],farray[3]);break; case FIELDTYPE_MFColorRGBA: retval = X3D_newMFColorRGBA(count,f4);break; case FIELDTYPE_MFColor: retval = X3D_newMFColor(count,f3);break; } FREE_IF_NZ(farray); FREE_IF_NZ(f2); FREE_IF_NZ(f3); FREE_IF_NZ(f4); break; case FIELDTYPE_SFBool: case FIELDTYPE_SFInt32: token = strtok(values,delim); /*string delims*/ if( sscanf(token,"%d",&inum) == 1) { if(type == FIELDTYPE_SFInt32) retval = X3D_newSFInt32(inum); if(type == FIELDTYPE_SFBool) retval = X3D_newSFBool(inum); } break; case FIELDTYPE_SFTime: case FIELDTYPE_SFVec2d: case FIELDTYPE_SFVec3d: count = getnumtokens(vals,delim); darray = MALLOC(double *, count*sizeof(double)); memcpy(vals,values,len); token = strtok(vals,delim); count = 0; while (token != NULL) { if( sscanf(token,"%lf",&d)==1 )/* = strtof(tokens);*/ { darray[count] = d; count++; } token = strtok(NULL,delim); } d2 = MALLOC(double **, count*sizeof(double*)); d3 = MALLOC(double **, count*sizeof(double*)); d4 = MALLOC(double **, count*sizeof(double*)); for(i=0;i<count;i++) { d2[i] = &darray[i*2]; d3[i] = &darray[i*3]; d4[i] = &darray[i*4]; } switch(type) { case FIELDTYPE_SFTime: retval = X3D_newSFTime(darray[0]); break; case FIELDTYPE_SFVec2d: retval = X3D_newSFVec2d(darray[0],darray[1]);break; case FIELDTYPE_SFVec3d: retval = X3D_newMFVec3d(count,d3); break; } FREE_IF_NZ(darray); FREE_IF_NZ(d2); FREE_IF_NZ(d3); FREE_IF_NZ(d4); break; case FIELDTYPE_SFString: /* retval->X3D_SFString.type = FIELDTYPE_SFString; len = strlen(values); retval->X3D_SFString.p[count].strptr = MALLOC(char *, (len+1)*sizeof(char)); strncpy(retval->X3D_SFString.p[count].strptr,values,len); retval->X3D_SFString.strptr[len] = '\0'; retval->X3D_SFString.len = len; */ retval = X3D_newSFString(values); break; case FIELDTYPE_MFString: retval = malloc(sizeof(X3DNode)); retval->X3D_MFString.type = FIELDTYPE_MFString; n = 0; for(i=0;i<(int)strlen(vals);i++) if( vals[i] == '\"' )n++; n = n/2; /* c = MALLOC(char *, n*STRLEN*sizeof(char)); carray = MALLOC(char **, n*(sizeof(char*))); for(i=0;i<n;i++) carray[i] = &c[i*STRLEN]; */ retval->X3D_MFString.n = n; retval->X3D_MFString.p = malloc(sizeof(X3DNode)*retval->X3D_MFString.n); count = 0; for(i=0,n=0;i<(int)strlen(vals);i++) { if( vals[i] == '\"' ) { n++; if(n%2) start = i; else { end = i; len = end - start; /* if "Y" start=0,end=2 need a string 2 long for Y and \0. len=end-start= 2-0=2 */ retval->X3D_MFString.p[count].strptr = MALLOC(char *, len*sizeof(char)); strncpy(retval->X3D_MFString.p[count].strptr,&vals[start+1],len-1); /*strncpy(carray[count],&vals[start+1],len-1); carray[count][len-1] = '\0';*/ retval->X3D_MFString.p[count].strptr[len-1] = '\0'; retval->X3D_MFString.p[count].len = len-1; count++; } } } /*retval = X3D_newMFString(count, carray);*/ break; }
BOOL CALLBACK RulesDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { int i, iCount; char str[256]; static HWND hWndList; LV_COLUMN lvC; LV_ITEM lvI; LV_DISPINFO *pItem; char tempString1[256], tempString2[256]; switch (uMsg) { case WM_INITDIALOG: hWndList = GetDlgItem(hDlg, IDC_LIST); ListView_SetExtendedListViewStyleEx(hWndList, LVS_EX_GRIDLINES, LVS_EX_GRIDLINES ); ListView_SetExtendedListViewStyleEx(hWndList, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES ); lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; lvC.cx = 525; lvC.pszText = "Rule"; lvC.iSubItem = 0; lvC.fmt = LVCFMT_LEFT; ListView_InsertColumn(hWndList, 0, &lvC); PopulateRulesList(hWndList, 0); SendDlgItemMessage(hDlg, IDC_RULE, EM_SETLIMITTEXT, (WPARAM) 255, 0); if (bEnableFilter == TRUE) CheckRadioButton(hDlg, IDC_RADIO_FILTER, IDC_RADIO_NOFILTER, IDC_RADIO_FILTER); else { CheckRadioButton(hDlg, IDC_RADIO_FILTER, IDC_RADIO_NOFILTER, IDC_RADIO_NOFILTER); SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDC_RADIO_NOFILTER, 0), 0); } RestoreWindowPosition(hDlg); return TRUE; case WM_NOTIFY: switch (((LPNMHDR) lParam)->code) { case LVN_ENDLABELEDIT: pItem = (LV_DISPINFO *) lParam; ListView_SetItemText(hWndList, pItem->item.iItem, 0, pItem->item.pszText); return TRUE; } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_ADD: GetDlgItemText(hDlg, IDC_RULE, str, 255); iCount = getnumtokens(str); if ((iCount != 8) && (iCount != 3)) { MessageBox(hDlg, "Incorrect number of parameters, please correct rule.", APP_NAME, MB_ICONEXCLAMATION | MB_OK); return TRUE; } lvI.mask = LVIF_TEXT; lvI.iSubItem = 0; lvI.cchTextMax = 255; i = ListView_GetItemCount(hWndList); lvI.iItem = i; lvI.pszText = str; ListView_InsertItem(hWndList, &lvI); SetDlgItemText(hDlg, IDC_RULE, ""); ListView_SetCheckState(hWndList, i, TRUE); ListView_EnsureVisible(hWndList, i, FALSE); return TRUE; case IDC_DELETE: lvI.mask = LVIF_STATE; lvI.stateMask =LVIS_SELECTED; lvI.iSubItem = 0; iCount = ListView_GetItemCount( hWndList ); for( i = 0; i < iCount; i++ ) { lvI.iItem = i; ListView_GetItem(hWndList, &lvI); if( lvI.state == LVIS_SELECTED ) { ListView_DeleteItem(hWndList, i); --iCount; --i; } } return TRUE; case IDC_CANCEL: SaveWindowPosition(hDlg); EndDialog(hDlg, FALSE); return TRUE; case IDC_SAVE: lvI.mask = LVIF_TEXT; lvI.iSubItem = 0; lvI.cchTextMax = 255; memset(rule_text, 0, sizeof(rule_text)); iCount = ListView_GetItemCount(hWndList); for (i = 0; i < iCount; i++) { lvI.iItem = i; lvI.pszText = rule_text[i].rule; ListView_GetItem(hWndList, &lvI); rule_text[i].bEnabled = ListView_GetCheckState(hWndList, i); } if (SendDlgItemMessage(hDlg, IDC_RADIO_FILTER, BM_GETCHECK, 0, 0) == BST_CHECKED) bEnableFilter = TRUE; else bEnableFilter = FALSE; SaveWindowPosition(hDlg); EndDialog(hDlg, TRUE); return TRUE; case IDC_RADIO_NOFILTER: EnableWindow(GetDlgItem(hDlg, IDC_ADD), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_DELETE), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RULE), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_MOVEUP), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_MOVEDOWN), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_DEFAULT), FALSE); EnableWindow(hWndList, FALSE); return TRUE; case IDC_RADIO_FILTER: EnableWindow(GetDlgItem(hDlg, IDC_ADD), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_DELETE), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RULE), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_MOVEUP), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_MOVEDOWN), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_DEFAULT), TRUE); EnableWindow(hWndList, TRUE); return TRUE; case IDC_MOVEUP: iCount = ListView_GetItemCount( hWndList ); for( i = 1; i < iCount; i++ ) { if( ListView_GetItemState(hWndList, i, LVIS_SELECTED) == LVIS_SELECTED ) { ListView_GetItemText(hWndList, i-1, 0, tempString1, sizeof(tempString1)); ListView_GetItemText(hWndList, i, 0, tempString2, sizeof(tempString2)); ListView_SetItemText(hWndList, i-1, 0, tempString2); ListView_SetItemText(hWndList, i, 0, tempString1); ListView_SetItemState(hWndList, i-1, LVIS_SELECTED, LVIS_SELECTED ); ListView_SetItemState(hWndList, i, 0, LVIS_SELECTED); break; } } return TRUE; case IDC_MOVEDOWN: iCount = ListView_GetItemCount( hWndList ); for( i = iCount-2; i >= 0; i-- ) { if( ListView_GetItemState(hWndList, i, LVIS_SELECTED) == LVIS_SELECTED ) { ListView_GetItemText(hWndList, i+1, 0, tempString1, sizeof(tempString1)); ListView_GetItemText(hWndList, i, 0, tempString2, sizeof(tempString2)); ListView_SetItemText(hWndList, i+1, 0, tempString2); ListView_SetItemText(hWndList, i, 0, tempString1); ListView_SetItemState(hWndList, i+1, LVIS_SELECTED, LVIS_SELECTED); ListView_SetItemState(hWndList, i, 0, LVIS_SELECTED); break; } } return TRUE; case IDC_DEFAULT: i = MessageBox(hDlg, "This action will erase existing rules. Proceed with setting up default rules?", "Network Spy", MB_YESNO | MB_ICONWARNING); if (i == IDYES) { SetupDefaultRules(); PopulateRulesList(hWndList, 0); } return TRUE; } break; case WM_CLOSE: SaveWindowPosition(hDlg); EndDialog(hDlg, 0); return TRUE; } return FALSE; }