#if !defined(__DICSRV_H__) #define __DICSRV_H__ /* System Includes */ #include /* required for all Windows applications. */ #include /* Windows header for message cracker. */ #include #include #include #include #include #define CLIENTS_TIMER_ID 1 #define MOVE_TIMER_ID 2 /* Database Includes */ #include #include #include /* LEAD Includes */ #include "..\\..\\..\\include\\l_bitmap.h" /* LEADTOOLS main header file. */ #include "..\\..\\..\\include\\l_error.h" /* LEADTOOLS error definition header file. */ #include "..\\..\\..\\include\\ltdic.h" #include "resource.h" #define SERVER_SETTINGS_FILENAME "APISrv.ini" #define CLIENTS_LIST_FILENAME "APISvCln.ini" #define EVENTS_LOG_FILENAME "APISvLog.txt" #define DEFAULT_IMAGES_FOLDERNAME "APISvImg" #define DEFAULT_TEMP_FOLDERNAME "Temp" #define DEFAULT_LOGS_FOLDERNAME "Log" #define MDB_FILENAME "LeadDicm.mdb" #define SAMPLE_DICOM_IMAGES { "Image1.dic", \ "Image2.dic", \ "Image3.dic" } #define CA_CERT_NAME "CA.pem" #define SERVER_CERT_NAME "Server.pem" #define SERVER_AUTH_DATA "LEAD server ISCL" #define SERVER_AUTH_DATA_LEN 17 /* Macros */ #ifndef RECTWIDTH #define RECTWIDTH(lpRect) (((LPRECT) lpRect)->right -((LPRECT) lpRect)->left) #define RECTHEIGHT(lpRect) (((LPRECT) lpRect)->bottom -((LPRECT) lpRect)->top) #endif /* Structure Definitions */ typedef struct tagSRVADMINDATA { L_BOOL bEnableEdits; HWND hUserList; HWND hEventLog; L_CHAR szAETitle[20]; L_UINT lServerPort; L_INT lServerTimeOut; L_INT lMaxClients; HIMAGELIST hImageList; } SRVADMINDATA, * pSRVADMINDATA; typedef struct tagCLIENTDATA { HDICOMNET hClient; char szAETitle[20]; UINT uTimeout; UINT uSecondsElapsed; BOOL bEnableTimeout; } CLIENTDATA, * pCLIENTDATA; // Database structures typedef struct tagDBHANDLES { SQLHENV hEnv; SQLHDBC hDbc; } DBHANDLES, * pDBHANDLES; typedef struct tagPATIENTSRECORDSET { BOOL bEOF; // Must be the first member SQLHSTMT hStmt; // Must be the second member char szPatientID[256]; char szPatientName[64]; TIMESTAMP_STRUCT PatientBirthDate; TIMESTAMP_STRUCT PatientBirthTime; char szPatientSex[16]; char szEthnicGroup[64]; char szPatientComments[1024]; SQLINTEGER lPatientIDLenOrInd; SQLINTEGER lPatientNameLenOrInd; SQLINTEGER lPatientBirthDateInd; SQLINTEGER lPatientBirthTimeInd; SQLINTEGER lPatientSexLenOrInd; SQLINTEGER lEthnicGroupLenOrInd; SQLINTEGER lPatientCommentsLenOrInd; } PATIENTSRECORDSET, * pPATIENTSRECORDSET; typedef struct tagSTUDIESRECORDSET { BOOL bEOF; // Must be the first member SQLHSTMT hStmt; // Must be the second member char szStudyInstanceUID[256]; TIMESTAMP_STRUCT StudyDate; TIMESTAMP_STRUCT StudyTime; char szAccessionNumber[64]; char szStudyID[256]; char szPatientName[256]; char szPatientID[256]; char szStudyDescription[1024]; SQLINTEGER lStudyInstanceUIDLenOrInd; SQLINTEGER lStudyDateInd; SQLINTEGER lStudyTimeInd; SQLINTEGER lAccessionNumberLenOrInd; SQLINTEGER lStudyIDLenOrInd; SQLINTEGER lPatientNameLenOrInd; SQLINTEGER lPatientIDLenOrInd; SQLINTEGER lStudyDescriptionLenOrInd; } STUDIESRECORDSET, * pSTUDIESRECORDSET; typedef struct tagSERIESRECORDSET { BOOL bEOF; // Must be the first member SQLHSTMT hStmt; // Must be the second member char szSeriesInstanceUID[256]; char szStudyInstanceUID[256]; char szModality[64]; long lSeriesNumber; char szPatientID[256]; SQLINTEGER lSeriesInstanceUIDLenOrInd; SQLINTEGER lStudyInstanceUIDLenOrInd; SQLINTEGER lModalityLenOrInd; SQLINTEGER lSeriesNumberInd; SQLINTEGER lPatientIDLenOrInd; } SERIESRECORDSET, * pSERIESRECORDSET; typedef struct tagIMAGESRECORDSET { BOOL bEOF; // Must be the first member SQLHSTMT hStmt; // Must be the second member char szSOPInstanceUID[256]; char szSeriesInstanceUID[256]; char szStudyInstanceUID[256]; long lInstanceNumber; char szReferencedFile[1024]; char szPatientID[256]; char szSOPClassUID[256]; char szTransferSyntaxUID[256]; SQLINTEGER lSOPInstanceUIDLenOrInd; SQLINTEGER lSeriesInstanceUIDLenOrInd; SQLINTEGER lStudyInstanceUIDLenOrInd; SQLINTEGER lInstanceNumberInd; SQLINTEGER lReferencedFileLenOrInd; SQLINTEGER lPatientIDLenOrInd; SQLINTEGER lSOPClassUIDLenOrInd; SQLINTEGER lTransferSyntaxUIDLenOrInd; } IMAGESRECORDSET, * pIMAGESRECORDSET; /* Functions */ // DicSrv.c BOOL CALLBACK ConfigDlgProc(HWND hDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam); BOOL CALLBACK LogOptsDlgProc(HWND hDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam); BOOL CALLBACK ServerDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID OnServerAdmin(HWND hDlg); VOID OnSelchangedTree1(HWND hDlg, NMHDR* pNMHDR); VOID OnDblclkTree1(HWND hDlg, NMHDR* pNMHDR); VOID OnDelete(HWND hDlg); VOID OnImport(HWND hDlg); VOID OnServerConnections(HWND hDlg); VOID OnServerLoggingOptions(HWND hDlg); VOID OnCloseClient(HWND hDlg); VOID OnTimer(HWND hDlg, UINT nIDEvent); // Util.c VOID MatchAspectRatio (LPRECT pRect, L_INT nImageWidth, L_INT nImageHeight); VOID RemoveUnsupportedUIDs(); VOID LogEvent(HWND hDlg, L_CHAR L_FAR* pszUser, L_CHAR L_FAR *pszEvent); VOID SetElement(HDICOMDS hDataSet, pDICOMELEMENT pSiblingElement, L_UINT32 uTag, L_UINT16 uVR, L_CHAR* pszValue); VOID SetDateTimeElement(HDICOMDS hDataSet, pDICOMELEMENT pSiblingElement, TIMESTAMP_STRUCT* pTS, L_UINT32 uTag, BOOL bDateValue); BOOL FindClient(HWND hDlg, LPCSTR pszIPAddress, LPCSTR pszAETitle, int* piUserListIndex); VOID SetClientInfo(HWND hDlg, HDICOMNET hClient, LPCSTR pszIPAddress, LPCSTR pszAETitle); BOOL GetClientInfo(HWND hDlg, HDICOMNET hClient, LPSTR pszAETitle); VOID EnableClientTimeout(HWND hDlg, HDICOMNET hClient, BOOL bEnable); BOOL SaveDataSet(HDICOMNET hClient, HDICOMDS hDataSet, LPSTR pszFilename); VOID SaveSet(HDICOMDS hSet, BOOL bDataSet, BOOL bReceived, LPSTR pszResultFile); VOID LastClientAction(HWND hDlg, HDICOMNET hClient, L_CHAR L_FAR *pszAction, L_BOOL bMessage); INT CopyElement(HWND hDlg, HDICOMDS hTargetDS, pDICOMELEMENT pDestElement, HDICOMDS hSourceDS, L_UINT32 lTag, BOOL bValueRequired); BOOL GetFolder(HWND hWndOwner, LPTSTR pszSelectedFolder, L_INT nSize,LPTSTR pszTitle); VOID Trim(LPSTR pszString); BOOL PrepareFolder(LPSTR pszFolder, LPCSTR pszAlternativeName); VOID EmptyDatabase(); BOOL GetFile(LPCTSTR pszFilter, LPCTSTR pszTitle, LPSTR pszFile, DWORD dwSize); BOOL PrepareDatabase(LPSTR pszMdbFolder); L_INT GetServerPrivateKeyPassword(HWND hWndParent); L_VOID GetCertName(char *pszFileName, char pszCACertName[]); BOOL GetTreeViewItemData(HWND hTreeCtrl, HTREEITEM hItem, DWORD* pdwItemData); // Display.c L_VOID PaintBitmap(HDC hDC, LPRECT pDest, pBITMAPHANDLE pBitmap); L_VOID DrawImageBtn(HWND hDlg, LPDRAWITEMSTRUCT pds); L_VOID DisplayDICOMDir(HWND hDlg); L_VOID DisplayDirDS(HWND hDlg, pDICOMELEMENT pElement, HTREEITEM hParent, L_BOOL bChild); HTREEITEM DisplayDSKey(HWND hDlg, pDICOMELEMENT pKey, HTREEITEM hParent, L_BOOL bChild); L_VOID DisplayKey(HWND hDlg, pDICOMELEMENT pElement, HTREEITEM hParent); L_VOID DisplayImageData(HWND hDlg, L_CHAR L_FAR* pszFile); L_VOID DisplayAssociate(HWND hDlg, HDICOMNET hClient, HDICOMPDU hPDU); // SrvInit.c BOOL LoadServerSettings(); VOID InitDialog(HWND hDlg); VOID LoadClientsList(HWND hDlg); VOID LoadEventsLog(HWND hDlg); VOID InitServerDS(HWND hDlg); // SrvSave.c BOOL SaveServerSettings(); BOOL Unload(HWND hDlg); BOOL SaveClientsList(HWND hDlg); BOOL SaveEventsLog(HWND hDlg); // Admin.c BOOL CALLBACK AdminDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK UserPropDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID InitAdminDlg(HWND hDlg, pSRVADMINDATA pData); L_BOOL UpdateData(HWND hDlg, pSRVADMINDATA pData); VOID ClearEventsLog(HWND hDlg, HWND hEventsListCtrl); // DBUtil.c BOOL OpenDatabaseConnection(pDBHANDLES pDBHandles); VOID CloseDatabaseConnection(pDBHANDLES pDBHandles); BOOL OpenPatientsRecordset(SQLHDBC hDbc, pPATIENTSRECORDSET pPatientsRS, LPSTR pszQueryString, BOOL bReadForwardOnly); BOOL OpenStudiesRecordset(SQLHDBC hDbc, pSTUDIESRECORDSET pStudiesRS, LPSTR pszQueryString, BOOL bReadForwardOnly); BOOL OpenSeriesRecordset(SQLHDBC hDbc, pSERIESRECORDSET pSeriesRS, LPSTR pszQueryString, BOOL bReadForwardOnly); BOOL OpenImagesRecordset(SQLHDBC hDbc, pIMAGESRECORDSET pImagesRS, LPSTR pszQueryString, BOOL bReadForwardOnly); VOID CloseRecordset(PVOID pRecordset); BOOL GetNextRecord(PVOID pRecordset); BOOL GetFirstRecord(PVOID pRecordset); BOOL AddNewRecord(PVOID pRecordset); BOOL DeleteRecord(PVOID pRecordset); VOID WrapUpDatabase(pDBHANDLES pDBHandles, PVOID pRS1, PVOID pRS2, PVOID pRS3, PVOID pRS4); BOOL DeletePatient(HWND hDlg, L_CHAR* pszPatientID); BOOL DeleteStudy(HWND hDlg, pDBHANDLES pDb, pSTUDIESRECORDSET pStudiesRS, L_CHAR* pszStudyInstanceUID); BOOL DeleteSeries(HWND hDlg, pDBHANDLES pDb, pSERIESRECORDSET pSeriesRS, L_CHAR* pszStudyInstanceUID, L_CHAR* pszSeriesInstanceUID); BOOL DeleteImage(HWND hDlg, pDBHANDLES pDb, pIMAGESRECORDSET pImagesRS, L_CHAR* pszStudyInstanceUID, L_CHAR* pszSeriesInstanceUID, L_CHAR* pszSOPInstanceUID); int InsertDataSet(HWND hDlg, HDICOMDS hSourceDS, L_CHAR* pszFile); VOID FindPatients(HWND hDlg, HDICOMNET hClient, HDICOMDS hReqIdentifier, L_UCHAR nPresentationID, L_UINT16 uMessageID, L_CHAR* pszClass, LPSTR pszUser); VOID FindStudies(HWND hDlg, HDICOMNET hClient, HDICOMDS hReqIdentifier, L_UCHAR nPresentationID, L_UINT16 uMessageID, L_CHAR* pszClass, LPSTR pszUser, BOOL bPatientRoot); VOID FindSeries(HWND hDlg, HDICOMNET hClient, HDICOMDS hReqIdentifier, L_UCHAR nPresentationID, L_UINT16 uMessageID, L_CHAR* pszClass, LPSTR pszUser, BOOL bPatientRoot); VOID FindImages(HWND hDlg, HDICOMNET hClient, HDICOMDS hReqIdentifier, L_UCHAR nPresentationID, L_UINT16 uMessageID, L_CHAR* pszClass, LPSTR pszUser, BOOL bPatientRoot); VOID MoveImages(HWND hDlg, HDICOMDS hReqIdentifier, LPSTR pszMoveDstIP, L_UINT uMoveDstPort, int iQRLevel, BOOL bPatientRoot, LPSTR pszUser); // Net.c L_VOID SetServerCallbacks(HWND hDlg); L_VOID SetClientCallbacks(HWND hDlg, HDICOMNET hClient); L_VOID LoadDefaultSettings(); L_BOOL LoadFromFileSettings(); L_BOOL SendMatchedInstance(HWND hDlg, HDICOMNET hNet, LPSTR pszFailedSOPInstanceUID); L_BOOL ChangeTransferSyntax(HDICOMDS hDataSet, LPCSTR pszDataSetTS, LPCSTR pszAssociatedTS); L_CHAR *GetTLSErrorString(L_INT nError); // Server L_VOID L_EXPORT EXT_CALLBACK AcceptCallback(HDICOMNET hNet, L_INT nError, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK CloseCallback(HDICOMNET hNet, L_INT nError, HDICOMNET hPeer, L_VOID *pUserData); // Client L_VOID L_EXPORT EXT_CALLBACK ConnectCallback(HDICOMNET hNet, L_INT nError, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveCallback(HDICOMNET hNet, L_INT nError, L_UCHAR nType, L_CHAR *pBuffer, L_UINT32 nBytes, L_VOID *UserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveDataCallback(HDICOMNET hNet, L_UCHAR nPresentationID, HDICOMDS hCS, HDICOMDS hDS, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveAssociateRequestCallback(HDICOMNET hNet, HDICOMPDU hPDU, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveReleaseRequestCallback(HDICOMNET hNet, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveAbortCallback(HDICOMNET hNet, L_UCHAR nSource, L_UCHAR nReason, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK CloseClientCallback(HDICOMNET hNet, L_INT nError, HDICOMNET hPeer, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveReleaseResponseCallback(HDICOMNET hNet, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveAssociateAcceptCallback(HDICOMNET hNet, HDICOMPDU hPDU, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveAssociateRejectCallback(HDICOMNET hNet, L_UCHAR nResult, L_UCHAR nSource, L_UCHAR nReason, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveCEchoRequestCallback(HDICOMNET hNet, L_UCHAR nPresentationID, L_UINT16 nMessageID, L_CHAR L_FAR *pszClass, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveUnknownCallback(HDICOMNET hNet, L_UCHAR nPresentationID, HDICOMDS hCS, HDICOMDS hDS, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveCStoreRequestCallback(HDICOMNET hNet, L_UCHAR nPresentationID, L_UINT16 nMessageID, L_CHAR * pszClass, L_CHAR * pszInstance, L_UINT16 nPriority, L_CHAR L_FAR *pszMoveAE, L_UINT16 nMoveMessageID, HDICOMDS hDS, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveCStoreResponseCallback(HDICOMNET hNet, L_UCHAR nPresentationID, L_UINT16 nMessageID, L_CHAR L_FAR *pszClass, L_CHAR L_FAR *pszInstance, L_UINT16 nStatus, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveCStoreRequestCallback(HDICOMNET hNet, L_UCHAR nPresentationID, L_UINT16 nMessageID, L_CHAR * pszClass, L_CHAR * pszInstance, L_UINT16 nPriority, L_CHAR L_FAR *pszMoveAE, L_UINT16 nMoveMessageID, HDICOMDS hDS, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveCFindRequestCallback(HDICOMNET hNet, L_UCHAR nPresentationID, L_UINT16 nMessageID, L_CHAR L_FAR *pszClass, L_UINT16 nPriority, HDICOMDS hDS, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK ReceiveCMoveRequestCallback(HDICOMNET hNet, L_UCHAR nPresentationID, L_UINT16 nMessageID, L_CHAR L_FAR *pszClass, L_UINT16 nPriority, L_CHAR L_FAR *pszMoveAE, HDICOMDS hDS, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK exOnSecureLinkReady(HDICOMNET hNet, L_UINT32 nError, L_VOID *pUserData); L_UINT32 L_EXPORT EXT_CALLBACK exGetChallengeISCL(HDICOMNET hNet, L_UINT64 *nChallenge, L_UINT64 nParameter, L_VOID *pUserData); L_UINT32 L_EXPORT EXT_CALLBACK exInternalAuthenticateISCL(HDICOMNET hNet, L_UINT64 nChallenge, L_UINT64 *nResponse, L_UINT64 nParameter, L_VOID *pUserData); L_UINT32 L_EXPORT EXT_CALLBACK exExternalAuthenticateISCL(HDICOMNET hNet, L_UINT64 nChallenge, L_UINT64 nResponse, L_UINT64 nParameter, L_VOID *pUserData); L_VOID L_EXPORT EXT_CALLBACK exOnReceivedISCLPacket(HDICOMNET hNet, L_INT nError, L_CHAR *pBuffer, L_UINT32 nBytes, L_VOID *pUserData); /* Global Data */ HINSTANCE ghInstance; char gszApplicationFolder[MAX_PATH]; char gszConnectionString[MAX_PATH + 64]; char gszImagesFolder[MAX_PATH]; char gszTempFilesFolder[MAX_PATH]; char gszServerAETitle[20]; UINT guServerPort; int giTimeOut; int giMaxClients; BOOL gbGenerateEventsLogFile; BOOL gbSaveReceivedCSs; BOOL gbSaveReceivedDSs; BOOL gbSaveSentDSs; char gszLogFolder[MAX_PATH]; BOOL gbSaveServerSettings; char gszLastLoggedDSFileName[MAX_PATH]; BOOL gbValidPrivateKeyPassword; char gszPrivateKeyPassword[1024]; HWND ghWndParent; L_BOOL gbImport; HIMAGELIST ghImageList; BITMAPHANDLE gBitmap; pDICOMELEMENT gpDisplay; HDICOMNET ghServer; HDICOMDS ghServerDS; L_UINT32 gSecureMode; L_UINT64 gISCLAuthKeys[8]; L_UINT gISCLAuthCurrentKey; L_UINT32 gISCLAuthAlg; L_UINT64 gISCLEncKeys[8]; L_UINT gISCLEncCurrentKey; L_UINT32 gISCLEncAlg; L_UINT32 gISCLEncSign; L_UINT32 gSecureMode; L_UINT64 gKey; // For handling C-MOVE requests typedef struct tagMOVEMATCHES { char szSOPClassUID[UID_MAX_SIZE + 1]; char szTransferSyntaxUID[UID_MAX_SIZE + 1]; char szReferencedFile[MAX_PATH]; } MOVEMATCHES, * pMOVEMATCHES; HDICOMNET ghClient; HDICOMNET ghMoveNet; HDICOMPDU ghMovePDU; char gszMoveDstAE[20]; pMOVEMATCHES gpMoveMatches; int gnMatchesCount; int gnMatchIndex; L_UCHAR gnMovePresentationID; L_UINT16 guMoveMessageID; L_UINT16 guStoreMessageID; L_CHAR gszMoveClass[UID_MAX_SIZE + 1]; int gnSecondsElapsed; int gnSuccessfulSubOperations; int gnFailedSubOperations; int gnWarningSubOperations; #endif // #if !defined(__DICSRV_H__)