Beispiel #1
0
void InRescanRomsFirstFunc(XUIMessage *pMsg, InRescanRomsStruct* pData, char *szPath)
{
    XuiMessage(pMsg,XM_MESSAGE_ON_RESCAN_ROMS);
    _XuiMessageExtra(pMsg,(XUIMessageData*) pData, sizeof(*pData));

	
}
vector<string> FileBrowser::GetFolderList()
{
	vector<string> retVal;
	if(m_CurrentFolder.size()==0)
	{
		//List Drives
		retVal.push_back("Game:");

		if (SETTINGS::getInstance().getSambaClientOn()) 
			retVal.push_back("smb:");

		std::vector<Drive* const> mountedDrives;
	
		DrivesManager::getInstance().getMountedDrives(&mountedDrives);
		for(unsigned int x=0;x<mountedDrives.size();x++)
		{

			retVal.push_back(mountedDrives[x]->GetCleanDriveName() + ":");
		}

		return retVal;
	}
	else
	{
		retVal.push_back("..");

		string path = GetCurrentPath();
		if (path.substr(0,4).compare("smb:") == 0) {
			map<string, unsigned int> m_SambaTypes;

			int dir;
			if (path.length() == 5) {
				if (SambaClient::getInstance().m_SambaTopLevelTypes.size() > 0) {
					for (map<string, unsigned int>::const_iterator it = SambaClient::getInstance().m_SambaTopLevelTypes.begin(); it != SambaClient::getInstance().m_SambaTopLevelTypes.end(); ++it)
					{
						retVal.push_back(it->first);
					}
					return retVal;
				}
			}
			path.append("/");
			if ((dir = smbc_opendir(path.c_str())) < 0)
			{
				DebugMsg("FileBrowser", "Could not open directory [%s] (%d:%s)\n", path.c_str(), errno, strerror(errno));
				if (errno == 13) {  // permission denied
					string user;
					string password;
					string share;
					string rawpath = GetRawSmbPath(user, password, share);

					XUIMessage xuiMsg;
					XuiMessage(&xuiMsg, XM_SMB_PERMISSION_DENIED);
					Credentials * cred = new Credentials();
					_XuiMessageExtra(&xuiMsg,(XUIMessageData*) cred, sizeof(*cred));
					cred->smbPath = rawpath;
					cred->user = user;
					cred->password = password;
					cred->share = share;

					XuiSendMessage( parentScene , &xuiMsg );
				}
				return retVal;
			}
			struct smbc_dirent *        dirent;
		    while ((dirent = smbc_readdir(dir)) != NULL)
			{
				if (dirent->smbc_type != SMBC_WORKGROUP &&
					dirent->smbc_type != SMBC_SERVER &&
					dirent->smbc_type != SMBC_FILE_SHARE &&
					dirent->smbc_type != SMBC_DIR)
					continue;
				if (strcmp(dirent->name, ".") == 0 || strcmp(dirent->name, "..") == 0)
					continue;
				if (hasEnding(dirent->name, "$"))
					continue;

				if (m_CurrentFolder.size() == 1) {
					SambaClient::getInstance().m_SambaTopLevelTypes[dirent->name] = dirent->smbc_type;
				}

				// filter ourselves out of the list of servers
				if (SETTINGS::getInstance().getSambaServerOn() && CFreestyleApp::getInstance().hasInternetConnection()) {
					if (m_CurrentFolder.size() == 2) {
						string wrkgroup = SETTINGS::getInstance().getSambaClientWorkgroup();
						if (stricmp(wrkgroup.c_str(), m_CurrentFolder[1].c_str()) == 0) {
							string hostname = SETTINGS::getInstance().getHostname();
							if (stricmp(hostname.c_str(), dirent->name) == 0)
								continue;
						}
					}
				}
				retVal.push_back(dirent->name);
			}
//			if (m_CurrentFolder.size() == 1) {
//				m_SambaTopLevelTypes = m_SambaTypes;
//				//m_CurrentFolderSambaTypes.push_back(m_SambaTypes);
//			}
			smbc_closedir(dir);
			return retVal;
		}
		WIN32_FIND_DATA findFileData;
		memset(&findFileData,0,sizeof(WIN32_FIND_DATA));
		string searchcmd = GetCurrentPath() + "\\*";
	
		HANDLE hFind = FindFirstFile(searchcmd.c_str(), &findFileData);
		if (hFind == INVALID_HANDLE_VALUE)
			return retVal;
		do {
			string s = findFileData.cFileName;
			if(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				retVal.push_back(s);
			}
		} while (FindNextFile(hFind, &findFileData));
		FindClose(hFind);
		return retVal;
	}

}