#ifndef _CSMBPlugin_
#include "LMBDiscoverer.h"
#include "CNSLPlugin.h"
#define kProtocolPrefixPlainStr "SMB"
#define kProtocolPrefixStr "/SMB"
#define kProtocolPrefixSlashStr "/SMB/"
#define kScopePrefixStr "Network Neighborhood(DS)"
#define kScopePrefixSlashStr "Network Neighborhood(DS)/"
#define kReadSMBConfigData 'read'
#define kWriteSMBConfigData 'writ'
#define kReadSMBConfigXMLDataSize 'xmls'
#define kReadSMBConfigXMLData 'rxml'
#define kWriteSMBConfigXMLData 'wxml'
#define kNMBLookupToolPath "/usr/bin/nmblookup"
#define kServiceTypeString "smb"
#define kTemplateConfFilePath "/etc/smb.conf.template"
#define kTempConfFilePath "/var/run/smb.conf.temp"
#define kConfFilePath "/etc/smb.conf"
#define kBrowsingConfFilePath "/var/run/smbbrowsing.conf"
#define kUseWINSURLFilePath "/etc/smb_use_wins_url.conf"
class CSMBPlugin : public CNSLPlugin
{
public:
CSMBPlugin ( void );
virtual ~CSMBPlugin ( void );
virtual sInt32 InitPlugin ( void );
Boolean AreWeRunningOnXServer ( void );
virtual void ActivateSelf ( void );
virtual void DeActivateSelf ( void );
virtual Boolean PluginSupportsServiceType ( const char* serviceType );
void RegisterForComputerNameChanges ( void );
void DeregisterForComputerNameChanges ( void );
void HandleComputerNameChange ( void );
uInt32 fSignature;
const char* GetWinsServer ( void ) { return mWINSServer; }
void NodeLookupIsCurrent ( void );
LMBDiscoverer* OurLMBDiscoverer ( void ) { return mLMBDiscoverer; }
void ClearLMBForWorkgroup ( CFStringRef workgroupRef, CFStringRef lmbNameRef );
CFStringRef GetComputerNameChangeKey ( void ) { return mComputerNameChangeKey; }
void ResetBroadcastThrottle ( void );
Boolean OKToDoServiceLookupInWorkgroup ( CFStringRef workgroupRef );
void BroadcastServiceLookupFailedInWorkgroup ( CFStringRef workgroupRef );
void BroadcastServiceLookupSucceededInWorkgroup ( CFStringRef workgroupRef );
protected:
void WriteWorkgroupToFile ( FILE* fp );
void WriteNetBIOSTrackingCommentToFile ( FILE* fp );
void WriteNetBIOSNameToFile ( FILE* fp );
void WriteCommentToFile ( FILE* fp );
void WriteWINSToFile ( FILE* fp );
void WriteCodePageToFile ( FILE* fp );
void WriteUnixCharsetToFile ( FILE* fp );
void WriteDisplayCharsetToFile ( FILE* fp );
void ReadConfigFile ( void );
void WriteToConfigFile ( const char* pathToConfigFile );
void CheckAndHandleIfConfigFileChanged ( void );
void SaveKnownLMBsToDisk ( void );
void ReadKnownLMBsFromDisk ( void );
virtual sInt32 DoPlugInCustomCall ( sDoPlugInCustomCall *inData );
virtual sInt32 HandleNetworkTransition ( sHeader *inData );
virtual void ClearOutStaleNodes ( void ) {}
sInt32 FillOutCurrentStateWithXML ( sDoPlugInCustomCall *inData, Boolean sizeOnly );
sInt32 SaveNewStateFromXML ( sDoPlugInCustomCall *inData );
sInt32 FillOutCurrentState ( sDoPlugInCustomCall *inData );
sInt32 SaveNewState ( sDoPlugInCustomCall *inData );
CFArrayRef CreateListOfWorkgroups ( void );
void* MakeDataBufferOfWorkgroups ( UInt32* dataLen );
virtual CFStringRef GetBundleIdentifier ( void );
virtual const char* GetProtocolPrefixString ( void ); virtual const char* GetLocalNodeString ( void ); virtual Boolean IsLocalNode ( const char *inNode );
virtual UInt32 GetTimeBetweenNodeLookups ( void );
virtual void NewNodeLookup ( void ); virtual void NewServiceLookup ( char* serviceType, CNSLDirNodeRep* nodeDirRep );
virtual Boolean OKToOpenUnPublishedNode ( const char* parentNodeName );
private:
void LockNodeState ( void ) { pthread_mutex_lock( &mNodeStateLock ); }
void UnLockNodeState ( void ) { pthread_mutex_unlock( &mNodeStateLock ); }
pthread_mutex_t mNodeStateLock;
void LockBroadcastThrottler ( void ) { pthread_mutex_lock( &mBroadcastThrottlerLock ); }
void UnLockBroadcastThrottler ( void ) { pthread_mutex_unlock( &mBroadcastThrottlerLock ); }
pthread_mutex_t mBroadcastThrottlerLock;
Boolean mNodeListIsCurrent;
Boolean mNodeSearchInProgress;
Boolean mUseWINSURL;
char* mLocalNodeString;
char* mWINSServer;
char* mNetBIOSName;
char* mCommentFieldString;
Boolean mUseComputerNameTracking;
CFMutableDictionaryRef mBroadcastThrottler;
Boolean mConfFileCodePageAlreadyModifiedByDS;
Boolean mInitialSearch;
Boolean mNeedFreshLookup;
Boolean mCurrentSearchCanceled;
UInt32 mTimeBetweenLookups;
time_t mConfFileModTime;
LMBDiscoverer* mLMBDiscoverer;
SCDynamicStoreRef mSCRef;
CFStringRef mComputerNameChangeKey;
Boolean mRunningOnXServer;
};
#endif