Add ifdefs to work with and without cegcc support for ConnMgr (which

for now seems to lack ability to link so I'm still loading procs by
name); don't close ConnMgr connection when phone stopped so can get
notified of further changes and needn't restart; on WM_ACTIVATE, put
full-screen mode in sync with prefs setting to fix crash where app is
launched while running and yields to prev running copy which then crashes
on exit on Treo700w (see recent checkin 2853).
This commit is contained in:
ehouse 2009-12-23 06:01:26 +00:00
parent 488a102977
commit 3ae0df2764
7 changed files with 78 additions and 208 deletions

View file

@ -56,7 +56,7 @@
#include "cesms.h"
#include "cesockwr.h"
#include "ceresstr.h"
#include "connmgr.h"
#include "ceconnmg.h"
#include "dbgutil.h"
@ -1331,7 +1331,7 @@ getOSInfo( CEAppGlobals* globals )
#ifndef XWFEATURE_STANDALONE_ONLY
#ifdef _WIN32_WCE
#if defined _WIN32_WCE && ! defined CEGCC_DOES_CONNMGR
# define LOAD_PTR( typ, name ) { \
typ proc; \
proc = (typ)GetProcAddress( hcellDll, TEXT(#name));\
@ -1537,7 +1537,7 @@ InitInstance(HINSTANCE hInstance, int nCmdShow
trapBackspaceKey( hWnd );
#ifdef _WIN32_WCE
#if defined _WIN32_WCE && ! defined CEGCC_DOES_CONNMGR
initConnMgr( globals );
#endif
@ -2145,7 +2145,7 @@ freeGlobals( CEAppGlobals* globals )
}
WSACleanup();
# ifdef _WIN32_WCE
# if defined _WIN32_WCE && ! defined CEGCC_DOES_CONNMGR
if ( !!globals->hcellDll ) {
FreeLibrary( globals->hcellDll );
globals->hcellDll = NULL;
@ -2315,7 +2315,7 @@ ceCheckHandleFocusKey( CEAppGlobals* globals, WPARAM wParam, LPARAM lParam,
/* Sometimes, e.g. after a menu is released, we get KEY_UP not preceeded
by KEY_DOWN. Just drop those. */
if ( !keyDown && !globals->keyDown ) {
XP_LOGF( "%s: keyUp not preceeded by keyDown: dropping", __func__ );
/* drop key; don't log as it happens all the time */
} else {
XP_Bool isRepeat = keyDown && ((HIWORD(lParam) & KF_REPEAT) != 0);
XP_Key key;
@ -2498,6 +2498,11 @@ WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_ACTIVATE:
// Notify shell of our activate message
SHHandleWMActivate( hWnd, wParam, lParam, &globals->sai, FALSE );
if ( !!globals && !!globals->game.board ) {
if ( ceSizeIfFullscreen( globals, globals->hWnd ) ) {
(void)cePositionBoard( globals );
}
}
break;
case WM_SETTINGCHANGE:
@ -3263,7 +3268,7 @@ ce_send_proc( const XP_U8* buf, XP_U16 len, const CommsAddrRec* addrp,
= ce_sockwrap_new( MPPARM(globals->mpool)
globals->hWnd,
got_data_proc,sock_state_change,
#ifdef _WIN32_WCE
#if defined _WIN32_WCE && ! defined CEGCC_DOES_CONNMGR
&globals->cmProcs,
#endif
globals );

View file

@ -28,7 +28,7 @@
#include "util.h"
#include "mempool.h"
#include "cesockwr.h"
#include "connmgr.h"
#include "ceconnmg.h"
#define LCROSSWORDS_DIR_NODBG L"Crosswords"
#define CE_GAMEFILE_VERSION1 0x01 /* means draw gets to save/restore */

View file

@ -28,7 +28,7 @@
#include "cemain.h"
#include "cedebug.h"
#include "debhacks.h"
#include "connmgr.h"
#include "ceconnmg.h"
/* This object owns all network activity: sending and receiving packets. It
@ -45,8 +45,10 @@ struct CeSocketWrapper {
HWND hWnd;
DataRecvProc dataProc;
StateChangeProc stateProc;
#ifdef _WIN32_WCE
#if defined _WIN32_WCE
# if ! defined CEGCC_DOES_CONNMGR
const CMProcs* cmProcs;
# endif
HANDLE connMgrHandle;
#endif
void* closure;
@ -78,6 +80,14 @@ struct CeSocketWrapper {
MPSLOT
};
#ifdef _WIN32_WCE
# ifdef CEGCC_DOES_CONNMGR
# define CMCALL(proc) proc
# else
# define CMCALL(proc) (*self->cmProcs->proc)
# endif
#endif
#ifdef DEBUG
static const char*
ConnState2Str( CeConnState connState )
@ -275,12 +285,11 @@ openNetwork( CeSocketWrapper* self )
if ( !!self->connMgrHandle ) { /* already have a connection? */
DWORD status;
res = (*self->cmProcs->ConnMgrConnectionStatus)( self->connMgrHandle,
&status );
res = CMCALL(ConnMgrConnectionStatus)( self->connMgrHandle, &status );
if ( SUCCEEDED(res) && status == CONNMGR_STATUS_CONNECTED ) {
stateChanged( self, CE_IPST_NETWORK_OPENED );
} else {
(*self->cmProcs->ConnMgrReleaseConnection)( self->connMgrHandle, 1 );
CMCALL(ConnMgrReleaseConnection)( self->connMgrHandle, 1 );
self->connMgrHandle = NULL;
}
}
@ -290,7 +299,7 @@ openNetwork( CeSocketWrapper* self )
HANDLE hand;
XP_MEMSET( &cmi, 0, sizeof(cmi) );
res = (*self->cmProcs->ConnMgrMapURL)( L"http://google.com",
res = CMCALL(ConnMgrMapURL)( L"http://google.com",
&cmi.guidDestNet, NULL );
if ( SUCCEEDED(res) ) {
cmi.cbSize = sizeof(cmi);
@ -301,7 +310,7 @@ openNetwork( CeSocketWrapper* self )
cmi.hWnd = self->hWnd;
cmi.uMsg = XWWM_CONNMGR_EVT;
res = (*self->cmProcs->ConnMgrEstablishConnection)( &cmi, &hand );
res = CMCALL(ConnMgrEstablishConnection)( &cmi, &hand );
if ( SUCCEEDED(res) ) {
self->connMgrHandle = hand;
stateChanged( self, CE_IPST_OPENING_NETWORK );
@ -335,7 +344,7 @@ getHostAddr( CeSocketWrapper* self )
CeSocketWrapper*
ce_sockwrap_new( MPFORMAL HWND hWnd, DataRecvProc dataCB,
StateChangeProc stateCB,
#ifdef _WIN32_WCE
#if defined _WIN32_WCE && ! defined CEGCC_DOES_CONNMGR
const CMProcs* cmProcs,
#endif
void* closure )
@ -348,7 +357,7 @@ ce_sockwrap_new( MPFORMAL HWND hWnd, DataRecvProc dataCB,
self->hWnd = hWnd;
self->dataProc = dataCB;
self->stateProc = stateCB;
#ifdef _WIN32_WCE
#if defined _WIN32_WCE && ! defined CEGCC_DOES_CONNMGR
self->cmProcs = cmProcs;
#endif
self->closure = closure;
@ -370,7 +379,7 @@ ce_sockwrap_delete( CeSocketWrapper* self )
#ifdef _WIN32_WCE
if ( !!self->connMgrHandle ) {
(*self->cmProcs->ConnMgrReleaseConnection)( self->connMgrHandle, 1 );
CMCALL(ConnMgrReleaseConnection)( self->connMgrHandle, 1 );
self->connMgrHandle = NULL;
}
#endif
@ -545,10 +554,42 @@ ce_sockwrap_event( CeSocketWrapper* self, WPARAM wParam, LPARAM lParam )
} /* ce_sockwrap_event */
#ifdef _WIN32_WCE
#ifdef DEBUG
static const char*
CMStatus2Str( WPARAM status )
{
#define CASESTR(s) case (s): return #s
switch( status ) {
CASESTR( CONNMGR_STATUS_CONNECTED );
CASESTR( CONNMGR_STATUS_NOPATHTODESTINATION );
CASESTR( CONNMGR_STATUS_CONNECTIONCANCELED );
CASESTR( CONNMGR_STATUS_CONNECTIONLINKFAILED );
CASESTR( CONNMGR_STATUS_CONNECTIONDISABLED );
CASESTR( CONNMGR_STATUS_AUTHENTICATIONFAILED );
CASESTR( CONNMGR_STATUS_PHONEOFF );
CASESTR( CONNMGR_STATUS_UNKNOWN );
CASESTR( CONNMGR_STATUS_DISCONNECTED );
CASESTR( CONNMGR_STATUS_CONNECTIONFAILED );
CASESTR( CONNMGR_STATUS_WAITINGFORPATH );
CASESTR( CONNMGR_STATUS_WAITINGFORPHONE );
CASESTR( CONNMGR_STATUS_EXCLUSIVECONFLICT );
CASESTR( CONNMGR_STATUS_WAITINGCONNECTION );
CASESTR( CONNMGR_STATUS_WAITINGFORRESOURCE );
CASESTR( CONNMGR_STATUS_WAITINGFORNETWORK );
CASESTR( CONNMGR_STATUS_WAITINGDISCONNECTION );
CASESTR( CONNMGR_STATUS_WAITINGCONNECTIONABORT );
CASESTR( CONNMGR_STATUS_NOPATHWITHPROPERTY );
}
#undef CASESTR
XP_ASSERT(0);
return "";
}
#endif
void
ce_connmgr_event( CeSocketWrapper* self, WPARAM wParam, ConnMgrErr* userErr )
{
XP_LOGF( "%s: wParam=%x", __func__, wParam );
XP_LOGF( "%s: wParam=%s", __func__, CMStatus2Str(wParam) );
*userErr = CONN_ERR_NONE;
@ -563,14 +604,17 @@ ce_connmgr_event( CeSocketWrapper* self, WPARAM wParam, ConnMgrErr* userErr )
case CONNMGR_STATUS_CONNECTIONLINKFAILED:
case CONNMGR_STATUS_CONNECTIONDISABLED:
case CONNMGR_STATUS_AUTHENTICATIONFAILED:
(*self->cmProcs->ConnMgrReleaseConnection)( self->connMgrHandle, 1 );
/* Do I want to release, or keep it around for status messages
later? */
//(*self->cmProcs->ConnMgrReleaseConnection)( self->connMgrHandle, 1 );
//self->connMgrHandle = NULL;
stateChanged( self, CE_IPST_START );
self->connMgrHandle = NULL;
*userErr = CONN_ERR_NONET;
break;
/* Error the user can fix.... */
case CONNMGR_STATUS_PHONEOFF:
closeConnection( self );
*userErr = CONN_ERR_PHONE_OFF;
break;

View file

@ -23,7 +23,7 @@
#include "comms.h"
#include "mempool.h"
#include "connmgr.h"
#include "ceconnmg.h"
typedef enum {
CE_IPST_START
@ -51,7 +51,7 @@ typedef void (*StateChangeProc)( void* closure, CeConnState oldState,
CeSocketWrapper* ce_sockwrap_new( MPFORMAL HWND hWnd, DataRecvProc dataCB,
StateChangeProc stateCB,
#ifdef _WIN32_WCE
#if defined _WIN32_WCE && ! defined CEGCC_DOES_CONNMGR
const CMProcs* cmProcs,
#endif
void* globals );

View file

@ -302,12 +302,15 @@ ceSize( CEAppGlobals* globals, HWND hWnd, XP_Bool fullScreen )
rect.bottom - rect.top, TRUE );
} /* ceSize */
void
XP_Bool
ceSizeIfFullscreen( CEAppGlobals* globals, HWND hWnd )
{
if ( globals->appPrefs.fullScreen != ceIsFullScreen(globals, hWnd) ) {
XP_Bool resized = globals->appPrefs.fullScreen
!= ceIsFullScreen(globals, hWnd);
if ( resized ) {
ceSize( globals, hWnd, globals->appPrefs.fullScreen );
}
return resized;
}
static XP_Bool

View file

@ -96,9 +96,9 @@ void ceSetLeftSoftkey( CEAppGlobals* globals, XP_U16 id );
XP_Bool ceGetExeDir( wchar_t* buf, XP_U16 bufLen );
#if defined _WIN32_WCE
void ceSizeIfFullscreen( CEAppGlobals* globals, HWND hWnd );
XP_Bool ceSizeIfFullscreen( CEAppGlobals* globals, HWND hWnd );
#else
# define ceSizeIfFullscreen( globals, hWnd )
# define ceSizeIfFullscreen( globals, hWnd ) XP_FALSE
#endif
#ifdef OVERRIDE_BACKKEY

View file

@ -1,182 +0,0 @@
/* -*-mode: C; fill-column: 77; c-basic-offset: 4; -*- */
/*
* Copyright 2005-2009 by Eric House (xwords@eehouse.org). All rights
* reserved.
*
* 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.
*/
/* This should eventually be contributed to cegcc. Everything it in comes
* from MSDN
*/
#ifndef _CONNMGR_H_
#define _CONNMGR_H_
#include <winuser.h>
/* from http://hi.baidu.com/53_54/blog/index/1 */
#ifndef S_OK
# define S_OK 0
#endif
#ifndef CONNMGR_PARAM_GUIDDESTNET
# define CONNMGR_PARAM_GUIDDESTNET 0x1
#endif
#ifndef CONNMGR_FLAG_PROXY_HTTP
# define CONNMGR_FLAG_PROXY_HTTP 0x1
#endif
#ifndef CONNMGR_PRIORITY_USERINTERACTIVE
# define CONNMGR_PRIORITY_USERINTERACTIVE 0x08000
#endif
#ifndef CONNMGR_STATUS_CONNECTED
# define CONNMGR_STATUS_CONNECTED 0x10
#endif
#if 0
/* from http://www.dotnet247.com/247reference/msgs/53/267570.aspx */
public const uint CONNMGR_STATUS_UNKNOWN = 0x00; // Unknown status
public const uint CONNMGR_STATUS_CONNECTED = 0x10; // Connection is up
public const uint CONNMGR_STATUS_DISCONNECTED = 0x20; // Connection is disconnected
public const uint CONNMGR_STATUS_CONNECTIONFAILED = 0x21; // Connection failed and cannot not be reestablished
public const uint CONNMGR_STATUS_CONNECTIONCANCELED = 0x22; // User aborted connection
public const uint CONNMGR_STATUS_CONNECTIONDISABLED = 0x23; // Connection is ready to connect but disabled
public const uint CONNMGR_STATUS_NOPATHTODESTINATION = 0x24; // No path could be found to destination
public const uint CONNMGR_STATUS_WAITINGFORPATH = 0x25; // Waiting for a path to the destination
public const uint CONNMGR_STATUS_WAITINGFORPHONE = 0x26; // Voice call is in progress
public const uint CONNMGR_STATUS_WAITINGCONNECTION = 0x40; // Attempting to connect
public const uint CONNMGR_STATUS_WAITINGFORRESOURCE = 0x41; // Resource is in use by another connection
public const uint CONNMGR_STATUS_WAITINGFORNETWORK = 0x42; // No path could be found to destination
public const uint CONNMGR_STATUS_WAITINGDISCONNECTION = 0x80; // Connection is being brought down
public const uint CONNMGR_STATUS_WAITINGCONNECTIONABORT = 0x81; // Aborting connection attempt
#endif
/*
A bunch of these constants are from:
http://74.125.155.132/search?q=cache:fZImjloe6fsJ:download.microsoft.com/download/6/B/C/6BC8CDA8-9035-43AC-AFB8-B5B7DC550949/OCS%25202007%2520R2%2520Technical%2520Reference%2520for%2520Clients.doc+define+CONNMGR_STATUS_PHONEOFF&cd=1&hl=en&ct=clnk&gl=us&client=iceweasel-a
*/
/* this URL provides the following definitions
http://technet.microsoft.com/en-us/library/dd637175%28office.13%29.aspx
CONNMGR_STATUS_CONNECTIONLINKFAILED(0x2A)
CONNMGR_STATUS_CONNECTIONFAILED(0x21)
CONNMGR_STATUS_EXCLUSIVECONFLICT(0x28)
CONNMGR_STATUS_NOPATHTODESTINATION(0x24)
CONNMGR_STATUS_CONNECTIONCANCELED(0x22)
CONNMGR_STATUS_WAITINGFORPATH(0x25)
CONNMGR_STATUS_PHONEOFF(0x27)
CONNMGR_STATUS_WAITINGFORPHONE(0x26)
CONNMGR_STATUS_AUTHENTICATIONFAILED(0x2B)
CONNMGR_STATUS_NOPATHWITHPROPERTY(0x2C)
CONNMGR_STATUS_UNKNOWN( 0X00)
*/
#ifndef CONNMGR_STATUS_UNKNOWN
# define CONNMGR_STATUS_UNKNOWN 0x00
#endif
#ifndef CONNMGR_STATUS_CONNECTED
# define CONNMGR_STATUS_CONNECTED 0x10
#endif
// CONNMGR_STATUS_SUSPENDED
#ifndef CONNMGR_STATUS_DISCONNECTED
# define CONNMGR_STATUS_DISCONNECTED 0x20
#endif
#ifndef CONNMGR_STATUS_CONNECTIONFAILED
# define CONNMGR_STATUS_CONNECTIONFAILED 0x21
#endif
#ifndef CONNMGR_STATUS_CONNECTIONCANCELED
# define CONNMGR_STATUS_CONNECTIONCANCELED 0x22
#endif
#ifndef CONNMGR_STATUS_CONNECTIONDISABLED
# define CONNMGR_STATUS_CONNECTIONDISABLED 0x23
#endif
#ifndef CONNMGR_STATUS_NOPATHTODESTINATION
# define CONNMGR_STATUS_NOPATHTODESTINATION 0x24
#endif
#ifndef CONNMGR_STATUS_WAITINGFORPATH
# define CONNMGR_STATUS_WAITINGFORPATH 0x25
#endif
#ifndef CONNMGR_STATUS_WAITINGFORPHONE
# define CONNMGR_STATUS_WAITINGFORPHONE 0x26
#endif
#ifndef CONNMGR_STATUS_PHONEOFF
# define CONNMGR_STATUS_PHONEOFF 0x27
#endif
#ifndef CONNMGR_STATUS_EXCLUSIVECONFLICT
# define CONNMGR_STATUS_EXCLUSIVECONFLICT 0x28
#endif
// CONNMGR_STATUS_NORESOURCES
#ifndef CONNMGR_STATUS_CONNECTIONLINKFAILED
# define CONNMGR_STATUS_CONNECTIONLINKFAILED 0x2A
#endif
#ifndef CONNMGR_STATUS_AUTHENTICATIONFAILED
# define CONNMGR_STATUS_AUTHENTICATIONFAILED 0x2B
#endif
#ifndef CONNMGR_STATUS_WAITINGCONNECTION
# define CONNMGR_STATUS_WAITINGCONNECTION 0x40
#endif
#ifndef CONNMGR_STATUS_WAITINGFORRESOURCE
# define CONNMGR_STATUS_WAITINGFORRESOURCE 0x41
#endif
#ifndef CONNMGR_STATUS_WAITINGFORNETWORK
# define CONNMGR_STATUS_WAITINGFORNETWORK 0x42
#endif
#ifndef CONNMGR_STATUS_WAITINGDISCONNECTION
# define CONNMGR_STATUS_WAITINGDISCONNECTION 0x80
#endif
#ifndef CONNMGR_STATUS_WAITINGCONNECTIONABORT
# define CONNMGR_STATUS_WAITINGCONNECTIONABORT 0x81
#endif
#ifndef CONNMGR_STATUS_NOPATHWITHPROPERTY
# define CONNMGR_STATUS_NOPATHWITHPROPERTY 0x2C
#endif
typedef struct _CONNMGR_CONNECTIONINFO {
DWORD cbSize;
DWORD dwParams;
DWORD dwFlags;
DWORD dwPriority;
BOOL bExclusive;
BOOL bDisabled;
GUID guidDestNet;
HWND hWnd;
UINT uMsg;
LPARAM lParam;
ULONG ulMaxCost;
ULONG ulMinRcvBw;
ULONG ulMaxConnLatency;
} CONNMGR_CONNECTIONINFO;
/* procptr typedefs since we're loading by name */
typedef HRESULT (*ConnMgrRegisterForStatusChangeNotificationProc)( BOOL, HWND );
/* Returns S_OK if successful or returns an error code if the function call
failed.*/
typedef HRESULT (*ConnMgrEstablishConnectionProc)( CONNMGR_CONNECTIONINFO*,
HANDLE* );
typedef HRESULT (*ConnMgrConnectionStatusProc)( HANDLE, DWORD* );
typedef HRESULT (*ConnMgrMapURLProc)( LPTSTR, GUID*, DWORD* );
typedef HRESULT (*ConnMgrReleaseConnectionProc)( HANDLE, LONG );
typedef struct _CMProcs {
ConnMgrEstablishConnectionProc ConnMgrEstablishConnection;
ConnMgrConnectionStatusProc ConnMgrConnectionStatus;
ConnMgrMapURLProc ConnMgrMapURL;
ConnMgrReleaseConnectionProc ConnMgrReleaseConnection;
} CMProcs;
#endif