1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15- #include "mgsession.h"
16-
1715#include <stdint.h>
1816#include <stdlib.h>
1917#include <string.h>
2018
2119#include "mgcommon.h"
2220#include "mgconstants.h"
21+ #include "mgsession.h"
2322#include "mgvalue.h"
2423
2524int mg_session_write_uint8 (mg_session * session , uint8_t val ) {
@@ -131,6 +130,44 @@ int mg_session_write_map(mg_session *session, const mg_map *map) {
131130 return 0 ;
132131}
133132
133+ int mg_session_write_date (mg_session * session , const mg_date * date ) {
134+ MG_RETURN_IF_FAILED (
135+ mg_session_write_uint8 (session , (uint8_t )(MG_MARKER_TINY_STRUCT1 )));
136+ MG_RETURN_IF_FAILED (mg_session_write_uint8 (session , MG_SIGNATURE_DATE ));
137+ MG_RETURN_IF_FAILED (mg_session_write_integer (session , date -> days ));
138+ return 0 ;
139+ }
140+
141+ int mg_session_write_local_time (mg_session * session , const mg_local_time * lt ) {
142+ MG_RETURN_IF_FAILED (
143+ mg_session_write_uint8 (session , (uint8_t )(MG_MARKER_TINY_STRUCT1 )));
144+ MG_RETURN_IF_FAILED (mg_session_write_uint8 (session , MG_SIGNATURE_LOCAL_TIME ));
145+ MG_RETURN_IF_FAILED (mg_session_write_integer (session , lt -> nanoseconds ));
146+ return 0 ;
147+ }
148+
149+ int mg_session_write_local_date_time (mg_session * session ,
150+ const mg_local_date_time * ldt ) {
151+ MG_RETURN_IF_FAILED (
152+ mg_session_write_uint8 (session , (uint8_t )(MG_MARKER_TINY_STRUCT2 )));
153+ MG_RETURN_IF_FAILED (
154+ mg_session_write_uint8 (session , MG_SIGNATURE_LOCAL_DATE_TIME ));
155+ MG_RETURN_IF_FAILED (mg_session_write_integer (session , ldt -> seconds ));
156+ MG_RETURN_IF_FAILED (mg_session_write_integer (session , ldt -> nanoseconds ));
157+ return 0 ;
158+ }
159+
160+ int mg_session_write_duration (mg_session * session , const mg_duration * dur ) {
161+ MG_RETURN_IF_FAILED (
162+ mg_session_write_uint8 (session , (uint8_t )(MG_MARKER_TINY_STRUCT4 )));
163+ MG_RETURN_IF_FAILED (mg_session_write_uint8 (session , MG_SIGNATURE_DURATION ));
164+ MG_RETURN_IF_FAILED (mg_session_write_integer (session , dur -> months ));
165+ MG_RETURN_IF_FAILED (mg_session_write_integer (session , dur -> days ));
166+ MG_RETURN_IF_FAILED (mg_session_write_integer (session , dur -> seconds ));
167+ MG_RETURN_IF_FAILED (mg_session_write_integer (session , dur -> nanoseconds ));
168+ return 0 ;
169+ }
170+
134171int mg_session_write_value (mg_session * session , const mg_value * value ) {
135172 switch (value -> type ) {
136173 case MG_VALUE_TYPE_NULL :
@@ -163,14 +200,12 @@ int mg_session_write_value(mg_session *session, const mg_value *value) {
163200 mg_session_set_error (session , "tried to send value of type 'path'" );
164201 return MG_ERROR_INVALID_VALUE ;
165202 case MG_VALUE_TYPE_DATE :
166- mg_session_set_error (session , "tried to send value of type 'date'" );
167- return MG_ERROR_INVALID_VALUE ;
203+ return mg_session_write_date (session , value -> date_v );
168204 case MG_VALUE_TYPE_TIME :
169205 mg_session_set_error (session , "tried to send value of type 'time'" );
170206 return MG_ERROR_INVALID_VALUE ;
171207 case MG_VALUE_TYPE_LOCAL_TIME :
172- mg_session_set_error (session , "tried to send value of type 'local_time'" );
173- return MG_ERROR_INVALID_VALUE ;
208+ return mg_session_write_local_time (session , value -> local_time_v );
174209 case MG_VALUE_TYPE_DATE_TIME :
175210 mg_session_set_error (session , "tried to send value of type 'date_time'" );
176211 return MG_ERROR_INVALID_VALUE ;
@@ -179,12 +214,10 @@ int mg_session_write_value(mg_session *session, const mg_value *value) {
179214 "tried to send value of type 'date_time_zone_id'" );
180215 return MG_ERROR_INVALID_VALUE ;
181216 case MG_VALUE_TYPE_LOCAL_DATE_TIME :
182- mg_session_set_error (session ,
183- "tried to send value of type 'local_date_time'" );
184- return MG_ERROR_INVALID_VALUE ;
217+ return mg_session_write_local_date_time (session ,
218+ value -> local_date_time_v );
185219 case MG_VALUE_TYPE_DURATION :
186- mg_session_set_error (session , "tried to send value of type 'duration'" );
187- return MG_ERROR_INVALID_VALUE ;
220+ return mg_session_write_duration (session , value -> duration_v );
188221 case MG_VALUE_TYPE_POINT_2D :
189222 mg_session_set_error (session , "tried to send value of type 'point_2d'" );
190223 return MG_ERROR_INVALID_VALUE ;
0 commit comments