Bug 561464 - Add support for XPCOM on Android, patch mostly by vlad, r=bsmedberg

This commit is contained in:
Michael Wu 2010-06-01 12:02:42 -07:00
parent 32b9a10bd8
commit f6b9e6e472
12 changed files with 59 additions and 12 deletions

View File

@ -50,6 +50,10 @@
#include "prenv.h"
#include "pratom.h"
#ifdef ANDROID
#include <android/log.h>
#endif
#if defined(XP_BEOS)
/* For DEBUGGER macros */
#include <Debug.h>
@ -309,6 +313,10 @@ NS_DebugBreak(PRUint32 aSeverity, const char *aStr, const char *aExpr,
fprintf(stderr, "\07");
#endif
#ifdef ANDROID
__android_log_print(ANDROID_LOG_INFO, "Gecko", "%s", buf.buffer);
#endif
// Write the message to stderr
fprintf(stderr, "%s\n", buf.buffer);
fflush(stderr);

View File

@ -76,7 +76,7 @@ nsUUIDGenerator::Init()
// We're a service, so we're guaranteed that Init() is not going
// to be reentered while we're inside Init().
#if !defined(XP_WIN) && !defined(XP_MACOSX)
#if !defined(XP_WIN) && !defined(XP_MACOSX) && !defined(ANDROID)
/* initialize random number generator using NSPR random noise */
unsigned int seed;
@ -171,11 +171,19 @@ nsUUIDGenerator::GenerateUUIDInPlace(nsID* id)
* back to it; instead, we use the value returned when we called
* initstate, since older glibc's have broken setstate() return values
*/
#ifndef ANDROID
setstate(mState);
#endif
PRSize bytesLeft = sizeof(nsID);
while (bytesLeft > 0) {
#ifdef ANDROID
long rval = arc4random();
const int mRBytes = 4;
#else
long rval = random();
#endif
PRUint8 *src = (PRUint8*)&rval;
// We want to grab the mRBytes least significant bytes of rval, since
@ -199,8 +207,10 @@ nsUUIDGenerator::GenerateUUIDInPlace(nsID* id)
id->m3[0] &= 0x3f;
id->m3[0] |= 0x80;
#ifndef ANDROID
/* Restore the previous RNG state */
setstate(mSavedState);
#endif
#endif
return NS_OK;

View File

@ -59,7 +59,7 @@ protected:
PRLock* mLock;
#if defined(WINCE)
#elif !defined(XP_WIN) && !defined(XP_MACOSX)
#elif !defined(XP_WIN) && !defined(XP_MACOSX) && !defined(ANDROID)
char mState[128];
char *mSavedState;
PRUint8 mRBytes;

View File

@ -536,7 +536,7 @@ NS_InitXPCOM3(nsIServiceManager* *result,
rv = nsTimerImpl::Startup();
NS_ENSURE_SUCCESS(rv, rv);
#ifndef WINCE
#if !defined(WINCE) && !defined(ANDROID)
NS_TIME_FUNCTION_MARK("Next: setlocale");
// If the locale hasn't already been setup by our embedder,

View File

@ -49,6 +49,10 @@
#include <io.h>
#endif
#ifdef ANDROID
#include <android/log.h>
#endif
const char*
NS_strspnp(const char *delims, const char *str)
{
@ -279,6 +283,15 @@ printf_stderr(const char *fmt, ...)
fclose(fp);
}
#elif defined(ANDROID)
void
printf_stderr(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
__android_log_vprint(ANDROID_LOG_INFO, "Gecko", fmt, args);
va_end(args);
}
#else
void
printf_stderr(const char *fmt, ...)

View File

@ -291,6 +291,9 @@ GetUnixHomeDir(nsILocalFile** aFile)
PR_TRUE,
aFile);
}
#elif defined(ANDROID)
// XXX no home dir on android; maybe we should return the sdcard if present?
return NS_ERROR_FAILURE;
#else
return NS_NewNativeLocalFile(nsDependentCString(PR_GetEnv("HOME")),
PR_TRUE, aFile);

View File

@ -1105,7 +1105,18 @@ nsLocalFile::SetFileSize(PRInt64 aFileSize)
{
CHECK_mPath();
#ifdef HAVE_TRUNCATE64
#if defined(ANDROID)
/* no truncate on bionic */
int fd = open(mPath.get(), O_WRONLY);
if (fd == -1)
return NSRESULT_FOR_ERRNO();
int ret = ftruncate(fd, (off_t)aFileSize);
close(fd);
if (ret == -1)
return NSRESULT_FOR_ERRNO();
#elif defined(HAVE_TRUNCATE64)
if (truncate64(mPath.get(), (off64_t)aFileSize) == -1)
return NSRESULT_FOR_ERRNO();
#else

View File

@ -43,9 +43,9 @@
#include "xpcom-private.h"
//-----------------------------------------------------------------------------
// XP_MACOSX or XP_BEOS
// XP_MACOSX or XP_BEOS or ANDROID
//-----------------------------------------------------------------------------
#if defined(XP_BEOS) || defined(XP_MACOSX)
#if defined(XP_BEOS) || defined(XP_MACOSX) || defined(ANDROID)
#include "nsAString.h"
#include "nsReadableUtils.h"

View File

@ -70,12 +70,12 @@ NS_COM nsresult NS_CopyUnicodeToNative(const nsAString &input, nsACString &outp
* a real function. On Mac OS X and BeOS, it's always UTF-8 while on Windows
* and other platforms (e.g. OS2), it's never UTF-8.
*/
#if defined(XP_UNIX) && !defined(XP_MACOSX)
#if defined(XP_UNIX) && !defined(XP_MACOSX) && !defined(ANDROID)
NS_COM PRBool NS_IsNativeUTF8();
#else
inline PRBool NS_IsNativeUTF8()
{
#if defined(XP_MACOSX) || defined(XP_BEOS)
#if defined(XP_MACOSX) || defined(XP_BEOS) || defined(ANDROID)
return PR_TRUE;
#else
return PR_FALSE;

View File

@ -40,7 +40,7 @@
#include "xptcprivate.h"
#if !defined(LINUX) || !defined(__arm__)
#if !defined(__arm__) && !(defined(LINUX) || defined(ANDROID))
#error "This code is for Linux ARM only. Check that it works on your system, too.\nBeware that this code is highly compiler dependent."
#endif

View File

@ -41,7 +41,7 @@
#include "xptcprivate.h"
#include "xptiprivate.h"
#if !defined(LINUX) || !defined(__arm__)
#if !defined(__arm__) && !(defined(LINUX) || defined(ANDROID))
#error "This code is for Linux ARM only. Please check if it works for you, too.\nDepends strongly on gcc behaviour."
#endif

View File

@ -44,8 +44,10 @@ include $(DEPTH)/config/autoconf.mk
MODULE = xpcom
ifneq (,$(filter-out WINCE SYMBIAN,$(OS_ARCH)))
# Sadly, the code here is too smart for the WinCE/Symbian compiler's brain
# there's no reason to build a target xpidl, why do we do this at all?
##ifneq (,$(filter-out WINCE SYMBIAN,$(OS_ARCH)))
### Sadly, the code here is too smart for the WinCE/Symbian compiler's brain
ifndef CROSS_COMPILE
PROGRAM = xpidl$(BIN_SUFFIX)
SDK_BINARY = $(PROGRAM)
endif