20 #import <msxml6.dll> named_guids
24 #if( FMI_SUPPORT_A612 ) 26 #define MULTIPART_CONTENT_HEADER "Content-Type: multipart/related; boundary=\"" 36 #if( FMI_SUPPORT_A621 ) 47 : CDialog( CCustomFormsDlg::IDD, pParent ),
50 m_templateTransform =
new XMLTransformer( _T(
"custom-forms\\preview_template.xsl" ) );
51 m_submittedTransform =
new XMLTransformer( _T(
"custom-forms\\preview_submitted.xsl" ) );
59 delete m_templateTransform;
60 delete m_submittedTransform;
71 CDialog::DoDataExchange(pDX);
83 CDialog::OnInitDialog();
85 _variant_t flags( 0L, VT_I4 );
86 _variant_t target_frame_name(
"" );
87 _variant_t post_data(
"" );
88 _variant_t headers(
"" );
93 if ( !catalog.Open( _T(
"custom-forms\\catalog.xml" ), CFile::modeCreate | CFile::modeWrite, &pEx ) )
95 m_browser.Navigate( _T(
"about:blank" ), &flags, &target_frame_name, &post_data, &headers );
97 pEx.GetErrorMessage( msg, 256 );
98 m_browser.WriteContent( CString( msg ) );
101 CString filePath = catalog.GetFilePath();
104 if ( buildCatalog( filePath ) )
106 CString url(
"file:///" );
108 m_browser.Navigate( url, &flags, &target_frame_name, &post_data, &headers );
137 CDialog::OnSize( aType, aClientWidth, aClientHeight );
139 if ( NULL == m_browser.GetSafeHwnd() )
147 GetClientRect( &rect );
149 m_browser.MoveWindow( rect.left, rect.top, rect.Width(), rect.Height() );
157 message.Format( _T(
"The device has reported that form template %d was deleted" ), (
int) wParam );
158 MessageBox( message, _T(
"Form Template Deleted" ), MB_OK | MB_ICONINFORMATION );
169 message.Format( _T(
"The device has reported that form template %d is at position %d" ), (
int) wParam, (
uint8) lParam );
170 MessageBox( message, _T(
"Form Template Position" ), MB_OK | MB_ICONINFORMATION );
175 #if( FMI_SUPPORT_A621 ) 182 message.Format( _T(
"Failed to Show form: Form ID Not Present on Device" ));
183 MessageBox( message, _T(
"Show Form Failed" ), MB_OK | MB_ICONINFORMATION );
194 message.Format( _T(
"Form successfully displayed on device." ));
195 MessageBox( message, _T(
"Show Form Success" ), MB_OK | MB_ICONINFORMATION );
201 static BOOL
skipTo( CFile & src,
const char * boundary )
203 size_t boundaryLen = strlen( boundary );
204 char * buf =
new char[boundaryLen];
205 memset( buf, 0, boundaryLen );
208 while( ( rLen = src.Read( (
void* ) &buf[offset++], 1 ) ) >= 0 )
210 if( 0 == strncmp( buf, boundary, min( offset, boundaryLen ) ) )
212 if( offset == boundaryLen )
215 src.Read( (
void* ) buf, 1 );
218 src.Read( (
void* ) buf, 1 );
226 memset( buf, 0, boundaryLen );
234 static BOOL
readUntil( CFile & src,
const char * boundary, CFile & dst )
236 size_t boundaryLen = strlen( boundary );
237 char * buf =
new char[boundaryLen];
238 memset( buf, 0, boundaryLen );
241 while( ( rLen = src.Read( (
void* ) &buf[offset++], 1 ) ) >= 0 )
243 if( 0 == strncmp( buf, boundary, min( offset, boundaryLen ) ) )
245 if( offset == boundaryLen )
248 src.Read( (
void* ) buf, 1 );
251 src.Read( (
void* ) buf, 1 );
259 dst.Write( (
void* ) buf, offset );
260 memset( buf, 0, boundaryLen );
268 static BOOL
readLine( CFile & src, std::string & dst )
271 BOOL expectLF =
FALSE;
273 while( ( rLen = src.Read( (
void* ) b, 1 ) ) == 1 )
299 static void write(CFile * file,
char * text)
301 file->Write( (
const void * )text, ( UINT ) strlen( text ) );
307 static void write(CFile * file, std::string & text)
309 file->Write( (
const void * )text.c_str(), ( UINT ) text.length() );
312 static BOOL
extractMultiPart( CFile & srcFile, CString dstPath, CStringArray & extractedFiles )
314 std::string boundary;
317 boundary = boundary.substr( 0, boundary.length() - 1 );
318 if( !
skipTo( srcFile, boundary.c_str() ) )
322 std::string contentType, other;
324 while(
readLine( srcFile, contentType ) )
327 if( 0 == other.find(
"Content-ID:" ) )
329 contentID = CString( other.substr( 11 ).c_str() );
330 contentID = contentID.Trim();
331 contentID = contentID.Mid( 1, contentID.GetLength() - 2 );
334 if( !dstFile.Open( dstPath + _T(
"\\" ) + contentID, CFile::modeCreate | CFile::modeWrite ) )
338 readUntil( srcFile, boundary.c_str(), dstFile );
340 extractedFiles.Add( contentID );
342 else if( 0 == contentType.find(
"Content-Type" ) && 0 < contentType.find(
"text/xml" ) )
344 contentID = _T(
"main.xml" );
346 if( !dstFile.Open( dstPath + _T(
"\\" ) + contentID, CFile::modeCreate | CFile::modeWrite ) )
351 std::tr1::regex pattern(
"\"cid:(.*)\"" );
352 std::string replace =
"\"$1\"";
356 if( 0 == line.compare( boundary ) )
360 std::string changed = std::tr1::regex_replace( line, pattern, replace );
361 write( &dstFile, changed );
362 write( &dstFile,
"\r\n" );
366 extractedFiles.Add( contentID );
385 MSXML2::IXMLDOMDocument2Ptr submitDoc( MSXML2::CLSID_DOMDocument60 );
387 submitDoc->async = VARIANT_FALSE;
388 submitDoc->validateOnParse = VARIANT_FALSE;
389 submitDoc->resolveExternals = VARIANT_FALSE;
393 if( !f.Open( tempFile, CFile::modeRead | CFile::typeBinary ) )
395 MessageBox( _T(
"Unable to parse submitted form file" ), _T(
"Form Submitted"), MB_ICONERROR | MB_OK );
401 memset( header, 0,
sizeof( header ) );
402 UINT rLen = f.Read( header, mpchLen );
405 if( rLen != mpchLen )
408 MessageBox( _T(
"Unable to parse submitted form file - unrecognized header" ), _T(
"Form Submitted"), MB_ICONERROR | MB_OK );
412 CString srcPath = tempFile.Left( tempFile.ReverseFind(
'\\' ) );
413 COleDateTime submitTime = COleDateTime::GetCurrentTime();
414 CString submitTimeStr = submitTime.Format( _T(
"%Y-%m-%d_%H.%M.%S" ) );
415 if( 0 == strncmp( header,
"<?xml", strlen(
"<?xml" ) ) )
418 files.Add( tempFile );
422 if( srcPath.GetLength() > 0 )
424 srcPath += _T(
"\\" );
426 srcPath += submitTimeStr;
427 if( ERROR_PATH_NOT_FOUND == CreateDirectory( srcPath, NULL) )
429 MessageBox( _T(
"Failed to create temporary folder " ) + srcPath, _T(
"Form Submitted" ), MB_OK | MB_ICONERROR );
434 DeleteFile( tempFile );
435 srcPath += _T(
"\\" );
436 tempFile = srcPath + files[0];
442 MessageBox( _T(
"Unable to parse submitted form file - unrecognized header" ), _T(
"Form Submitted"), MB_ICONERROR | MB_OK );
445 VARIANT_BOOL loaded = submitDoc->load( _variant_t( tempFile ) );
446 if ( VARIANT_TRUE != loaded )
448 if ( submitDoc->parseError )
450 CString reason = submitDoc->parseError->Getreason();
451 MessageBox( reason, _T(
"Form Submitted"), MB_ICONERROR | MB_OK );
455 MessageBox( _T(
"Unable to parse submitted form file - XML parse error" ), _T(
"Form Submitted"), MB_ICONERROR | MB_OK );
460 MSXML2::IXMLDOMNodePtr formId = submitDoc->selectSingleNode( _bstr_t(
"//form/@id" ) );
461 MSXML2::IXMLDOMNodePtr formVersion = submitDoc->selectSingleNode( _bstr_t(
"//form/@version" ) );
462 if ( formId == NULL )
464 MessageBox( _T(
"Submitted form file's form element does not contain required attribute 'id'" ), _T(
"Form Submitted"), MB_ICONERROR | MB_OK );
467 if ( formVersion == NULL)
469 MessageBox( _T(
"Submitted form file's form element does not contain required attribute 'version'" ), _T(
"Form Submitted"), MB_ICONERROR | MB_OK );
475 CStringArray folders;
476 folders.Add( _T(
"custom-forms" ) );
477 folders.Add( _T(
"library" ) );
478 folders.Add( formId->Gettext() );
479 folders.Add( formVersion->Gettext() );
480 folders.Add( submitTimeStr );
482 for(
int i=0; i<folders.GetCount(); i++ )
484 destPath += folders[i] + _T(
"\\" );
485 if( ERROR_PATH_NOT_FOUND == CreateDirectory( destPath, NULL) )
487 MessageBox( _T(
"Failed to create repository folder " ) + destPath, _T(
"Form Submitted" ), MB_OK | MB_ICONERROR );
491 for(
int i=0; i<files.GetCount(); i++ )
493 CString destFile = destPath + files[i];
495 if( tempFile.Find( files[i] ) >= 0 )
497 destFile = destPath + _T(
"main.xml" );
499 if( !MoveFile( srcPath + files[i], destFile ) )
501 MessageBox( _T(
"Failed to move submitted form file to repository " ) + destPath, _T(
"Form Submitted" ), MB_OK | MB_ICONERROR );
517 if ( !catalog.Open( _T(
"custom-forms\\catalog.xml" ), CFile::modeCreate | CFile::modeWrite, &pEx ) )
522 CString filePath = catalog.GetFilePath();
525 if ( buildCatalog( filePath ) )
527 CString url(
"file:///" );
529 url.Replace(
'\\',
'/' );
534 if ( 0 == url.CompareNoCase( browserAddress ) )
546 MSXML2::IXMLDOMDocument2Ptr doc( MSXML2::CLSID_DOMDocument60 );
547 doc->loadXML( _T(
"<catalog></catalog>" ) );
548 MSXML2::IXMLDOMElementPtr root = doc->GetdocumentElement();
550 vtObject.vt = VT_DISPATCH;
551 vtObject.pdispVal = root;
552 vtObject.pdispVal->AddRef();
553 MSXML2::IXMLDOMProcessingInstructionPtr xmlProc = doc->createProcessingInstruction(
"xml",
" version='1.0' encoding='UTF-8'" );
554 doc->insertBefore( xmlProc, vtObject );
555 MSXML2::IXMLDOMProcessingInstructionPtr xslProc = doc->createProcessingInstruction(
"xml-stylesheet",
" type='text/xsl' href='catalog.xsl'" );
556 doc->insertBefore( xslProc, vtObject );
560 CStringArray formFolders;
561 BOOL bWorking = ff.FindFile( _T(
"custom-forms\\library\\*" ) );
564 bWorking = ff.FindNextFileW();
565 if ( ff.IsDirectory() && !ff.IsDots() )
567 formFolders.Add( ff.GetFileName() );
573 MSXML2::IXMLDOMSchemaCollection2Ptr templateSchemas( MSXML2::CLSID_XMLSchemaCache60 );
574 templateSchemas->add( _bstr_t(
"" ), _bstr_t(
"custom-forms\\form_template.xsd" ) );
576 MSXML2::IXMLDOMDocument2Ptr templateDoc( MSXML2::CLSID_DOMDocument60 );
577 templateDoc->schemas = templateSchemas.GetInterfacePtr();;
579 templateDoc->async = VARIANT_FALSE;
580 templateDoc->validateOnParse = VARIANT_TRUE;
581 templateDoc->resolveExternals = VARIANT_TRUE;
584 MSXML2::IXMLDOMSchemaCollection2Ptr submitSchemas( MSXML2::CLSID_XMLSchemaCache60 );
585 submitSchemas->add( _bstr_t(
"" ), _bstr_t(
"custom-forms\\form_submit.xsd" ) );
587 MSXML2::IXMLDOMDocument2Ptr submitDoc( MSXML2::CLSID_DOMDocument60 );
588 submitDoc->schemas = submitSchemas.GetInterfacePtr();;
590 submitDoc->async = VARIANT_FALSE;
591 submitDoc->validateOnParse = VARIANT_TRUE;
592 submitDoc->resolveExternals = VARIANT_TRUE;
597 CStringArray versionFolders;
598 for (
int i=0; i<formFolders.GetCount(); i++ )
600 MSXML2::IXMLDOMElementPtr formElem = doc->createElement( _T(
"form" ) );
601 formElem->setAttribute( _bstr_t(
"id" ), _variant_t( formFolders[i] ) );
602 root->appendChild( formElem );
604 bWorking = ff.FindFile( _T(
"custom-forms\\library\\" ) + formFolders[i] + _T(
"\\*" ) );
607 bWorking = ff.FindNextFileW();
608 if ( ff.IsDirectory() && !ff.IsDots() )
610 versionFolders.Add( ff.GetFileName() );
614 for (
int j=0; j<versionFolders.GetCount(); j++ )
616 CString versionFolder = _T(
"custom-forms\\library\\" ) + formFolders[i] + _T(
"\\" ) + versionFolders[j];
617 MSXML2::IXMLDOMElementPtr versionElem = doc->createElement( _T(
"version" ) );
618 versionElem->setAttribute( _bstr_t(
"id" ), _variant_t( versionFolders[j] ) );
619 formElem->appendChild( versionElem );
623 if ( formFile.Open( versionFolder + _T(
"\\form.xml" ), CFile::modeRead ) )
625 CString formFilePath = formFile.GetFilePath();
627 VARIANT_BOOL valid = templateDoc->load( _variant_t( formFilePath ) );
628 MSXML2::IXMLDOMElementPtr templateElem = doc->createElement( _T(
"template" ) );
629 versionElem->appendChild( templateElem );
630 if ( VARIANT_TRUE != valid )
632 MSXML2::IXMLDOMElementPtr parseErrorElem = doc->createElement( _T(
"parseError" ) );
633 parseErrorElem->setAttribute( _bstr_t(
"line" ), _variant_t( templateDoc->parseError->Getline() ) );
634 parseErrorElem->setAttribute( _bstr_t(
"char" ), _variant_t( templateDoc->parseError->Getlinepos() ) );
635 parseErrorElem->appendChild( doc->createCDATASection( templateDoc->parseError->Getreason() ) );
636 templateElem->appendChild( parseErrorElem );
638 MSXML2::IXMLDOMElementPtr urlElem = doc->createElement( _T(
"url" ) );
639 formFilePath.Replace(
'\\',
'/' );
640 urlElem->Puttext( _bstr_t( _T(
"file:///" ) + formFilePath ) );
641 templateElem->appendChild( urlElem );
644 bWorking = ff.FindFile( versionFolder + _T(
"\\*_*" ) );
645 CFileStatus fileStatus;
647 bWorking = ff.FindNextFileW();
648 CString submitPath = ff.GetFilePath();
649 CString subPath = ff.GetFileName();
650 if( ff.IsDirectory() )
652 submitPath += _T(
"\\main.xml" );
653 subPath += _T(
"\\main.xml" );
654 if( !CFile::GetStatus( submitPath, fileStatus ) )
656 DWORD lastErr = GetLastError();
657 if( lastErr == ERROR_FILE_NOT_FOUND || lastErr == ERROR_PATH_NOT_FOUND )
663 else if( submitPath.Find( _T(
".xml" ) ) < 0 )
667 MSXML2::IXMLDOMElementPtr submitElem = doc->createElement( _T(
"submit" ) );
668 versionElem->appendChild( submitElem );
669 VARIANT_BOOL valid = submitDoc->load( _variant_t( submitPath ) );
670 if ( VARIANT_TRUE != valid )
672 MSXML2::IXMLDOMElementPtr parseErrorElem = doc->createElement( _T(
"parseError" ) );
673 parseErrorElem->setAttribute( _bstr_t(
"line" ), _variant_t( submitDoc->parseError->Getline() ) );
674 parseErrorElem->setAttribute( _bstr_t(
"char" ), _variant_t( submitDoc->parseError->Getlinepos() ) );
675 parseErrorElem->appendChild( doc->createCDATASection( submitDoc->parseError->Getreason() ) );
676 submitElem->appendChild( parseErrorElem );
678 MSXML2::IXMLDOMElementPtr urlElem = doc->createElement( _T(
"url" ) );
679 subPath.Replace(
'\\',
'/' );
680 urlElem->Puttext( _bstr_t( subPath ) );
681 submitElem->appendChild( urlElem );
682 MSXML2::IXMLDOMElementPtr rootElem = doc->createElement( _T(
"root" ) );
683 subPath = ff.GetRoot();
684 subPath.Replace(
'\\',
'/' );
685 rootElem->Puttext( _bstr_t( _T(
"file:///" ) + subPath ) );
686 submitElem->appendChild( rootElem );
691 versionFolders.RemoveAll();
693 HRESULT hr = doc->save( _variant_t( filePath ) );
694 return SUCCEEDED( hr );
705 if ( !tmpFile.Open( _T(
"custom-forms\\tmp.html" ), CFile::modeCreate | CFile::modeWrite ) ) {
706 m_browser.WriteContent( CString(
"unable to open temporary file" ) );
711 CString url(
"file://" );
712 url += tmpFile.GetFilePath();
718 transformer->
transform( src, fileStream, params );
721 _variant_t flags( 0L, VT_I4 );
722 _variant_t target_frame_name(
"" );
723 _variant_t post_data(
"" );
724 _variant_t headers(
"" );
726 m_browser.Navigate(url, &flags, &target_frame_name, &post_data, &headers );
730 BEGIN_EVENTSINK_MAP(CCustomFormsDlg, CDialog)
736 CString folder = child.Left( child.ReverseFind(
'\\' ) );
738 BOOL bHasMore = ff.FindFile( folder + _T(
"\\*" ) );
746 bHasMore = ff.FindNextFileW();
756 if( !RemoveDirectory( folder ) )
774 if ( URL->vt != VT_BSTR )
779 CString urlStr = URL->bstrVal;
782 if ( urlStr.Find( _T(
"template:" ) ) == 0)
788 CMapStringToString params;
790 params.SetAt( _T(
"resources" ), _T(
"" ) );
792 transform( src, m_templateTransform, params );
794 else if ( urlStr.Find( _T(
"submitted:") ) == 0 )
799 CString submittedFile =
CWebBrowser2::URLDecode( urlStr.Right( urlStr.GetLength() - (int) strlen(
"submitted:" ) ) );
802 CMapStringToString params;
804 params.SetAt( _T(
"resources" ), _T(
"" ) );
806 CString formPath = submittedFile.Left( submittedFile.ReverseFind(
'?' ) );
807 params.SetAt( _T(
"formPath" ), formPath );
808 submittedFile.Replace(
'?',
'/' );
809 CString relPath = submittedFile.Left( submittedFile.ReverseFind(
'/' ) + 1 );
810 params.SetAt( _T(
"relPath" ), relPath );
811 transform( submittedFile, m_submittedTransform, params );
813 else if ( urlStr.Find( _T(
"app:") ) == 0 )
818 CString command = urlStr.Right( urlStr.GetLength() - (int) strlen(
"app:" ) );
819 CString procedure = command.Left( command.Find(
'(' ) );
820 CString args = command.Mid( procedure.GetLength() + 1, command.ReverseFind(
')') - ( procedure.GetLength() + 1 ) );
822 TRACE2(
"app command '%s' executed with args '%s'\r\n", procedure, args );
824 CStringArray arguments;
827 CString token = args.Tokenize( _T(
"," ), curPos );
828 while ( token != _T(
"" ) )
830 if ( 0 == token.Find(
'"' ) )
832 if ( token.GetLength()-1 == token.ReverseFind(
'"' ) )
834 token = token.Mid( 1, token.GetLength() - 2 );
839 token += args.Tokenize( _T(
"," ), curPos );
843 arguments.Add( token );
844 token = args.Tokenize( _T(
"," ), curPos );
847 if ( procedure == _T(
"importForm" ) )
851 else if ( procedure == _T(
"deleteCustom" ) )
853 deleteFromDevice( _ttoi( arguments[0] ) );
855 else if ( procedure == _T(
"changePosition" ) )
857 moveOnDevice( _ttoi( arguments[0] ), (
uint8) _ttoi( arguments[1] ) );
859 else if ( procedure == _T(
"requestPosition" ) )
861 requestPosition( _ttoi( arguments[0] ) );
863 #if( FMI_SUPPORT_A621 ) 864 else if ( procedure == _T(
"showForm" ) )
866 showForm( _ttoi( arguments[0] ) );
869 else if ( procedure == _T(
"sendForm" ) )
871 CString formFile = arguments[0];
872 formFile.Replace(
'/',
'\\');
873 sendToDevice( formFile.Right( formFile.GetLength() - (int) strlen(
"file:///" ) ) );
875 else if ( procedure == _T(
"removeForm" ) )
877 CString formFile = arguments[0];
878 formFile.Replace(
'/',
'\\');
879 CString filename = formFile.Right( formFile.GetLength() - (int) strlen(
"file:///" ) );
880 if ( DeleteFile( filename ) )
887 message.Format( _T(
"Unable to remove form. Error code: %d" ), GetLastError() );
888 MessageBox( message, _T(
"Remove form" ), MB_OK | MB_ICONERROR );
896 TCHAR workingDirectory[200];
902 DWORD returnValue = GetCurrentDirectory( 200, workingDirectory );
903 if( returnValue == 0 || returnValue > 200 )
905 MessageBox( _T(
"Unable to get current directory" ), _T(
"Import Form Template" ), MB_OK | MB_ICONERROR );
914 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
915 _T(
"XML Files (*.xml)|*.xml||" )
918 if( dlg.DoModal() == IDOK )
921 SetCurrentDirectory( workingDirectory );
924 MSXML2::IXMLDOMSchemaCollection2Ptr templateSchemas( MSXML2::CLSID_XMLSchemaCache60 );
925 templateSchemas->add( _bstr_t(
"" ), _bstr_t(
"custom-forms\\form_template.xsd" ) );
927 MSXML2::IXMLDOMDocument2Ptr templateDoc( MSXML2::CLSID_DOMDocument60 );
928 templateDoc->schemas = templateSchemas.GetInterfacePtr();;
930 templateDoc->async = VARIANT_FALSE;
932 templateDoc->validateOnParse = VARIANT_TRUE;
933 templateDoc->resolveExternals = VARIANT_TRUE;
935 VARIANT_BOOL valid = templateDoc->load( _variant_t( dlg.GetPathName() ) );
936 if ( VARIANT_TRUE != valid )
938 CString text = templateDoc->parseError->Getreason();
940 message.Format( _T(
"Form validation failed.\nLine %d, char %d: %s \nDo you want to import anyway?" ),
941 templateDoc->parseError->Getline(), templateDoc->parseError->Getlinepos(), text );
942 if (IDNO == MessageBox(
944 _T(
"Import Form Template" ),
945 MB_YESNO | MB_ICONWARNING ) )
950 templateDoc->validateOnParse = VARIANT_FALSE;
951 templateDoc->load( _variant_t( dlg.GetPathName() ) );
954 MSXML2::IXMLDOMNodePtr formId = templateDoc->selectSingleNode( _bstr_t(
"//form/@id" ) );
955 MSXML2::IXMLDOMNodePtr formVersion = templateDoc->selectSingleNode( _bstr_t(
"//form/@version" ) );
956 MSXML2::IXMLDOMNodePtr formTitle = templateDoc->selectSingleNode( _bstr_t(
"//form/title" ) );
957 CStringArray messages;
958 if ( formId == NULL )
960 messages.Add( _T(
"form element does not contain required attribute 'id'" ) );
962 if ( formVersion == NULL)
964 messages.Add( _T(
"form element does not contain required attribute 'version'" ) );
966 if ( formTitle == NULL)
968 messages.Add( _T(
"form element does not contain required child element 'title'" ) );
970 if ( messages.GetCount() > 0 )
972 CString message(
"Severe error importing form template:" );
973 for (
int i=0; i<messages.GetCount(); i++ )
975 message += _T(
"\n" );
976 message += messages[i];
978 MessageBox( message, _T(
"Import Form Template" ), MB_OK | MB_ICONERROR );
983 CStringArray folders;
984 folders.Add( _T(
"custom-forms" ) );
985 folders.Add( _T(
"library" ) );
986 folders.Add( formId->Gettext() );
987 folders.Add( formVersion->Gettext() );
989 for (
int i=0; i<folders.GetCount(); i++ )
991 path += folders[i] + _T(
"\\" );
992 if ( ERROR_PATH_NOT_FOUND == CreateDirectory( path, NULL) )
994 MessageBox( _T(
"Failed to create repository folder " ) + path, _T(
"Import Form Template" ), MB_OK | MB_ICONERROR );
999 CString targetPath = path + _T(
"\\form.xml" );
1001 CFileStatus existingFile;
1002 if ( CFile::GetStatus(targetPath, existingFile) )
1004 if ( IDOK != MessageBox(
1005 _T(
"A template file already exists for this form id and version\nand will be overwritten if you continue." ),
1006 _T(
"Import Form Template" ),
1007 MB_OKCANCEL | MB_ICONWARNING ) )
1014 if ( CopyFile( dlg.GetPathName(), targetPath,
FALSE ) )
1023 SetCurrentDirectory( workingDirectory );
1029 CFileStatus fileStatus;
1030 if ( !CFile::GetStatus( filename, fileStatus ) )
1033 message.Format( _T(
"Form file %s does not exist." ), filename );
1034 MessageBox( message, _T(
"Send Form Template to Device" ), MB_OK | MB_ICONERROR );
1041 MSXML2::IXMLDOMSchemaCollection2Ptr templateSchemas( MSXML2::CLSID_XMLSchemaCache60 );
1042 templateSchemas->add( _bstr_t(
"" ), _bstr_t(
"custom-forms\\form_template.xsd" ) );
1044 MSXML2::IXMLDOMDocument2Ptr templateDoc( MSXML2::CLSID_DOMDocument60 );
1045 templateDoc->schemas = templateSchemas.GetInterfacePtr();;
1047 templateDoc->async = VARIANT_FALSE;
1048 templateDoc->validateOnParse = VARIANT_TRUE;
1049 templateDoc->resolveExternals = VARIANT_TRUE;
1051 VARIANT_BOOL valid = templateDoc->load( _variant_t( filename ) );
1052 if ( VARIANT_TRUE != valid )
1054 if (IDNO == MessageBox(
1055 _T(
"Form validation failed.\nDo you want to send the file anyway?" ),
1056 _T(
"Send Form Template to Device" ),
1057 MB_YESNO | MB_ICONWARNING ) )
1062 templateDoc->validateOnParse = VARIANT_FALSE;
1063 templateDoc->load( _variant_t( filename ) );
1066 MSXML2::IXMLDOMNodePtr formVersion = templateDoc->selectSingleNode( _bstr_t(
"//form/@version" ) );
1067 if ( formVersion == NULL)
1070 _T(
"Form template does not specify a version attribute, which is necessary for file transport." ),
1071 _T(
"Send Form Template to Device" ),
1072 MB_OK | MB_ICONERROR );
1076 char file[MAX_PATH+1];
1077 char versionString[35];
1079 uint8 versionLength;
1081 memset( version, 0,
sizeof( version ) );
1082 WideCharToMultiByte( mCom.mClientCodepage, 0, formVersion->Gettext(), -1, versionString, 34, NULL, NULL );
1083 versionString[34] =
'\0';
1084 versionLength = (
uint8)
minval( 16, strlen( versionString ) );
1085 memmove( version, versionString, versionLength );
1087 WideCharToMultiByte( CP_ACP, 0, filename, -1, file, MAX_PATH+1, NULL, NULL );
1088 file[MAX_PATH] =
'\0';
1093 sending_dlg.DoModal();
1110 memset( &message, 0,
sizeof( message ) );
1128 #if( FMI_SUPPORT_A621 ) Modal dialog displaying the status of the file transfer.
File-based implementation of IStream interface.
#define minval(_x, _y)
The smaller of _x and _y.
#define IDC_EMBEDDED_BROWSER
Serial communication controller for Garmin and FMI packets.
CString unzip(char *original)
This function will uncompress a file into a new file.
#define SAVE_RECEIVED_FORM_SUBMIT
File name of the saved custom form submission file.
static CString URLDecode(CString sIn)
translate escape sequences into their original characters
unsigned char uint8
8-bit unsigned integer
static HRESULT OpenFile(LPCWSTR pName, IStream **ppStream, bool fWrite)
#define WM_EVENT(_event)
Translation from an application event to the corresponding Windows message.
unsigned long int uint32
32-bit unsigned integer