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"); };
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); } }