HOW TO Developing an Authorization plug-in

#if defined (_WIN32)
#pragma warning(disable : 4996)
BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
return TRUE;
#endif
How to create here
/*----------------------------------------------------------------------------+
|       ___     _       _                                                    |
|      /   |   | |     | |                                                   |
|     / /| | __| | ___ | |__   ___                                           |
|    / /_| |/ _  |/ _ \|  _ \ / _ \                                          |
|   / ___  | (_| | (_) | |_) |  __/                                          |
|  /_/   |_|\__,_|\___/|____/ \___|                                          |
|                                                                            |
|                                                                            |
|  ADOBE CONFIDENTIAL                                                        |
|  __________________                                                        |
|                                                                            |
|  Copyright (c) 2003 - 2010, Adobe Systems Incorporated.                    |
|  All rights reserved.                                                      |
|                                                                            |
|  NOTICE:  All information contained herein is, and remains the property    |
|  of Adobe Systems Incorporated and its suppliers, if any. The intellectual |
|  and technical concepts contained herein are proprietary to Adobe Systems  |
|  Incorporated and its suppliers and may be covered by U.S. and Foreign     |
|  Patents, patents in process, and are protected by trade secret or         |
|  copyright law. Dissemination of this information or reproduction of this  |
|  material is strictly forbidden unless prior written permission is         |
|  obtained from Adobe Systems Incorporated.                                 |
|                                                                            |
|          Adobe Systems Incorporated       415.832.2000                     |
|          601 Townsend Street              415.832.2020 fax                 |
|          San Francisco, CA 94103                                           |
|                                                                            |
+----------------------------------------------------------------------------*/
#include "StdAfx.h"
#include "FmsAuthAdaptor.h"
#include "FmsAuthActions.h"
#include "FmsMedia.h"
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include "hash.h"
#include <sstream>
#if defined (_WIN32)
#pragma warning(disable : 4996)
BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
return TRUE;
#endif
// Flag to process SWF Verification in this auth sample.  A real SWF file
// must be targeted in the SWFVerification code below for the example to work.
static const bool kAuthorizeSwfVerification = false;
class FmsAuthAdaptor : public IFmsAuthAdaptor
public:
  FmsAuthAdaptor(IFmsAuthServerContext2* pFmsAuthServerContext)
   : m_pFmsAuthServerContext(pFmsAuthServerContext) {}
  virtual ~FmsAuthAdaptor() {}
  void authorize(IFmsAuthEvent* pAev);
  void notify(IFmsAuthEvent* pAev);
  void getEvents(I32 aevBitAuth[], I32 aevBitNotf[], unsigned int count);
private:
  bool getStats(I64 clientStatsHandle, FmsClientStats& baseStats);
  void processStats(IFmsAuthEvent* pAev);
  IFmsAuthServerContext2* m_pFmsAuthServerContext;
// Utils
// Note: Do not delete the return value.  The return value is a buffer
// allocated in FMS memory space, and FMS will manage the memory.
static char* getStringField(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kString)
  return reinterpret_cast<char*>(field.str);
return 0;
// Note: Do not delete the return value.  The return value is a buffer
// allocated in FMS memory space, and FMS will manage the memory.
static U8* getBufferField(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kBuffer)
  return field.buf;
return 0;
static bool getI8Field(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I8& iValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kI8)
  iValue = field.i8;
  return true;
return false;
static bool getI32Field(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I32& iValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kI32)
  iValue = field.i32;
  return true;
return false;
static bool getI64Field(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I64& iValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kI64)
  iValue = field.i64;
  return true;
return false;
static bool getFloatField(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, float& fValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kFloat)
  fValue = field.f;
  return true;
return false;
static bool getU16Field(const IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, U16& iValue)
FmsVariant field;
if (pEv->getField(prop, field) == IFmsAuthEvent::S_SUCCESS && field.type == field.kU16)
  iValue = field.u16;
  return true;
return false;
static bool setStringField(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, char* pValue)
FmsVariant field;
field.setString(reinterpret_cast<I8*>(pValue));
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setI8Field(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I8 iValue)
FmsVariant field;
field.setI8(iValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setU8Field(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, U8 iValue)
FmsVariant field;
field.setU8(iValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setI32Field(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I32 iValue)
FmsVariant field;
field.setI32(iValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setI64Field(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, I64 iValue)
FmsVariant field;
field.setI64(iValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool setFloatField(IFmsAuthEvent* pEv, IFmsAuthEvent::Field prop, float fValue)
FmsVariant field;
field.setFloat(fValue);
return pEv->setField(prop, field) == IFmsAuthEvent::S_SUCCESS;
static bool isADPCMSupported(int iAudioCodecs)
return (iAudioCodecs & SUPPORT_SND_ADPCM) != 0;
static bool isVP6Supported(int iVideoCodecs)
int iAllVP6 = ( SUPPORT_VID_VP6ALPHA | SUPPORT_VID_VP6 );
return (iVideoCodecs & iAllVP6) != 0;
static bool isService(int iType)
return (iType & TYPE_SERVICE) != 0;
static bool isAMF3(unsigned char uEncod)
return (uEncod == ENCODE_AMF3);
// This class will process all authorization events
class MyFmsAuthorizeEvent
public:
MyFmsAuthorizeEvent(IFmsAuthEvent* pAev, IFmsAuthServerContext2* pFmsAuthServerContext)
  : m_pAev(pAev), m_pFmsAuthServerContext(pFmsAuthServerContext) {}
virtual ~MyFmsAuthorizeEvent() {}
void authorize();
private:
IFmsAuthEvent*   m_pAev;
IFmsAuthServerContext2* m_pFmsAuthServerContext;
void MyFmsAuthorizeEvent::authorize()
bool bAuthorized = true;  // default authorization state
switch(m_pAev->getType())
  case IFmsAuthEvent::E_CONNECT:
   // only E_CONNECT allows changes to the following fields:
   // F_CLIENT_AUDIO_SAMPLE_ACCESS
   // F_CLIENT_AUDIO_SAMPLE_ACCESS_LOCK
   // F_CLIENT_READ_ACCESS
   // F_CLIENT_READ_ACCESS_LOCK
   // F_CLIENT_VIDEO_SAMPLE_ACCESS
   // F_CLIENT_VIDEO_SAMPLE_ACCESS_LOCK
   // F_CLIENT_WRITE_ACCESS_LOCK
   // F_CLIENT_WRITE_ACCESS
   I8 iValue;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS, iValue))
    setI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS, iValue);
   // redirect connection example
   char* pUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
   if (pUri && !strcmp(pUri, "rtmp://localhost/streamtest"))
    setStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI,
     "rtmp://localhost:1935/streamtest");
    bAuthorized = false;
   // set DiffServ fields based on a client IP
   // char* pIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
   // if (pIp && !strcmp(pIp, "192.168.1.1"))
    // set the DSCP bits and mask
    U8 m_diffServBits = 170;
    U8 m_diffServMask = 252;
    setU8Field(m_pAev, IFmsAuthEvent::F_CLIENT_DIFFSERV_BITS, m_diffServBits);
    setU8Field(m_pAev, IFmsAuthEvent::F_CLIENT_DIFFSERV_MASK, m_diffServMask);
    bAuthorized = true;
  break;
  case IFmsAuthEvent::E_PLAY:
   char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
   if (pStreamName)
    setStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME, pStreamName);
   char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
   if (pStreamType)
    setStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE, pStreamType);
   char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
   if (pStreamQuery)
    setStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY, pStreamQuery);
   I8 iValue;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, iValue))
    // If iValue is 1 (true) the playlist will be reset and the
    // stream will be the only stream in the playlist; otherwise
    // 0 (false) means the stream will be added to the existing
    // playlist.
    setI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, iValue);
   if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, iValue))
    // If iValue is 1 (true) the stream timestamps will be ignored;
    // otherwise 0 (false) means the timestamps will be handled.
    setI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, iValue);
   char* pStreamTransition = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TRANSITION);
   if (pStreamTransition && strlen(pStreamTransition))
    // MBR transition example
    if (!strcmp(pStreamTransition, "switch") ||
     !strcmp(pStreamTransition, "swap"))
     // get the old stream's properties
     char* pOldStreamName = getStringField(m_pAev, IFmsAuthEvent::F_OLD_STREAM_NAME);
     char* pOldStreamType = getStringField(m_pAev, IFmsAuthEvent::F_OLD_STREAM_TYPE);
     char* pOldStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_OLD_STREAM_QUERY);
     // if pOldStream is empty (optional for switch) current stream is in play
     // do we really want stream transition? 
      // no we do not allow transition
      // bAuthorized = false;
      // now transition will be turned off and old stream continue playing
      // break;    
     // doing nothing will execute transition mode as is
     // or you could modify transition by changing transition properties
     // set it to 1 to indicate they will be hooking up the stream,
     // but that it does not currently exist
     setI32Field(m_pAev, IFmsAuthEvent::F_STREAM_LIVE_PUBLISH_PENDING, 1);
    // get the offset value if transition is set to offset mode for reconnect
    if (!strcmp(pStreamTransition, "resume"))
     float fValue;
     if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_OFFSET, fValue))
      float offset = fValue; //offset value in seconds
   else
    // This is a regular play waiting for approval, which may be converted
    // into a play2 command by changing transition properties
  break;
  case IFmsAuthEvent::E_PUBLISH:
   char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
   if (pStreamName)
    setStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME, pStreamName);
   char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
   if (pStreamType)
    setStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE, pStreamType);
   I32 iValue;
   if (getI32Field(m_pAev, IFmsAuthEvent::F_STREAM_PUBLISH_TYPE, iValue))
    // publish types:
    // 0 : record
    // 1 : append
    // 2 : appendWithGap
    // -1 : live
    setI32Field(m_pAev, IFmsAuthEvent::F_STREAM_PUBLISH_TYPE, iValue);
  break;
  case IFmsAuthEvent::E_FILENAME_TRANSFORM:
    I64 iValue;
    if (getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, iValue))
     // some fields are not eligible to be modified. The return
     // value will be false when trying to modify the F_CLIENT_ID.
     bool bSet = setI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, iValue);
    char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
    if (pStreamName)
     // some fields are not eligible to be modified. The return
     // value will be false when trying to modify the F_STREAM_NAME.
     bool bSet = setStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME, pStreamName);
    char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
    if (pStreamPath)
     setStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH, pStreamPath);
    char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
    if (pStreamType)
     setStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE, pStreamType); 
  break;
  case IFmsAuthEvent::E_PAUSE:
   bAuthorized = false; // block all E_PAUSE events.
   float fValue;
   if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_PAUSE_TIME, fValue))
    float fPauseTime = fValue; // in seconds
   I8 iValue;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_PAUSE, iValue))
    // 1 (true) means PAUSE
    // 0 (false) means UNPAUSE
    bool boolPause = iValue != 0;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_PAUSE_TOGGLE, iValue))
    // 1 (true) means PAUSE_TOGGLE
    // 0 (false) means no PAUSE_TOGGLE was set
    bool boolPauseToggle = iValue != 0;
   FmsVariant field;
   // Notify Action example: An IFmsNofifyAction is created to notify
   // server side action script (SSAS) of the E_PAUSE event by calling
   // the function name "method" in the script.  In this example two
   // variables will be passed to "method" by calling addParam(field)
   // on the action.
   if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS)
    I64 clientId = field.i64;
    IFmsNotifyAction* pAction = m_pAev->addNotifyAction("Notified by adaptor");
    pAction->setClientId(field);
    const char mtd[] = "method";
    field.setString(reinterpret_cast<I8*>(const_cast<char*>(mtd)));
    pAction->setMethodName(field);
    // create and insert a U16 "12345" as the first parameter
    field.setU16(12345);
    pAction->addParam(field);
    // create and insert clientId as a double as the second parameter
    field.setDouble((double)clientId);
    pAction->addParam(field);
    // Note: SSAS does not work with I64 or Buffer variants
    // field.setI64(clientId);
    // pAction->addParam(field); // incorrect
  break;
  case IFmsAuthEvent::E_SEEK:
   bAuthorized = false; // block all E_SEEK events
   float fValue;
   if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fValue))
    // Modification of the seek position example:
    // fValue + 3; will add 3 seconds to the initial seek posistion
    float fSeekTime = fValue; // value in seconds
    setFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fSeekTime);
  break;
  case IFmsAuthEvent::E_LOADSEGMENT:
   // bAuthorized = false; // block all E_LOADSEGMENT events
   // E_LOADSEGMENT is a read only event that substitutes E_PLAY on
   // FMS Origin servers for recorded streams.
   I64 iValue;
   if (getI64Field(m_pAev, IFmsAuthEvent::F_SEGMENT_START, iValue))
    I64 iStart = iValue; // in bytes
   if (getI64Field(m_pAev, IFmsAuthEvent::F_SEGMENT_END, iValue))
    I64 iEnd = iValue; // in bytes
  break;
  case IFmsAuthEvent::E_RECORD:
   // bAuthorized = false; // block all E_RECORD events
   float fValue;
   if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, fValue))
    float recMaxSize = fValue; // in kilobytes
    setFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, recMaxSize);
   if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, fValue))
    float recMaxDuration = fValue; // in seconds
    setFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, recMaxDuration);
  break;
  case IFmsAuthEvent::E_SWF_VERIFY:
   // SWF Verification example:
   // kAuthorizeSwfVerification is assigned false by default.  The
   // target SWF file must be updated for this to work.
   if(kAuthorizeSwfVerification)
    I8 swfvVersion = 0;
    if(getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_VERSION, swfvVersion))
     std::stringstream stream;
     stream << "Swf verification version is " << static_cast<int>(swfvVersion);
     m_pFmsAuthServerContext->log(stream.str().c_str(), IFmsServerContext::kInformation, false);
    I64 swfvDepth;
    if(getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DEPTH, swfvDepth))
     I32 swfvTTL;
     if(getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, swfvTTL))
      swfvTTL /= 2;
      setI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, swfvTTL);
     U8 digest[kSHA256DigestLen];
     // Target a real SWF file instead of sample.swf
     hashSwfFileAtDepth("C:\\sample.swf", swfvDepth, digest);
     FmsVariant field;
     field.setBuffer(digest, kSHA256DigestLen);
     m_pAev->setField(IFmsAuthEvent::F_CLIENT_SWFV_DIGEST, field);
  break;
  case IFmsAuthEvent::E_APPSTART:
  case IFmsAuthEvent::E_APPSTOP:
  case IFmsAuthEvent::E_DISCONNECT:
  case IFmsAuthEvent::E_STOP:
  case IFmsAuthEvent::E_UNPUBLISH:
  case IFmsAuthEvent::E_ACTION:
  case IFmsAuthEvent::E_CODEC_CHANGE:
  case IFmsAuthEvent::E_RECORD_STOP:
  case IFmsAuthEvent::E_CLIENT_PAUSE:
  case IFmsAuthEvent::E_SWF_VERIFY_COMPLETE:
  case IFmsAuthEvent::E_CLIENT_SEEK:
  case IFmsAuthEvent::E_START_TRANSMIT:
  case IFmsAuthEvent::E_STOP_TRANSMIT:
  case IFmsAuthEvent::E_MAXEVENT:
  break;
IFmsAuthServerContext2::AuthFailureDesc* desc = NULL;
if(!bAuthorized)
  desc = new IFmsAuthServerContext2::AuthFailureDesc("Blocked by auth adaptor",
   IFmsAuthServerContext2::kDefaultStatus, -1);
char buf[1024];
const char* const action = bAuthorized ? "approved" : "rejected";
sprintf(buf, "Received authorization type=%d id=%p %s\n", m_pAev->getType(),
  m_pAev, action);
// log to the configured FMS log directory. If the third parameter is true,
// also send the log to the system event log.
m_pFmsAuthServerContext->log(buf, IFmsServerContext::kInformation, false);
m_pFmsAuthServerContext->onAuthorize(m_pAev, bAuthorized, desc);
delete desc;
class MyFmsNotifyEvent
public:
  MyFmsNotifyEvent(IFmsAuthEvent* pAev, IFmsAuthServerContext2* pFmsAuthServerContext)
   : m_pAev(pAev), m_pFmsAuthServerContext(pFmsAuthServerContext) {}
  virtual ~MyFmsNotifyEvent() {}
  void notify() const;
private:
  IFmsAuthEvent* m_pAev;
  IFmsAuthServerContext2* m_pFmsAuthServerContext;
void MyFmsNotifyEvent::notify() const
switch(m_pAev->getType())
  case IFmsAuthEvent::E_PLAY:
   char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME);
   char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST);
   char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI);
   char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
   char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
   char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI);
   char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST);
   char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER);
   char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL);
   char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT);
   char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS);
   char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS);
   char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS);
   char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS);
   char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO);
   char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM);
   char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
   char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
   char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
   char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
   I32 iValue;
   if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_CODECS, iValue))
    bool bADPCM = isADPCMSupported(iValue);
   if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_CODECS, iValue))
    bool bVP6 = isVP6Supported(iValue);
   if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_TYPE, iValue))
    bool bService = isService(iValue);
   if (getI32Field(m_pAev, IFmsAuthEvent::F_STREAM_ID, iValue))
    I32 iStreamId = iValue;
   float fValue;
   if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_LENGTH, fValue))
    float fLength = fValue; // in seconds
   if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_POSITION, fValue))
    float iPosition = fValue; // in seconds
   I64 lValue;
   if (getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, lValue))
    I64 iClientId = lValue; 
   I8 sValue;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SECURE, sValue))
    bool bSecure = sValue != 0;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_AMF_ENCODING, sValue))
    bool bAMF3 = isAMF3(sValue);
   if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS_LOCK, sValue))
    bool bRead = sValue != 0;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS_LOCK, sValue))
    bool bWrite = sValue != 0;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS_LOCK, sValue))
    bool bAudioRead = sValue != 0;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS_LOCK, sValue))
    bool bVideoRead = sValue != 0;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, sValue))
    bool bReset = sValue != 0;
   if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, sValue))
    bool bIgnore = sValue != 0;
  break;
  case IFmsAuthEvent::E_SEEK:
   float fValue;
   if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fValue))
    float fSeekTime = fValue;
   // Disconnect Action example: disconnect the client that was
   // specified by the E_SEEK notify event
   FmsVariant field;
   if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS)
    IFmsDisconnectAction* pAction =
     const_cast<IFmsAuthEvent*>(m_pAev)->
      addDisconnectAction("Seek is not allowed. Blocked by adaptor");
    pAction->setClientId(field);
  break;
  case IFmsAuthEvent::E_CODEC_CHANGE:
   char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME);
   char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST);
   char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI);
   char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
   char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
   char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI);
   char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST);
   char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER);
   char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL);
   char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT);
   char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS);
   char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS);
   char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS);
   char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS);
   char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO);
   char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM);
   char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
   char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
   char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
   char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
   U16 fType;
   if (getU16Field(m_pAev, IFmsAuthEvent::F_STREAM_CODEC_TYPE, fType))
    U16 streamCodecType = fType;
    if (streamCodecType == kVIDEO_CODEC)
     U16 fValue;
     if (getU16Field(m_pAev, IFmsAuthEvent::F_STREAM_CODEC, fValue))
      U16 streamCodecValue = fValue;
      if (streamCodecValue == VIDEO_CODEC_SORENSON)
       // Disconnect Action example: Disallow clients trying
       // to publish content with the sorenson video codec.
       FmsVariant field;
       if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS)
        IFmsDisconnectAction* pAction =
         const_cast<IFmsAuthEvent*>(m_pAev)->
         addDisconnectAction("Sorenson is not allowed. Blocked by adaptor");
        pAction->setClientId(field);
  break;
  case IFmsAuthEvent::E_RECORD_STOP:
   char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME);
   char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST);
   char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI);
   char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
   char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI);
   char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI);
   char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST);
   char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER);
   char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL);
   char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT);
   char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS);
   char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS);
   char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS);
   char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS);
   char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO);
   char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM);
   char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME);
   char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE);
   char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY);
   char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH);
   float fValue;
   if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, fValue))
    float recMaxSize = fValue; // in kilobytes
   if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, fValue))
    float recMaxDuration = fValue; // in seconds
  break;
  case IFmsAuthEvent::E_SWF_VERIFY_COMPLETE:
   char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP);
   I8 version; // version of SWF verification
   getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_VERSION, version);
   I64 depth; // depth in the SWF file hashed
   getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DEPTH, depth);
   I32 ttl; // time to live of the SWF hash provided
   getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, ttl);
   // digest provided to match against
   U8* buffer = getBufferField(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DIGEST);
   // result of the attempted match-- see FmsAuthEvents.h enum
   // eSWFMatch for the meaning of this field
   I32 match;
   getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_RESULT, match);
   std::stringstream stream;
   stream << "swf verification for client: "
     << std::string(pClIp)
     << " is complete, the result is: " << match;
   m_pFmsAuthServerContext->log(stream.str().c_str(), IFmsServerContext::kInformation, false);
  break;
  case IFmsAuthEvent::E_APPSTART:
  case IFmsAuthEvent::E_APPSTOP:
  case IFmsAuthEvent::E_CONNECT:
  case IFmsAuthEvent::E_DISCONNECT:
  case IFmsAuthEvent::E_FILENAME_TRANSFORM:
  case IFmsAuthEvent::E_STOP:
  case IFmsAuthEvent::E_PAUSE:
  case IFmsAuthEvent::E_PUBLISH:
  case IFmsAuthEvent::E_UNPUBLISH:
  case IFmsAuthEvent::E_LOADSEGMENT:
  case IFmsAuthEvent::E_ACTION:
  case IFmsAuthEvent::E_RECORD:
  case IFmsAuthEvent::E_CLIENT_PAUSE:
  case IFmsAuthEvent::E_SWF_VERIFY:
  case IFmsAuthEvent::E_CLIENT_SEEK:
  case IFmsAuthEvent::E_START_TRANSMIT:
  case IFmsAuthEvent::E_STOP_TRANSMIT:
  case IFmsAuthEvent::E_MAXEVENT:
  break;
char buf[1024];
sprintf(buf, "Received notification type=%d id=%p\n", m_pAev->getType(), m_pAev);
// log to the configured FMS log directory. If the third parameter is true,
// also send the log to the system event log.
m_pFmsAuthServerContext->log(buf, IFmsServerContext::kInformation, false);
m_pFmsAuthServerContext->onNotify(m_pAev);
/* All authorization events flow through this wrapper function.
* Note: This sample auth adaptor has MyFmsAppAuthEvent allocated on the
* stack, but time intensive implementations may warrant authorization to
* be allocated on the heap so work may be passed to a thread pool.  This
* prevents starvation of the calling FMS threads in custom code that may
* have processing delays (ie database calls, network filesystem access, etc..).
void FmsAuthAdaptor::authorize(IFmsAuthEvent* pAev)
  MyFmsAuthorizeEvent(pAev, m_pFmsAuthServerContext).authorize();
/* All notification events flow through this wrapper function.
* Note: This sample auth adaptor has MyFmsNotifyEvent allocated on the
* stack, but time intensive implementations may warrant notifications to
* be allocated on the heap so work may be passed to a thread pool.  This
* prevents starvation of the calling FMS threads in custom code that may
* have processing delays (ie database calls, network filesystem access, etc..).
void FmsAuthAdaptor::notify(IFmsAuthEvent* pAev)
  processStats(pAev);
  MyFmsNotifyEvent(pAev, m_pFmsAuthServerContext).notify();
* Get client statistics.
bool FmsAuthAdaptor::getStats(I64 clientStatsHandle, FmsClientStats& baseStats)
bool bValue= m_pFmsAuthServerContext->getClientStats(clientStatsHandle, baseStats);
return bValue;
* Example obtainting client stats from an E_CONNECT or E_STOP event
void FmsAuthAdaptor::processStats(IFmsAuthEvent* pAev)
  I64 statsHandle;
  FmsClientStats baseStats;
  if (!getI64Field(pAev, IFmsAuthEvent::F_CLIENT_STATS_HANDLE, statsHandle))
   return;
  char* pAppName = getStringField(pAev, IFmsAuthEvent::F_APP_NAME);
  if (pAev->getType() == IFmsAuthEvent::E_CONNECT)
   getStats(statsHandle, baseStats);
   // log data
   char buf[1024];
   char hashKey[9];
   memset(hashKey, 0, 9);
   memcpy(hashKey, &statsHandle, sizeof(statsHandle));
   sprintf(buf, "client Stats Handle= %s, bytes_in= %f, bytes_out= %f\n", hashKey,
    static_cast<double>(baseStats.bytes_in), static_cast<double>(baseStats.bytes_out));
   m_pFmsAuthServerContext->log(buf, IFmsServerContext::kInformation, false);
  else if (pAev->getType() == IFmsAuthEvent::E_STOP)
   getStats(statsHandle, baseStats);
/* By default, all authorization and notifications events will be sent.
* Call excludeEvents with the bit set to 1, to stop recieving events.
* Note: The events:
* E_APPSTART, E_APPSTOP, E_DISCONNECT, E_STOP, E_UNPUBLISH, E_CODEC_CHANGE
* are excluded by default and are not authorizable.
void FmsAuthAdaptor::getEvents(I32 aevBitAuth[], I32 aevBitNotf[], unsigned int count)
// exclude certain auth events
IFmsAuthEvent::EventType authExcludeEvent[] = { IFmsAuthEvent::E_SEEK };
// set E_SEEK to a non authorizable event
m_pFmsAuthServerContext->excludeEvents(aevBitAuth, count, authExcludeEvent, 1);
// Warning: if E_CODEC_CHANGE event is not excluded, all messages will be
// scanned to detect codec change. Subscribe to this event only as needed.
// Example that excludes certain notify events. (E_PAUSE, E_CODEC_CHANGE)
IFmsAuthEvent::EventType notifyExcludeEvent[] =
  { IFmsAuthEvent::E_PAUSE, IFmsAuthEvent::E_CODEC_CHANGE };
m_pFmsAuthServerContext->excludeEvents(aevBitNotf, count, notifyExcludeEvent, 2);
extern "C" void FCExport FmsCreateAuthAdaptor3(IFmsAuthServerContext2* pAuthServerCtx,
              IFmsAuthAdaptor*& pFmsAuthAdaptor, U32& iVersion)
pFmsAuthAdaptor = new FmsAuthAdaptor(pAuthServerCtx);
U32 version = pAuthServerCtx->getVersion();
U16 w2 = LWORD(version);
U16 w1 = HWORD(version);
iVersion = MKLONG(INTERFACE_MINOR_VERSION, INTERFACE_MAJOR_VERSION);
char buf[1024];
char *ptr = buf;
int valueLen = pAuthServerCtx->getConfig("UserKey1", &ptr, sizeof(buf));
if (!valueLen)
  valueLen = pAuthServerCtx->getConfig("UserKey2", &ptr, sizeof(buf));
  if (!valueLen)
   return;
  if (valueLen < 0)
   // failed to find this key
   return;
if (valueLen < 0)
  // failed to find this key
  return;
// value length is bigger then the buffer size, and a real adaptor should
    // allocate valueLen + 1 bytes and call again
extern "C" void FCExport FmsDestroyAuthAdaptor3(IFmsAuthAdaptor* pAuthAdaptor )
delete pAuthAdaptor;

There is no API to Acrobat's document compare feature.
It is certainly possible for an experienced plug-in programmer to
create a new compare plug-in. For example, extract text from two PDFs
and compare it. Comparison algorithms have been much studied so should
be findable in academic literature.
Going beyond text comparison would be a major exercise.
Aandi Inston

Similar Messages

  • How to develop a simple plugin for adobe illustrator cs2 using xcode on mac os

    I would like to know the steps to develop a simple plug-in for adobe illustrator cs2 using xcode on mac OS...anything like a dialog box displaying "hello World"... I m new to MAC OS...Please help...
    Thanks in advance

    Get the SDK and start playing with the sample plug-ins. Asking for something as general as "how do I get started" is asking a little much from this forum :) Try your hand at the SDK and come back to ask more specific questions as you run into them.
    Bear in mind that this isn't an Xcode forum either, though I'm sure there are places to get good help on that!

  • How to get instrument and plug in files to logic8?

    How to get instrument and plug in files to logic8?
    I lost mine in a hard drive crash.
    I cant use my DVD jam pack
    This is my spec
      Modellnamn:          iMac
      Modellidentifierare:          iMac8,1
      Processornamn:          Intel Core 2 Duo
      Processorhastighet:          2,4 GHz
      Antal processorer:          1
      Totalt antal kärnor:          2
      L2-cache:          6 MB
      Minne:          3 GB
      Busshastighet:          1,07 GHz
      Boot ROM-version:          IM81.00C1.B00
      SMC-version (system):          1.29f1
    iMac, OS X Mountain Lion (10.8.2)

    I think you want to get the latitude and longitude information of client accessing the web application. In the web application you cannot directly get the client location information as the nature of the web application is different from windows applications.
    I advise you to develop a Silverlight component and in that Silverlight component use geolocation classes to get client location. Please refer this article for getting data in Silverlight http://www.c-sharpcorner.com/UploadFile/82b980/getting-geo-location-of-user-in-silverlight/
    And once you get the location information you can send that data back to ASP.net webpage or call any javascript method as shown here http://ovaismehboob.wordpress.com/2013/06/22/bridging-data-between-asp-net-and-silverlight/
    Hope this helps!
    Ovais Mehboob Ahmed Khan http://ovaismehboob.wordpress.com

  • How to get standard authorizations  saritha reddy

    Hello Basis Gurus.
    iam using one month trail version of crm 5.0.
    my client is 100. i entered password wrong then the login failed. then i entered thru 066 and 000 clients. but its not allowing me to copy any standards. its says u r not authorized . i entered thru 066 client and created a new Id thru su01. but the same problem its not allowing me to copy any standards .
    Pls tell me how to log on to 100 client or how to get standard authorizations.
    pls give me u r valuable solution to me problem
    Many Thanks
    saritha
    [email protected]

    Hi
    See the doc related to Authorization concept and do accordingly
    In general different users will be given different authorizations based on their role in the orgn.
    We create ROLES and assign the Authorization and TCODES for that role, so only that user can have access to those T Codes.
    USe SUIM and SU21 T codes for this.
    Much of the data in an R/3 system has to be protected so that unauthorized users cannot access it. Therefore the appropriate authorization is required before a user can carry out certain actions in the system. When you log on to the R/3 system, the system checks in the user master record to see which transactions you are authorized to use. An authorization check is implemented for every sensitive transaction.
    If you wish to protect a transaction that you have programmed yourself, then you must implement an authorization check.
    This means you have to allocate an authorization object in the definition of the transaction.
    For example:
    program an AUTHORITY-CHECK.
    AUTHORITY-CHECK OBJECT <authorization object>
    ID <authority field 1> FIELD <field value 1>.
    ID <authority field 2> FIELD <field value 2>.
    ID <authority-field n> FIELD <field value n>.
    The OBJECT parameter specifies the authorization object.
    The ID parameter specifies an authorization field (in the authorization object).
    The FIELD parameter specifies a value for the authorization field.
    The authorization object and its fields have to be suitable for the transaction. In most cases you will be able to use the existing authorization objects to protect your data. But new developments may require that you define new authorization objects and fields.
    http://help.sap.com/saphelp_nw04s/helpdata/en/52/67167f439b11d1896f0000e8322d00/content.htm
    To ensure that a user has the appropriate authorizations when he or she performs an action, users are subject to authorization checks.
    Authorization : An authorization enables you to perform a particular activity in the SAP System, based on a set of authorization object field values.
    You program the authorization check using the ABAP statement AUTHORITY-CHECK.
    AUTHORITY-CHECK OBJECT 'S_TRVL_BKS'
    ID 'ACTVT' FIELD '02'
    ID 'CUSTTYPE' FIELD 'B'.
    IF SY-SUBRC <> 0.
    MESSAGE E...
    ENDIF.
    'S_TRVL_BKS' is a auth. object
    ID 'ACTVT' FIELD '02' in place 2 you can put 1,2, 3 for change create or display.
    The AUTHORITY-CHECK checks whether a user has the appropriate authorization to execute a particular activity.
    This Authorization concept is somewhat linked with BASIS people.
    As a developer you may not have access to access to SU21 Transaction where you have to define, authorizations, Objects and for nthat object you assign fields and values. Another Tcode is PFCG where you can assign these authrization objects and TCodes for a  profile and that profile in turn attached to a particular user.
    Take the help of the basis Guy and create and use.
    <b>Reward points for useful Answers</b>
    Regards
    Anji

  • How to detect headphone is plugged in?

    Hi
    Please help me, how to detect headphone is plugged in or not?
    Thanx.

    Here's something to get you started:
    https://developer.apple.com/iphone/library/documentation/MusicAudio/Conceptual/C oreAudioOverview/CoreAudioEssentials/chapter3_section11.html

  • How to develop web app by ADF Faces rich web client ?

    i want developer web app by adf face rich
    but have not adf rich tag library in jdev 10.1.3
    how to develop by adf rich?

    Hi,
    don't know what you mean by ADF Faces rich web client, but if you mean our Ajax component set, then this is not yet available outside of Oracle. If you mean ADF Faces as we have it in JDeveloper 10.1.3, create a JSF page and step through the creation process, toggle the ADF Faces libraries to make ADF Faces available
    Frank

  • Hi, how to develop application , matching of userid and password to backend

    hi masters ,
                  , user  have to give userid and password of back end sap system  to see particular report. i mean there is a first view ( this first view muust not be first screen of portal ) with userid and password fields . after gave his id and password he can go to second view to see the particualr details .please suggest me about how to do custom bapi code and , in also  webdynpro java  how to develop .
               i know about sso. in this concept i have to use through webdynpro java only. no need of sso concept here .
              after giving the  userid and password , those details must be match with  backend sap database.if no  one of userid and passwrod field  is  matching it has to show some error message. and in password field must be in encrypted letters .

    hi surya,
    Use JCO api to create connection to the backend.
    [JCO tutorial|http://www.apentia-forum.de/viewtopic.php?t=1962&sid=9ac1506bdb153c14edaf891300bfde25]
    On the webdynpro screen you can ask users to enter login id and password. Use this information to create connection to backend using JCO.
    Hope this helps!
    Monalisa

  • How to develope a XML-RPC client with PL/SQL

    Anyone know how to develop a XML-RPC client with PL/SQL?
    I've oracle 8i.
    Have you some example of code?
    Thanks
    Paolo

    So, you actually want to create the physical directory using JAVA?
    Then see:
    http://www.oracle-base.com/articles/8i/shell-commands-from-plsql.php

  • How Can i De-authorize computers from my itunes account

    as people may know it is only possible to have 5 computers authorized to play itunes music however how can i de-authorize computers i don't have anymore, or computers that been restored back to factory settings. as i have 4 registered but only have one computer in use

    first of all you open up your itunes, go to itunes store and on the right side you should find "Account" click on that and log in, there should be a button right underneath Change Country, if you click that button, it should reset the authorization back to 0, and you have to re-authorize the computers that you use. If that button doesn't appear you might have to authorize another computer to make it 5 authorized, and then reset the authorization.

  • How to develop Framework Extension for join two tables

    Dear developers,
    My project contains more than 200 maintenance tables.
    Maintenance tables are very small and less than 100 lines.
    Maintenance tables mostly associated with a translation table.
    Translation tables are used for localized texts.
    Translation tables consists of Master Table Key + LanguageKey.
    I want to edit customizing tables only session language as single table.
    Translation table row may or may not be. Thats mean relationship is 1 to 0..1.
    ADF table control ignore this relationship.
    I tried view link between master view and detail view objects, but if translation table line is empty ADF table control throws translation iterator is null exception.
    I tried entity based left joined editable view I get view link inconsisty problem.
    In this case, the BC forcing me to framework extension.
    How is develop solution?

    topic is update

  • How to develop a report with current price &  the last price in the pre.yrs

    hi ,
    guys,
    my client want a report to list of material with respective vendor and to make a price comparison betn the current price & the last price in the privious year.
    can any one help how to develop the report, shall go for generic extrc.
    thanks in advace.
    ramnath

    CR CR 2011 / "Crystal reports For Visual Studio 2010", you are correct.
    Re. the database thinggy. You can connect to a database via ODBC, OLE DB or in some instances natively. Once a report is created you an change the datasource. A good sample app on how to do this is  csharp_win_dbengine / vb_win_dbengine. A link to the samples is here:
    Crystal Reports for .NET SDK Samples - Business Intelligence (BusinessObjects) - SCN Wiki
    More info on connecting to dbs and changing them is in the developer help files:
    SAP Crystal Reports .NET SDK Developer Guide
    SAP Crystal Reports .NET API Guide
    More info on CR APIs for .NET (applies to all versions of CR and VS):
    Crystal Reports for Visual Studio 2005 Walkthro... | SCN
    You can also use ADO .NET Datasets and in this way you handle the database connections in your app. A good sample is csharp_win_adodotnet (also available in VB) - same link as above.
    More info on datasets:
    Crystal Reports Guide To ADO.NET
    Crystal Reports for Visual Studio .NET - Walkthrough - Reporting Off ADO.NET Datasets
    For more complicated operations (e.g.; changing a report from ODBC to OLE DB, changing one table, etc., you will want to use the InProc RAS SDK that is also available in CRVS. Developer help files are here:
    Report Application Server .NET SDK Developer Guide
    Report Application Server .NET API Guide
    Sample apps are here:
    NET RAS SDK Samples - Business Intelligence (BusinessObjects) - SCN Wiki
    and here:
    Crystal Reports .NET In Process RAS (Unmanaged) SDK Sample Applications
    More info on RAS SDK:
    How to Use The RAS SDK .NET With In-Process RAS Server
    Lastly, do use the search box in the top right corner. I find simple search strings such as 'crystal net parameter' return best results (KBAs, Blogs, docs, wikis, discussions and more).
    - Ludek

  • How do I de-authorize my iTunes account on an old computer that I no longer have?

    I am now maxed out with 5 authorized computers but I only have access to the last two.  How can I get my account de-authorized on computers that no longer exist?

    "How do I de-authorize all computers when I don't have access to all of them? "
    iTunes Store: About authorization and deauthorization
    "And if I do de-authorize currently active/authorized computers with the intention of re-authorizing them, do I lose any downloads or content?"
    No

  • How do i de-authorize an itunes account on a dead computer

    how do i de-authorize an itunes account on a dead computer

    Use the Deauthorize All command documented in this article, or if it isn't an option, the 'contact iTunes Store support' link at the bottom of it.
    (119547)

  • Question: how to get the adobe plug in to play a downloaded flv file ?

    I want to know how to get the flv adobe plug in which i downloaded as a result abc or nbc or cbs.com i forget exactly which said i had to and also it seems to be used for playing most all videos from web such as those from utube,hulu, etc. So my question is how do i get the plug in to play any downloaded *.flv video ?  The particulars on the one i have is:
    Output folder: C:\WINDOWS\system32\Macromed\Flash
    Execute: "C:\WINDOWS\system32\Macromed\Flash\uninstall_plugin.exe"
    Extract: NPSWF32.dll
    Extract: NPSWF32_FlashUtil.exe
    Extract: flashplayer.xpt
    also perhaps FLVPlayer.swf of about 9Kb may have something to do with it?
    And the latest update i have was about jan 13 when it seemed to automatically take over my system and update itself.x
    I know it has the ability to do what i want- which is full screen cropped ,change aspect ratios etc. and seems
    It has to be able to or else it could not play the files and give those options which it does on some videos like from utube etc. in the first place. Unfortuneately it has something also to do with the useless *.swf files which are apparently of no use to anything and could certainly be eliminated .
      I have downloaded several freebie flv players such as bs player etc. etc. but they all have so many faults and are not suitable. Bs player does what i want but it hangs , have to go to system mgr. to get out of it sometimes , often difficult to use etc.etc. The main features is i need is to be able to make and play playlists to automatically in full screen one after the other in a specified order with NO user intervention and the ability to magnify or 'pan in' i guess they call it and change aspect ratios so that i can have full screen as if just cropping part of horizontal such as if want to view a 16/9 aspect ratio on a computer as i have with the prior standard 4/3 aspect and change a downloaded vertically stretched to a cropped instead etc.
        Also it doesn't make sense to download others and take up disk space when already have the adobe - also adobe seems to be the only one that plays hulu flv's correctly - on other flv players the video and audio are way out of sync and not just by few seconds but often by a minute or more. I know there is another 'pain' way to do it which is create a *.avi or other extension with loss of clarity etc. which have done but would like to be able to just do it in real time while playing the flv file itself as for example
    as bs player does.
       Anyway if there is no way to get adobe to do this does anyone know of any other free flv player downloads which will do what
    i want - basically playlists, magnify , pan,crop and still full screen, change aspect ratios -  other than bs player ?

    The plugin is what it is: a browser plugin - it cannot act as a standalone player.
    To play local flv files you either need to
    download/install the standalone player (Projector) from http://www.adobe.com/support/flashplayer/downloads.html
    download/install Adobe Media Player http://www.adobe.com/products/mediaplayer/

  • How do I clear Blocked Plug-in on MacBook Pro 10.6.8?

    How do I clear Blocked Plug-in on MacBook Pro 10.6.8?

    By installing the current version of Flash Player. Adobe website.

Maybe you are looking for

  • XML Validation using custom DTD file

    Well, I thought that my problem is about to be a trivial one, but now, I don't think so. I have to develop XML-based protocol over HTTP. XML Document doesn't contain any reference to DTD, but I have some DTDs. I want to validate my XML messages in re

  • I downloaded an itunes song,shows dowdloaded,shows on my library,but wont play,whats up

    I downloaded an itunes song from itune store among many,shows downloaded at store,in my library,but wont let me play,whats up?

  • There is a standard cube for 0SEM_BCS_10?

    Hi guys. I`m willng to use 0SEM_BCS_10 to get data fo preparation to consolidation. But I didn't find a standard infocube to get these data that cames from 0SEM_BCS_10..it will be a "staging" cube where the BCS cube (0BCS_C10) will get data by data s

  • How can I tell which model ThinkCente​r desktop I have?

    Hi, I just inherited an IBM ThinkCentre at work.  Besides "IBM" and "ThinkCentre", I don't see any descriptive markings anywhere as to the model number or anything.  I want to see if there are any drivers/firmware (BIOS), etc. updates, but can't get

  • Snapshot of a colored table

    Hi, Does anyone know of any design pattern or of any standard class that can return a snapshot of a JTable? What I want to do is to create a small picture of a large table and then add the zooming and panning functionality to it, so that we can easil