// PageArchiveData.cpp : implementation file // #include "stdafx.h" #include "mgrnve.h" #include "PageArchiveData.h" #include "ConnectionManager.h" #define C_STATUS_MOVIE_TRY_CONNECT 0x01 #define C_STATUS_MOVIE_CONNECT_GOOD 0x02 #define C_STATUS_MOVIE_CONNECT_FAIL 0x03 #define C_STATUS_AUDIO_TRY_CONNECT 0x04 #define C_STATUS_AUDIO_CONNECT_GOOD 0x05 #define C_STATUS_AUDIO_CONNECT_FAIL 0x06 #define C_STATUS_MOVIE_CONNECT_CANCEL 0x07 #define C_STATUS_AUDIO_CONNECT_CANCEL 0x08 #define C_STATUS_RECEIVE_CAMERAINFO 0x09 #define C_STATUS_MOVIE_DISCONNECT 0x0A #define C_STATUS_AUDIO_DISCONNECT 0x0B #define DATATYPE_UNKNOWN 0x00 #define DATATYPE_CAMERADATA 0x01 #define DATATYPE_SWITCHDATA 0x02 #define DATATYPE_MOVIEDATA 0x03 #define DATATYPE_AUDIODATA 0x04 #define DATATYPE_DIRECTORY 0x05 #define DATATYPE_ARCHIVEDATA 0x06 typedef struct{ WORD wVideoChannel; WORD wAudioChannel; DWORD dwTime; DWORD dwDate; DWORD dwDummy; }DATEMAP_INFO; typedef struct { int nHeaderSize; int nDataSize; DWORD dwDate; //wYear<<16 | wMonth<<8 | wDay DWORD dwTime; //wHour<<24 | wMinute<<16 | wSecond<<8 | (wMilliseconds/10) BYTE info[4]; // 0=channel, 1=method, 2=mpeg/mjpeg, 3=frameNo int dummy[3]; // 0: data size, 1: pos data size, 2 : protocol size.. }READ_DB_HEADER, *PREAD_DB_HEADER; // dumy size cal : ((dummy + 15)/16*16) + 16 #define GET_LW_HIBYTE(x) ( (x >> 8) & 0xFF ) #define GET_LW_LOBYTE(x) ( x & 0xFF ) #define GET_YEAR( x ) ( x >> 16 ) #define GET_MON( x ) ( (x >> 8) & 0xFF ) #define GET_DAY( x ) ( x & 0xFF ) #define GET_HOUR( x ) ( x >> 24 ) #define GET_MIN( x ) ( (x >> 16) & 0xFF ) #define GET_SEC( x ) ( (x >> 8) & 0xFF ) #define GET_HUND( x ) ( x & 0xFF ) #define WM_SLIDER_MOVING WM_USER + 1 #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPageArchiveData dialog CPageArchiveData::CPageArchiveData(CWnd* pParent, CMgrNVE* pMgrCM, CConnectionManager *pConnMgr) : CParamDlg(CPageArchiveData::IDD, pParent, pMgrCM, pConnMgr) { //{{AFX_DATA_INIT(CPageArchiveData) //}}AFX_DATA_INIT strncpy(m_szIP, "192.168.13.4", sizeof(m_szIP)); strncpy(m_szID, "Administrator", sizeof(m_szID)); strncpy(m_szPW, "", sizeof(m_szPW)); m_uPort = 911; m_uIndexDate = 0xFFFFFFFF; m_uIndexTime = 0xFFFFFFFF; m_uSpeedPos = 0; m_bConnect = FALSE; m_pDlgPlay = NULL; m_pMsgMgr = NULL; m_pNet5 = NULL; m_uMaxCh = 0; } void CPageArchiveData::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPageArchiveData) DDX_Control(pDX, IDC_TREE_SEARCH_DATA, m_treeSearchData); DDX_Control(pDX, IDC_SLIDER_SPEED, m_sldSpeed); DDX_Control(pDX, IDC_CHK_CONNECT, m_btnConnect); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPageArchiveData, CDialog) //{{AFX_MSG_MAP(CPageArchiveData) ON_WM_DESTROY() ON_NOTIFY(NM_DBLCLK, IDC_TREE_SEARCH_DATA, OnDblclkTreeSearchData) ON_WM_HSCROLL() ON_BN_CLICKED(IDC_CHK_CONNECT, OnChkConnect) ON_BN_CLICKED(IDC_BTN_GET_DIR, OnBtnGetDir) ON_BN_CLICKED(IDC_BTN_RECORD, OnBtnRecord) ON_BN_CLICKED(IDC_BTN_STOP, OnBtnStop) ON_BN_CLICKED(IDC_BTN_DELETE, OnBtnDelete) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPageArchiveData message handlers BOOL CPageArchiveData::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_pMsgMgr = m_pMgrNVE->GetMsgManager(); m_pNet5 = m_pConnection->GetNet5Api(); m_pDlgPlay = new CDlgPlay(); m_pDlgPlay->Create(IDD_DIALOG_PLAY); m_pDlgPlay->ShowWindow(TRUE); m_pDlgPlay->SetControlDlg(this); m_pAgentCtrl = m_pDlgPlay->GetWebAgent(); m_pAgentCtrl->SetUserAgentType(0); //0 : single mode, 1: app draw mode, 2 : app raw data m_sldSpeed.SetRange(0, 100); m_uSpeedPos = 100; m_sldSpeed.SetPos(m_uSpeedPos); m_pAgentCtrl->MethodEnableSpeedControl((short)(100-m_uSpeedPos)); char szCmd[NVE_SHORT_EXT_CMD_LENGTH]; _snprintf(szCmd, sizeof(szCmd), "EXT_CMD / RTSP/1.0\r\n" "CSeq: 1\r\n" "CmdCount: 1\r\n" "GET HARDWARE_INFO max_video_ch\r\n\r\n"); m_pNet5->Net5Command(NET5_NC_SEND_RTSP_REQUEST, (ULONG*)szCmd, NULL, NULL, NULL); m_pNet5->Net5Command(NET5_NC_RECV_RTSP_RESPONSE, (ULONG*)szCmd, NULL, NULL, NULL); NVE_RTSP_VALUE RtspValue[NVE_MAX_RTSP_VALUE]; ParseRTSPResponse(szCmd, RtspValue, NVE_MAX_RTSP_VALUE); FindRTSPValue(RtspValue, "max_video_ch", &m_uMaxCh, NVE_RTSP_VALUE_INT); for (ULONG i=0; iSetCheck(1); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPageArchiveData::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here if (m_pDlgPlay) { delete m_pDlgPlay; m_pDlgPlay = NULL; } } BEGIN_EVENTSINK_MAP(CPageArchiveData, CDialog) //{{AFX_EVENTSINK_MAP(CPageArchiveData) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() void CPageArchiveData::AddLog(LPSTR szMessage) { /*if(m_lstLog.GetSafeHwnd () != NULL) { if(m_lstLog.GetCount() > 100) m_lstLog.DeleteString(100); m_lstLog.InsertString(0, szMessage); }*/ m_pMsgMgr->PushErrorCodeF(szMessage); m_pMsgMgr->Show(TRUE); } void CPageArchiveData::ConnectionInfo(short nConnectionStatus) { // TODO: Add your control notification handler code here char szLogMessage[64]; ZeroMemory(szLogMessage, 64); if(nConnectionStatus == C_STATUS_MOVIE_CONNECT_GOOD) { sprintf(szLogMessage, "Movie connect ok"); } else if(nConnectionStatus == C_STATUS_MOVIE_CONNECT_FAIL) { sprintf(szLogMessage, "Movie connect fail"); } else if(nConnectionStatus == C_STATUS_MOVIE_CONNECT_CANCEL) { sprintf(szLogMessage, "Movie connect cancel"); } else if(nConnectionStatus == C_STATUS_MOVIE_DISCONNECT) { sprintf(szLogMessage, "Movie disconnect"); } else if(nConnectionStatus == C_STATUS_AUDIO_CONNECT_GOOD) sprintf(szLogMessage, "Audio connect ok"); else if(nConnectionStatus == C_STATUS_AUDIO_CONNECT_FAIL) sprintf(szLogMessage, "Audio connect fail"); else if(nConnectionStatus == C_STATUS_AUDIO_CONNECT_CANCEL) sprintf(szLogMessage, "Audio connect cancel"); else if(nConnectionStatus == C_STATUS_AUDIO_DISCONNECT) sprintf(szLogMessage, "Audio disconnect"); AddLog(szLogMessage); } void CPageArchiveData::ManageData(long nDataType, long nFirstParam, long FAR* pData, long nDataSize, long FAR* pHeaderData) { // TODO: Add your control notification handler code here if(nDataType == DATATYPE_CAMERADATA) { char szString1[64]; sprintf(szString1, " - [%ld] Status:%x",nDataSize,nFirstParam); AddLog(szString1); AddLog("Receive Camera information"); } else if(nDataType == DATATYPE_SWITCHDATA) { char szString[64]; sprintf(szString, " - [%ld] Status:%x",nDataSize,nFirstParam); AddLog(szString); AddLog("Receive DigitalI/O information"); } else if(nDataType == DATATYPE_DIRECTORY) { char szSearchDataPath[_MAX_PATH]; ZeroMemory(szSearchDataPath, _MAX_PATH); CopyMemory(szSearchDataPath, pData, nDataSize); AddLog("Receive Search Data"); CFile file; if(file.Open(szSearchDataPath, CFile::modeReadWrite|CFile::typeBinary)) { DWORD dwFileSize = file.GetLength(); WORD wStructSize = sizeof(DATEMAP_INFO); LPBYTE lpSearchData = new BYTE[dwFileSize]; int nDataCount = 0; nDataCount = dwFileSize/wStructSize; WORD wYear ; BYTE nMonth; BYTE nDay ; char szString[256]; char szchar[8]; DWORD dwTime; WORD wMovieChannel; WORD wAudioChannel; WORD nChannelBitValue; DATEMAP_INFO *pDataMapInfo; for(int i =0; i< nDataCount;i++) { file.Seek(wStructSize*i,CFile::begin); file.Read(lpSearchData,wStructSize); pDataMapInfo = (DATEMAP_INFO *)lpSearchData; { wYear = HIWORD(pDataMapInfo->dwDate); nMonth = (BYTE)GET_LW_HIBYTE(pDataMapInfo->dwDate); nDay = (BYTE)GET_LW_LOBYTE(pDataMapInfo->dwDate); dwTime = pDataMapInfo->dwTime; sprintf(szString,"%ld%02d%02d%02d", wYear, nMonth, nDay, dwTime); wMovieChannel = pDataMapInfo->wVideoChannel; wAudioChannel = pDataMapInfo->wVideoChannel; nChannelBitValue = 0; for(BYTE bi=0; bi<16; bi++) //channelNum { if(wMovieChannel & (0x01 << bi)) { sprintf(szchar, " CH%d" ,bi+1); strcat(szString, szchar); } } m_treeSearchData.InsertItem(szString,0,0); } } if(lpSearchData) delete lpSearchData; file.Close(); } } else if(nDataType == DATATYPE_MOVIEDATA || nDataType == DATATYPE_ARCHIVEDATA) { if(nFirstParam >= 16) return; if(pData == NULL) { m_uIndexDate = 0xFFFFFFFF; m_uIndexTime = 0xFFFFFFFF; return; } /*//### AGENT TYPE #### #define TYPE_SINGLE_MODE 0x00 // agent decoding and agent draw camera #define TYPE_APP_DRAW 0x01 // agent decoding and not draw, delivery app decoding data #define TYPE_APP_RAWDATA 0x02 // agent not decoding and not draw, delivery app raw data*/ if(m_pAgentCtrl->GetUserAgentType() == 1 && pHeaderData) { LPBITMAPINFOHEADER pbih = (LPBITMAPINFOHEADER)pHeaderData; CDC *theDC = GetDC(); int y_size = 0 ; int x_size = ((nFirstParam)%4)*160; y_size = (nFirstParam)/4*120; SetStretchBltMode(theDC->m_hDC,COLORONCOLOR); StretchDIBits(theDC->m_hDC, x_size,y_size, 160, 120, 0,0, pbih->biWidth , pbih->biHeight, pData, (LPBITMAPINFO)pbih, DIB_RGB_COLORS, SRCCOPY); ReleaseDC(theDC); } else if(m_pAgentCtrl->GetUserAgentType() == 2) { if(nDataType == DATATYPE_ARCHIVEDATA) { PREAD_DB_HEADER lpArchiveHeader; lpArchiveHeader = (PREAD_DB_HEADER)pData; int nStructSize = lpArchiveHeader->nHeaderSize; //int nChannelNum = lpArchiveHeader->info[0]; //aleady nFirstParam LPBITMAPINFOHEADER bih; bih = (LPBITMAPINFOHEADER)(pData+nStructSize); nStructSize += sizeof(BITMAPINFOHEADER); TRACE("Index Data ch[%d] time[%d:%d:%d:%d] size[%d] GOP[%d] \n", nFirstParam, GET_HOUR(lpArchiveHeader->dwTime), GET_MIN(lpArchiveHeader->dwTime), GET_SEC(lpArchiveHeader->dwTime), GET_HUND(lpArchiveHeader->dwTime), lpArchiveHeader->nDataSize, lpArchiveHeader->info[3]); /*BOOL bCodecOpen = TRUE; if(m_pTempDecodeCodec[nChannelNum]->IsReadyFor((LPBITMAPINFO)bih) == FALSE) bCodecOpen = m_pTempDecodeCodec[nChannelNum]->Open((LPBITMAPINFO)bih); if(bCodecOpen) { bCodecOpen = FALSE; if(m_pTempDecodeCodec[nChannelNum]->Decompress(pData+nStructSize,bih->biSizeImage)) bCodecOpen= TRUE; } */ } else if(nDataType == DATATYPE_MOVIEDATA) { LPBITMAPINFOHEADER bih; bih = (LPBITMAPINFOHEADER)(pData); /*BOOL bCodecOpen = TRUE; if(m_pTempDecodeCodec[nChannelNum]->IsReadyFor((LPBITMAPINFO)bih) == FALSE) bCodecOpen = m_pTempDecodeCodec[nChannelNum]->Open((LPBITMAPINFO)bih); if(bCodecOpen) { bCodecOpen = FALSE; if(m_pTempDecodeCodec[nChannelNum]->Decompress(pData+sizeof(BITMAPINFOHEADER),bih->biSizeImage)) bCodecOpen= TRUE; }*/ } } if(nDataType == DATATYPE_ARCHIVEDATA) { if(m_uIndexDate < 0xFFFFFFFF && m_uIndexTime < 0xFFFFFFFF) { //¿©±â¼­´Â next (¼ø¹æÇâ°Ë»ö)¸¸Çß´Ù. ¸¸¾à ¿ª¹æÇâÀ̰ųª ÇÑÀ常 ¾ò¾î¿Ã¶§´Â ¾Æ·¡ÀÇ ÇÔ¼ö¸¦ // ¼öÁ¤¶Ç´Â È£ÃâÇÏ¸é ¾È‰Â´Ù. m_pAgentCtrl->MethodRequestData(DATATYPE_ARCHIVEDATA, MAKELPARAM(0xFFFF, MAKEWORD(0x10, 0x02)), //0xffff : channel mask, 0x10 : request_type 0x03 : index_mode m_uIndexDate, m_uIndexTime); } } } } void CPageArchiveData::OnDblclkTreeSearchData(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here HTREEITEM hItem = m_treeSearchData.GetSelectedItem(); char strTemp[128],stryear[8],strmonth[8],strday[8],strhour[8]; int nyear,nmonth,nday,nhour; nyear=nmonth=nday=nhour=0; ZeroMemory(strTemp,128); ZeroMemory(stryear,8); ZeroMemory(strmonth,8); ZeroMemory(strday,8); ZeroMemory(strhour,8); sprintf(strTemp,"%s",m_treeSearchData.GetItemText(hItem)); strncpy(stryear,strTemp,4); strncpy(strmonth,strTemp+4,2); strncpy(strday,strTemp+6,2); strncpy(strhour,strTemp+8,2); nyear =atoi(stryear); nmonth =atoi(strmonth); nday =atoi(strday); nhour =atoi(strhour); Invalidate(); m_sldSpeed.EnableWindow(TRUE); m_uIndexDate = MAKELPARAM(MAKEWORD(nday, nmonth),nyear); m_uIndexTime = MAKELPARAM(0, MAKEWORD(0, nhour)); /* index mode #define DIR_MATCH 0x01 #define DIR_NEXT 0x02 #define DIR_PREV 0x04 #define DIR_HOME 0x08*/ /* request type #define DIR_MOVIE 0x10 #define DIR_AUDIO 0x20 #define DIR_EXTERNAL 0x40*/ m_pAgentCtrl->MethodRequestData(DATATYPE_ARCHIVEDATA, MAKELPARAM(0xFFFF, MAKEWORD(0x10, 0x03)), //0xffff : channel mask, 0x10 : request_type 0x03 : index_mode m_uIndexDate, m_uIndexTime); *pResult = 0; } void CPageArchiveData::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default CSliderCtrl* pSpeedControl = (CSliderCtrl*)pScrollBar; if(pSpeedControl->GetDlgCtrlID() == IDC_SLIDER_SPEED) { SetDlgItemInt(IDC_SLIDER_SPEED, pSpeedControl->GetPos()); m_uSpeedPos = pSpeedControl->GetPos(); } m_pAgentCtrl->MethodEnableSpeedControl((short)(100-m_uSpeedPos)); CDialog::OnHScroll(nSBCode, nPos, pScrollBar); } void CPageArchiveData::OnChkConnect() { // TODO: Add your control notification handler code here if(m_btnConnect.GetCheck()) { if (!m_bConnect) { char szIP[NVE_MAX_STR_LENGTH]; strcpy(szIP, &m_pConnection->GetServerAddr()[strlen("rtsp://")]); char *pToken = strstr(szIP, ":"); if (pToken) { pToken[0] = 0; } m_pAgentCtrl->SetHostIPAddress(szIP); m_pAgentCtrl->SetHostUserParam1(m_szID); m_pAgentCtrl->SetHostUserParam2(m_szPW); m_pAgentCtrl->SetHostPort(m_uPort); m_pAgentCtrl->MethodConnect(); m_bConnect = TRUE; SetDlgItemText(IDC_CHK_CONNECT, "Disconnect"); } } else { if (m_bConnect) { m_pAgentCtrl->MethodDisConnect(); m_bConnect = FALSE; //m_lstLog.ResetContent(); m_treeSearchData.DeleteAllItems(); SetDlgItemText(IDC_CHK_CONNECT, "Connect"); } } } void CPageArchiveData::OnBtnGetDir() { // TODO: Add your control notification handler code here m_pAgentCtrl->MethodRequestData(DATATYPE_DIRECTORY, 0, 0, 0); } void CPageArchiveData::OnBtnRecord() { // TODO: Add your control notification handler code here char szCmd[NVE_SHORT_EXT_CMD_LENGTH]; for (ULONG i=0; iGetCheck()) { continue; } _snprintf(szCmd, sizeof(szCmd), "/axis-cgi/admin/param.cgi?action=update&Image.I%d.SnapShot=yes", i); m_pNet5->Net5Command(NET5_NC_SEND_CGI_REQUEST, (ULONG*)szCmd, NULL, NULL, NULL); m_pNet5->Net5Command(NET5_NC_RECV_CGI_RESPONSE, (ULONG*)szCmd, NULL, NULL, NULL); } _snprintf(szCmd, sizeof(szCmd), "/enc-cgi/record/record.cgi?action=list&group=Record.UsbMount"); m_pNet5->Net5Command(NET5_NC_SEND_CGI_REQUEST, (ULONG*)szCmd, NULL, NULL, NULL); m_pNet5->Net5Command(NET5_NC_RECV_CGI_RESPONSE, (ULONG*)szCmd, NULL, NULL, NULL); char *pToken = strstr(szCmd, "UsbMount="); pToken += strlen("UsbMount="); if (strncmp(pToken, "yes", 3) != 0) { return; } _snprintf(szCmd, sizeof(szCmd), "/enc-cgi/record/record.cgi?action=update&group=Record.Enable=yes"); m_pNet5->Net5Command(NET5_NC_SEND_CGI_REQUEST, (ULONG*)szCmd, NULL, NULL, NULL); m_pNet5->Net5Command(NET5_NC_RECV_CGI_RESPONSE, (ULONG*)szCmd, NULL, NULL, NULL); for (i=0; iGetCheck()) { continue; } _snprintf(szCmd, sizeof(szCmd), "/enc-cgi/record/record.cgi?action=update&group=Record.R%d.Enable=yes", i); m_pNet5->Net5Command(NET5_NC_SEND_CGI_REQUEST, (ULONG*)szCmd, NULL, NULL, NULL); m_pNet5->Net5Command(NET5_NC_RECV_CGI_RESPONSE, (ULONG*)szCmd, NULL, NULL, NULL); } } void CPageArchiveData::OnBtnStop() { // TODO: Add your control notification handler code here char szCmd[NVE_SHORT_EXT_CMD_LENGTH]; for (ULONG i=0; iGetCheck()) { continue; } _snprintf(szCmd, sizeof(szCmd), "/enc-cgi/record/record.cgi?action=update&group=Record.R%d.Enable=no", i); m_pNet5->Net5Command(NET5_NC_SEND_CGI_REQUEST, (ULONG*)szCmd, NULL, NULL, NULL); m_pNet5->Net5Command(NET5_NC_RECV_CGI_RESPONSE, (ULONG*)szCmd, NULL, NULL, NULL); } } void CPageArchiveData::OnBtnDelete() { // TODO: Add your control notification handler code here char szCmd[NVE_SHORT_EXT_CMD_LENGTH]; _snprintf(szCmd, sizeof(szCmd), "/enc-cgi/record/record.cgi?action=update&group=Record.Storage.Delete"); m_pNet5->Net5Command(NET5_NC_SEND_CGI_REQUEST, (ULONG*)szCmd, NULL, NULL, NULL); m_pNet5->Net5Command(NET5_NC_RECV_CGI_RESPONSE, (ULONG*)szCmd, NULL, NULL, NULL); }