&ANALYZE-SUSPEND _VERSION-NUMBER UIB_v9r12 GUI &ANALYZE-RESUME &Scoped-define WINDOW-NAME C-Win &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS C-Win /*------------------------------------------------------------------------ File: Description: Input Parameters: Output Parameters: Author: Created: ------------------------------------------------------------------------*/ /* This .W file was created with the Progress AppBuilder. */ /*----------------------------------------------------------------------*/ /* Create an unnamed pool to store all the widgets created by this procedure. This is a good default which assures that this procedure's triggers and internal procedures will execute in this procedure's storage, and that proper cleanup will occur on deletion of the procedure. */ CREATE WIDGET-POOL. /* *************************** Definitions ************************** */ /* Parameters Definitions --- */ /* Local Variable Definitions --- */ &GLOBAL-DEFINE INFINITE -2147483648 &GLOBAL-DEFINE FILE_NOTIFY_CHANGE_FILE_NAME 1 &GLOBAL-DEFINE FILE_NOTIFY_CHANGE_DIR_NAME 2 &GLOBAL-DEFINE FILE_NOTIFY_CHANGE_ATTRIBUTES 4 &GLOBAL-DEFINE FILE_NOTIFY_CHANGE_SIZE 8 &GLOBAL-DEFINE FILE_NOTIFY_CHANGE_LAST_WRITE 16 &GLOBAL-DEFINE FILE_NOTIFY_CHANGE_LAST_ACCESS 32 &GLOBAL-DEFINE FILE_NOTIFY_CHANGE_CREATION 64 &GLOBAL-DEFINE FILE_NOTIFY_CHANGE_SECURITY 256 &GLOBAL-DEFINE WAIT_OBJECT_0 0 &GLOBAL-DEFINE WAIT_ABANDONED 144 &GLOBAL-DEFINE WAIT_IO_COMPLETION 192 &GLOBAL-DEFINE WAIT_TIMEOUT 258 &GLOBAL-DEFINE STATUS_PENDING 259 DEFINE VARIABLE TerminateFlag AS LOGICAL NO-UNDO. DEFINE VARIABLE hWatched AS INTEGER NO-UNDO. DEFINE VARIABLE PathName AS CHARACTER NO-UNDO INIT "C:\watch\in". DEFINE VARIABLE PathOut AS CHARACTER NO-UNDO INIT "C:\watch\out". DEFINE TEMP-TABLE TT_File NO-UNDO FIELD FileName AS CHARACTER FIELD FullPath AS CHARACTER FIELD CreateDate AS DATE FIELD CreateTime AS INTEGER FIELD ModDate AS DATE FIELD ModTime AS INTEGER. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK /* ******************** Preprocessor Definitions ******************** */ &Scoped-define PROCEDURE-TYPE Window &Scoped-define DB-AWARE no /* Name of first Frame and/or Browse and/or first Query */ &Scoped-define FRAME-NAME DEFAULT-FRAME /* Standard List Definitions */ &Scoped-Define ENABLED-OBJECTS b_BeginWatch b_Exit &Scoped-Define DISPLAYED-OBJECTS WatchAction AppHelp /* Custom List Definitions */ /* List-1,List-2,List-3,List-4,List-5,List-6 */ /* _UIB-PREPROCESSOR-BLOCK-END */ &ANALYZE-RESUME /* ************************ Function Prototypes ********************** */ &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD WatchChangeAction C-Win FUNCTION WatchChangeAction RETURNS LOGICAL ( INPUT pAction AS CHARACTER) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD WatchCreate C-Win FUNCTION WatchCreate RETURNS INTEGER ( INPUT pPath AS CHARACTER, INPUT pFlags AS INTEGER ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION-FORWARD WatchDelete C-Win FUNCTION WatchDelete RETURNS LOGICAL ( INPUT pWatched AS INTEGER ) FORWARD. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME /* *********************** Control Definitions ********************** */ /* Define the widget handle for the window */ DEFINE VAR C-Win AS WIDGET-HANDLE NO-UNDO. /* Definitions of the field level widgets */ DEFINE BUTTON b_BeginWatch LABEL "Begin Watch" SIZE 15 BY 1.14. DEFINE BUTTON b_Exit LABEL "Exit" SIZE 15 BY 1.14. DEFINE BUTTON b_StopWatch LABEL "Stop Watch" SIZE 15 BY 1.14. DEFINE VARIABLE AppHelp AS CHARACTER INITIAL "Press 'Begin Watch'" VIEW-AS EDITOR NO-BOX SIZE 30 BY 4 FGCOLOR 0 NO-UNDO. DEFINE VARIABLE WatchAction AS CHARACTER INITIAL "Not Watching Folder" VIEW-AS EDITOR NO-WORD-WRAP SCROLLBAR-HORIZONTAL SCROLLBAR-VERTICAL SIZE 40 BY 9.29 BGCOLOR 15 NO-UNDO. /* ************************ Frame Definitions *********************** */ DEFINE FRAME DEFAULT-FRAME WatchAction AT ROW 2.67 COL 4 NO-LABEL b_BeginWatch AT ROW 2.67 COL 61 b_StopWatch AT ROW 4.1 COL 61 AppHelp AT ROW 12.43 COL 5 NO-LABEL NO-TAB-STOP b_Exit AT ROW 13.86 COL 61 WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY SIDE-LABELS NO-UNDERLINE THREE-D AT COL 1 ROW 1 SIZE 80 BY 16. /* *********************** Procedure Settings ************************ */ &ANALYZE-SUSPEND _PROCEDURE-SETTINGS /* Settings for THIS-PROCEDURE Type: Window Allow: Basic,Browse,DB-Fields,Window,Query Other Settings: COMPILE */ &ANALYZE-RESUME _END-PROCEDURE-SETTINGS /* ************************* Create Window ************************** */ &ANALYZE-SUSPEND _CREATE-WINDOW IF SESSION:DISPLAY-TYPE = "GUI":U THEN CREATE WINDOW C-Win ASSIGN HIDDEN = YES TITLE = "Watched Folder Test" HEIGHT = 16 WIDTH = 80 MAX-HEIGHT = 16 MAX-WIDTH = 80 VIRTUAL-HEIGHT = 16 VIRTUAL-WIDTH = 80 CONTROL-BOX = no MIN-BUTTON = no MAX-BUTTON = no RESIZE = yes SCROLL-BARS = no STATUS-AREA = no BGCOLOR = ? FGCOLOR = ? KEEP-FRAME-Z-ORDER = yes THREE-D = yes MESSAGE-AREA = no SENSITIVE = yes. ELSE {&WINDOW-NAME} = CURRENT-WINDOW. /* END WINDOW DEFINITION */ &ANALYZE-RESUME /* *********** Runtime Attributes and AppBuilder Settings *********** */ &ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES /* SETTINGS FOR FRAME DEFAULT-FRAME */ /* SETTINGS FOR EDITOR AppHelp IN FRAME DEFAULT-FRAME NO-ENABLE */ ASSIGN AppHelp:RETURN-INSERTED IN FRAME DEFAULT-FRAME = TRUE AppHelp:READ-ONLY IN FRAME DEFAULT-FRAME = TRUE. /* SETTINGS FOR BUTTON b_StopWatch IN FRAME DEFAULT-FRAME NO-ENABLE */ /* SETTINGS FOR EDITOR WatchAction IN FRAME DEFAULT-FRAME NO-ENABLE */ IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win) THEN C-Win:HIDDEN = no. /* _RUN-TIME-ATTRIBUTES-END */ &ANALYZE-RESUME /* ************************ Control Triggers ************************ */ &Scoped-define SELF-NAME C-Win &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win ON END-ERROR OF C-Win /* Watched Folder Test */ OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO: MESSAGE "You must select the 'Exit' button to leave" VIEW-AS ALERT-BOX WARNING. RETURN NO-APPLY. END. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL C-Win C-Win ON WINDOW-CLOSE OF C-Win /* Watched Folder Test */ DO: RUN StopWatch. /* This event will close the window and terminate the procedure. */ APPLY "CLOSE":U TO THIS-PROCEDURE. END. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &Scoped-define SELF-NAME b_BeginWatch &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL b_BeginWatch C-Win ON CHOOSE OF b_BeginWatch IN FRAME DEFAULT-FRAME /* Begin Watch */ DO: ASSIGN SELF:SENSITIVE = FALSE. ENABLE b_StopWatch WITH FRAME {&FRAME-NAME}. RUN WatchFolder. END. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &Scoped-define SELF-NAME b_Exit &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL b_Exit C-Win ON CHOOSE OF b_Exit IN FRAME DEFAULT-FRAME /* Exit */ DO: STOP. END. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &Scoped-define SELF-NAME b_StopWatch &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL b_StopWatch C-Win ON CHOOSE OF b_StopWatch IN FRAME DEFAULT-FRAME /* Stop Watch */ DO: ASSIGN SELF:SENSITIVE = FALSE. RUN StopWatch. END. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &UNDEFINE SELF-NAME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK C-Win /* *************************** Main Block *************************** */ /* Set CURRENT-WINDOW: this will parent dialog-boxes and frames. */ ASSIGN CURRENT-WINDOW = {&WINDOW-NAME} THIS-PROCEDURE:CURRENT-WINDOW = {&WINDOW-NAME}. /* The CLOSE event can be used from inside or outside the procedure to */ /* terminate it. */ ON CLOSE OF THIS-PROCEDURE RUN disable_UI. /* Best default for GUI applications is... */ PAUSE 0 BEFORE-HIDE. /* Now enable the interface and wait for the exit condition. */ /* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */ MAIN-BLOCK: DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK: RUN enable_UI. WAIT-FOR CLOSE OF THIS-PROCEDURE. END. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME /* ********************** Internal Procedures *********************** */ &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI C-Win _DEFAULT-DISABLE PROCEDURE disable_UI : /*------------------------------------------------------------------------------ Purpose: DISABLE the User Interface Parameters: Notes: Here we clean-up the user-interface by deleting dynamic widgets we have created and/or hide frames. This procedure is usually called when we are ready to "clean-up" after running. ------------------------------------------------------------------------------*/ /* Delete the WINDOW we created */ IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(C-Win) THEN DELETE WIDGET C-Win. IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI C-Win _DEFAULT-ENABLE PROCEDURE enable_UI : /*------------------------------------------------------------------------------ Purpose: ENABLE the User Interface Parameters: Notes: Here we display/view/enable the widgets in the user-interface. In addition, OPEN all queries associated with each FRAME and BROWSE. These statements here are based on the "Other Settings" section of the widget Property Sheets. ------------------------------------------------------------------------------*/ DISPLAY WatchAction AppHelp WITH FRAME DEFAULT-FRAME IN WINDOW C-Win. ENABLE b_BeginWatch b_Exit WITH FRAME DEFAULT-FRAME IN WINDOW C-Win. {&OPEN-BROWSERS-IN-QUERY-DEFAULT-FRAME} VIEW C-Win. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE LoadDirectoryFiles C-Win PROCEDURE LoadDirectoryFiles : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ EMPTY TEMP-TABLE TT_File. INPUT FROM OS-DIR(PathName) NO-ECHO. REPEAT: CREATE TT_File. IMPORT TT_File.FileName TT_File.FullPath. END. INPUT CLOSE. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE ProcessFile C-Win PROCEDURE ProcessFile : /*------------------------------------------------------------------------------ Purpose: Perform an action against a file. Parameters: Notes: You have access to the TT_File buffer in this procedure so use the filename to perform some actions. ------------------------------------------------------------------------------*/ /* Copy Original File to OUT Directory */ OS-COPY VALUE(TT_File.FullPath) VALUE(PathOut + "\" + TT_File.FileName). /* Delete Original File */ OS-DELETE VALUE(TT_File.FullPath). /* Update the screen log to show that we processed the file */ WatchChangeAction ( WatchAction + CHR(13) + "Processed File: " + TT_File.FullPath). END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE ProcessFiles C-Win PROCEDURE ProcessFiles : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ FOR EACH TT_File: FILE-INFO:FILE-NAME = TT_File.FullPath. IF INDEX(FILE-INFO:FILE-TYPE,"F") > 0 THEN RUN ProcessFile. DELETE TT_File. END. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE StopWatch C-Win PROCEDURE StopWatch : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ WatchDelete(hWatched). hWatched = 0. WatchChangeAction("Watch Stopped"). ENABLE b_BeginWatch WITH FRAME {&FRAME-NAME}. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE WatchDirectory C-Win PROCEDURE WatchDirectory : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ DEFINE INPUT PARAMETER pWatched AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER pInterval AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER pStatus AS INTEGER NO-UNDO. DO WHILE TRUE: RUN WaitForSingleObject(pWatched, pInterval, OUTPUT pStatus). PROCESS EVENTS. IF pStatus = 0 OR TerminateFlag = TRUE THEN LEAVE. END. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE WatchFolder C-Win PROCEDURE WatchFolder : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ DEFINE VARIABLE WatchStatus AS INTEGER NO-UNDO. AppHelp = "Using Explorer move a file into the watched directory.". DISPLAY AppHelp WITH FRAME {&FRAME-NAME}. WatchChangeAction("Watching Path: " + PathName ). hWatched = WatchCreate(PathName, {&FILE_NOTIFY_CHANGE_ATTRIBUTES} + {&FILE_NOTIFY_CHANGE_FILE_NAME} + {&FILE_NOTIFY_CHANGE_LAST_WRITE} ). TerminateFlag = FALSE. RUN LoadDirectoryFiles. IF CAN-FIND(FIRST TT_File) THEN RUN ProcessFiles. RUN WatchDirectory(hWatched, 100,OUTPUT WatchStatus). IF WatchStatus = 0 THEN DO: RUN LoadDirectoryFiles. IF CAN-FIND(FIRST TT_File) THEN RUN ProcessFiles. /* now go into a second loop, this time calling the FindNextChangeNotification API, again exiting if watchStatus indicates the terminate flag was set */ DO WHILE TRUE: RUN WatchResume(hWatched, 100, OUTPUT WatchStatus). IF WatchStatus = -1 THEN DO: MESSAGE "Watching has been terminated for" PathName VIEW-AS ALERT-BOX. LEAVE. END. RUN LoadDirectoryFiles. IF CAN-FIND(FIRST TT_File) THEN RUN ProcessFiles. END. END. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE WatchResume C-Win PROCEDURE WatchResume : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ DEFINE INPUT PARAMETER pWatched AS INTEGER NO-UNDO. DEFINE INPUT PARAMETER pInterval AS INTEGER NO-UNDO. DEFINE OUTPUT PARAMETER pStatus AS INTEGER NO-UNDO. RUN FindNextChangeNotification(pWatched, OUTPUT pStatus). DO WHILE TRUE: RUN WaitForSingleObject(pWatched, pInterval, OUTPUT pStatus). PROCESS EVENTS. IF pStatus = 0 OR TerminateFlag = TRUE THEN LEAVE. END. END PROCEDURE. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE WinAPI C-Win PROCEDURE WinAPI : /*------------------------------------------------------------------------------ Purpose: Parameters: Notes: ------------------------------------------------------------------------------*/ END PROCEDURE. PROCEDURE FindFirstChangeNotificationA EXTERNAL "kernel32": DEFINE INPUT PARAMETER lpPathName AS CHARACTER. DEFINE INPUT PARAMETER bWatchSubTree AS LONG. DEFINE INPUT PARAMETER dwNotifyFilter AS LONG. DEFINE RETURN PARAMETER pOut AS LONG. END. PROCEDURE FindCloseChangeNotification EXTERNAL "kernel32": DEFINE INPUT PARAMETER hChangeHandle AS LONG. DEFINE RETURN PARAMETER pOut AS LONG. END. PROCEDURE FindNextChangeNotification EXTERNAL "kernel32": DEFINE INPUT PARAMETER hChangeHandle AS LONG. DEFINE RETURN PARAMETER pOut AS LONG. END. PROCEDURE WaitForSingleObject EXTERNAL "kernel32": DEFINE INPUT PARAMETER hHandle AS LONG. DEFINE INPUT PARAMETER dwMilliseconds AS LONG. DEFINE RETURN PARAMETER rOut AS LONG. END. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME /* ************************ Function Implementations ***************** */ &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION WatchChangeAction C-Win FUNCTION WatchChangeAction RETURNS LOGICAL ( INPUT pAction AS CHARACTER) : /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ ASSIGN WatchAction = pAction. DISPLAY WatchAction WITH FRAME {&FRAME-NAME}. RETURN TRUE. /* Function return value. */ END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION WatchCreate C-Win FUNCTION WatchCreate RETURNS INTEGER ( INPUT pPath AS CHARACTER, INPUT pFlags AS INTEGER ) : /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ DEFINE VARIABLE hOut AS INTEGER NO-UNDO. RUN FindFirstChangeNotificationA(pPath, 0, pFlags, OUTPUT hOut ). RETURN hOut. /* Function return value. */ END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME &ANALYZE-SUSPEND _UIB-CODE-BLOCK _FUNCTION WatchDelete C-Win FUNCTION WatchDelete RETURNS LOGICAL ( INPUT pWatched AS INTEGER ) : /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ DEFINE VARIABLE hStatus AS INTEGER NO-UNDO. TerminateFlag = TRUE. RUN FindCloseChangeNotification(pWatched, OUTPUT hStatus). RETURN TRUE. /* Function return value. */ END FUNCTION. /* _UIB-CODE-BLOCK-END */ &ANALYZE-RESUME