4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hyunjun Ko <zzoon.ko@samsung.com>, Haejeong Kim <backto.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 #include <audio-svc.h>
23 #include <media-svc.h>
29 void insert_into_db(MediaSvcHandle * db_handle, const char * dir_path);
30 void msg_print(int line, char *msg);
34 int ret = AUDIO_SVC_ERROR_NONE;
35 char * audio_id = NULL;
39 AudioHandleType *tracks = NULL;
40 AudioHandleType *item = NULL;
41 AudioHandleType *groups = NULL;
42 MediaSvcHandle * db_handle = NULL;
44 //db open ==================================================
45 ret = media_svc_connect(&db_handle);
46 if (ret != AUDIO_SVC_ERROR_NONE) {
47 msg_print(__LINE__, "error to open music database");
51 //create table test ==================================================
52 ret = audio_svc_create_table();
53 if (ret != AUDIO_SVC_ERROR_NONE) {
54 msg_print(__LINE__, "error to create table");
59 //insert music files to db ==================================================
60 ret = audio_svc_delete_all(AUDIO_SVC_STORAGE_PHONE);
61 if (ret != AUDIO_SVC_ERROR_NONE) {
62 msg_print(__LINE__, "error to delete all items on phone");
65 //insert_into_db(db_handle, "/opt/media/Sounds/Music");
67 //iterate all tracks and get the info of tracks ==================================================
68 msg_print(__LINE__, "iterate all tracks");
69 ret = audio_svc_count_list_item(db_handle, AUDIO_SVC_TRACK_ALL, "", "", "", "", &rows);
70 if (ret != AUDIO_SVC_ERROR_NONE) {
71 msg_print(__LINE__, "error to delete all items on phone");
76 msg_print(__LINE__, "there is no item");
80 fprintf(stderr, "rows = [%d]\n", rows);
82 ret = audio_svc_list_item_new(&tracks, rows);
83 if (ret != AUDIO_SVC_ERROR_NONE) {
84 msg_print(__LINE__, "error to alloc memory for list item");
88 ret = audio_svc_get_list_item(db_handle, AUDIO_SVC_TRACK_ALL, //item_type,
91 NULL, //filter_string,
92 NULL, //filter_string2,
97 if (ret != AUDIO_SVC_ERROR_NONE) {
98 msg_print(__LINE__, "error to get list item");
102 ret = audio_svc_item_new(&item);
103 for (idx = 0; idx < rows; idx++)
105 ret = audio_svc_list_item_get_val(tracks, idx, AUDIO_SVC_LIST_ITEM_AUDIO_ID, &audio_id, &size, -1);
106 if (ret != AUDIO_SVC_ERROR_NONE) {
107 msg_print(__LINE__, "error audio_svc_list_item_get_val");
110 fprintf(stderr, "[audio_id] = %s \n", audio_id);
111 ret = audio_svc_get_item_by_audio_id(db_handle, audio_id, item);
112 if (ret != AUDIO_SVC_ERROR_NONE) {
113 msg_print(__LINE__, "error to get item by audio_id");
118 char *audio_id = NULL, *path = NULL, *title = NULL, *album = NULL, *artist = NULL, *thumbname = NULL, *year = NULL;
119 char thumb_path[AUDIO_SVC_PATHNAME_SIZE] = {0};
121 ret = audio_svc_item_get_val(item,
122 AUDIO_SVC_TRACK_DATA_AUDIO_ID, &audio_id, &size,
123 AUDIO_SVC_TRACK_DATA_PATHNAME, &path, &size,
124 AUDIO_SVC_TRACK_DATA_TITLE, &title, &size,
125 AUDIO_SVC_TRACK_DATA_ALBUM, &album, &size,
126 AUDIO_SVC_TRACK_DATA_ARTIST, &artist, &size,
127 AUDIO_SVC_TRACK_DATA_THUMBNAIL_PATH, &thumbname, &size,
128 AUDIO_SVC_TRACK_DATA_YEAR, &year, &size,
130 if (ret != AUDIO_SVC_ERROR_NONE) {
131 msg_print(__LINE__, "error audio_svc_item_get_val");
134 fprintf(stderr, "**** ITEM INFO[%d] ****\n", idx);
135 fprintf(stderr, " **audio_id = %s\n", audio_id);
136 fprintf(stderr, " **path = %s\n", path);
137 fprintf(stderr, " **title = %s\n", title);
138 fprintf(stderr, " **album = %s\n", album);
139 fprintf(stderr, " **artist = %s\n", artist);
140 fprintf(stderr, " **thumb = %s\n", thumbname);
141 fprintf(stderr, " **album = %s\n", album);
142 fprintf(stderr, " **year = %s\n", year);
145 ret = audio_svc_get_thumbnail_path_by_path(db_handle, path, thumb_path, AUDIO_SVC_PATHNAME_SIZE);
146 if (ret != AUDIO_SVC_ERROR_NONE) {
147 msg_print(__LINE__, "error audio_svc_item_get_val");
150 fprintf(stderr, " **thumb_path = %s\n\n", thumb_path);
155 ret = audio_svc_item_free(item);
156 if (ret != AUDIO_SVC_ERROR_NONE) {
157 msg_print(__LINE__, "error audio_svc_item_free");
160 ret = audio_svc_list_item_free(tracks);
161 if (ret != AUDIO_SVC_ERROR_NONE) {
162 msg_print(__LINE__, "error audio_svc_list_item_free");
167 ret = audio_svc_update_item_metadata(audio_id,
168 AUDIO_SVC_TRACK_DATA_PLAYED_COUNT, 5,
169 AUDIO_SVC_TRACK_DATA_PLAYED_TIME, 5,
170 AUDIO_SVC_TRACK_DATA_ADDED_TIME, 5,
171 AUDIO_SVC_TRACK_DATA_RATING, AUDIO_SVC_RATING_5,
172 AUDIO_SVC_TRACK_DATA_TITLE, "Test title", strlen("Test title"),
173 AUDIO_SVC_TRACK_DATA_ARTIST, NULL, 0,
174 AUDIO_SVC_TRACK_DATA_ALBUM, "Test album", strlen("Test album"),
175 AUDIO_SVC_TRACK_DATA_GENRE, "Test genre", strlen("Test genre"),
176 AUDIO_SVC_TRACK_DATA_AUTHOR, "Test author", strlen("Test author"),
177 AUDIO_SVC_TRACK_DATA_DESCRIPTION, "Test description", strlen("Test description"),
178 AUDIO_SVC_TRACK_DATA_YEAR, 2011,
179 AUDIO_SVC_TRACK_DATA_TRACK_NUM, 10,
180 AUDIO_SVC_TRACK_DATA_ALBUM_RATING, AUDIO_SVC_RATING_5,
182 if (ret != AUDIO_SVC_ERROR_NONE) {
183 msg_print(__LINE__, "error audio_svc_update_item_metadata");
187 //iterate all albums and its tracks ==================================================
188 msg_print(__LINE__, "iterate all albums and its tracks");
190 ret = audio_svc_count_group_item(db_handle, AUDIO_SVC_GROUP_BY_ALBUM, NULL, NULL, NULL, NULL, &rows);
191 if (ret != AUDIO_SVC_ERROR_NONE) {
192 msg_print(__LINE__, "error audio_svc_count_group_item");
196 msg_print(__LINE__, "there is no group item");
200 fprintf(stderr, "rows = [%d]\n", rows);
202 ret = audio_svc_group_item_new(&groups, rows);
203 if (ret != AUDIO_SVC_ERROR_NONE) {
204 msg_print(__LINE__, "error audio_svc_list_item_new");
208 ret = audio_svc_get_group_item(db_handle, AUDIO_SVC_GROUP_BY_ALBUM, //group_type,
209 NULL, //limit_string1,
210 NULL, //limit_string2,
211 NULL, //filter_string,
212 NULL, //filter_string2,
217 if (ret != AUDIO_SVC_ERROR_NONE) {
218 msg_print(__LINE__, "error audio_svc_get_group_item");
222 for (idx = 0; idx < rows; idx++) {
223 char *main_info = NULL, *sub_info = NULL, *thumbname = NULL;
224 int album_rating = 0;
228 ret = audio_svc_group_item_get_val(groups, idx ,
229 AUDIO_SVC_GROUP_ITEM_THUMBNAIL_PATH, &thumbname, &size,
230 AUDIO_SVC_GROUP_ITEM_MAIN_INFO, &main_info, &size,
231 AUDIO_SVC_GROUP_ITEM_SUB_INFO, &sub_info, &size,
232 AUDIO_SVC_GROUP_ITEM_RATING, &album_rating,
235 if (ret != AUDIO_SVC_ERROR_NONE) {
236 msg_print(__LINE__, "error audio_svc_group_item_get_val");
240 fprintf(stderr, "**** GROUP INFO[%d] ****\n", idx);
241 fprintf(stderr, " **main_info = %s\n", main_info);
242 fprintf(stderr, " **sub_info = %s\n", sub_info);
243 fprintf(stderr, " **thumbname = %s\n", thumbname);
244 fprintf(stderr, " **album_rating = %d\n\n", album_rating);
246 //iterate tracks of albums ==================================================
247 ret = audio_svc_count_list_item(db_handle, AUDIO_SVC_TRACK_BY_ALBUM, main_info, "", "", "", &count);
248 if (ret != AUDIO_SVC_ERROR_NONE) {
249 msg_print(__LINE__, "error audio_svc_count_list_item");
253 msg_print(__LINE__, "there is no item");
257 fprintf(stderr, " rows = [%d]\n", count);
259 ret = audio_svc_list_item_new(&tracks, count);
260 if (ret != AUDIO_SVC_ERROR_NONE) {
261 msg_print(__LINE__, "error audio_svc_list_item_new");
265 ret = audio_svc_get_list_item(db_handle, AUDIO_SVC_TRACK_BY_ALBUM, main_info, NULL, NULL, NULL, 0, count, tracks);
266 if (ret != AUDIO_SVC_ERROR_NONE) {
267 msg_print(__LINE__, "error audio_svc_list_item_new");
268 ret = audio_svc_group_item_free(groups);
269 if (ret != AUDIO_SVC_ERROR_NONE) {
270 msg_print(__LINE__, "error audio_svc_list_item_free");
276 for (j = 0; j < count; j++)
278 char *audio_id = NULL, *title = NULL, *artist = NULL, *thumbname = NULL, *pathname = NULL, *album = NULL;
283 ret = audio_svc_list_item_get_val(tracks, j ,
284 AUDIO_SVC_LIST_ITEM_AUDIO_ID, &audio_id, &size,
285 AUDIO_SVC_LIST_ITEM_THUMBNAIL_PATH, &thumbname, &size,
286 AUDIO_SVC_LIST_ITEM_TITLE, &title, &size,
287 AUDIO_SVC_LIST_ITEM_ARTIST, &artist, &size,
288 AUDIO_SVC_LIST_ITEM_ALBUM, &album, &size,
289 AUDIO_SVC_LIST_ITEM_PATHNAME, &pathname, &size,
290 AUDIO_SVC_LIST_ITEM_DURATION, &duration,
291 AUDIO_SVC_LIST_ITEM_RATING, &rating,
293 if (ret != AUDIO_SVC_ERROR_NONE) {
294 msg_print(__LINE__, "error audio_svc_list_item_get_val");
295 ret = audio_svc_list_item_free(tracks);
296 if (ret != AUDIO_SVC_ERROR_NONE) {
297 msg_print(__LINE__, "error audio_svc_list_item_free");
303 fprintf(stderr, " **audio_id = %s\n", audio_id);
304 fprintf(stderr, " **thumbnail_path = %s\n", thumbname);
305 fprintf(stderr, " **title = %s\n", title);
306 fprintf(stderr, " **artist = %s\n", artist);
307 fprintf(stderr, " **album = %s\n", album);
308 fprintf(stderr, " **path = %s\n", pathname);
309 fprintf(stderr, " **duration = %d\n", duration);
310 fprintf(stderr, " **rating = %d\n\n", rating);
313 ret = audio_svc_list_item_free(tracks);
314 if (ret != AUDIO_SVC_ERROR_NONE) {
315 msg_print(__LINE__, "error audio_svc_list_item_free");
321 ret = audio_svc_group_item_free(groups);
322 if (ret != AUDIO_SVC_ERROR_NONE) {
323 msg_print(__LINE__, "error audio_svc_list_item_free");
328 //iterate all Folder and its tracks ==================================================
329 msg_print(__LINE__, "iterate all Folder and its tracks");
330 //AudioHandleType *groups = NULL;
331 ret = audio_svc_count_group_item(db_handle, AUDIO_SVC_GROUP_BY_FOLDER, NULL, NULL, NULL, NULL, &rows);
332 if (ret != AUDIO_SVC_ERROR_NONE) {
333 msg_print(__LINE__, "error audio_svc_count_group_item");
337 msg_print(__LINE__, "there is no group item");
341 fprintf(stderr, "rows = [%d]\n", rows);
343 ret = audio_svc_group_item_new(&groups, rows);
344 if (ret != AUDIO_SVC_ERROR_NONE) {
345 msg_print(__LINE__, "error audio_svc_group_item_new");
349 ret = audio_svc_get_group_item(db_handle, AUDIO_SVC_GROUP_BY_FOLDER, //group_type,
350 NULL, //limit_string1,
351 NULL, //limit_string2,
352 NULL, //filter_string,
353 NULL, //filter_string2,
357 if (ret != AUDIO_SVC_ERROR_NONE) {
358 msg_print(__LINE__, "error audio_svc_get_group_item of get folder");
359 ret = audio_svc_list_item_free(tracks);
360 if (ret != AUDIO_SVC_ERROR_NONE) {
361 msg_print(__LINE__, "error audio_svc_list_item_free");
367 for (idx = 0; idx < rows; idx++) {
368 char *main_info = NULL, *sub_info = NULL, *thumbname = NULL;
373 ret = audio_svc_group_item_get_val(groups, idx ,
374 AUDIO_SVC_GROUP_ITEM_THUMBNAIL_PATH, &thumbname, &size,
375 AUDIO_SVC_GROUP_ITEM_MAIN_INFO, &main_info, &size,
376 AUDIO_SVC_GROUP_ITEM_SUB_INFO, &sub_info, &size,
377 AUDIO_SVC_GROUP_ITEM_RATING, &rating,
380 if (ret != AUDIO_SVC_ERROR_NONE) {
381 msg_print(__LINE__, "error audio_svc_list_item_get_val of get folder");
382 ret = audio_svc_list_item_free(tracks);
383 if (ret != AUDIO_SVC_ERROR_NONE) {
384 msg_print(__LINE__, "error audio_svc_list_item_free");
390 fprintf(stderr, "**** FOLDER INFO[%d] ****\n", idx);
391 fprintf(stderr, " **main_info = %s\n", main_info);
392 fprintf(stderr, " **sub_info = %s\n", sub_info);
393 fprintf(stderr, " **thumbname = %s\n", thumbname);
394 fprintf(stderr, " **rating = %d\n\n", rating);
396 //iterate tracks of albums ==================================================
397 ret = audio_svc_count_list_item(db_handle, AUDIO_SVC_TRACK_BY_FOLDER, sub_info, "", "", "", &count);
398 if (ret != AUDIO_SVC_ERROR_NONE) {
399 msg_print(__LINE__, "error audio_svc_count_list_item");
403 msg_print(__LINE__, "there is no item");
407 fprintf(stderr, " rows = [%d]\n\n", count);
409 ret = audio_svc_list_item_new(&tracks, count);
410 if (ret != AUDIO_SVC_ERROR_NONE) {
411 msg_print(__LINE__, "error audio_svc_list_item_new");
415 ret = audio_svc_get_list_item(db_handle, AUDIO_SVC_TRACK_BY_FOLDER, sub_info, NULL, NULL, NULL, 0, count, tracks);
416 if (ret != AUDIO_SVC_ERROR_NONE) {
417 msg_print(__LINE__, "error audio_svc_list_item_new");
421 for (j = 0; j < count; j++)
423 char *audio_id = NULL, *title = NULL, *artist = NULL, *thumbname = NULL, *pathname = NULL;
428 ret = audio_svc_list_item_get_val(tracks, j ,
429 AUDIO_SVC_LIST_ITEM_AUDIO_ID, &audio_id, &size,
430 AUDIO_SVC_LIST_ITEM_THUMBNAIL_PATH, &thumbname, &size,
431 AUDIO_SVC_LIST_ITEM_TITLE, &title, &size,
432 AUDIO_SVC_LIST_ITEM_ARTIST, &artist, &size,
433 AUDIO_SVC_LIST_ITEM_PATHNAME, &pathname, &size,
434 AUDIO_SVC_LIST_ITEM_DURATION, &duration,
435 AUDIO_SVC_LIST_ITEM_RATING, &rating,
437 if (ret != AUDIO_SVC_ERROR_NONE) {
438 msg_print(__LINE__, "error audio_svc_list_item_get_val");
439 ret = audio_svc_list_item_free(tracks);
440 if (ret != AUDIO_SVC_ERROR_NONE) {
441 msg_print(__LINE__, "error audio_svc_list_item_free");
447 fprintf(stderr, " **audio_id = %s\n", audio_id);
448 fprintf(stderr, " **thumbnail_path = %s\n", thumbname);
449 fprintf(stderr, " **title = %s\n", title);
450 fprintf(stderr, " **artist = %s\n", artist);
451 fprintf(stderr, " **path = %s\n", pathname);
452 fprintf(stderr, " **duration = %d\n", duration);
453 fprintf(stderr, " **rating = %d\n\n", rating);
456 ret = audio_svc_list_item_free(tracks);
457 if (ret != AUDIO_SVC_ERROR_NONE) {
458 msg_print(__LINE__, "error audio_svc_list_item_free");
464 ret = audio_svc_group_item_free(groups);
465 if (ret != AUDIO_SVC_ERROR_NONE) {
466 msg_print(__LINE__, "error audio_svc_list_item_free");
470 //iterate all playlist and its tracks ==================================================
473 AudioHandleType*playlists = NULL;
474 char plst_name[AUDIO_SVC_PLAYLIST_NAME_SIZE] = {0};
476 ret = audio_svc_count_playlist(db_handle, NULL, NULL, &plst_count);
477 if (ret != AUDIO_SVC_ERROR_NONE) {
478 msg_print(__LINE__, "error audio_svc_count_playlist");
482 msg_print(__LINE__, "there is no playlist");
486 fprintf(stderr, "plst_count = [%d]\n", plst_count);
488 ret = audio_svc_playlist_new(&playlists, plst_count);
489 if (ret != AUDIO_SVC_ERROR_NONE) {
490 msg_print(__LINE__, "error audio_svc_playlist_new");
494 ret = audio_svc_get_playlist(db_handle,
495 NULL, //filter_string,
496 NULL, //filter_string2,
500 if (ret != AUDIO_SVC_ERROR_NONE) {
501 msg_print(__LINE__, "error audio_svc_playlist_new");
506 for (idx = 0; idx < plst_count; idx++) {
508 char *playlist_name = NULL;
509 char *playlist_thumbnail_path = NULL;
511 audio_svc_playlist_get_val(playlists, idx, AUDIO_SVC_PLAYLIST_ID, &plst_id, AUDIO_SVC_PLAYLIST_NAME, &playlist_name, &size, AUDIO_SVC_PLAYLIST_THUMBNAIL_PATH, &playlist_thumbnail_path, &size,-1);
512 fprintf(stderr, "**** Playlist Item Info****\n");
513 fprintf(stderr, "** plst id: [%d], name: [%s], thumbnail_path: [%s]\n\n", plst_id, playlist_name, playlist_thumbnail_path);
516 ret = audio_svc_playlist_free(playlists);
517 if (ret != AUDIO_SVC_ERROR_NONE) {
518 msg_print(__LINE__, "error audio_svc_playlist_new");
522 ret = audio_svc_count_playlist_item(db_handle, plst_id, "", "", &rows);
523 if (ret != AUDIO_SVC_ERROR_NONE) {
524 msg_print(__LINE__, "error audio_svc_count_list_item");
529 msg_print(__LINE__, "there is no item");
533 fprintf(stderr, "rows = [%d]\n", rows);
535 ret = audio_svc_playlist_item_new(&tracks, rows);
536 if (ret != AUDIO_SVC_ERROR_NONE) {
537 msg_print(__LINE__, "error to alloc memory for list item");
541 ret = audio_svc_get_playlist_item(db_handle,
543 NULL, //filter_string,
544 NULL, //filter_string2,
549 if (ret != AUDIO_SVC_ERROR_NONE) {
550 msg_print(__LINE__, "error to get list item");
554 for (idx = 0; idx < rows; idx++) {
555 char *audio_id = NULL, *title = NULL, *artist = NULL, *thumbname = NULL, *pathname = NULL;
562 ret = audio_svc_playlist_item_get_val(tracks, idx ,
563 AUDIO_SVC_PLAYLIST_ITEM_UID, &uid,
564 AUDIO_SVC_PLAYLIST_ITEM_AUDIO_ID, &audio_id, &size,
565 AUDIO_SVC_PLAYLIST_ITEM_THUMBNAIL_PATH, &thumbname, &size,
566 AUDIO_SVC_PLAYLIST_ITEM_TITLE, &title, &size,
567 AUDIO_SVC_PLAYLIST_ITEM_ARTIST, &artist, &size,
568 AUDIO_SVC_PLAYLIST_ITEM_PATHNAME, &pathname, &size,
569 AUDIO_SVC_PLAYLIST_ITEM_DURATION, &duration,
570 AUDIO_SVC_PLAYLIST_ITEM_RATING, &rating,
571 AUDIO_SVC_PLAYLIST_ITEM_PLAY_ORDER, &play_order,
573 if (ret != AUDIO_SVC_ERROR_NONE) {
574 msg_print(__LINE__, "error audio_svc_list_item_get_val");
578 fprintf(stderr, " **uid = %d\n", uid);
579 fprintf(stderr, " **audio_id = %s\n", audio_id);
580 fprintf(stderr, " **thumbnail_path = %s\n", thumbname);
581 fprintf(stderr, " **title = %s\n", title);
582 fprintf(stderr, " **artist = %s\n", artist);
583 fprintf(stderr, " **path = %s\n", pathname);
584 fprintf(stderr, " **duration = %d\n", duration);
585 fprintf(stderr, " **rating = %d\n", rating);
586 fprintf(stderr, " **play_order = %d\n\n", play_order);
589 ret = audio_svc_playlist_item_free(tracks);
590 if (ret != AUDIO_SVC_ERROR_NONE) {
591 msg_print(__LINE__, "error audio_svc_list_item_free");
595 ret = audio_svc_get_playlist_name_by_playlist_id(db_handle, plst_id, plst_name, AUDIO_SVC_PLAYLIST_NAME_SIZE);
596 if (ret != AUDIO_SVC_ERROR_NONE) {
597 msg_print(__LINE__, "error audio_svc_get_playlist_name_by_playlist_id");
600 fprintf(stderr,"playlist id = %d, playlist name = %s\n", plst_id, plst_name);
602 //db close ==================================================
603 ret = media_svc_disconnect(db_handle);
604 if (ret != AUDIO_SVC_ERROR_NONE) {
605 msg_print(__LINE__, "error to close music database");
613 void insert_into_db(MediaSvcHandle * db_handle, const char * dir_path)
616 char thumb_path[AUDIO_SVC_PATHNAME_SIZE+1] = {0};
620 DIR *dir = opendir(dir_path);
621 while ((dp=readdir(dir)) != NULL) {
622 char fpath[_POSIX_PATH_MAX];
624 if (dp->d_name[0] == '.') {
627 snprintf(fpath, sizeof(fpath), "%s/%s", dir_path, dp->d_name);
629 fprintf(stderr,"[file path] : %s\n", fpath);
631 int ret = audio_svc_insert_item(db_handle, AUDIO_SVC_STORAGE_PHONE, fpath, AUDIO_SVC_CATEGORY_MUSIC);
632 if (ret != AUDIO_SVC_ERROR_NONE) {
633 fprintf(stderr,"[error to insert music] : %s\n", fpath);
642 void msg_print(int line, char *msg)
644 //fprintf(stderr, "\n");
645 //fprintf(stderr,"%s:%d\n", __FUNCTION__, __LINE__);
646 //fprintf(stderr, "+++++++++++++++++++++++++++++++++\n");
647 fprintf(stderr, "[%d]%s +++++\n", line, msg);
648 //fprintf(stderr, "+++++++++++++++++++++++++++++++++\n");
649 //fprintf(stderr, "+++++++++++++++++++++++++++++++++\n");
650 //fprintf(stderr, "\n");