יום רביעי, דצמבר 21, 2011

זיהוי ששדה מסויים לא הוגדר ב gsoap

לא מזמן התמודדתי עם צורך בזיהו אלמטים שלא הוכנסו ב gSOAP בספריה ורציתי לשתף.

ב gSOAP כאשר את מכריזים על חבר ב struct ברירת המחדל שלו היא optional ו nillable, זה אולי לא נשמע בעייה אבל זה נותן תחושה ממש לא טובה.

כאשר יש לכם שדה שהוא optional קשה לגלות עם השדה הוכנס או לא בהודעה (כלומר אין משהוא ברירת מחדל שיתן לכם את זה).
כל יחדת מידע שאנו עובדים איתה מאוכסנת באיזה שהוא struct (שקשור לWS איתו אנו עובדים).
לדוגמה :

typedef struct {
      char * field1;
      char * field2; 
      .
      .
      .
      time_t fileK;
      unsigned int fieldZ; 
} foo_t;

אנו נעבד את מבנה הנתונים בכניסה לפונקציה  - נעבור שדה שדה ונבדוק את תוכנו.
כלומר עבור פונקציה גנרית שתעבד כל WS אנו נעבור על שדה שדה.
לכן יש לנו offset גודל וטיפוס בשביל לעבד את המידע.

על מנת להתמודד עם התופעה:

עבור char * :  עם שדה לא הוגדר אז : 
NULL == *(char ** field_offset)
אם התנאי הזה מתקיים אז השדה שאתם עובדים עליו לא היה בהודעה.
כלומר missing element in xml

אם לעומת זאת הערך הוא ריק אז מתקיים:
'\0' == *((char ** )field_offset)
כלומר יש לכם : <node></node>

עבור ערך בסיסי תקבלו (חשוב לזכור ש field_offset הוא void *).
 
NULL == ((int *) field_offset)
NULL == ((double *) field_offset)

שימו לב שבמעבר על כל אחד מהשדות יש להזהר ולהשתמש בגודל האמיתי.

אין תגובות:

הוסף רשומת תגובה