aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartijn Kaijser <machine.sanctum@gmail.com>2014-05-20 08:48:52 +0200
committerMartijn Kaijser <machine.sanctum@gmail.com>2014-05-20 08:48:52 +0200
commitc69432b865c3dd6cde0b9edebdedefd6fe5a4ed6 (patch)
tree0cad963c68cf1dd7b7b820ff86d0ba67ff4365e0
parent6f96ff25adf8c929a88cc2bcfa5292a971f11432 (diff)
parent6b80807b380e92a4047fe27827499df7405c49ff (diff)
Merge pull request #4681 from Karlson2k/useragent_fix_01
UserAgent fixes
-rw-r--r--xbmc/GUIInfoManager.cpp17
-rw-r--r--xbmc/GUIInfoManager.h2
-rw-r--r--xbmc/osx/DarwinUtils.h3
-rw-r--r--xbmc/osx/DarwinUtils.mm151
-rw-r--r--xbmc/utils/SystemInfo.cpp181
-rw-r--r--xbmc/utils/SystemInfo.h8
6 files changed, 282 insertions, 80 deletions
diff --git a/xbmc/GUIInfoManager.cpp b/xbmc/GUIInfoManager.cpp
index eb39447c62..eed9eb2a0f 100644
--- a/xbmc/GUIInfoManager.cpp
+++ b/xbmc/GUIInfoManager.cpp
@@ -259,6 +259,7 @@ const infomap system_labels[] = {{ "hasnetwork", SYSTEM_ETHERNET_LINK_ACT
{ "usedspacepercent", SYSTEM_USED_SPACE_PERCENT },
{ "freespacepercent", SYSTEM_FREE_SPACE_PERCENT },
{ "buildversion", SYSTEM_BUILD_VERSION },
+ { "buildversionshort",SYSTEM_BUILD_VERSION_SHORT },
{ "builddate", SYSTEM_BUILD_DATE },
{ "fps", SYSTEM_FPS },
{ "dvdtraystate", SYSTEM_DVD_TRAY_STATE },
@@ -1812,6 +1813,9 @@ CStdString CGUIInfoManager::GetLabel(int info, int contextWindow, CStdString *fa
}
}
break;
+ case SYSTEM_BUILD_VERSION_SHORT:
+ strLabel = GetVersionShort();
+ break;
case SYSTEM_BUILD_VERSION:
strLabel = GetVersion();
break;
@@ -4206,14 +4210,17 @@ CTemperature CGUIInfoManager::GetGPUTemperature()
// Version string MUST NOT contain spaces. It is used
// in the HTTP request user agent.
+std::string CGUIInfoManager::GetVersionShort(void)
+{
+ return StringUtils::Format("%d.%d%s", VERSION_MAJOR, VERSION_MINOR, VERSION_TAG);
+}
+
CStdString CGUIInfoManager::GetVersion()
{
- CStdString tmp;
if (GetXbmcGitRevision())
- tmp = StringUtils::Format("%d.%d%s Git:%s", VERSION_MAJOR, VERSION_MINOR, VERSION_TAG, GetXbmcGitRevision());
- else
- tmp = StringUtils::Format("%d.%d%s", VERSION_MAJOR, VERSION_MINOR, VERSION_TAG);
- return tmp;
+ return GetVersionShort() + " Git:" + GetXbmcGitRevision();
+
+ return GetVersionShort();
}
CStdString CGUIInfoManager::GetBuild()
diff --git a/xbmc/GUIInfoManager.h b/xbmc/GUIInfoManager.h
index caf9ef510b..8795a8cc48 100644
--- a/xbmc/GUIInfoManager.h
+++ b/xbmc/GUIInfoManager.h
@@ -174,6 +174,7 @@ namespace INFO
#define SYSTEM_HAS_PVR 186
#define SYSTEM_STARTUP_WINDOW 187
#define SYSTEM_STEREOSCOPIC_MODE 188
+#define SYSTEM_BUILD_VERSION_SHORT 189
#define NETWORK_IP_ADDRESS 190
#define NETWORK_MAC_ADDRESS 191
@@ -784,6 +785,7 @@ public:
int GetPlayTimeRemaining() const;
int GetTotalPlayTime() const;
CStdString GetCurrentPlayTimeRemaining(TIME_FORMAT format) const;
+ std::string GetVersionShort(void);
CStdString GetVersion();
CStdString GetBuild();
diff --git a/xbmc/osx/DarwinUtils.h b/xbmc/osx/DarwinUtils.h
index e1a16116f1..a6d2709649 100644
--- a/xbmc/osx/DarwinUtils.h
+++ b/xbmc/osx/DarwinUtils.h
@@ -31,12 +31,15 @@ typedef const struct __CFString * CFStringRef;
extern "C"
{
#endif
+ const char *getIosPlatformString(void);
bool DarwinIsAppleTV2(void);
bool DarwinIsMavericks(void);
bool DarwinHasRetina(void);
const char *GetDarwinOSReleaseString(void);
const char *GetDarwinVersionString(void);
float GetIOSVersion(void);
+ const char *GetIOSVersionString(void);
+ const char *GetOSXVersionString(void);
int GetDarwinFrameworkPath(bool forPython, char* path, uint32_t *pathsize);
int GetDarwinExecutablePath(char* path, uint32_t *pathsize);
const char *DarwinGetXbmcRootFolder(void);
diff --git a/xbmc/osx/DarwinUtils.mm b/xbmc/osx/DarwinUtils.mm
index 0637720709..a59044bbbd 100644
--- a/xbmc/osx/DarwinUtils.mm
+++ b/xbmc/osx/DarwinUtils.mm
@@ -85,60 +85,79 @@ enum iosPlatform
};
// platform strings are based on http://theiphonewiki.com/wiki/Models
+const char* getIosPlatformString(void)
+{
+ static std::string iOSPlatformString;
+ if (iOSPlatformString.empty())
+ {
+#if defined(TARGET_DARWIN_IOS)
+ // Gets a string with the device model
+ size_t size;
+ sysctlbyname("hw.machine", NULL, &size, NULL, 0);
+ char *machine = new char[size];
+ if (sysctlbyname("hw.machine", machine, &size, NULL, 0) == 0 && machine[0])
+ iOSPlatformString.assign(machine, size -1);
+ else
+#endif
+ iOSPlatformString = "unknown0,0";
+
+#if defined(TARGET_DARWIN_IOS)
+ delete [] machine;
+#endif
+ }
+
+ return iOSPlatformString.c_str();
+}
+
enum iosPlatform getIosPlatform()
{
+ static enum iosPlatform eDev = iDeviceUnknown;
#if defined(TARGET_DARWIN_IOS)
- // Gets a string with the device model
- size_t size;
- sysctlbyname("hw.machine", NULL, &size, NULL, 0);
- char *machine = new char[size];
- sysctlbyname("hw.machine", machine, &size, NULL, 0);
- NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
- delete [] machine;
-
- if ([platform isEqualToString:@"iPhone1,1"]) return iPhone2G;
- if ([platform isEqualToString:@"iPhone1,2"]) return iPhone3G;
- if ([platform isEqualToString:@"iPhone2,1"]) return iPhone3GS;
- if ([platform isEqualToString:@"iPhone3,1"]) return iPhone4;
- if ([platform isEqualToString:@"iPhone3,2"]) return iPhone4;
- if ([platform isEqualToString:@"iPhone3,3"]) return iPhone4CDMA;
- if ([platform isEqualToString:@"iPhone4,1"]) return iPhone4S;
- if ([platform isEqualToString:@"iPhone5,1"]) return iPhone5;
- if ([platform isEqualToString:@"iPhone5,2"]) return iPhone5GSMCDMA;
- if ([platform isEqualToString:@"iPhone5,3"]) return iPhone5CGSM;
- if ([platform isEqualToString:@"iPhone5,4"]) return iPhone5CGlobal;
- if ([platform isEqualToString:@"iPhone6,1"]) return iPhone5SGSM;
- if ([platform isEqualToString:@"iPhone6,2"]) return iPhone5SGlobal;
-
- if ([platform isEqualToString:@"iPod1,1"]) return iPodTouch1G;
- if ([platform isEqualToString:@"iPod2,1"]) return iPodTouch2G;
- if ([platform isEqualToString:@"iPod3,1"]) return iPodTouch3G;
- if ([platform isEqualToString:@"iPod4,1"]) return iPodTouch4G;
- if ([platform isEqualToString:@"iPod5,1"]) return iPodTouch5G;
-
- if ([platform isEqualToString:@"iPad1,1"]) return iPad;
- if ([platform isEqualToString:@"iPad1,2"]) return iPad;
- if ([platform isEqualToString:@"iPad2,1"]) return iPad2WIFI;
- if ([platform isEqualToString:@"iPad2,2"]) return iPad2;
- if ([platform isEqualToString:@"iPad2,3"]) return iPad2CDMA;
- if ([platform isEqualToString:@"iPad2,4"]) return iPad2;
- if ([platform isEqualToString:@"iPad2,5"]) return iPadMiniWIFI;
- if ([platform isEqualToString:@"iPad2,6"]) return iPadMini;
- if ([platform isEqualToString:@"iPad2,7"]) return iPadMiniGSMCDMA;
- if ([platform isEqualToString:@"iPad3,1"]) return iPad3WIFI;
- if ([platform isEqualToString:@"iPad3,2"]) return iPad3GSMCDMA;
- if ([platform isEqualToString:@"iPad3,3"]) return iPad3;
- if ([platform isEqualToString:@"iPad3,4"]) return iPad4WIFI;
- if ([platform isEqualToString:@"iPad3,5"]) return iPad4;
- if ([platform isEqualToString:@"iPad3,6"]) return iPad4GSMCDMA;
- if ([platform isEqualToString:@"iPad4,1"]) return iPadAirWifi;
- if ([platform isEqualToString:@"iPad4,2"]) return iPadAirCellular;
- if ([platform isEqualToString:@"iPad4,4"]) return iPadMini2Wifi;
- if ([platform isEqualToString:@"iPad4,5"]) return iPadMini2Cellular;
-
- if ([platform isEqualToString:@"AppleTV2,1"]) return AppleTV2;
+ if (eDev == iDeviceUnknown)
+ {
+ std::string devStr(getIosPlatformString());
+
+ if (devStr == "iPhone1,1") eDev = iPhone2G;
+ else if (devStr == "iPhone1,2") eDev = iPhone3G;
+ else if (devStr == "iPhone2,1") eDev = iPhone3GS;
+ else if (devStr == "iPhone3,1") eDev = iPhone4;
+ else if (devStr == "iPhone3,2") eDev = iPhone4;
+ else if (devStr == "iPhone3,3") eDev = iPhone4CDMA;
+ else if (devStr == "iPhone4,1") eDev = iPhone4S;
+ else if (devStr == "iPhone5,1") eDev = iPhone5;
+ else if (devStr == "iPhone5,2") eDev = iPhone5GSMCDMA;
+ else if (devStr == "iPhone5,3") eDev = iPhone5CGSM;
+ else if (devStr == "iPhone5,4") eDev = iPhone5CGlobal;
+ else if (devStr == "iPhone6,1") eDev = iPhone5SGSM;
+ else if (devStr == "iPhone6,2") eDev = iPhone5SGlobal;
+ else if (devStr == "iPod1,1") eDev = iPodTouch1G;
+ else if (devStr == "iPod2,1") eDev = iPodTouch2G;
+ else if (devStr == "iPod3,1") eDev = iPodTouch3G;
+ else if (devStr == "iPod4,1") eDev = iPodTouch4G;
+ else if (devStr == "iPod5,1") eDev = iPodTouch5G;
+ else if (devStr == "iPad1,1") eDev = iPad;
+ else if (devStr == "iPad1,2") eDev = iPad;
+ else if (devStr == "iPad2,1") eDev = iPad2WIFI;
+ else if (devStr == "iPad2,2") eDev = iPad2;
+ else if (devStr == "iPad2,3") eDev = iPad2CDMA;
+ else if (devStr == "iPad2,4") eDev = iPad2;
+ else if (devStr == "iPad2,5") eDev = iPadMiniWIFI;
+ else if (devStr == "iPad2,6") eDev = iPadMini;
+ else if (devStr == "iPad2,7") eDev = iPadMiniGSMCDMA;
+ else if (devStr == "iPad3,1") eDev = iPad3WIFI;
+ else if (devStr == "iPad3,2") eDev = iPad3GSMCDMA;
+ else if (devStr == "iPad3,3") eDev = iPad3;
+ else if (devStr == "iPad3,4") eDev = iPad4WIFI;
+ else if (devStr == "iPad3,5") eDev = iPad4;
+ else if (devStr == "iPad3,6") eDev = iPad4GSMCDMA;
+ else if (devStr == "iPad4,1") eDev = iPadAirWifi;
+ else if (devStr == "iPad4,2") eDev = iPadAirCellular;
+ else if (devStr == "iPad4,4") eDev = iPadMini2Wifi;
+ else if (devStr == "iPad4,5") eDev = iPadMini2Cellular;
+ else if (devStr == "AppleTV2,1") eDev = AppleTV2;
+ }
#endif
- return iDeviceUnknown;
+ return eDev;
}
bool DarwinIsAppleTV2(void)
@@ -217,6 +236,38 @@ float GetIOSVersion(void)
return(version);
}
+const char *GetIOSVersionString(void)
+{
+#if defined(TARGET_DARWIN_IOS)
+ static std::string iOSVersionString;
+ if (iOSVersionString.empty())
+ {
+ CCocoaAutoPool pool;
+ iOSVersionString.assign((const char*)[[[UIDevice currentDevice] systemVersion] UTF8String]);
+ }
+ return iOSVersionString.c_str();
+#else
+ return "0.0";
+#endif
+}
+
+const char *GetOSXVersionString(void)
+{
+#if defined(TARGET_DARWIN_OSX)
+ static std::string OSXVersionString;
+ if (OSXVersionString.empty())
+ {
+ CCocoaAutoPool pool;
+ OSXVersionString.assign((const char*)[[[NSDictionary dictionaryWithContentsOfFile:
+ @"/System/Library/CoreServices/SystemVersion.plist"] objectForKey:@"ProductVersion"] UTF8String]);
+ }
+
+ return OSXVersionString.c_str();
+#else
+ return "0.0";
+#endif
+}
+
int GetDarwinFrameworkPath(bool forPython, char* path, uint32_t *pathsize)
{
CCocoaAutoPool pool;
diff --git a/xbmc/utils/SystemInfo.cpp b/xbmc/utils/SystemInfo.cpp
index 93866eebf8..5bab81a426 100644
--- a/xbmc/utils/SystemInfo.cpp
+++ b/xbmc/utils/SystemInfo.cpp
@@ -52,11 +52,12 @@
#include "utils/AMLUtils.h"
#endif
-/* Target identification */
+/* Platform identification */
#if defined(TARGET_DARWIN)
#include <Availability.h>
#elif defined(TARGET_ANDROID)
#include <android/api-level.h>
+#include <sys/system_properties.h>
#elif defined(TARGET_FREEBSD)
#include <sys/param.h>
#elif defined(TARGET_LINUX)
@@ -821,13 +822,54 @@ CStdString CSysInfo::GetUnameVersion()
}
#endif
+#ifdef TARGET_ANDROID
+std::string CSysInfo::GetAndroidVersionString(void)
+{
+ static std::string versionString;
+ if (versionString.empty())
+ {
+ char versionCStr[PROP_VALUE_MAX];
+ int propLen = __system_property_get("ro.build.version.release", versionCStr);
+ versionString.assign(versionCStr, (propLen > 0 && propLen <= PROP_VALUE_MAX) ? propLen : 0);
+
+ if (versionString.empty() || std::string("0123456789").find(versionCStr[0]) == std::string::npos)
+ versionString.assign("0.0.0"); // can't correctly detect Android version
+ else
+ {
+ size_t pointPos = versionString.find('.');
+ if (pointPos == std::string::npos)
+ versionString += ".0.0";
+ else if (versionString.find('.', pointPos + 1) == std::string::npos)
+ versionString += ".0";
+ }
+ }
+
+ return versionString;
+}
+
+std::string CSysInfo::GetAndroidDeviceName(void)
+{
+ static std::string deviceName;
+ static bool inited = false;
+ if (!inited)
+ {
+ char deviceCStr[PROP_VALUE_MAX];
+ int propLen = __system_property_get("ro.product.model", deviceCStr);
+ deviceName.assign(deviceCStr, (propLen > 0 && propLen <= PROP_VALUE_MAX) ? propLen : 0);
+ inited = true;
+ }
+
+ return deviceName;
+}
+#endif // TARGET_ANDROID
+
#if defined(TARGET_WINDOWS)
-CStdString CSysInfo::GetUAWindowsVersion()
+std::string CSysInfo::GetUAWindowsVersion()
{
OSVERSIONINFOEX osvi = {};
osvi.dwOSVersionInfoSize = sizeof(osvi);
- CStdString strVersion = "Windows NT";
+ std::string strVersion = "Windows NT";
if (GetVersionEx((OSVERSIONINFO *)&osvi))
{
@@ -842,44 +884,137 @@ CStdString CSysInfo::GetUAWindowsVersion()
{
if (bIsWow)
{
- strVersion.append(";WOW64");
+ strVersion.append("; WOW64");
GetNativeSystemInfo(&si); // different function to read the info under Wow
}
}
- if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
- strVersion.append(";Win64;x64");
- else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64)
- strVersion.append(";Win64;IA64");
-
+ if (!bIsWow)
+ {
+ if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
+ strVersion.append("; Win64; x64");
+ else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
+ strVersion.append("; Win64; IA64");
+ else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM)
+ strVersion.append("; ARM");
+ }
return strVersion;
}
#endif
-CStdString CSysInfo::GetUserAgent()
+std::string CSysInfo::GetUserAgent()
{
- CStdString result;
- result = "XBMC/" + g_infoManager.GetLabel(SYSTEM_BUILD_VERSION) + " (";
+ static std::string result;
+ if (!result.empty())
+ return result;
+
+ result = "XBMC/" + g_infoManager.GetLabel(SYSTEM_BUILD_VERSION_SHORT) + " (";
#if defined(TARGET_WINDOWS)
result += GetUAWindowsVersion();
#elif defined(TARGET_DARWIN)
#if defined(TARGET_DARWIN_IOS)
- result += "iOS; ";
+ std::string iDevStr(getIosPlatformString()); // device model name with number of model version
+ size_t iDevStrDigit = iDevStr.find_first_of("0123456789");
+ std::string iDev(iDevStr, 0, iDevStrDigit); // device model name without number
+ if (iDevStrDigit == 0)
+ iDev = "unknown";
+ result += iDev + "; ";
+ std::string iOSVerison(GetIOSVersionString());
+ size_t lastDotPos = iOSVerison.rfind('.');
+ if (lastDotPos != std::string::npos && iOSVerison.find('.') != lastDotPos
+ && iOSVerison.find_first_not_of('0', lastDotPos + 1) == std::string::npos)
+ iOSVerison.erase(lastDotPos);
+ StringUtils::Replace(iOSVerison, '.', '_');
+ if (iDev == "iPad" || iDev == "AppleTV")
+ result += "CPU OS ";
+ else
+ result += "CPU iPhone OS ";
+ result += iOSVerison + " like Mac OS X";
#else
- result += "Mac OS X; ";
+ result += "Macintosh; ";
+ std::string cpuFam(GetBuildTargetCpuFamily());
+ if (cpuFam == "x86")
+ result += "Intel ";
+ else if (cpuFam == "PowerPC")
+ result += "PPC ";
+ result += "Mac OS X ";
+ std::string OSXVersion(GetOSXVersionString());
+ StringUtils::Replace(OSXVersion, '.', '_');
+ result += OSXVersion;
#endif
- result += GetUnameVersion();
-#elif defined(TARGET_FREEBSD)
- result += "FreeBSD; ";
- result += GetUnameVersion();
+#elif defined(TARGET_ANDROID)
+ result += "Linux; Android ";
+ std::string versionStr(GetAndroidVersionString());
+ const size_t verLen = versionStr.length();
+ if (verLen >= 2 && versionStr.compare(verLen - 2, 2, ".0", 2) == 0)
+ versionStr.erase(verLen - 2); // remove last ".0" if any
+ result += versionStr;
+ std::string deviceInfo(GetAndroidDeviceName());
+
+ char buildId[PROP_VALUE_MAX];
+ int propLen = __system_property_get("ro.build.id", buildId);
+ if (propLen > 0 && propLen <= PROP_VALUE_MAX)
+ {
+ if (!deviceInfo.empty())
+ deviceInfo += " ";
+ deviceInfo += "Build/";
+ deviceInfo.append(buildId, propLen);
+ }
+
+ if (!deviceInfo.empty())
+ result += "; " + deviceInfo;
#elif defined(TARGET_POSIX)
- result += "Linux; ";
- result += GetLinuxDistro();
- result += "; ";
- result += GetUnameVersion();
+ result += "X11; ";
+ struct utsname un;
+ if (uname(&un) == 0)
+ {
+ std::string cpuStr(un.machine);
+ if (cpuStr == "x86_64" && GetXbmcBitness() == 32)
+ cpuStr = "i686 (x86_64)";
+ result += un.sysname;
+ result += " ";
+ result += cpuStr;
+ }
+ else
+ result += "Unknown";
+#else
+ result += "Unknown";
+#endif
+ result += ")";
+ // add fork ID here in form:
+ // result += " XBMC_FORK_" + "forkname" + "/" + "1.0"; // default fork number is '1.0'
+#ifdef TARGET_RASPBERRY_PI
+ result += " XBMC_HW_RaspberryPi/1.0";
+#elif defined (TARGET_DARWIN_IOS)
+ std::string iDevVer;
+ if (iDevStrDigit == std::string::npos)
+ iDevVer = "0.0";
+ else
+ iDevVer.assign(iDevStr, iDevStrDigit, std::string::npos);
+ StringUtils::Replace(iDevVer, ',', '.');
+ result += " XBMC_HW_" + iDev + "/" + iDevVer;
+#endif
+ // add more device IDs here if needed.
+ // keep only one device ID in result! Form:
+ // result += " XBMC_HW_" + "deviceID" + "/" + "1.0"; // '1.0' if device has no version
+
+#if defined(TARGET_ANDROID)
+ // Android has no CPU string by default, so add it as additional parameter
+ struct utsname un1;
+ if (uname(&un1) == 0)
+ {
+ std::string cpuStr(un1.machine);
+ StringUtils::Replace(cpuStr, ' ', '_');
+ result += " XBMC_CPU/" + cpuStr;
+ }
#endif
- result += "; http://xbmc.org)";
+
+ result += " XBMC_BITNESS/" + StringUtils::Format("%d", GetXbmcBitness());
+
+ std::string fullVer(g_infoManager.GetLabel(SYSTEM_BUILD_VERSION));
+ StringUtils::Replace(fullVer, ' ', '-');
+ result += " Version/" + fullVer;
return result;
}
diff --git a/xbmc/utils/SystemInfo.h b/xbmc/utils/SystemInfo.h
index 6c35f4e9d6..e8d8380d42 100644
--- a/xbmc/utils/SystemInfo.h
+++ b/xbmc/utils/SystemInfo.h
@@ -109,10 +109,14 @@ public:
#ifdef TARGET_POSIX
CStdString GetUnameVersion();
#endif
+#ifdef TARGET_ANDROID
+ std::string GetAndroidVersionString(void);
+ std::string GetAndroidDeviceName(void);
+#endif
#if defined(TARGET_WINDOWS)
- CStdString GetUAWindowsVersion();
+ std::string GetUAWindowsVersion();
#endif
- CStdString GetUserAgent();
+ std::string GetUserAgent();
bool HasInternet();
bool IsAppleTV2();
bool HasVideoToolBoxDecoder();