📄 u_ijou.c
字号:
DOMAIN_OBJS *pstDomObj;ST_CHAR *jrnlName;ST_BOOLEAN bDone;int numEntries, i, j;VAR_INFO *viLocal, *viSend;int startEntryNum, stopEntryNum, entryNum;ST_BOOLEAN bHaveStartTime, bHaveStartEntry;ST_BOOLEAN bHaveStopTime, bHaveStopEntry;ST_BOOLEAN bHaveSaTime, bHaveSaEntry;ST_BOOLEAN bSendNegResp = SD_FALSE, bSendVarTag;ST_CHAR **ppVarTags; pstReqInfo = (JREAD_REQ_INFO *) req_info->req_info_ptr; chan = req_info->chan; /* find the requested journal */ if (pstReqInfo->jou_name.object_tag == AA_SPEC) { pstDomObj = mms_chan_info[chan].objs.aa_objs; jrnlName = pstReqInfo->jou_name.obj_name.aa_spec; } else if (pstReqInfo->jou_name.object_tag == DOM_SPEC) { pstDomObj = ms_find_dom_objs (&pstReqInfo->jou_name, chan); jrnlName = pstReqInfo->jou_name.obj_name.item_id; } else { pstDomObj = &m_vmd_select->vmd_wide; jrnlName = pstReqInfo->jou_name.obj_name.vmd_spec; } pstJrnl = ms_find_journal (pstDomObj, jrnlName); if (!pstJrnl) { mp_err_resp (req_info, 2, 1); return; } /* read the journal */ /* If we can't read the journal we are assuming that the journal */ /* exists but has no entry content written in the journal cfg file */ if (readJrnlFile (pstJrnl->usr) != SD_SUCCESS) { pstRespInfo = (JREAD_RESP_INFO *) dest_buffer; pstRespInfo->num_of_jou_entry = 0; pstRespInfo->more_follows = SD_FALSE; mp_jread_resp (req_info, pstRespInfo); freeLocalJrnl (); return; } if (localJrnlLevel == 0) /* nav testing */ startEntryNum = EMPTY_JOURNAL; /* organize the filter criteria */ bHaveStartTime = SD_FALSE; bHaveStartEntry = SD_FALSE; bHaveStopTime = SD_FALSE; bHaveStopEntry = SD_FALSE; bHaveSaTime = SD_FALSE; bHaveSaEntry =SD_FALSE; if (pstReqInfo->range_start_pres) { if (pstReqInfo->start_tag == 0) bHaveStartTime = SD_TRUE; else if (pstReqInfo->start_tag == 1) bHaveStartEntry = SD_TRUE; } if (pstReqInfo->range_stop_pres) { if (pstReqInfo->stop_tag == 0) bHaveStopTime = SD_TRUE; else if (pstReqInfo->stop_tag == 1) bHaveStopEntry = SD_TRUE; } if (pstReqInfo->sa_entry_pres) { bHaveSaTime = SD_TRUE; if (pstReqInfo->entry_spec_len >0) bHaveSaEntry = SD_TRUE; } /* determine eligible journal entries using filter criteria */ /* a startEntryNum == -1 indicates an empty journal */ startEntryNum = (localJrnlLevel == 0) ? EMPTY_JOURNAL : 0; stopEntryNum = localJrnlLevel-1; /* consider start range filter */ if (bHaveStartTime) { if (!bHaveStopTime && !bHaveStopEntry) startEntryNum = getFirstTS (&pstReqInfo->start_time, 0); else if (bHaveStopTime) { if (compareMmsBtod (&pstReqInfo->end_time, &pstReqInfo->start_time) >=0) startEntryNum = getFirstTS (&pstReqInfo->start_time, 0); else startEntryNum = getLastTS (&pstReqInfo->start_time); } else if (bHaveStopEntry) { if (pstReqInfo->num_of_entries > 0) startEntryNum = getFirstTS (&pstReqInfo->start_time, 0); else startEntryNum = getLastTS (&pstReqInfo->start_time); } } if (bHaveStartEntry) { i=0; bDone = SD_FALSE; while (i<localJrnlLevel && !bDone) { if ((pstLocalJrnl[i]->entry_id_len == pstReqInfo->start_entry_len) && (memcmp (pstLocalJrnl[i]->entry_id, pstReqInfo->start_entry, pstReqInfo->start_entry_len) >= 0) ) bDone = SD_TRUE; else i++; } if (bDone) startEntryNum = i; } /* find the stop entry using filters */ if (bHaveStopTime && startEntryNum != EMPTY_JOURNAL) { if (compareMmsBtod (&pstReqInfo->end_time, &pstLocalJrnl[startEntryNum]->ent_content.occur_time) >= 0) { if (bHaveStartTime && (compareMmsBtod (&pstReqInfo->start_time, &pstReqInfo->end_time) > 0)) startEntryNum = EMPTY_JOURNAL; else stopEntryNum = getLastTS (&pstReqInfo->end_time); } else { if (bHaveStartTime && (compareMmsBtod (&pstReqInfo->start_time, &pstReqInfo->end_time) <= 0)) startEntryNum = EMPTY_JOURNAL; else stopEntryNum = getFirstTS (&pstReqInfo->end_time, 0); } } if (bHaveStopEntry && startEntryNum != EMPTY_JOURNAL) { if (pstReqInfo->num_of_entries <0 ) stopEntryNum = startEntryNum +pstReqInfo->num_of_entries + 1; else stopEntryNum = startEntryNum + pstReqInfo->num_of_entries - 1; stopEntryNum = max (stopEntryNum, 0); stopEntryNum = min (stopEntryNum, localJrnlLevel); } if (bHaveSaTime && startEntryNum != EMPTY_JOURNAL) { if (startEntryNum <= stopEntryNum) /* chronological return */ { entryNum = getFirstTS (&pstReqInfo->time_spec, startEntryNum) +1 ; startEntryNum = (entryNum <= stopEntryNum) ? entryNum : EMPTY_JOURNAL; } else { entryNum = getFirstTS (&pstReqInfo->time_spec, stopEntryNum) - 1; startEntryNum = (entryNum > stopEntryNum) ? entryNum : EMPTY_JOURNAL; } } if (bHaveSaEntry && (startEntryNum != EMPTY_JOURNAL)) { i=startEntryNum; bDone = SD_FALSE; while (i<localJrnlLevel && !bDone) { if ((pstLocalJrnl[i]->entry_id_len == pstReqInfo->entry_spec_len) && (memcmp (pstLocalJrnl[i]->entry_id, pstReqInfo->entry_spec, pstReqInfo->entry_spec_len) > 0) ) bDone = SD_TRUE; else i++; } if (bDone) startEntryNum = i; } if (startEntryNum >= localJrnlLevel) startEntryNum = EMPTY_JOURNAL; /* check for resp err */ if (bSendNegResp) { mp_err_resp (req_info, 7, 2); freeLocalJrnl (); return; } /* check for empty journal */ if (startEntryNum == EMPTY_JOURNAL) { pstRespInfo = (JREAD_RESP_INFO *) dest_buffer; pstRespInfo->num_of_jou_entry = 0; pstRespInfo->more_follows = SD_FALSE; mp_jread_resp (req_info, pstRespInfo); freeLocalJrnl (); return; } /* prepare the response using the list of eligible entries */ pstRespInfo = (JREAD_RESP_INFO *) dest_buffer; pstRespInfo->more_follows = SD_FALSE; pstJE = (JOURNAL_ENTRY *) (pstRespInfo + 1); ppVarTags = (ST_CHAR **) (pstReqInfo + 1); numEntries = 0; i = startEntryNum; bDone = SD_FALSE; while (!bDone) { pstLJE = pstLocalJrnl[i]; if (pstReqInfo->list_of_var_pres) { bSendVarTag = SD_FALSE; if ((pstLJE->ent_content.entry_form_tag == 2) && pstLJE->ent_content.ef.data.list_of_var_pres) { viLocal = (VAR_INFO *) (pstLJE + 1); j=0; while ((j < pstLJE->ent_content.ef.data.num_of_var) && !bSendVarTag) { bSendVarTag = findVarTag (viLocal->var_tag, pstReqInfo->num_of_var, ppVarTags); j++; viLocal++; } } } else bSendVarTag = SD_TRUE; if (bSendVarTag) { numEntries++; memcpy (pstJE, pstLJE, sizeof (JOURNAL_ENTRY)); if ((pstJE->ent_content.entry_form_tag == 2) && pstJE->ent_content.ef.data.list_of_var_pres) { viSend = (VAR_INFO *) (pstJE + 1); viLocal = (VAR_INFO *) (pstLJE + 1); numVars=0; for (j=0; j<pstJE->ent_content.ef.data.num_of_var; j++, viLocal++) { memcpy (viSend, viLocal, sizeof (VAR_INFO)); viSend++; numVars++; } pstJE->ent_content.ef.data.num_of_var = numVars; if (numVars == 0) pstJE->ent_content.ef.data.list_of_var_pres = SD_FALSE; pstJE = (JOURNAL_ENTRY *) viSend; } else pstJE++; } if (stopEntryNum < startEntryNum) { i--; if (i < stopEntryNum) bDone = SD_TRUE; } else { i++; if (i > stopEntryNum) bDone = SD_TRUE; } if (!bDone && (numEntries >= MAX_ENTRIES_PER_RESP)) { bDone = SD_TRUE; pstRespInfo->more_follows = SD_TRUE; } } pstRespInfo->num_of_jou_entry = numEntries; mp_jread_resp (req_info, pstRespInfo); freeLocalJrnl (); }/************************************************************************//* WRITE JOURNAL *//************************************************************************/#if MMS_JWRITE_EN & RESP_ENST_VOID u_jwrite_ind (MMSREQ_IND *req_info) {JWRITE_REQ_INFO *ptr;ENTRY_CONTENT *ec_ptr;VAR_INFO *vi_ptr;ST_INT ch, i, j; if (mms_debug_sel & MMS_LOG_USR_IND) { indic_info_print (req_info,"Write Journal "); ptr = (JWRITE_REQ_INFO *) req_info->req_info_ptr; ec_ptr = (ENTRY_CONTENT *) (ptr + 1); if (ptr->num_of_jou_entry > 0) { printf ("\n\n Press return to continue"); ch = get_a_char (); CLEARSCR; printf ("\n Journal Name : "); print_objname (&(ptr->jou_name)); printf ("\n No. of Journal Entries : %d ", ptr->num_of_jou_entry); } else { printf ("\n Journal Name : "); print_objname (&(ptr->jou_name)); printf ("\n No. of Journal Entries : %d ", ptr->num_of_jou_entry); } for (i=0; i < ptr->num_of_jou_entry; i++) { printf ("\n\nEntry %3d)", i+1); printf ("\nOccurrence Time : "); print_evt_tod (&ec_ptr->occur_time); printf ("\nAdditional Detail: "); if (ec_ptr->addl_detail_pres) list_bytes (ec_ptr->addl_detail,ec_ptr->addl_detail_len); else printf ("Not Present"); printf ("\nEntry form tag : %d, ", ec_ptr->entry_form_tag); switch (ec_ptr->entry_form_tag) { case 2 : printf ("data"); break; case 3 : printf ("annotation"); break; } if (ec_ptr->entry_form_tag == 3) /* form = annotation */ { printf ("\nAnnotation : %s", ec_ptr->ef.annotation); } else /* form == data */ { if (ec_ptr->ef.data.event_pres) { printf ("\nEvent Condition Name : "); print_objname (&(ec_ptr->ef.data.evcon_name)); printf ("\nCurrent State : %d - ", ec_ptr->ef.data.cur_state); switch (ec_ptr->ef.data.cur_state) { case 0 : printf ("disabled"); break; case 1 : printf ("idle"); break; case 2 : printf ("active"); break; } } else printf ("\nEvent : Not Present"); if (ec_ptr->ef.data.list_of_var_pres) { vi_ptr = (VAR_INFO *) (ec_ptr + 1); printf ("Number of Variables : %d", ec_ptr->ef.data.num_of_var); for (j=0; j < ec_ptr->ef.data.num_of_var ; j++) { printf ("\nVariable Tag : %s", vi_ptr->var_tag); printf ("\nValue Specification : "); list_bytes (vi_ptr->value_spec.data,vi_ptr->value_spec.len); } /* end of variable list loop */ } /* end of IF variable list present */ else printf ("\nList of Variables : Not Present"); } /* end of DATA form */ if ((i+1) < ptr->num_of_jou_entry) printf ("\nPress return for next entry content, x to exit"); else printf ("\nPress return to continue "); ch = get_a_char (); if (ch == 'x' || ch == 'X') i = ptr->num_of_jou_entry; /* exit selected */ else { vi_ptr = (VAR_INFO *) (ec_ptr + 1); vi_ptr += ec_ptr->ef.data.num_of_var; ec_ptr = (ENTRY_CONTENT *) vi_ptr; } } /* End of Journal Entry Loop */ mp_jwrite_resp (req_info); /* send the response */ } else sendJwriteResp (req_info); indic_info_wait (); /* allow user to see indic info */ }#endif/************************************************************************//* sendJwriteResp: add JWrite data to the local journal *//************************************************************************/static ST_VOID sendJwriteResp (MMSREQ_IND *req_info) {JWRITE_REQ_INFO *pstReqInfo;ST_INT chan;DOMAIN_OBJS *pstDomObj;ST_CHAR *jrnlName;JOURNAL_ENTRY *pstJE; JOURNAL *pstJrnl;ENTRY_CONTENT *pstEC;int i, j, numVars = 0, entrySize, len;ST_CHAR buf[1024];ST_UCHAR *temp, *tmp; VAR_INFO *viIn, *viOut;APP_REF stAppRef; pstReqInfo = (JWRITE_REQ_INFO *) req_info->req_info_ptr; chan = req_info->chan; /* find the requested journal */ if (pstReqInfo->jou_name.object_tag == AA_SPEC) { pstDomObj = mms_chan_info[chan].objs.aa_objs; jrnlName = pstReqInfo->jou_name.obj_name.aa_spec; } else if (pstReqInfo->jou_name.object_tag == DOM_SPEC) { pstDomObj = ms_find_dom_objs (&pstReqInfo->jou_name, chan); jrnlName = pstReqInfo->jou_name.obj_name.item_id; } else { pstDomObj = &m_vmd_select->vmd_wide; jrnlName = pstReqInfo->jou_name.obj_name.vmd_spec; } pstJrnl = ms_find_journal (pstDomObj, jrnlName); if (!pstJrnl) { mp_err_resp (req_info, 2, 1); return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -