void FDirectoryWatchRequestLinux::ProcessPendingNotifications() { ProcessChanges(); // Trigger all listening delegates with the files that have changed if (FileChanges.Num() > 0) { for (int32 DelegateIdx = 0; DelegateIdx < Delegates.Num(); ++DelegateIdx) { Delegates[DelegateIdx].Execute(FileChanges); } FileChanges.Empty(); } }
void trpgPageManageTester::RandomTest(int num,int seed) { if (!manager || !archive || !printBuf) throw 1; // Seed the random number generator so we can replicate runs if (seed != -1) srand(seed); // Need the extents trpg2dPoint ll,ur,lod0Size; const trpgHeader *head = archive->GetHeader(); head->GetExtents(ll,ur); head->GetTileSize(0,lod0Size); // Give ourselves some space around the extents ll.x -= lod0Size.x/2.0; ll.y -= lod0Size.y/2.0; ur.x += lod0Size.x/2.0; ur.y += lod0Size.y/2.0; // Jump around int i; char line[1024]; for (i=0;i<num;i++) { // Generate a point double randNum1 = rand()/(double)RAND_MAX; double randNum2 = rand()/(double)RAND_MAX; trpg2dPoint pt; pt.x = (ur.x - ll.x)*randNum1; pt.y = (ur.y - ll.y)*randNum2; // Jump to the point bool changes = manager->SetLocation(pt); sprintf(line,"Jumped to (%f,%f). Tiles to load/unload = %s",pt.x,pt.y, (changes ? "yes" : "no")); printBuf->prnLine(line); // Process the results ProcessChanges(); } // Ask the page manager for its final status manager->Print(*printBuf); manager->Stop(); }
void trpgPageManageTester::Fly_LL_to_UR(double dist) { char line[1024]; if (!manager || !archive || !printBuf) throw 1; // Need the extents trpg2dPoint ll,ur,lod0Size; const trpgHeader *head = archive->GetHeader(); head->GetExtents(ll,ur); head->GetTileSize(0,lod0Size); // Give ourselves some space around the extents ll.x -= lod0Size.x/2.0; ll.y -= lod0Size.y/2.0; ur.x += lod0Size.x/2.0; ur.y += lod0Size.y/2.0; // Fly the path trpg2dPoint loc; loc = ll; do { loc.x += dist; loc.y += dist; // Jump to next point bool changes = manager->SetLocation(loc); sprintf(line,"Moved to (%f,%f). Tiles to load/unload = %s",loc.x,loc.y, (changes ? "yes" : "no")); printBuf->prnLine(line); // Process new location ProcessChanges(); } while (loc.x < ur.x && loc.y < ur.y); // Ask the page manager for its final status manager->Print(*printBuf); manager->Stop(); }
DWORD WINAPI FileWatchWorker(LPVOID param){ DWORD dwWaitStatus; HANDLE dwChangeHandle; FileWatchController* controller = (FileWatchController *)param; LPCWSTR lpDir = controller->directory; // Watch the directory for file creation and deletion. dwChangeHandle = FindFirstChangeNotification(lpDir, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE ); wchar_t watchedDir[MAX_PATH]; memset(watchedDir, 0, MAX_PATH); wcscpy_s(watchedDir, MAX_PATH, controller->directory); // Make a final validation check on our handles. if ((dwChangeHandle == NULL)) { PostMessage(attachmentsHwnd, WM_FILE_WATCH_FAILED, 0, 0); } // Change notification is set. Now wait on both notification // handles and refresh accordingly. while (!controller->exit) { // Wait for notification. dwWaitStatus = WaitForSingleObject(dwChangeHandle, 100); switch (dwWaitStatus) { case WAIT_OBJECT_0: // A file was created, renamed, or deleted in the directory. // Refresh this directory and restart the notification. if ( controller->pause == FALSE ){ ProcessChanges(watchedDir); } if ( FindNextChangeNotification(dwChangeHandle) == FALSE ) { } break; case WAIT_TIMEOUT: /* See if the controller wants me to switch to watching a different directory * This corresponds to the user accessing a different document */ if ( wcscmp(controller->directory, watchedDir) != 0 ){ memset(watchedDir, 0, MAX_PATH); wcscpy_s(watchedDir, MAX_PATH, controller->directory); dwChangeHandle = FindFirstChangeNotification(watchedDir, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE ); } break; default: break; } } return 0; }
/****************************************************************** SchedXmlConfig - entry point for XmlConfig Custom Action ********************************************************************/ extern "C" UINT __stdcall SchedXmlConfig( __in MSIHANDLE hInstall ) { // AssertSz(FALSE, "debug SchedXmlConfig"); HRESULT hr = S_OK; UINT er = ERROR_SUCCESS; LPWSTR pwzCurrentFile = NULL; BOOL fCurrentFileChanged = FALSE; PMSIHANDLE hView = NULL; PMSIHANDLE hRec = NULL; XML_CONFIG_CHANGE* pxfcHead = NULL; XML_CONFIG_CHANGE* pxfcTail = NULL; // TODO: do we need this any more? XML_CONFIG_CHANGE* pxfc = NULL; eXmlAction xa = xaUnknown; eXmlPreserveDate xd; LPWSTR pwzCustomActionData = NULL; DWORD cFiles = 0; // initialize hr = WcaInitialize(hInstall, "SchedXmlConfig"); ExitOnFailure(hr, "failed to initialize"); hr = ReadXmlConfigTable(&pxfcHead, &pxfcTail); MessageExitOnFailure(hr, msierrXmlConfigFailedRead, "failed to read XmlConfig table"); hr = ProcessChanges(&pxfcHead); ExitOnFailure(hr, "failed to process XmlConfig changes"); // loop through all the xml configurations for (pxfc = pxfcHead; pxfc; pxfc = pxfc->pxfcNext) { // If this is a different file, or the first file... if (NULL == pwzCurrentFile || 0 != lstrcmpW(pwzCurrentFile, pxfc->wzFile)) { // Remember the file we're currently working on hr = StrAllocString(&pwzCurrentFile, pxfc->wzFile, 0); ExitOnFailure(hr, "failed to copy file name"); fCurrentFileChanged = TRUE; } // // Figure out what action to take // xa = xaUnknown; // If it's being installed or reinstalled or uninstalled and that matches // what we are doing then calculate the right action. if ((XMLCONFIG_INSTALL & pxfc->iXmlFlags && (WcaIsInstalling(pxfc->isInstalled, pxfc->isAction) || WcaIsReInstalling(pxfc->isInstalled, pxfc->isAction))) || (XMLCONFIG_UNINSTALL & pxfc->iXmlFlags && WcaIsUninstalling(pxfc->isInstalled, pxfc->isAction))) { if (XMLCONFIG_CREATE & pxfc->iXmlFlags && XMLCONFIG_ELEMENT & pxfc->iXmlFlags) { xa = xaCreateElement; } else if (XMLCONFIG_DELETE & pxfc->iXmlFlags && XMLCONFIG_ELEMENT & pxfc->iXmlFlags) { xa = xaDeleteElement; } else if (XMLCONFIG_DELETE & pxfc->iXmlFlags && XMLCONFIG_VALUE & pxfc->iXmlFlags) { xa = xaDeleteValue; } else if (XMLCONFIG_CREATE & pxfc->iXmlFlags && XMLCONFIG_VALUE & pxfc->iXmlFlags) { xa = xaWriteValue; } else if (XMLCONFIG_CREATE & pxfc->iXmlFlags && XMLCONFIG_DOCUMENT & pxfc->iXmlFlags) { xa = xaWriteDocument; } else if (XMLCONFIG_DELETE & pxfc->iXmlFlags && XMLCONFIG_DOCUMENT & pxfc->iXmlFlags) { hr = E_INVALIDARG; ExitOnFailure(hr, "Invalid flag configuration. Cannot delete a fragment node."); } } if (XMLCONFIG_PRESERVE_MODIFIED & pxfc->iXmlFlags) { xd = xdPreserve; } else { xd= xdDontPreserve; } if (xaUnknown != xa) { if (fCurrentFileChanged) { hr = BeginChangeFile(pwzCurrentFile, pxfc->iCompAttributes, &pwzCustomActionData); ExitOnFailure1(hr, "failed to begin file change for file: %ls", pwzCurrentFile); fCurrentFileChanged = FALSE; ++cFiles; } hr = WcaWriteIntegerToCaData((int)xa, &pwzCustomActionData); ExitOnFailure(hr, "failed to write action indicator custom action data"); hr = WcaWriteIntegerToCaData((int)xd, &pwzCustomActionData); ExitOnFailure(hr, "failed to write Preserve Date indicator to custom action data"); hr = WriteChangeData(pxfc, xa, &pwzCustomActionData); ExitOnFailure(hr, "failed to write change data"); } } // If we looped through all records all is well if (E_NOMOREITEMS == hr) { hr = S_OK; } ExitOnFailure(hr, "failed while looping through all objects to secure"); // Schedule the custom action and add to progress bar if (pwzCustomActionData && *pwzCustomActionData) { Assert(0 < cFiles); hr = WcaDoDeferredAction(PLATFORM_DECORATION(L"ExecXmlConfig"), pwzCustomActionData, cFiles * COST_XMLFILE); ExitOnFailure(hr, "failed to schedule ExecXmlConfig action"); } LExit: ReleaseStr(pwzCurrentFile); ReleaseStr(pwzCustomActionData); FreeXmlConfigChangeList(pxfcHead); if (FAILED(hr)) { er = ERROR_INSTALL_FAILURE; } return WcaFinalize(er); }