Example #1
0
int main(int argc, char *argv[]) {
	ICommonCoreManager* ccm = NULL;
	IPresentationEngineManager* pem = NULL;
	ILocalDeviceManager* dm = NULL;
	IFormatterMultiDevice* fmd = NULL;
#if HAVE_COMPSUPPORT
	IComponentManager* cm;
	cout << "HAVE_COMPSUPPORT" << endl;
#endif

	string nclFile       = "", param = "", bgUri = "", cmdFile = "";
	int i, devClass      = 0;
	int xOffset          = 0, yOffset = 0, w = 0, h = 0, maxTransp = 0;
	double delayTime     = 0;
	double ocDelay       = 0;
	bool isRemoteDoc     = false;
	bool removeOCFilter  = false;
	bool forceQuit       = true;
	bool enableGfx       = true;
	bool autoMount       = false;

	bool enableMultimodalTestApp = false;
	bool enableP2PTestApp = false;

	setLogToNullDev();

	for (i = 1; i < argc; i++) {
		if ((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0)) {
			printHelp();
			return 0;

		} else if ((strcmp(argv[i], "-v") == 0) ||
			    (strcmp(argv[i], "--version")) == 0) {

			printVersion();
			return 0;

		} else if ((strcmp(argv[i], "--ncl") == 0) && ((i + 1) < argc)) {
			nclFile.assign(argv[i+1], strlen(argv[i+1]));
			cout << "argv = '" << argv[i+1] << "' nclFile = '";
			cout << nclFile << "'" << endl;

		} else if ((strcmp(argv[i], "--enable-log") == 0) && ((i + 1) < argc)) {
			if (strcmp(argv[i+1], "file") == 0) {
				setLogToFile();

			} else if (strcmp(argv[i+1], "stdout") == 0) {
				setLogToStdoutDev();
			}

		} else if ((strcmp(argv[i], "--force-quit") == 0) && ((i + 1) < argc)) {
			if (strcmp(argv[i+1], "false") == 0) {
				forceQuit = false;
			}

		} else if ((strcmp(argv[i], "--x-offset") == 0) && ((i + 1) < argc)) {
			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				xOffset = (int)stof(param);
			}

		} else if ((strcmp(argv[i], "--y-offset") == 0) && ((i + 1) < argc)) {
			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				yOffset = (int)stof(param);
			}

		} else if ((strcmp(argv[i], "--set-width") == 0) && ((i + 1) < argc)) {
			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				w = (int)stof(param);
			}

		} else if ((strcmp(argv[i], "--set-height") == 0) && ((i + 1) < argc)) {
			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				h = (int)stof(param);
			}

		} else if ((strcmp(argv[i], "--set-max-transp") == 0) &&
				((i + 1) < argc)) {

			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				maxTransp = (int)stof(param);
			}

		} else if ((strcmp(argv[i], "--set-bg-image") == 0) &&
				((i + 1) < argc)) {

			param = argv[i+1];
			if (fileExists(param)) {
				bgUri = param;
				cout << "main bgUri = '" << bgUri << "'";
				cout << " OK" << endl;

			} else {
				cout << "main Warning: can't set bgUri '" << param << "'";
				cout << " file does not exist" << endl;
			}

		} else if (((strcmp(argv[i], "--device-class") == 0) ||
				(strcmp(argv[i], "--dev-class") == 0)) && ((i + 1) < argc)) {

			if (strcmp(argv[i+1], "1") == 0 ||
					strcmp(argv[i+1], "passive") == 0) {

				devClass = 1;

			} else if (strcmp(argv[i+1], "2") == 0 ||
					strcmp(argv[i+1], "active") == 0) {

				devClass = 2;
			}

		} else if (((strcmp(argv[i], "-i") == 0) ||
				(strcmp(argv[i], "--insert-delay") == 0)) &&
				((i + 1) < argc)) {

			if (isNumeric(argv[i+1])) {
				param     = argv[i+1];
				delayTime = stof(param);
			}

		} else if (strcmp(argv[i], "--insert-oc-delay") == 0 &&
				((i + 1) < argc)) {

			if (isNumeric(argv[i+1])) {
				param   = argv[i+1];
				ocDelay = stof(param);
			}

		} else if (strcmp(argv[i], "--disable-gfx") == 0) {
			enableGfx = false;

		} else if (strcmp(argv[i], "--enable-automount") == 0) {
			autoMount = true;

		} else if (strcmp(argv[i], "--enable-remove-oc-filter") == 0) {
			removeOCFilter = true;

		} else if ((strcmp(argv[i], "--enable-cmdfile") == 0) &&
				((i + 1) < argc)) {

			cmdFile.assign(argv[i+1], strlen(argv[i+1]));
			cout << "argv = '" << argv[i+1] << "' cmdFile = '";
			cout << cmdFile << "'" << endl;
		} else if (strcmp(argv[i], "--enable-multimodal-test-app") == 0) {
			enableMultimodalTestApp = true;
		} else if (strcmp(argv[i], "--enable-p2p-test-app") == 0) {
			enableP2PTestApp = true;
		}
	}

	if (delayTime > 0) {
		::usleep((int)delayTime);
	}

	initTimeStamp();
	initializeCurrentPath();
#if HAVE_COMPSUPPORT
	cm = IComponentManager::getCMInstance();
#endif

	if (nclFile != "") {
		nclFile = updateFileUri(nclFile);

		if (argc > 1 && nclFile.substr(0, 1) != "/") {
			cout << "ginga main() remote NCLFILE" << endl;
			isRemoteDoc = true;
		}
	}

	cout << "ginga main() NCLFILE = " << nclFile.c_str() << endl;

	if (devClass == 1) {
#if HAVE_COMPSUPPORT
		dm = ((LocalDeviceManagerCreator*)(cm->getObject(
				"LocalDeviceManager")))();

		dm->createDevice("systemScreen(0)");
		fmd = ((FormatterMultiDeviceCreator*)(cm->getObject(
				"FormatterMultiDevice")))(
						NULL, devClass, xOffset, yOffset, w, h);
#else
		dm  = LocalDeviceManager::getInstance();
		dm->createDevice("systemScreen(0)");
		fmd = new FormatterPassiveDevice(NULL, xOffset, yOffset, w, h);
#endif

		if (bgUri != "") {
			fmd->setBackgroundImage(bgUri);
		}
		getchar();

	} else if (devClass == 2) {
#if HAVE_COMPSUPPORT
		dm = ((LocalDeviceManagerCreator*)(cm->getObject(
				"LocalDeviceManager")))();

		dm->createDevice("systemScreen(0)");
		fmd = ((FormatterMultiDeviceCreator*)(cm->getObject(
				"FormatterMultiDevice")))(
						NULL, devClass, xOffset, yOffset, w, h);
#else
		dm  = LocalDeviceManager::getInstance();
		dm->createDevice("systemScreen(0)");
		fmd = new FormatterActiveDevice(NULL, xOffset, yOffset, w, h);
#endif

		if (bgUri != "") {
			fmd->setBackgroundImage(bgUri);
		}

		getchar();

	} else {
		if (nclFile == "") {
			enableGfx = false;
		}

#if HAVE_COMPSUPPORT
		pem = ((PEMCreator*)(cm->getObject("PresentationEngineManager")))(
				devClass, xOffset, yOffset, w, h, enableGfx);
#else
		pem = new PresentationEngineManager(
				devClass, xOffset, yOffset, w, h, enableGfx);
#endif

		if (pem == NULL) {
			return -2;
		}

		if (bgUri != "") {
			cout << endl << endl;
			cout << "main '" << bgUri << "'" << endl;
			cout << endl << endl;
			pem->setBackgroundImage(bgUri);
		}

		if (cmdFile != "") {
			cmdFile = updateFileUri(cmdFile);
			pem->setCmdFile(cmdFile);
		}

		// Enqunto não existe um application manager, inicializamos as
		// aplicações por aqui.

		if (enableP2PTestApp) {
			cout << "Iniciando P2PTestApp" << endl;
			P2PTest *p2pTest = P2PTest::getInstance();
		}

		if (enableMultimodalTestApp) {
			// TODO descobrir por que esse o acesso a instância do InputManager tem
			// que ficar depois do acesso ao PresentationEngineManager.
			cout << "Iniciando MultimodaTestApp" << endl;

			// Acrescenta uma aplicação como observadora de eventos multimodais
			MultimodalTest *mmt = MultimodalTest::getInstance();
			mmt->registerListener();
		}

		// Pode-se postar um evento de 3 formas diferentes:
		// 1) Lendo o conteúdo do arquivo e passando a string resultante.
		// 2) Passando o nome do arquivo
		// 3) Montando uma string da hora e passando a string montada.
		// Nenhuma das 3 está sendo usada aqui pois o xml está sendo recebido
		// pelo CommunicationManager.

		// Forma 1)
//		string str, strTotal;
//		ifstream in;
//		in.open("/misc/eventoMultimodal.xml");
//		getline(in, str);
//
//		while (in) {
//		   strTotal += str + '\n';
//		   getline(in, str);
//		}
//
//		im->postMultimodalEvent(strTotal);

		// Forma 2)
//		im->postMultimodalEvent("/misc/eventoMultimodal.xml");

		// Forma 3)
//		im->postMultimodalEvent(
//				"<multimodal id=\"idDoEventoDeTeste\">\n"
//				"    <head>\n"
//				"        <device id=\"a\" model=\"z\"/>\n"
//				"        <user id=\"q\"/>\n"
//				"        <time begin=\"dateTime\" end=\"dateTime\"/>\n"
//				"    </head>\n"
//				"    <body>\n"
//				"        <inkml:ink>\n"
//				"            <inkml:trace>\n"
//				"                10 0, 9 14, 8 28, 7 42, 6 56, 6 70, 8 84, 8 98, 8 112, 9 126, 10 140,\n"
//				"                13 154, 14 168, 17 182, 18 188, 23 174, 30 160, 38 147, 49 135,\n"
//				"                58 124, 72 121, 77 135, 80 149, 82 163, 84 177, 87 191, 93 205\n"
//				"            </inkml:trace>\n"
//				"            <inkml:trace>\n"
//				"                130 155, 144 159, 158 160, 170 154, 179 143, 179 129, 166 125,\n"
//				"                152 128, 140 136, 131 149, 126 163, 124 177, 128 190, 137 200,\n"
//				"                150 208, 163 210, 178 208, 192 201, 205 192, 214 180\n"
//				"            </inkml:trace>\n"
//				"            <inkml:trace>\n"
//				"                227 50, 226 64, 225 78, 227 92, 228 106, 228 120, 229 134,\n"
//				"                230 148, 234 162, 235 176, 238 190, 241 204\n"
//				"            </inkml:trace>\n"
//				"            <inkml:trace>\n"
//				"                282 45, 281 59, 284 73, 285 87, 287 101, 288 115, 290 129,\n"
//				"                291 143, 294 157, 294 171, 294 185, 296 199, 300 213\n"
//				"            </inkml:trace>\n"
//				"            <inkml:trace>\n"
//				"                366 130, 359 143, 354 157, 349 171, 352 185, 359 197,\n"
//				"                371 204, 385 205, 398 202, 408 191, 413 177, 413 163,\n"
//				"                405 150, 392 143, 378 141, 365 150\n"
//				"            </inkml:trace>\n"
//				"        </inkml:ink>\n"
//				"        <voice>aqui entra um voicexml</voice>\n"
//				"        <accel>Ainda por definir</accel>\n"
//				"        <binary>Ainda por definir</binary>\n"
//				"    </body>\n"
//				"</multimodal>");


		if (nclFile == "") {
			pem->setIsLocalNcl(false, NULL);
			pem->autoMountOC(autoMount);

#if HAVE_COMPSUPPORT
			ccm = ((CCMCreator*)(cm->getObject("CommonCoreManager")))(pem);

#else
			ccm = new CommonCoreManager(pem, xOffset, yOffset, w, h);
#endif
			ccm->removeOCFilterAfterMount(removeOCFilter);
			ccm->setOCDelay(ocDelay);
			ccm->startPresentation();

			// Essa trecho faz com que o fluxo trave até que o método
			// unlockConditionSatisfied do eim seja chamado. Isso permite sair
			// do ginga recebendo a mensagem MAIN ALL DONE e, ao mesmo tempo,
			// permite que o ginga permaneça em execução mesmo se não existir
			// uma aplicação ncl em execução e se não estiver ocorrendo o
			// recebimento de um ts.
			// Permite também, por exemplo, que a aplicação de teste do
			// componente P2P permaneça em execução esperando pelo recebimento
			// de algum arquivo.
			// A chamada ao método unlockConditionSatisfied está sendo feita no
			// método EnhancedInputManager::run(), quando a tecla F10 é
			// pressionada.
			IEnhancedInputManager* eim;
#if HAVE_COMPSUPPORT
			eim = ((EnhancedInputManagerCreator*)
				(cm->getObject("InputManager")))();
#else
			eim = EnhancedInputManager::getInstance();
#endif
			cout << "Vou esperar liberação do EnhancedInputManager" << endl;
			eim->waitForUnlockCondition();

		} else if (fileExists(nclFile) || isRemoteDoc) {
			cout << "ginga main() NCLFILE = " << nclFile.c_str() << endl;
			pem->setIsLocalNcl(forceQuit, NULL);
			if (pem->openNclFile(nclFile)) {
				pem->startPresentation(nclFile);
				pem->waitUnlockCondition();
			}
		}

		if (pem != NULL) {
			delete pem;
		}

		if (ccm != NULL) {
			delete ccm;
		}

#if HAVE_COMPSUPPORT
		printTimeStamp();
		cm->releaseComponentFromObject("PresentationEngineManager");
#endif
	}

	cout << "MAIN ALL DONE!" << endl;
	if (!forceQuit) {
		cout << "Press a key to continue" << endl;
		getchar();
	}

	return 0;
}
Example #2
0
int main(int argc, char *argv[]) {
	ICommonCoreManager* ccm = NULL;
	IPresentationEngineManager* pem = NULL;
	ILocalDeviceManager* dm = NULL;
	IFormatterMultiDevice* fmd = NULL;

	string nclFile       = "", param = "", bgUri = "", cmdFile = "", connectorFile="";
	int i, devClass      = 0;
	int xOffset          = 0, yOffset = 0, w = 0, h = 0, maxTransp = 0;
	double delayTime     = 0;
	double ocDelay       = 0;
	bool isRemoteDoc     = false;
	bool removeOCFilter  = false;
	bool forceQuit       = true;
	bool enableGfx       = false;
	bool autoMount       = false;
	bool startConnector = false;
	//int baseId = -1;
	string baseId;

	setLogToNullDev();

	for (i = 1; i < argc; i++) {
		if ((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0)) {
			printHelp();
			return 0;

		} else if ((strcmp(argv[i], "-v") == 0) ||
			    (strcmp(argv[i], "--version")) == 0) {

			printVersion();
			return 0;
		} else if ((strcmp(argv[i], "-b") == 0) ||
			(strcmp(argv[i], "--build")) == 0) {
				printBuildInfo();
				return 0;
		} else if ((strcmp(argv[i], "--ncl") == 0) && ((i + 1) < argc)) {
			nclFile.assign(argv[i+1], strlen(argv[i+1]));

		} else if ((strcmp(argv[i], "--enable-log") == 0) && ((i + 1) < argc)) {
			if (strcmp(argv[i+1], "file") == 0) {
				setLogToFile();

			} else if (strcmp(argv[i+1], "stdout") == 0) {
				setLogToStdoutDev();
			}

		} else if ((strcmp(argv[i], "--force-quit") == 0) && ((i + 1) < argc)) {
			if (strcmp(argv[i+1], "false") == 0) {
				forceQuit = false;
			}

		} else if ((strcmp(argv[i], "--x-offset") == 0) && ((i + 1) < argc)) {
			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				xOffset = stof(param);
			}

		} else if ((strcmp(argv[i], "--y-offset") == 0) && ((i + 1) < argc)) {
			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				yOffset = stof(param);
			}

		} else if ((strcmp(argv[i], "--set-width") == 0) && ((i + 1) < argc)) {
			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				w = stof(param);
			}

		} else if ((strcmp(argv[i], "--set-height") == 0) && ((i + 1) < argc)) {
			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				h = stof(param);
			}

		} else if ((strcmp(argv[i], "--set-max-transp") == 0) &&
				((i + 1) < argc)) {

			if (isNumeric(argv[i+1])) {
				param = argv[i+1];
				maxTransp = stof(param);
			}

		} else if ((strcmp(argv[i], "--set-bg-image") == 0) &&
				((i + 1) < argc)) {

			param = argv[i+1];
			if (fileExists(param)) {
				bgUri = param;
				cout << "main bgUri = '" << bgUri << "'";
				cout << " OK" << endl;

			} else {
				cout << "main Warning: can't set bgUri '" << param << "'";
				cout << " file does not exist" << endl;
			}

		} else if (((strcmp(argv[i], "--device-class") == 0) ||
				(strcmp(argv[i], "--dev-class") == 0)) && ((i + 1) < argc)) {

			if (strcmp(argv[i+1], "1") == 0 ||
					strcmp(argv[i+1], "passive") == 0) {

				devClass = 1;

			} else if (strcmp(argv[i+1], "2") == 0 ||
					strcmp(argv[i+1], "active") == 0) {

				devClass = 2;
			}

		} else if (((strcmp(argv[i], "-i") == 0) ||
				(strcmp(argv[i], "--insert-delay") == 0)) &&
				((i + 1) < argc)) {

			if (isNumeric(argv[i+1])) {
				param     = argv[i+1];
				delayTime = stof(param);
			}

		} else if (strcmp(argv[i], "--insert-oc-delay") == 0 &&
				((i + 1) < argc)) {

			if (isNumeric(argv[i+1])) {
				param   = argv[i+1];
				ocDelay = stof(param);
			}

		} else if (strcmp(argv[i], "--enable-gfx") == 0) {
			enableGfx = true;
		}else if ((strcmp(argv[i], "-r") == 0) || (strcmp(argv[i], "--enable-rendering-layer-controller") == 0)) {
			::util::Singleton<DFBSurfaceMutex> _DFBSurfaceMutexSingleton;
			_DFBSurfaceMutexSingleton.instance().enable();
		} else if (strcmp(argv[i], "--enable-automount") == 0) {
			autoMount = true;

		} else if (strcmp(argv[i], "--enable-remove-oc-filter") == 0) {
			removeOCFilter = true;

		} else if ((strcmp(argv[i], "--enable-cmdfile") == 0) &&
				((i + 1) < argc)) {

			cmdFile.assign(argv[i+1], strlen(argv[i+1]));
			cout << "argv = '" << argv[i+1] << "' cmdFile = '";
			cout << cmdFile << "'" << endl;
		}else if ((strcmp(argv[i], "-c") == 0) || (strcmp(argv[i], "--connector") == 0)) {
			startConnector = true;
			if (i + 1 < argc ){
				connectorFile.assign(argv[i+1], strlen(argv[i+1]));
			}
		}else if ((strcmp(argv[i], "--baseId") == 0) && (i + 1 < argc)){
			//if (isNumeric(argv[i+1])) {
				param = argv[i +1];
				//baseId = stof(param);
				baseId = param;
			//}
		}
	}

	if (delayTime > 0) {
		::usleep(delayTime);
	}

	std::cout << "Setting up terminate handler" << std::endl;
	std::set_terminate(custom_terminate);

	initTimeStamp();
	initializeCurrentPath();

	if (nclFile != "") {
		nclFile = updateFileUri(nclFile);

		if (argc > 1 && nclFile.substr(0, 1) != "/") {
			cout << "ginga main() remote NCLFILE" << endl;
			isRemoteDoc = true;
		}
	}

	printf("\n   --------------------------| Ginga.ar %s |--------------------------\n",GINGA_VERSION);
	printf("\n[Ginga] processing file: %s\n ", nclFile.c_str());

	if (devClass == 1) {
		dm  = LocalDeviceManager::getInstance();
		dm->createDevice("systemScreen(0)");
		fmd = new FormatterPassiveDevice(NULL, xOffset, yOffset, w, h);

		if (bgUri != "") {
			fmd->setBackgroundImage(bgUri);
		}
		getchar();

	} else if (devClass == 2) {
		dm  = LocalDeviceManager::getInstance();
		dm->createDevice("systemScreen(0)");
		fmd = new FormatterActiveDevice(NULL, xOffset, yOffset, w, h);

		if (bgUri != "") {
			fmd->setBackgroundImage(bgUri);
		}

		getchar();

	} else {

		if (nclFile == "") {
			enableGfx = false;
		}

		pem = new PresentationEngineManager(devClass, xOffset, yOffset, w, h, enableGfx);

		if (pem == NULL) {
			return -2;
		}
		
		if(baseId != ""){
			pem->setCurrentPrivateBaseId(baseId);
		}
		if (startConnector){
			pem->startConnector(connectorFile);
		}

		if (bgUri != "") {
			cout << endl << endl;
			cout << "main '" << bgUri << "'" << endl;
			cout << endl << endl;
			pem->setBackgroundImage(bgUri);
		}

		if (cmdFile != "") {
			cmdFile = updateFileUri(cmdFile);
			pem->setCmdFile(cmdFile);
		}

		if (nclFile == "") {
			pem->setIsLocalNcl(false);
			pem->autoMountOC(autoMount);

			ccm = new CommonCoreManager(pem); //, xOffset, yOffset, w, h);

			ccm->removeOCFilterAfterMount(removeOCFilter);
			ccm->setOCDelay(ocDelay);
			ccm->startPresentation();
                        ccm->waitPresentationEnd();

		} else if (fileExists(nclFile) || isRemoteDoc) {
			pem->setIsLocalNcl(forceQuit);
			if (pem->startNclFile(nclFile)){
				pem->waitUnlockCondition();			
			}
		}

		if (pem != NULL) {
			delete pem;
		}

		if (ccm != NULL) {
			delete ccm;
		}

	}

	cout << "[Ginga] Process finished." << endl;
	return 0;
}