18 #define MAX_INPUT_LENGTH 1024 22 IMPLEMENT_DYNAMIC(CCdtChatDlg, CDialog)
24 BEGIN_MESSAGE_MAP(CCdtChatDlg, CDialog)
26 ON_MESSAGE(
WM_EVENT( EVENT_CDT_PACKET_RECEIVED ), OnCDTPacketReceived )
33 : CDialog( CCdtChatDlg::IDD, pParent ),
41 CCdtChatDlg::~CCdtChatDlg()
50 void CCdtChatDlg::DoDataExchange(CDataExchange* pDX)
52 CDialog::DoDataExchange(pDX);
61 BOOL CCdtChatDlg::OnInitDialog()
65 CDialog::OnInitDialog();
67 mInputField.SetLimitText( MAX_INPUT_LENGTH );
70 mBrowser.GetClientRect( &rect1 );
71 GetClientRect( &rect2 );
72 mPadding = ( rect2.Width() - rect1.Width() ) / 2;
73 mInputField.GetClientRect( &rect1 );
74 mInputHeight = rect1.Height();
76 _variant_t flags( 0L, VT_I4 );
77 _variant_t target_frame_name(
"" );
78 _variant_t post_data(
"" );
79 _variant_t headers(
"" );
80 mBrowser.Navigate( _T(
"about:blank" ), &flags, &target_frame_name, &post_data, &headers );
84 if ( starterFile.Open( _T(
"cdt\\chat-starter.html" ), CFile::modeRead ) )
88 while( 0 < ( readLen = starterFile.Read( buf, 1024 ) ) )
91 mBrowser.WriteContent( CString( buf ) );
104 __packed
struct chat_msg_header
115 __packed
struct chat_msg
123 uint8 body[ MAX_CDT_PAYLOAD -
sizeof( chat_msg_header ) ];
126 static COleDateTime epoch(1970,1,1,0,0,0);
134 void CCdtChatDlg::OnOK()
137 if( 0 == mInputField.GetWindowTextLengthW() )
142 TCHAR text[ MAX_INPUT_LENGTH + 1 ];
143 mInputField.GetWindowText( text,
sizeof( text ) );
144 int byteLength = _tcslen( text ) *
sizeof( TCHAR );
145 uint8 converted[ MAX_INPUT_LENGTH *
sizeof( TCHAR ) ];
146 memset( converted, 0,
sizeof( converted ) );
147 memcpy( converted, (
void*)text, byteLength );
150 COleDateTime currentTime = COleDateTime::GetCurrentTime();
151 COleDateTimeSpan diff = currentTime - epoch;
152 payload.id = diff.GetTotalSeconds();
154 payload.reserved = 0;
158 _T(
"<div class='sent' id='%u'><span class='ts'>%s</span>" ),
160 currentTime.Format( _T(
"%Y-%m-%d %H.%M.%S" ) )
162 TRACE1(
"sent chat message %u\n", payload.id );
164 TCHAR chunk[ MAX_CDT_PAYLOAD ];
166 for(
int i=0; i<byteLength; i +=
sizeof( payload.body ) )
168 memset( &payload.body, 0,
sizeof( payload.body ) );
169 payload.bodyLength = min( byteLength - i,
sizeof( payload.body ) );
170 memcpy( &payload.body, &converted[i], payload.bodyLength );
171 mCom.txCdt( CDT_DATA_TRANSFER, (
uint8*)&payload,
sizeof( chat_msg_header ) + payload.bodyLength );
173 memset( chunk, 0,
sizeof( chunk ) );
174 memcpy( chunk, &converted[i], payload.bodyLength );
175 formatted.AppendFormat(
176 _T(
"<span class='chunk' chunk-id='%d'>%s</span>" ),
183 mBrowser.WriteContent( formatted );
184 mBrowser.WriteContent( _T(
"</div><div class='clear'></div>\n" ) );
186 mInputField.SetWindowTextW( _T(
"" ) );
187 mInputField.SetFocus();
193 LRESULT CCdtChatDlg::OnCDTPacketReceived( WPARAM wParam, LPARAM lParam)
197 uint8 const * cdtPayload = (
uint8 const *) lParam;
200 if( cdtPayloadSize <
sizeof( chat_msg_header ) )
206 memset( &packet, 0,
sizeof( chat_msg ) );
207 memcpy( &packet, cdtPayload, cdtPayloadSize );
209 switch( packet.type )
215 memset( &ack, 0,
sizeof( chat_msg_header ) );
218 ack.chunkId = packet.chunkId;
219 mCom.txCdt( CDT_DATA_TRANSFER, (
uint8*)&ack,
sizeof( chat_msg_header ) );
222 TCHAR text[ MAX_CDT_PAYLOAD + 1 ];
223 memset( text, 0,
sizeof( text ) );
224 memcpy( (
void*)text, (
void*)&packet.body, cdtPayloadSize -
sizeof( chat_msg_header ) );
227 _T(
"<div class='received' received-msg-id='%u'><span class='ts'>%s</span><span class='body'>%s</span></div><div class='clear'></div>\n" ),
229 COleDateTime::GetCurrentTime().Format( _T(
"%Y-%m-%d %H.%M.%S" ) ),
232 mBrowser.WriteContent( formatted );
237 TRACE1(
"received ACK for sent chat message %u\n", packet.id );
239 CString sentMessageId;
240 sentMessageId.Format( _T(
"%u" ), packet.id );
241 args.Add( sentMessageId );
243 chunkId.Format( _T(
"%d" ), packet.chunkId );
245 mBrowser.InvokeScript( _T(
"setDelivered" ), &args );
268 void CCdtChatDlg::OnSize
275 CDialog::OnSize( aType, aClientWidth, aClientHeight );
277 if ( NULL == mBrowser.GetSafeHwnd() )
288 void CCdtChatDlg::updateSize()
291 GetClientRect( &rect );
294 rect.left + mPadding,
296 rect.Width() - ( 2 * mPadding ),
297 rect.Height() - ( ( 3 * mPadding ) + mInputHeight )
299 mInputField.MoveWindow(
300 rect.left + mPadding,
301 rect.Height() - ( mPadding + mInputHeight ),
302 rect.Width() - ( ( 3 * mPadding ) + mInputHeight),
305 GetDlgItem( IDOK )->MoveWindow(
306 rect.right - ( mPadding + mInputHeight ),
307 rect.Height() - ( mPadding + mInputHeight ),
#define IDC_CDT_CHAT_INPUT
signed short int sint16
16-bit signed integer
Serial communication controller for Garmin and FMI packets.
unsigned char uint8
8-bit unsigned integer
#define WM_EVENT(_event)
Translation from an application event to the corresponding Windows message.
unsigned long int uint32
32-bit unsigned integer