如何在RHTTPSession上使用RConnection初始化的连接?
说明:
下列代码演示了如何在RHTTPSession对象上增加一个由RConnection生成的连接:
RConnection connection; RSocketServ socketServ; RHTTPSession session; User::LeaveIfError(socketServ.Connect()); User::LeaveIfError(connection.Open( socketServ )); User::LeaveIfError(onnection.Start()) session.OpenL(); RHTTPConnectionInfo connInfo = iSession.ConnectionInfo(); RStringPool pool = iSession.StringPool(); connInfo.SetPropertyL(pool.StringF(HTTP::EHttpSocketServ, RHTTPSession::GetTable()), THTTPHdrVal(iSocketServ.Handle())); connInfo.SetPropertyL(pool.StringF(HTTP::EHttpSocketConnection, RHTTPSession::GetTable()), HTTPHdrVal(iConnect.SubSessionHandle())); session.OpenTransactionL(...);
详细描述
现在有这样几个文件需要安装,其中六个基本文件适合所有平台,有一个是可选择安装的文件,它只能安装在Nokia7610上,或平台版本大于7610平台版本的手机上,请问如何在安装时对平台版本进行判断呢?
解决方案
pkg中大部分都可以被条件语句所包含。可是下列内容可能无法这样使用:languages, package-header, package signature, requisites, 和capabilities.
不幸的是,平台版本号正是做为“ requisites"所定义的,因此无法被条件语句所包含。不过好在Nokia所有设备上都有这样一个目录”z:\system\install" ,其中有一个sis文件"Series60vx.x.sis" 。
这样一来,Nokia7610所需安装部件就可写为:
IF exists("z:\system\install\Series60v2.1.sis") ; 7610 dependent component ELSEIF exists("z:\system\install\Series60v2.6.sis") ; Series 60 Platform 2.6 dependent component ELSE ; Series 60 1.x dependent component ENDIF
下列代码演示了如何不经提示对话框而生成一个连接。你需要知道具体接入点的IAP ID。
RSocketServ socketServ; RConnection connection; User::LeaveIfError(socketServ.Connect()); User::LeaveIfError(connect.Open(socketServ)); TCommDbConnPref pref;pref.SetIapId(4); // IAP ID for connection to be used pref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); pref.SetDirection( ECommDbConnectionDirectionOutgoing ); connection.Start(pref);
如何保证主要程序在多个开发平台上都可使用。
开发者开发的跨平台程序可能融合了各平台不同的方法及属性,因此需要小心对待这样的情况。如需将程序设计为适应多平台特性,则需要做一些额外的工作。此外代码重用也是我们必须达到的目标之一。
我们可以通过标准预处理宏来解决跨平台的问题,这样我们即可为每个发行版本来分别编译了。
#ifdef __SERIES60_20__ // call new supported method in Series 60 Developer Platform 2nd Edition #else // call old supported method in Series 60 Developer Platform 1.0 #endif
在9200系列通信器中怎样可以在程序中调用安装管理器?
说明:
完成这个功能可以使用下面的代码
CApaCommandLine* cmdLine; cmdLine=CApaCommandLine::NewLC(); cmdLine->SetLibraryNameL( _L("z:\\System\\apps\\instapp\\instapp.app")); cmdLine->SetDocumentNameL(_L("FileNameToInstall.sis")); cmdLine->SetCommandL(EApaCommandRun); EikDll::StartAppL(*cmdLine); CleanupStack::PopAndDestroy(); // cmdLine
我怎样才能知道某一种消息类型(MTM)是否已经连接了呢?
解决方案
首先,连接到消息服务器,打开一个客户端进程:
CMsvSession* session = CMsvSession::OpenAsyncL(*this);
创建一个CClientMtmRegistry类的对象:
CClientMtmRegistry* mtmReg; mtmReg = CClientMtmRegistry::NewL(*session); /* list of known MTM Uid KUidMsgTypeSMS KUidMsgTypeMultimedia KUidMsgTypePOP3 KUidMsgTypeIMAP4 KUidMsgTypeSMTP */ if (mtmReg->IsPresent(KUidMsgTypePOP3)) { // POP3 MTM is present } if (mtmReg->IsInUse(KUidMsgTypePOP3)) { // POP3 MTM is in use }
如果某一个MTM的UID是未知的,可以用下面的裚环来获取。
TInt mtmCount = mtmReg->NumRegisteredMtmDlls(); for (TInt i=0; i<mtmCount; i++) { TUid mtmUid = mtmReg->MtmTypeUid(i); const CMtmDllInfo* mtmInfo; mtmInfo = &(iMtmReg->RegisteredMtmDllInfo(mtmUid)); TBuf8<256> info; info.Copy(mtmInfo->HumanReadableName()); }
如何发现可用的音频设备
解决方案
检测音频设备并没有直接的方法。但是可以尝试播放一段测试音
乐(频率 20 KHz, 优先级 = EMdaPriorityMin, 长度 = 0 ms).
如果返回的值是KErrInUse,那么这说明音频服务器正在使用中.
注意:有些情况下其他的多媒体客户端程序有可能一直保留对音
频设备的占用。
播放声音的示例代码在Series 60 SDK的Sound example中有演示
如何在一个单独类中使用线程局部存储(TLS)
下列代码演示了一个单独的对象,它的NewL函数使用了TLS来测试本类型的对象是否已綺生成。如果是,则简单返回存储在TLS中的指针(转化为它自己的类型),如果否,则实例化一个这样类型的对象,并存储在TLS中,并给予返回。
注意这里假定在DLL中没有其他类使用本类,如果有的话,那你需要重写一个单独的管理类,它使用TLS来存储一个结构指针,该结构含所有程序需要的单个对象的指针。
Example 1: Singleton implementation based on TLS ============== CMySingleton.h ============== class CMySingleton : public CBase { public: // constructor and destructor static CMySingleton* NewL(); virtual ~CMySingleton(); private: // constructors CMySingleton(); // private because of the singleton pattern; it is // guaranteed that only NewL will call it void ConstructL(); public: // other functions ... private: // other functions ... private: // data ... } ================ CMySingleton.cpp ================ CMySingleton::CMySingleton* NewL() { CMySingleton* singleton; // Check thread local storage: if ( Dll::Tls() == NULL ) { // TLS is still null, which means that no CMySingleton has // been instantiated yet. Do so now, and return that // instance: singleton = new ( ELeave ) CMySingleton(); CleanupStack::PushL( singleton ); singleton->ConstructL(); CleanupStack::Pop( singleton ); // Store a pointer to the new instance in thread local storage: TInt err = Dll::SetTls( static_cast<TAny*>( singleton ) ); if ( err == KErrNone ) { return singleton; } else { delete instance; User::Leave( err ); return NULL; } } else { // CMySingleton has been instantiated once already, so return // that instance: singleton = static_cast<CMySingleton*>( Dll::Tls() ); return singleton; } }
CMdaAudioPlayerUtility不支持buffer形式播放MIDI,只能以文件形式播放。
hoolee提外话,可以自己来实现midi的codec,这样就可以buffer处理了
在调用UserSvr::ResetMachine()方法重启机器时可能会引发数据文件的丢失或损坏。
因为这个函数不允许用户处理退出的准备工作,直接关机当然会损坏文件的数据。
解决方法为,让用户手动选择机器的关闭。
如果使用CSendAs API发送短信,必须由用户明确指定。而使用后发送的短信会存放在发件箱里。
播放AMR文件结束的过早,导致最后的声音都无法听见。
无法听到的那部分至少0.5秒。
解决方法:
在文件末尾加上段静音。
在播放声音时,当有来电出现, 会引发KErrDied错误。
这在系统中是不允许的,因为在硬件设备层是不允许程序声音与来电声音相混合的。注意,这样的情况只发生在上面指定的手机型号中。
如何在来电时播放声音呢,可以使用MMF(Multi Media Framework)中的CMdaAudioOutputStream或CMdaAudioPlayerUtility向audio硬件传递声音。
这样你会获得一个error code -13的错误(KErrDied)
这是没有办法解决的。
在模拟器上使用CMdaAudioInputStream时会引发内存泄露,导致在退出程序时出现错误提示。
解决办法:忽略CMdaAudioInputStream所引发的内存泄露。
当录音到最后一个buffer完成时会因为CMdaAudioInputStream导致异常发生。
CMdaAudioInputStream会引发E32User-CBase 49错误。在KErrOverflow错误发生时,MMdaAudioInputStreamCallback::MaiscRecordComplete()
会被调用。
解决方法,可以通过重用buffer来避免这个问题,请参考Series 60 Developer Platform 2.0: Audio Streaming Example v1.0一文获取更多资料。
在symbian OS 7.0s中就已綺不推荐使用WAP stack API了,因此在Symbian OS 8.0a中就去掉了这些。
因为某些程序使用WAP Stack API后会引发机器崩溃。这些API所涉及到的Capcodec.dll和wapstkcli.dll库也都被去掉了。
我们现在可以使用HTTP Client API来替代它们,这里HTTP Client API是支持WSP的
尽管XML Parser API在一些开发文档中提及,并且在SDK中也有一些相关性的头文件存在,但其目前仍无法使用。
XML Parser API将在未来的Series 60 Developer Platform被正式支持。
如果你需要的话,可以实现自己的XML解析程序或使用现成的解析器,如Digia SAX Paser