void Exporter::createSceneGraph(MFnDagNode& path, int parentIndex)
{
	Node output;
	std::vector<std::string> pathparts;
	output.name = path.fullPathName().asChar();
	splitStringToVector(output.name, pathparts, "|");
	output.name = pathparts[pathparts.size() - 1];
	if (!strcmp(output.name.c_str(), "persp"))
		return;
	else if (!strcmp(output.name.c_str(), "top"))
		return;
	else if (!strcmp(output.name.c_str(), "side"))
		return;
	else if (!strcmp(output.name.c_str(), "front"))
		return;
	output.parent = parentIndex;
	output.transform = path.transformationMatrix().matrix;



	scene_.sceneGraph.push_back(output);
	int children = path.childCount();
	int parent = scene_.sceneGraph.size() - 1;
	for (int i = 0; i < children; i++)
	{
		cout << path.child(i).apiTypeStr() << endl;
		if (!strcmp(path.child(i).apiTypeStr(), "kMesh")){
			scene_.sceneGraph[parent].type = 1;
			MFnMesh mesh(path.child(i));
			MDagPath dag_path;
			MItDag dag_iter(MItDag::kBreadthFirst, MFn::kMesh);
			int y = 0;
			while (!dag_iter.isDone())
			{
				if (dag_iter.getPath(dag_path))
				{
					MFnDagNode dag_node = dag_path.node();
					if (!dag_node.isIntermediateObject())
					{
						if (!strcmp(mesh.partialPathName().asChar(), dag_node.partialPathName().asChar()))
							scene_.sceneGraph[parent].mesh = y;
						y++;
					}
				}
				dag_iter.next();
			}
		}
//		else if (!strcmp(path.child(i).apiTypeStr(), "kCamera")); kan l�gga till fler typer h�r
		else
		createSceneGraph(MFnDagNode(path.child(i)), parent);
	}


}
//turns a text file into a vector of strings line-by-line
void Exporter::fileToStrings(std::string file_path, std::vector<std::string> &output)
{
	std::ifstream file(file_path);
	if (!file.is_open())
	{
		printf("Could not open ");
		printf(file_path.c_str());
		printf("\n");
		return;
	}
	std::string s((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

	splitStringToVector(s, output, "\n");
};
Ejemplo n.º 3
0
    int TapInterface::init (void)
    {
        std::lock_guard<std::mutex> lg (_mtxWrite);

        if (_bInitDone) {
            return 0;
        }
        _bInitDone = true;

        #if defined (WIN32)
            const char * WIN32_NETWORK_ADAPTERS_REG_KEY = "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}";
            const char * WIN32_NETWORK_ADAPTERS_NAMES_REG_KEY = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}";
            const char * WIN32_TCPIP_INTERFACE_CONFIGURATION_REG_KEY = "SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces";
            const char * TAP_INTERFACE_DESCRIPTION1 = "TAP-Win32";
            const char * TAP_INTERFACE_DESCRIPTION2 = "TAP-Windows Adapter V9";
            const char * USER_MODE_DEVICE_DIR_PREFIX = "\\\\.\\Global\\";       // From OpenVPN - tap-win32/common.h
            const char * SYS_DEVICE_DIR = "\\Device\\";                         // From OpenVPN - tap-win32/common.h
            const char * USER_DEVICE_DIR = "\\DosDevices\\Global\\";            // From OpenVPN - tap-win32/common.h
            const char * TAP_DEVICE_SUFFIX = ".tap";                            // From OpenVPN - tap-win32/common.h

            int iCount = 0;
            std::string sInstanceID, sMACAddr, sIPAddr, sSubnetMask, sDefaultGateway, sMTU;
            NOMADSUtil::RegKeys *pRK = NOMADSUtil::getRegistrySubKeys (WIN32_NETWORK_ADAPTERS_REG_KEY);
            for (int i = 0; i <= pRK->getHighestIndex(); i++) {
                const char *pszSubKey = (*pRK)[i];
                char szKey [MAX_PATH];
                szKey[MAX_PATH-1] = '\0';
                snprintf (szKey, MAX_PATH, "%s\\%s", WIN32_NETWORK_ADAPTERS_REG_KEY, pszSubKey);
                NOMADSUtil::RegEntries *pREs = NOMADSUtil::getRegistryEntries (szKey);
                if (pREs != nullptr) {
                    NOMADSUtil::RegEntry *pEntry = pREs->get ("DriverDesc");
                    if ((pEntry != nullptr) && (pEntry->type == NOMADSUtil::RegEntry::RET_String)) {
                        checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Info,
                                        "found network adaptor <%s>\n", pEntry->value);
                        if ((strstr (pEntry->value, TAP_INTERFACE_DESCRIPTION1)) || (strstr (pEntry->value, TAP_INTERFACE_DESCRIPTION2))) {
                            auto * const pREInstanceId = pREs->get ("NetCfgInstanceId");
                            if ((pREInstanceId != nullptr) && (pREInstanceId->type == NOMADSUtil::RegEntry::RET_String)) {
                                iCount++;
                                sInstanceID = pREInstanceId->value;
                                auto * const pREMACAddr = pREs->get ("MAC");
                                if ((pREMACAddr != nullptr) && (pREMACAddr->type == NOMADSUtil::RegEntry::RET_String)) {
                                    sMACAddr = pREMACAddr->value;
                                }
                                auto * const pREMTU = pREs->get ("MTU");
                                if ((pREMTU != nullptr) && (pREMTU->type == NOMADSUtil::RegEntry::RET_String)) {
                                    sMTU = pREMTU->value;
                                }

                                snprintf (szKey, MAX_PATH, "%s\\%s\\Connection", WIN32_NETWORK_ADAPTERS_NAMES_REG_KEY, sInstanceID.c_str());
                                auto * const pNetworkConnEntries = NOMADSUtil::getRegistryEntries (szKey);
                                if (pNetworkConnEntries != nullptr) {
                                    auto * const pREName = pNetworkConnEntries->get ("Name");
                                    if (pREName != nullptr) {
                                        _sUserFriendlyInterfaceName = _sInterfaceName = pREName->value;
                                        checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Info,
                                                        "TUN/TAP Network Adaptor name is %s\n", _sInterfaceName.c_str());
                                    }
                                    else {
                                        checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Warning,
                                                        "unable to find the TUN/TAP interface name\n");
                                    }
                                }

                                snprintf (szKey, MAX_PATH, "%s\\%s", WIN32_TCPIP_INTERFACE_CONFIGURATION_REG_KEY, sInstanceID.c_str());
                                auto * const pTCPIPEntries = NOMADSUtil::getRegistryEntries (szKey);
                                if (pTCPIPEntries != nullptr) {
                                    // IP address
                                    auto * const pREIPAddr = pTCPIPEntries->get ("IPAddress");
                                    if ((pREIPAddr != nullptr) && (pREIPAddr->type == NOMADSUtil::RegEntry::RET_MultiString)) {
                                        if (pREIPAddr->values.getHighestIndex() < 0) {
                                            checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Warning,
                                                            "TUN/TAP Network Adaptor does not have an IP Address\n");
                                        }
                                        else {
                                            sIPAddr = pREIPAddr->values[0];
                                            if (pREIPAddr->values.getHighestIndex() > 0) {
                                                checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Warning,
                                                                "TUN/TAP Network Adaptor has more than one IP address - using <%s>\n",
                                                                sIPAddr.c_str());
                                            }
                                        }
                                    }

                                    // Netmask
                                    auto * const pRENetmask = pTCPIPEntries->get ("SubnetMask");
                                    if ((pRENetmask != nullptr) && (pRENetmask->type == NOMADSUtil::RegEntry::RET_MultiString)) {
                                        if (pRENetmask->values.getHighestIndex() < 0) {
                                            checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Warning,
                                                            "TUN/TAP Network Adaptor does not have a specified SubnetMask\n");
                                        }
                                        else {
                                            sSubnetMask = pRENetmask->values[0];
                                            if (pRENetmask->values.getHighestIndex() > 0) {
                                                checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Warning,
                                                                "TUN/TAP Network Adaptor has more than one SubnetMask - using <%s>\n",
                                                                sSubnetMask.c_str());
                                            }
                                        }
                                    }

                                    // Netmask
                                    auto * const pREGateway = pTCPIPEntries->get ("DefaultGateway");
                                    if ((pREGateway != nullptr) && (pREGateway->type == NOMADSUtil::RegEntry::RET_MultiString)) {
                                        if (pREGateway->values.getHighestIndex() < 0) {
                                            checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Warning,
                                                            "TUN/TAP Network Adaptor does not have a specified Default Gateway\n");
                                        }
                                        else {
                                            sDefaultGateway = pRENetmask->values[0];
                                            if (pRENetmask->values.getHighestIndex() > 0) {
                                                checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Warning,
                                                                "TUN/TAP Network Adaptor has more than one Default Gateway - using <%s>\n",
                                                                sDefaultGateway.c_str());
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            delete pRK;

            if (iCount == 0) {
                checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_SevereError,
                                "did not find the TAP-Win32 interface\n");
                return -1;
            }
            else if (iCount > 1) {
                checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_SevereError,
                                "found %d TAP-Win32 interfaces - do not know which one to use\n", iCount);
                return -2;
            }

            char szDeviceFilePath[MAX_PATH];
            szDeviceFilePath[MAX_PATH-1] = '\0';
            snprintf (szDeviceFilePath, MAX_PATH, "%s%s%s", USER_MODE_DEVICE_DIR_PREFIX, sInstanceID.c_str(), TAP_DEVICE_SUFFIX);

            checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_Info,
                            "opening device %s\n", szDeviceFilePath);

            _hInterface = CreateFile (szDeviceFilePath, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr);
            if (_hInterface == INVALID_HANDLE_VALUE) {
                checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_SevereError,
                                "CreateFile failed with error %d while attempting to open <%s>\n",
                                GetLastError(), szDeviceFilePath);
                return -3;
            }

            memset (&_oRead, 0, sizeof(_oRead));
            memset (&_oWrite, 0, sizeof(_oWrite));
            _oRead.hEvent = CreateEvent (nullptr, TRUE, FALSE, nullptr);
            if (_oRead.hEvent == INVALID_HANDLE_VALUE) {
                checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_SevereError,
                                "CreateEvent 1 failed with error %d\n", GetLastError());
                return -4;
            }
            _oWrite.hEvent = CreateEvent (nullptr, TRUE, FALSE, nullptr);
            if (_oWrite.hEvent == INVALID_HANDLE_VALUE) {
                checkAndLogMsg ("TapInterface::init", NOMADSUtil::Logger::L_SevereError,
                                "CreateEvent 2 failed with error %d\n", GetLastError());
                return -5;
            }

            // Process MAC address
            if (sMACAddr.length() > 0) {
                // MAC Address was configured - parse it
                _bMACAddrFound = true;
                auto svMACAddressBytes = splitStringToVector (sMACAddr, ':');
                if (svMACAddressBytes.size() != 6) {
                    _bMACAddrFound = false;
                    checkAndLogMsg("TapInterface::init", NOMADSUtil::Logger::L_Info,
                                    "Error parsing the retrieved MAC address <%s>\n", sMACAddr.c_str());
                }

                for (int i = 0; (i < 6) && _bMACAddrFound; i++) {
                    char pszByte[5];
                    strcpy (pszByte, "0x");
                    strcat (pszByte, svMACAddressBytes[i].c_str());
                    strcat (pszByte, "\0");

                    unsigned int tmp;
                    std::stringstream ss;
                    ss << std::hex << pszByte;
                    ss >> tmp;
                    _aui8MACAddr[i] = static_cast<uint8> (tmp);
                }
            }