📄 os_core_symbian.cpp
字号:
/* $Id: os_core_symbian.cpp 1269 2007-05-12 15:03:23Z bennylp $ */
/*
* Copyright (C)2003-2006 Benny Prijono <benny@prijono.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <pj/os.h>
#include <pj/assert.h>
#include <pj/pool.h>
#include <pj/log.h>
#include <pj/rand.h>
#include <pj/string.h>
#include <pj/guid.h>
#include <pj/except.h>
#include <pj/errno.h>
#include "os_symbian.h"
#define PJ_MAX_TLS 32
#define DUMMY_MUTEX ((pj_mutex_t*)101)
#define DUMMY_SEMAPHORE ((pj_sem_t*)102)
#define THIS_FILE "os_core_symbian.c"
/*
* Note:
*
* The Symbian implementation does not support threading!
*/
struct pj_thread_t
{
char obj_name[PJ_MAX_OBJ_NAME];
void *tls_values[PJ_MAX_TLS];
#if defined(PJ_OS_HAS_CHECK_STACK) && PJ_OS_HAS_CHECK_STACK!=0
pj_uint32_t stk_size;
pj_uint32_t stk_max_usage;
char *stk_start;
const char *caller_file;
int caller_line;
#endif
} main_thread;
struct pj_atomic_t
{
pj_atomic_value_t value;
};
struct pj_sem_t
{
int value;
int max;
};
/* Flags to indicate which TLS variables have been used */
static int tls_vars[PJ_MAX_TLS];
/* atexit handlers */
static unsigned atexit_count;
static void (*atexit_func[32])(void);
/////////////////////////////////////////////////////////////////////////////
//
// CPjTimeoutTimer implementation
//
CPjTimeoutTimer::CPjTimeoutTimer()
: CActive(PJ_SYMBIAN_TIMER_PRIORITY), hasTimedOut_(PJ_FALSE)
{
}
CPjTimeoutTimer::~CPjTimeoutTimer()
{
if (IsActive())
Cancel();
timer_.Close();
}
void CPjTimeoutTimer::ConstructL()
{
hasTimedOut_ = PJ_FALSE;
timer_.CreateLocal();
CActiveScheduler::Add(this);
}
CPjTimeoutTimer *CPjTimeoutTimer::NewL()
{
CPjTimeoutTimer *self = new CPjTimeoutTimer;
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop(self);
return self;
}
void CPjTimeoutTimer::StartTimer(TUint miliSeconds)
{
if (IsActive())
Cancel();
hasTimedOut_ = PJ_FALSE;
timer_.After(iStatus, miliSeconds * 1000);
SetActive();
}
bool CPjTimeoutTimer::HasTimedOut() const
{
return hasTimedOut_ != 0;
}
void CPjTimeoutTimer::RunL()
{
hasTimedOut_ = PJ_TRUE;
}
void CPjTimeoutTimer::DoCancel()
{
timer_.Cancel();
}
TInt CPjTimeoutTimer::RunError(TInt aError)
{
PJ_UNUSED_ARG(aError);
return KErrNone;
}
/////////////////////////////////////////////////////////////////////////////
//
// PjSymbianOS implementation
//
PjSymbianOS::PjSymbianOS()
: isSocketServInitialized_(false), isResolverInitialized_(false),
console_(NULL), selectTimeoutTimer_(NULL)
{
}
// Get PjSymbianOS instance
PjSymbianOS *PjSymbianOS::Instance()
{
static PjSymbianOS instance_;
return &instance_;
}
// Initialize
TInt PjSymbianOS::Initialize()
{
TInt err;
selectTimeoutTimer_ = CPjTimeoutTimer::NewL();
#if 0
pj_assert(console_ == NULL);
TRAPD(err, console_ = Console::NewL(_L("PJLIB"),
TSize(KConsFullScreen,KConsFullScreen)));
return err;
#endif
if (!isSocketServInitialized_) {
err = socketServ_.Connect();
if (err != KErrNone)
goto on_error;
isSocketServInitialized_ = true;
}
if (!isResolverInitialized_) {
err = hostResolver_.Open(SocketServ(), KAfInet, KSockStream);
if (err != KErrNone)
goto on_error;
isResolverInitialized_ = true;
}
return KErrNone;
on_error:
Shutdown();
return err;
}
// Shutdown
void PjSymbianOS::Shutdown()
{
if (isResolverInitialized_) {
hostResolver_.Close();
isResolverInitialized_ = false;
}
if (isSocketServInitialized_) {
socketServ_.Close();
isSocketServInitialized_ = false;
}
if (console_) {
delete console_;
console_ = NULL;
}
if (selectTimeoutTimer_) {
delete selectTimeoutTimer_;
selectTimeoutTimer_ = NULL;
}
}
// Convert to Unicode
TInt PjSymbianOS::ConvertToUnicode(TDes16 &aUnicode, const TDesC8 &aForeign)
{
#if 0
pj_assert(conv_ != NULL);
return conv_->ConvertToUnicode(aUnicode, aForeign, convToUnicodeState_);
#else
return CnvUtfConverter::ConvertToUnicodeFromUtf8(aUnicode, aForeign);
#endif
}
// Convert from Unicode
TInt PjSymbianOS::ConvertFromUnicode(TDes8 &aForeign, const TDesC16 &aUnicode)
{
#if 0
pj_assert(conv_ != NULL);
return conv_->ConvertFromUnicode(aForeign, aUnicode, convToAnsiState_);
#else
return CnvUtfConverter::ConvertFromUnicodeToUtf8(aForeign, aUnicode);
#endif
}
/////////////////////////////////////////////////////////////////////////////
//
// PJLIB os.h implementation
//
PJ_DEF(pj_uint32_t) pj_getpid(void)
{
return 0;
}
PJ_DECL(void) pj_shutdown(void);
/*
* pj_init(void).
* Init PJLIB!
*/
PJ_DEF(pj_status_t) pj_init(void)
{
pj_status_t status;
pj_ansi_strcpy(main_thread.obj_name, "pjthread");
// Init main thread
pj_memset(&main_thread, 0, sizeof(main_thread));
// Initialize PjSymbianOS instance
PjSymbianOS *os = PjSymbianOS::Instance();
PJ_LOG(4,(THIS_FILE, "Initializing PJLIB for Symbian OS.."));
TInt err;
err = os->Initialize();
if (err != KErrNone)
goto on_error;
/* Initialize exception ID for the pool.
* Must do so after critical section is configured.
*/
status = pj_exception_id_alloc("PJLIB/No memory", &PJ_NO_MEMORY_EXCEPTION);
if (status != PJ_SUCCESS)
return status;
PJ_LOG(5,(THIS_FILE, "PJLIB initialized."));
return PJ_SUCCESS;
on_error:
pj_shutdown();
return PJ_RETURN_OS_ERROR(err);
}
PJ_DEF(pj_status_t) pj_atexit(pj_exit_callback func)
{
if (atexit_count >= PJ_ARRAY_SIZE(atexit_func))
return PJ_ETOOMANY;
atexit_func[atexit_count++] = func;
return PJ_SUCCESS;
}
PJ_DEF(void) pj_shutdown(void)
{
/* Call atexit() functions */
while (atexit_count > 0) {
(*atexit_func[atexit_count-1])();
--atexit_count;
}
/* Free exception ID */
if (PJ_NO_MEMORY_EXCEPTION != -1) {
pj_exception_id_free(PJ_NO_MEMORY_EXCEPTION);
PJ_NO_MEMORY_EXCEPTION = -1;
}
/* Clear static variables */
pj_errno_clear_handlers();
PjSymbianOS *os = PjSymbianOS::Instance();
os->Shutdown();
}
/*
* pj_thread_register(..)
*/
PJ_DEF(pj_status_t) pj_thread_register ( const char *cstr_thread_name,
pj_thread_desc desc,
pj_thread_t **thread_ptr)
{
PJ_UNUSED_ARG(cstr_thread_name);
PJ_UNUSED_ARG(desc);
PJ_UNUSED_ARG(thread_ptr);
return PJ_EINVALIDOP;
}
/*
* pj_thread_create(...)
*/
PJ_DEF(pj_status_t) pj_thread_create( pj_pool_t *pool,
const char *thread_name,
pj_thread_proc *proc,
void *arg,
pj_size_t stack_size,
unsigned flags,
pj_thread_t **ptr_thread)
{
PJ_UNUSED_ARG(pool);
PJ_UNUSED_ARG(thread_name);
PJ_UNUSED_ARG(proc);
PJ_UNUSED_ARG(arg);
PJ_UNUSED_ARG(stack_size);
PJ_UNUSED_ARG(flags);
PJ_UNUSED_ARG(ptr_thread);
/* Sorry mate, we don't support threading */
return PJ_ENOTSUP;
}
/*
* pj_thread-get_name()
*/
PJ_DEF(const char*) pj_thread_get_name(pj_thread_t *p)
{
pj_assert(p == &main_thread);
return p->obj_name;
}
/*
* pj_thread_resume()
*/
PJ_DEF(pj_status_t) pj_thread_resume(pj_thread_t *p)
{
PJ_UNUSED_ARG(p);
return PJ_EINVALIDOP;
}
/*
* pj_thread_this()
*/
PJ_DEF(pj_thread_t*) pj_thread_this(void)
{
return &main_thread;
}
/*
* pj_thread_join()
*/
PJ_DEF(pj_status_t) pj_thread_join(pj_thread_t *rec)
{
PJ_UNUSED_ARG(rec);
return PJ_EINVALIDOP;
}
/*
* pj_thread_destroy()
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -