blob: 04095fe4d392f96cdd5a60ad9054764fbb2f3254 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#ifndef PV_2WAY_PROXY_ADAPTER_H_INCLUDED
#define PV_2WAY_PROXY_ADAPTER_H_INCLUDED
#ifndef PV_INTERFACE_PROXY_H_INCLUDED
#include "pv_interface_proxy.h"
#endif
#ifndef PV_2WAY_INTERFACE_H_INCLUDED
#include "pv_2way_interface.h"
#endif
#ifndef PV_2WAY_INTERFACE_CMD_MESSAGES_H_INCLUDED
#include "pv_2way_interface_cmd_messages.h"
#endif
#ifndef PV_2WAY_ENGINE_H_INCLUDED
#include "pv_2way_engine.h"
#endif
#ifndef OSCL_SHARED_PTR_H_INCLUDED
#include "oscl_shared_ptr.h"
#endif
#ifndef OSCL_VECTOR_H_INCLUDED
#include "oscl_vector.h"
#endif
#include "pv_engine_observer.h"
#include "pv_engine_observer_message.h"
class PVLogger;
class PVMFNodeInterface;
class PVCmnCmdRespMsg : public CPVCmnInterfaceObserverMessage,
public PVCmdResponse
{
public:
PVCmnCmdRespMsg() : CPVCmnInterfaceObserverMessage(0),
PVCmdResponse(0, (OsclAny*)NULL, PVMFSuccess, NULL, 0)
{};
~PVCmnCmdRespMsg() {};
void Set(PVCommandId aId,
void *aContext,
PVMFStatus aStatus,
OsclAny* aEventData = NULL,
int32 aEventDataSize = 0);
void SetId(PVCommandId aId)
{
iId = aId;
}
void SetContextData(void *aContext)
{
iContext = aContext;
}
};
class PVCmnAsyncEventMsg : public CPVCmnInterfaceObserverMessage,
public PVAsyncInformationalEvent
{
public:
PVCmnAsyncEventMsg() : CPVCmnInterfaceObserverMessage(1)
, PVAsyncInformationalEvent(PVT_INDICATION_INCOMING_TRACK)
{};
~PVCmnAsyncEventMsg()
{
if (iEventExtInterface)
{
iEventExtInterface->removeRef();
iEventExtInterface = NULL;
}
};
void Set(const PVAsyncInformationalEvent& aEvent, PVEventType aType,
PVExclusivePtr aPtr,
uint8 *aLocalBuffer,
uint32 aLocalBufferSize);
};
class PVCmnAsyncErrorEvent: public CPVCmnInterfaceObserverMessage,
public PVAsyncErrorEvent
{
public:
PVCmnAsyncErrorEvent() : CPVCmnInterfaceObserverMessage(2)
, PVAsyncErrorEvent(0)
{};
~PVCmnAsyncErrorEvent() {};
void Set(PVEventType aEventType,
PVExclusivePtr aEventData,
uint8* aLocalBuffer,
int32 aLocalBufferSize);
};
/**
* CPV2WayProxyAdapter Class
*
* CPV2WayProxyAdapter is the interface to the pv2way SDK, which
* allows initialization, control, and termination of a two-way terminal.
* The application is expected to contain and maintain a pointer to the
* CPV2WayInterface instance at all times that a call is active.
* The CPV2WayFactory factory class is to be used to create and
* delete instances of this class
**/
class CPV2WayProxyAdapter :
public CPV2WayInterface,
public PVProxiedEngine,
public PVCommandStatusObserver,
public PVInformationalEventObserver,
public PVErrorEventObserver,
public PVProxiedInterfaceClient,
public PVProxiedInterfaceServer
{
public:
static CPV2WayProxyAdapter* New(TPVTerminalType aTerminalType,
PVCommandStatusObserver* aCmdStatusObserver,
PVInformationalEventObserver *aInfoEventObserver,
PVErrorEventObserver *aErrorEventObserver);
~CPV2WayProxyAdapter();
// CPV2WayInterface virtuals
PVCommandId GetSDKInfo(PVSDKInfo &aSDKInfo, OsclAny* aContextData = NULL);
PVCommandId GetSDKModuleInfo(PVSDKModuleInfo &aSDKModuleInfo, OsclAny* aContextData = NULL);
PVCommandId Init(PV2WayInitInfo& aInitInfo, OsclAny* aContextData = NULL);
PVCommandId Reset(OsclAny* aContextData = NULL);
PVCommandId AddDataSource(PVTrackId aChannelId, PVMFNodeInterface& aDataSource, OsclAny* aContextData = NULL);
PVCommandId RemoveDataSource(PVMFNodeInterface& aDataSource, OsclAny* aContextData = NULL);
PVCommandId AddDataSink(PVTrackId aChannelId, PVMFNodeInterface& aDataSink, OsclAny* aContextData = NULL);
PVCommandId RemoveDataSink(PVMFNodeInterface& aDataSink, OsclAny* aContextData = NULL);
PVCommandId Connect(const PV2WayConnectOptions& aOptions, PVMFNodeInterface* aCommServer = NULL, OsclAny* aContextData = NULL);
PVCommandId Disconnect(OsclAny* aContextData = NULL);
PVCommandId GetState(PV2WayState& aState, OsclAny* aContextData = NULL);
PVCommandId SetLatencyQualityTradeoff(PVMFNodeInterface& aTrack, int32 aTradeoff, OsclAny* aContextData = NULL);
PVCommandId Pause(PV2WayDirection aDirection, PVTrackId aTrackId, OsclAny* aContextData = NULL);
PVCommandId Resume(PV2WayDirection aDirection, PVTrackId aTrackId, OsclAny* aContextData = NULL);
PVCommandId SetLogAppender(const char* aTag, OsclSharedPtr<PVLoggerAppender>& aAppender, OsclAny* aContextData = NULL);
PVCommandId RemoveLogAppender(const char* aTag, OsclSharedPtr<PVLoggerAppender>& aAppender, OsclAny* aContextData = NULL);
PVCommandId SetLogLevel(const char* aTag, int32 aLevel, bool aSetSubtree = false, OsclAny* aContextData = NULL);
PVCommandId GetLogLevel(const char* aTag, int32& aLogInfo, OsclAny* aContextData = NULL);
//PVCommandId SendUserInput(CPVUserInput& user_input, OsclAny* aContextData = NULL);
//PVCommandId GetCallStatistics(CPVCmn2WayStatistics& aStats, OsclAny* aContextData = NULL);
PVCommandId QueryInterface(const PVUuid& aUuid, PVInterface*& aInterfacePtr, OsclAny* aContext = NULL);
PVCommandId QueryUUID(const PvmfMimeString& aMimeType, Oscl_Vector<PVUuid, BasicAlloc>& aUuids,
bool aExactUuidsOnly = false, OsclAny* aContextData = NULL);
PVCommandId CancelAllCommands(OsclAny* aContextData = NULL);
OSCL_IMPORT_REF void CreateAppenders(PVLogger *aLogger = NULL)
{
OSCL_UNUSED_ARG(aLogger);
};
OSCL_IMPORT_REF void CreateTerminal(PVLogger *aLogger = NULL);
OSCL_IMPORT_REF void DeleteTerminal(PVLogger *aLogger = NULL);
OSCL_IMPORT_REF void CleanupMessage(CPVCmnInterfaceCmdMessage *cmdMsg, PVLogger *aLogger = NULL);
OSCL_IMPORT_REF void CleanupNotification(CPVCmnInterfaceObserverMessage *obsMsg, PVLogger *aLogger = NULL);
OSCL_IMPORT_REF void ProcessNotification(CPVCmnInterfaceObserverMessage *aMsg, PVLogger *aLogger = NULL);
OSCL_IMPORT_REF void ProcessMessage(CPVCmnInterfaceCmdMessage *aMsg, PVLogger *aLogger = NULL);
//from PVProxiedEngine
OSCL_IMPORT_REF void CreateLoggerAppenders();
OSCL_IMPORT_REF void PVThreadLogon(PVMainProxy &proxy);
OSCL_IMPORT_REF void PVThreadLogoff(PVMainProxy &proxy);
//from PVProxiedInterfaceServer
OSCL_IMPORT_REF void HandleCommand(TPVProxyMsgId aMsgId, OsclAny* aMsg);
OSCL_IMPORT_REF void CleanupNotification(TPVProxyMsgId aId, OsclAny* aMsg);
//from PVProxiedInterfaceClient
OSCL_IMPORT_REF void HandleNotification(TPVProxyMsgId aId, OsclAny* aMsg);
OSCL_IMPORT_REF void CleanupCommand(TPVProxyMsgId aId, OsclAny* aMsg);
//from MPVErrorEventObserver
void HandleErrorEvent(const PVAsyncErrorEvent& aEvent);
//from MPVInformationalEventObserver
void HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent) ;
//from MPVCommandStatusObserver
void CommandCompleted(const PVCmdResponse& aResponse) ;
private:
CPV2WayProxyAdapter(): iCmdStatusObserver(NULL),
iInfoEventObserver(NULL),
iErrorEventObserver(NULL),
iterminalType(PV_TERMINAL_TYPE_NONE),
iterminalEngine(NULL),
iLogger(NULL),
iPVProxy(NULL)
{};
OsclAny ConstructL(TPVTerminalType aTerminalType,
PVCommandStatusObserver* aCmdStatusObserver,
PVInformationalEventObserver *aInfoEventObserver,
PVErrorEventObserver *aErrorEventObserver);
PVCmnCmdRespMsg *GetCmdMsgL();
void FreeCmdMsg(PVCmnCmdRespMsg *msg)
{
iFreeCmdMsg.push_back(msg);
}
PVCmnAsyncEventMsg *GetEventMsgL();
void FreeEventMsg(PVCmnAsyncEventMsg *msg)
{
iFreeEventMsg.push_back(msg);
}
PVCmnAsyncErrorEvent *GetErrorMsgL();
void FreeErrorMsg(PVCmnAsyncErrorEvent *msg)
{
iFreeErrorMsg.push_back(msg);
}
static int Construct(CPV2WayProxyAdapter*& aRet,
TPVTerminalType aTerminalType,
PVCommandStatusObserver* aCmdStatusObserver,
PVInformationalEventObserver *aInfoEventObserver,
PVErrorEventObserver *aErrorEventObserver);
PVCommandStatusObserver *iCmdStatusObserver;
PVInformationalEventObserver *iInfoEventObserver;
PVErrorEventObserver *iErrorEventObserver;
TPVTerminalType iterminalType;
CPV2WayInterface * iterminalEngine;
PVLogger *iLogger;
int ProcessMessageLTry(CPVCmnInterfaceCmdMessage *aMsg);
void ProcessMessageL(CPVCmnInterfaceCmdMessage *aMsg);
void ProcessNotificationL(CPVCmnInterfaceObserverMessage *aMsg);
friend class CPV2WayInterfaceProxyHandler;
friend class CPV2WayInterfaceProxyNotifier;
Oscl_Vector<PVCmnCmdRespMsg *, OsclMemAllocator> iFreeCmdMsg;
PVCmnCmdRespMsg iCmdMsg[MAX_PENDING_2WAY_COMMANDS];
Oscl_Vector<PVCmnAsyncEventMsg *, OsclMemAllocator> iFreeEventMsg;
PVCmnAsyncEventMsg iEventMsg[MAX_PENDING_2WAY_EVENTS];
Oscl_Vector<PVCmnAsyncErrorEvent *, OsclMemAllocator> iFreeErrorMsg;
PVCmnAsyncErrorEvent iErrorMsg[MAX_PENDING_2WAY_ERRORS];
CPVInterfaceProxy *iPVProxy;
friend class CPV2WayFactory;
TPVProxyId iProxyId;
};
#endif //