/*[]=====================================================================[]*/ /*[] LeadTools Run Time Library - Version 11 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2000 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[] []*/ /*[] store.c []*/ /*[]=====================================================================[]*/ #include "store.h" #include "process.h" #include L_VOID CleanOpenDlgParam(LPOPENDLGPARAMS pFOParam) { int i=0; if(pFOParam!=NULL && pFOParam->pFileData!= NULL ) { for(i=0; i < pFOParam->nNumOfFiles; ++i ) { if(pFOParam->pFileData[i].pBitmap != NULL) { L_FreeBitmap(pFOParam->pFileData[i].pBitmap); GlobalFreePtr(pFOParam->pFileData[i].pBitmap); } if(pFOParam->pFileData[i].pThumbnail != NULL) { L_FreeBitmap(pFOParam->pFileData[i].pThumbnail); GlobalFreePtr(pFOParam->pFileData[i].pThumbnail); } if(pFOParam->pFileData[i].pFileInfo != NULL) { GlobalFreePtr(pFOParam->pFileData[i].pFileInfo); } } GlobalFreePtr(pFOParam->pFileData); pFOParam->pFileData =NULL; pFOParam->nNumOfFiles = 0; } } L_INT OpenFileDialog(HWND hWnd,L_CHAR *szString) { OPENFILENAME OpenFileName; L_CHAR szFile[MAX_PATH] = ""; L_TCHAR szFilter[] = {TEXT("DICOM\0*.DIC\0ALL\0*.*\0\0")}; memset(&OpenFileName, 0, sizeof(OPENFILENAME)); OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.lpstrFile = szFile; OpenFileName.nMaxFile = sizeof(szFile); OpenFileName.lpstrFilter = szFilter; OpenFileName.nFilterIndex = 1; OpenFileName.lpstrTitle = "Open DICOM File"; OpenFileName.Flags = OFN_FILEMUSTEXIST; OpenFileName.hwndOwner = hWnd; if(GetOpenFileName(&OpenFileName)) { strcpy(szString,OpenFileName.lpstrFile); return SUCCESS; } return FAILURE; } //function OpenFileDialog L_BOOL ChangeTransferSyntax(HDICOMDS hDS, L_UCHAR nPresentationID) { pDICOMELEMENT pElement; L_CHAR szMessage[MAX_STRING_LEN], * pszDataSetTS, * pszAssociatedTS; // Get the Transfer Syntax used to encode the Data Set pszDataSetTS = NULL; pElement = L_DicomFindFirstElement(hDS, NULL, TAG_TRANSFER_SYNTAX_UID, FALSE); if (pElement) { pszDataSetTS = L_DicomGetStringValue(hDS, pElement, 0, 1); L_DicomFreeValue(hDS, pElement); } if (pszDataSetTS == NULL) { pszDataSetTS = UID_IMPLICIT_VR_LITTLE_ENDIAN; } // Get the associated Transfer Syntax pszAssociatedTS = L_DicomGetTransfer(hAssociateAccept, nPresentationID, 0); // No need to change the Transfer Syntax if they are the same. if (lstrcmp(pszDataSetTS, pszAssociatedTS) == 0) { return TRUE; } // Also, no need to change the Transfer Syntax explicitly if both belong to this group // of Transfer Syntaxes. if (lstrcmp(UID_IMPLICIT_VR_LITTLE_ENDIAN, pszAssociatedTS) == 0 || lstrcmp(UID_EXPLICIT_VR_LITTLE_ENDIAN, pszAssociatedTS) == 0 || lstrcmp(UID_EXPLICIT_VR_BIG_ENDIAN, pszAssociatedTS) == 0) { if (lstrcmp(UID_IMPLICIT_VR_LITTLE_ENDIAN, pszDataSetTS) == 0 || lstrcmp(UID_EXPLICIT_VR_LITTLE_ENDIAN, pszDataSetTS) == 0 || lstrcmp(UID_EXPLICIT_VR_BIG_ENDIAN, pszDataSetTS) == 0) { return TRUE; } } /* We need to change the Transfer Syntax of the Data Set */ wsprintf(szMessage, "Sorry, the Transfer Syntax (%s) used to encode the Data Set doesn't match " \ "the associated Transfer Syntax (%s) for the Abstract Syntax (%s) of the " \ "Presentation ID (%u).\n\nIn order to store the image using the current " \ "association, LEADTOOLS must change the Transfer Syntax of the Data Set. " \ "Press Yes if you would like to continue.", pszDataSetTS, pszAssociatedTS, L_DicomGetAbstract(hAssociateAccept, nPresentationID), nPresentationID); if (MessageBox(hWndMainGlobal, szMessage, "Demo", MB_YESNO) != IDYES) { return FALSE; } if (L_DicomChangeTransferSyntax(hDS, pszAssociatedTS, 2, 0) != DICOM_SUCCESS) { MessageBox(hWndMainGlobal, "Failed to change the Transfer Syntax.", "Demo", MB_OK | MB_ICONERROR); return FALSE; } // Has the image undergone a lossy compression? if (lstrcmp(UID_JPEG_BASELINE_1, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_EXTENDED_2_4, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_EXTENDED_3_5, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_SPECTRAL_NONHIER_6_8, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_SPECTRAL_NONHIER_7_9, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_FULL_NONHIER_10_12, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_FULL_NONHIER_11_13, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_EXTENDED_HIER_16_18, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_EXTENDED_HIER_17_19, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_SPECTRAL_HIER_20_22, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_SPECTRAL_HIER_21_23, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_FULL_HIER_24_26, pszDataSetTS) == 0 || lstrcmp(UID_JPEG_FULL_HIER_25_27, pszDataSetTS) == 0) { pElement = L_DicomFindFirstElement(hDS, NULL, TAG_LOSSY_IMAGE_COMPRESSION, FALSE); if (pElement == NULL) { pElement = L_DicomInsertElement(hDS, NULL, FALSE, TAG_LOSSY_IMAGE_COMPRESSION, VR_CS, FALSE, 0); } if (pElement) { L_DicomSetStringValue(hDS, pElement, "01", 1); } } return TRUE; } L_VOID CStoreRequest(HWND hWnd) { L_INT nResult; pDICOMELEMENT pElement; L_CHAR szFileName[_MAX_PATH]; L_CHAR *lpszClass=NULL; L_CHAR *lpszInstance=NULL; HDICOMDS hDSLocal; L_CHAR szMsg[MAX_STRING_LEN]; L_CHAR szTmp[MAX_STRING_LEN]; L_UCHAR nPresentationID; L_CHAR *szFakeInstance = "998.998.1.19950214.94000.1.102"; L_CHAR* pszTemp; if (OpenFileDialog(hWnd, szFileName)!=SUCCESS) return; hDSLocal = L_DicomCreateDS(szTempFilesFolder); wsprintf(szMsg, "C-STORE-RQ\n"); nResult = L_DicomLoadDS(hDSLocal, szFileName, 0); if (nResult != DICOM_SUCCESS) { wsprintf(szTmp, "Load Failed[%d]", nResult); lstrcat(szMsg, szTmp); LogMessage(MSG_ERROR, szMsg); L_DicomFreeDS(hDSLocal); return; } pElement = L_DicomFindFirstElement(hDSLocal, NULL, TAG_MEDIA_STORAGE_SOP_CLASS_UID, TRUE); if (pElement != NULL) lpszClass = L_DicomGetStringValue(hDSLocal, pElement, 0, 1); if (lpszClass == NULL) { pElement = L_DicomFindFirstElement(hDSLocal, NULL, TAG_SOP_CLASS_UID, TRUE); if (pElement != NULL) { lpszClass = L_DicomGetStringValue(hDSLocal, pElement, 0, 1); } } pElement = L_DicomFindFirstElement(hDSLocal, NULL, TAG_SOP_INSTANCE_UID, TRUE); if (pElement != NULL) lpszInstance = L_DicomGetStringValue(hDSLocal, pElement, 0, 1); nPresentationID = L_DicomFindAbstract(hAssociateAccept, lpszClass); if ( (nPresentationID == 0) || (L_DicomGetResult(hAssociateAccept, nPresentationID) != PDU_ACCEPT_RESULT_SUCCESS) ) { wsprintf(szTmp, "Presentation Not Found: Media Storage SOP Class UID"); lstrcat(szMsg, szTmp); LogMessage(MSG_ERROR, szMsg); L_DicomFreeDS(hDSLocal); return; } if (lpszClass) { pszTemp = (L_CHAR*) malloc(lstrlen(lpszClass) + 1); if (pszTemp) lstrcpy(pszTemp, lpszClass); lpszClass = pszTemp; } if (lpszInstance) { pszTemp = (L_CHAR*) malloc(lstrlen(lpszInstance) + 1); if (pszTemp) lstrcpy(pszTemp, lpszInstance); lpszInstance = pszTemp; } if (!ChangeTransferSyntax(hDSLocal, nPresentationID)) { L_DicomFreeDS(hDSLocal); if (lpszClass) free(lpszClass); if (lpszInstance) free(lpszInstance); return; } StartProcess(PROCESS_C_STORE, nPresentationID); switch (uSecureMode) { case DICOM_SECURE_NONE: nResult = L_DicomSendCStoreRequest ( hNetGlobal, nPresentationID, uUniqueMessageID++, lpszClass, (lpszInstance != NULL) ? lpszInstance : szFakeInstance, COMMAND_PRIORITY_MEDIUM, L_DicomGetCalled(hAssociateAccept), 0, hDSLocal ); break; case DICOM_SECURE_ISCL: nResult = L_DicomSendCStoreRequest ( hNetGlobalISCL, nPresentationID, uUniqueMessageID++, lpszClass, (lpszInstance != NULL) ? lpszInstance : szFakeInstance, COMMAND_PRIORITY_MEDIUM, L_DicomGetCalled(hAssociateAccept), 0, hDSLocal ); break; case DICOM_SECURE_TLS: nResult = L_DicomSendCStoreRequest ( hNetGlobalTLS, nPresentationID, uUniqueMessageID++, lpszClass, (lpszInstance != NULL) ? lpszInstance : szFakeInstance, COMMAND_PRIORITY_MEDIUM, L_DicomGetCalled(hAssociateAccept), 0, hDSLocal ); break; } if (lpszClass) free(lpszClass); if (lpszInstance) free(lpszInstance); wsprintf(szTmp, "nResult[%d]", nResult); lstrcat(szMsg, szTmp); LogMessage(MSG_SEND, szMsg); if (nResult != DICOM_SUCCESS) FinishProcess(PROCESS_C_STORE); L_DicomFreeDS(hDSLocal); }