Jump to content

NamedPipes only works on the same computer?!?


Recommended Posts

Hello again,

I found those codes that work on the same computer but not on a network, someone would know why?

I know the name in network \\.\pipe\pipename would have to be for example: \\VirtualPC\pipe\pipename, but does not work...

Client:

#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_Compression=0                                           ;Compression parameter 0-4  0=Low 2=normal 4=High. Default=2
#AutoIt3Wrapper_UseUpx=n                                                ;(Y/N) Compress output program. Default=Y

#include <NamedPipes.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GuiConstantsEx.au3>

Opt("MustDeclareVars", 1)

; ===============================================================================================================================
; Description ...: This is the client side of the pipe demo
; Author ........: Paul Campbell (PaulIA)
; Notes .........:
; ===============================================================================================================================

; ===============================================================================================================================
; Global constants
; ===============================================================================================================================

Global Const $BUFSIZE = 4096
Global Const $DEFCMD = "Message test"
Global Const $PIPE_NAME = "\\$\pipe\AutoIt3"
Global Const $ERROR_MORE_DATA = 234

; ===============================================================================================================================
; Global variables
; ===============================================================================================================================

Global $iEdit, $iMemo, $iSend, $iServer, $hPipe

; ===============================================================================================================================
; Main
; ===============================================================================================================================

CreateGUI()
MsgLoop()

; ===============================================================================================================================
; Creates a GUI for the client
; ===============================================================================================================================
Func CreateGUI()
    Local $hGUI, $iLabel1, $iLabel2

    $hGUI = GUICreate("Pipe Client", 500, 400, -1, -1, $WS_SIZEBOX)
    $iLabel1 = GUICtrlCreateLabel("Server:", 2, 14, 52, 20, $SS_RIGHT)
    $iServer = GUICtrlCreateEdit("<local>", 56, 10, 200, 20, $SS_LEFT)
    $iLabel2 = GUICtrlCreateLabel("Command:", 2, 36, 52, 20, $SS_RIGHT)
    $iEdit = GUICtrlCreateEdit($DEFCMD, 56, 32, 370, 20, $SS_LEFT)
    $iSend = GUICtrlCreateButton("Send", 430, 32, 60, 20)
    $iMemo = GUICtrlCreateEdit("", 0, 62, _WinAPI_GetClientWidth($hGUI), 332)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()
EndFunc   ;==>CreateGUI

; ===============================================================================================================================
; Logs an error message to the display
; ===============================================================================================================================
Func LogError($sMessage)
    $sMessage &= " (" & _WinAPI_GetLastErrorMessage() & ")"
    GUICtrlSetData($iMemo, GUICtrlRead($iMemo) & $sMessage & @CRLF)
EndFunc   ;==>LogError

; ===============================================================================================================================
; Logs a message to the display
; ===============================================================================================================================
Func LogMsg($sMessage)
    GUICtrlSetData($iMemo, GUICtrlRead($iMemo) & $sMessage & @CRLF)
EndFunc   ;==>LogMsg

; ===============================================================================================================================
; MsgLoop
; ===============================================================================================================================
Func MsgLoop()
    While True
        Switch GUIGetMsg()
            Case $iSend
                SendCmd()
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
EndFunc   ;==>MsgLoop

; ===============================================================================================================================
; This function opens a pipe to the server
; ===============================================================================================================================
Func OpenPipe()
    Local $sName, $sPipe
    ; Get pipe handle
    $sName = GUICtrlRead($iServer)
    If $sName = "<local>" Then $sName = "."
    $sPipe = StringReplace($PIPE_NAME, "$", $sName)
    $hPipe = _WinAPI_CreateFile($sPipe, 2, 6)
    If $hPipe <> 0 Then Return True
    LogError("OpenPipe failed")
    Return False
EndFunc   ;==>OpenPipe

; ===============================================================================================================================
; This function reads a message from the pipe
; ===============================================================================================================================
Func ReadMsg()
    Local $bSuccess, $iRead, $pBuffer, $tBuffer

    $tBuffer = DllStructCreate("char Text[4096]")
    $pBuffer = DllStructGetPtr($tBuffer)
    While 1
        $bSuccess = _WinAPI_ReadFile($hPipe, $pBuffer, $BUFSIZE, $iRead, 0)
        If $iRead = 0 Then ExitLoop
        If Not $bSuccess Or (@error = $ERROR_MORE_DATA) Then ExitLoop
        GUICtrlSetData($iMemo, "")
        GUICtrlSetData($iMemo, StringLeft(DllStructGetData($tBuffer, "Text"), $iRead), 1)
        ExitLoop
    WEnd
EndFunc   ;==>ReadMsg

; ===============================================================================================================================
; This function sends a command to the server
; ===============================================================================================================================
Func SendCmd()
    If OpenPipe() Then
        SetReadMode()
        WriteMsg(GUICtrlRead($iEdit))
        ReadMsg()
        _WinAPI_CloseHandle($hPipe)
    EndIf
EndFunc   ;==>SendCmd

; ===============================================================================================================================
; This function sets the pipe read mode
; ===============================================================================================================================
Func SetReadMode()
    If Not _NamedPipes_SetNamedPipeHandleState($hPipe, 1, 0, 0, 0) Then
        LogError("SetReadMode: _NamedPipes_SetNamedPipeHandleState failed")
    EndIf
EndFunc   ;==>SetReadMode

; ===============================================================================================================================
; This function writes a message to the pipe
; ===============================================================================================================================
Func WriteMsg($sMessage)
    Local $iMaxSize = 4096, $iBytes = 0, $iEnd, $iWritten, $iBuffer, $pBuffer, $tBuffer, $sSplitMsg
    #cs
    $iBytes = StringLen($sMessage)
    If $iBytes > $iMaxSize Then
        ;_MailSlotWrite($sMailSlot, "\\.\StartSplit")
        $iEnd = Int($iBytes / $iMaxSize)
        $iBytes = 0
        For $i = 0 To $iEnd
            $sSplitMsg = StringMid($sMessage, $i * $iMaxSize + 1, $iMaxSize)
            $iBuffer = StringLen($sSplitMsg) + 1
            $tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
            $pBuffer = DllStructGetPtr($tBuffer)
            DllStructSetData($tBuffer, "Text", $sSplitMsg)
            If Not _WinAPI_WriteFile($hPipe, $pBuffer, $iBuffer, $iWritten, 0) Then
                LogError("WriteMsg: _WinAPI_WriteFile failed")
            EndIf
            _WinAPI_CloseHandle($hPipe)
            OpenPipe()
            $iBytes += $iWritten
        Next
        ;_MailSlotWrite($sMailSlot, "\\.\EndSplit")
    Else
    #ce
        $iBuffer = StringLen($sMessage) + 1
        $tBuffer = DllStructCreate("char Text[" & $iBuffer & "]")
        $pBuffer = DllStructGetPtr($tBuffer)
        DllStructSetData($tBuffer, "Text", $sMessage)
        If Not _WinAPI_WriteFile($hPipe, $pBuffer, $iBuffer, $iWritten, 0) Then
            LogError("WriteMsg: _WinAPI_WriteFile failed")
        EndIf
        $iBytes = $iWritten
    ;EndIf

    Return $iBytes
EndFunc   ;==>WriteMsg

Server:

#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_Compression=0                                           ;Compression parameter 0-4  0=Low 2=normal 4=High. Default=2
#AutoIt3Wrapper_UseUpx=n                                                ;(Y/N) Compress output program. Default=Y

#include <NamedPipes.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Opt("MustDeclareVars", 1)

; ===============================================================================================================================
; Description ...: This is the server side of the pipe demo
; Author ........: Paul Campbell (PaulIA)
; Notes .........:
; ===============================================================================================================================

; ===============================================================================================================================
; Global constants
; ===============================================================================================================================

Global Const $DEBUGGING = False
Global Const $BUFSIZE = 4096
Global Const $PIPE_NAME = "\\.\pipe\AutoIt3"
Global Const $TIMEOUT = 5000
Global Const $WAIT_TIMEOUT = 258
Global Const $ERROR_IO_PENDING = 997
Global Const $ERROR_PIPE_CONNECTED = 535

; ===============================================================================================================================
; Global variables
; ===============================================================================================================================

Global $hEvent, $iMemo, $pOverlap, $tOverlap, $hPipe, $hReadPipe, $iState, $iToWrite

; ===============================================================================================================================
; Main
; ===============================================================================================================================

CreateGUI()
InitPipe()
MsgLoop()

; ===============================================================================================================================
; Creates a GUI for the server
; ===============================================================================================================================
Func CreateGUI()
    Local $hGUI

    $hGUI = GUICreate("Pipe Server", 500, 400, -1, -1, $WS_SIZEBOX)
    $iMemo = GUICtrlCreateEdit("", 0, 0, _WinAPI_GetClientWidth($hGUI), _WinAPI_GetClientHeight($hGUI))
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()
EndFunc   ;==>CreateGUI

; ===============================================================================================================================
; This function creates an instance of a named pipe
; ===============================================================================================================================
Func InitPipe()
    ; Create an event object for the instance
    $tOverlap = DllStructCreate($tagOVERLAPPED)
    $pOverlap = DllStructGetPtr($tOverlap)
    $hEvent = _WinAPI_CreateEvent()
    If $hEvent = 0 Then
        LogError("InitPipe ..........: API_CreateEvent failed")
        Return
    EndIf
    DllStructSetData($tOverlap, "hEvent", $hEvent)

    ; Create a named pipe
    $hPipe = _NamedPipes_CreateNamedPipe($PIPE_NAME, _ ; Pipe name
            2, _ ; The pipe is bi-directional
            2, _ ; Overlapped mode is enabled
            0, _ ; No security ACL flags
            1, _ ; Data is written to the pipe as a stream of messages
            1, _ ; Data is read from the pipe as a stream of messages
            0, _ ; Blocking mode is enabled
            1, _ ; Maximum number of instances
            $BUFSIZE, _ ; Output buffer size
            $BUFSIZE, _ ; Input buffer size
            $TIMEOUT, _ ; Client time out
            0) ; Default security attributes
    If $hPipe = -1 Then
        LogError("InitPipe ..........: _NamedPipes_CreateNamedPipe failed")
    Else
        ; Connect pipe instance to client
        ConnectClient()
    EndIf
EndFunc   ;==>InitPipe

; ===============================================================================================================================
; This function loops waiting for a connection event or the GUI to close
; ===============================================================================================================================
Func MsgLoop()
    Local $iEvent

    Do
        $iEvent = _WinAPI_WaitForSingleObject($hEvent, 0)
        If $iEvent < 0 Then
            LogError("MsgLoop ...........: _WinAPI_WaitForSingleObject failed")
            Exit
        EndIf
        If $iEvent = $WAIT_TIMEOUT Then ContinueLoop
        Debug("MsgLoop ...........: Instance signaled")

        Switch $iState
            Case 0
                CheckConnect()
            Case 1
                ReadRequest()
            Case 2
                CheckPending()
            Case 3
                RelayOutput()
        EndSwitch
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>MsgLoop

; ===============================================================================================================================
; Checks to see if the pending client connection has finished
; ===============================================================================================================================
Func CheckConnect()
    Local $iBytes

    ; Was the operation successful?
    If Not _WinAPI_GetOverlappedResult($hPipe, $pOverlap, $iBytes, False) Then
        LogError("CheckConnect ......: Connection failed")
        ReconnectClient()
    Else
        LogMsg("CheckConnect ......: Connected")
        $iState = 1
    EndIf
EndFunc   ;==>CheckConnect

; ===============================================================================================================================
; This function reads a request message from the client
; ===============================================================================================================================
Func ReadRequest()
    Local $pBuffer, $tBuffer, $iRead, $bSuccess;, $iToWrite

    $tBuffer = DllStructCreate("char Text[" & $BUFSIZE & "]")
    $pBuffer = DllStructGetPtr($tBuffer)
    $bSuccess = _WinAPI_ReadFile($hPipe, $pBuffer, $BUFSIZE, $iRead, $pOverlap)

    If $bSuccess and ($iRead <> 0) Then
        ; The read operation completed successfully
        Debug("ReadRequest .......: Read success")
    Else
        ; Wait for read Buffer to complete
        If Not _WinAPI_GetOverlappedResult($hPipe, $pOverlap, $iRead, True) Then
            LogError("ReadRequest .......: _WinAPI_GetOverlappedResult failed")
            ReconnectClient()
            Return
        Else
            ; Read the command from the pipe
            $bSuccess = _WinAPI_ReadFile($hPipe, $pBuffer, $BUFSIZE, $iRead, $pOverlap)
            If Not $bSuccess or ($iRead = 0) Then
                LogError("ReadRequest .......: _WinAPI_ReadFile failed")
                ReconnectClient()
                Return
            EndIf
        EndIf
    EndIf

    GUICtrlSetData($iMemo, DllStructGetData($tBuffer, "Text") & @CRLF, 1)

    ; Relay console output back to the client
    $iState = 3
EndFunc   ;==>ReadRequest

; ===============================================================================================================================
; This function relays the console output back to the client
; ===============================================================================================================================
Func CheckPending()
    Local $bSuccess, $iWritten

    $bSuccess = _WinAPI_GetOverlappedResult($hPipe, $pOverlap, $iWritten, False)
    If Not $bSuccess or ($iWritten <> $iToWrite) Then
        Debug("CheckPending ......: Write reconnecting")
        ReconnectClient()
    Else
        Debug("CheckPending ......: Write complete")
        $iState = 3
    EndIf
EndFunc   ;==>CheckPending

; ===============================================================================================================================
; This function relays the console output back to the client
; ===============================================================================================================================
Func RelayOutput()
    Local $pBuffer, $tBuffer, $sLine, $bSuccess, $iWritten

    $tBuffer = DllStructCreate("char Text[" & $BUFSIZE & "]")
    $pBuffer = DllStructGetPtr($tBuffer)
    ; Relay the data back to the client
    $sLine = "The message was received!"
    $iToWrite = StringLen($sLine)
    DllStructSetData($tBuffer, "Text", $sLine)
    ; Relay the data back to the client
    $bSuccess = _WinAPI_WriteFile($hPipe, $pBuffer, $iToWrite, $iWritten, $pOverlap)
    If $bSuccess and ($iWritten = $iToWrite) Then
        Debug("RelayOutput .......: Write success")
    Else
        If Not $bSuccess and (@error = $ERROR_IO_PENDING) Then
            Debug("RelayOutput .......: Write pending")
            $iState = 2
        Else
            ; An error occurred, disconnect from the client
            LogError("RelayOutput .......: Write failed")
            _WinAPI_FlushFileBuffers($hPipe)
            ReconnectClient()
        EndIf
    EndIf
EndFunc   ;==>RelayOutput

; ===============================================================================================================================
; This function is called to start an overlapped connection operation
; ===============================================================================================================================
Func ConnectClient()
    $iState = 0
    ; Start an overlapped connection
    If _NamedPipes_ConnectNamedPipe($hPipe, $pOverlap) Then
        LogError("ConnectClient .....: ConnectNamedPipe 1 failed")
    Else
        Switch @error
            ; The overlapped connection is in progress
            Case $ERROR_IO_PENDING
                Debug("ConnectClient .....: Pending")
                ; Client is already connected, so signal an event
            Case $ERROR_PIPE_CONNECTED
                LogMsg("ConnectClient .....: Connected")
                $iState = 1
                If Not _WinAPI_SetEvent(DllStructGetData($tOverlap, "hEvent")) Then
                    LogError("ConnectClient .....: SetEvent failed")
                EndIf
                ; Error occurred during the connection event
            Case Else
                LogError("ConnectClient .....: ConnectNamedPipe 2 failed")
        EndSwitch
    EndIf
EndFunc   ;==>ConnectClient

; ===============================================================================================================================
; Dumps debug information to the screen
; ===============================================================================================================================
Func Debug($sMessage)
    If $DEBUGGING Then LogMsg($sMessage)
EndFunc   ;==>Debug

; ===============================================================================================================================
; Logs an error message to the display
; ===============================================================================================================================
Func LogError($sMessage)
    $sMessage &= " (" & _WinAPI_GetLastErrorMessage() & ")"
    ConsoleWrite($sMessage & @LF)
EndFunc   ;==>LogError

; ===============================================================================================================================
; Logs a message to the display
; ===============================================================================================================================
Func LogMsg($sMessage)
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>LogMsg

; ===============================================================================================================================
; This function is called when an error occurs or when the client closes its handle to the pipe
; ===============================================================================================================================
Func ReconnectClient()
    ; Disconnect the pipe instance
    If Not _NamedPipes_DisconnectNamedPipe($hPipe) Then
        LogError("ReconnectClient ...: DisonnectNamedPipe failed")
        Return
    EndIf

    ; Connect to a new client
    ConnectClient()
EndFunc   ;==>ReconnectClient

I need that much of it to complete my program that I'll post once you've finished, thank anyone who can help me.

http://forum.autoitbrasil.com/ (AutoIt v3 Brazil!!!)

Somewhere Out ThereJames Ingram

somewh10.png

dropbo10.pngDownload Dropbox - Simplify your life!
Your virtual HD wherever you go, anywhere!

Link to comment
Share on other sites

In the client, change

Global Const $PIPE_NAME = "\\$\pipe\AutoIt3"

to

Global Const $PIPE_NAME = "\\.\pipe\AutoIt3"

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to comment
Share on other sites

In the client, change

Global Const $PIPE_NAME = "\\$\pipe\AutoIt3"

to

Global Const $PIPE_NAME = "\\.\pipe\AutoIt3"

??

See:

; ===============================================================================================================================
; This function opens a pipe to the server
; ===============================================================================================================================
Func OpenPipe()
    Local $sName, $sPipe
    ; Get pipe handle
    $sName = GUICtrlRead($iServer)
    If $sName = "<local>" Then $sName = "."
    $sPipe = StringReplace($PIPE_NAME, "$", $sName)
    $hPipe = _WinAPI_CreateFile($sPipe, 2, 6)
    If $hPipe <> 0 Then Return True
    LogError("OpenPipe failed")
    Return False
EndFunc   ;==>OpenPipe

http://forum.autoitbrasil.com/ (AutoIt v3 Brazil!!!)

Somewhere Out ThereJames Ingram

somewh10.png

dropbo10.pngDownload Dropbox - Simplify your life!
Your virtual HD wherever you go, anywhere!

Link to comment
Share on other sites

In my view, the dollar sign is just a placeholder and is invalid per se, except when you have a server named '$' if that's legitimate at all (?). See MSDN Named Pipes Names page.

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to comment
Share on other sites

In my view, the dollar sign is just a placeholder and is invalid per se, except when you have a server named '$' if that's legitimate at all (?). See MSDN Named Pipes Names page.

I think you still do not understand this part, I will join the two for you to understand better:

; ===============================================================================================================================
; Creates a GUI for the client
; ===============================================================================================================================
Func CreateGUI()
    Local $hGUI, $iLabel1, $iLabel2

    $hGUI = GUICreate("Pipe Client", 500, 400, -1, -1, $WS_SIZEBOX)
    $iLabel1 = GUICtrlCreateLabel("Server:", 2, 14, 52, 20, $SS_RIGHT)
    $iServer = GUICtrlCreateEdit("<local>", 56, 10, 200, 20, $SS_LEFT)
    $iLabel2 = GUICtrlCreateLabel("Command:", 2, 36, 52, 20, $SS_RIGHT)
    $iEdit = GUICtrlCreateEdit($DEFCMD, 56, 32, 370, 20, $SS_LEFT)
    $iSend = GUICtrlCreateButton("Send", 430, 32, 60, 20)
    $iMemo = GUICtrlCreateEdit("", 0, 62, _WinAPI_GetClientWidth($hGUI), 332)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()
EndFunc   ;==>CreateGUI

;(.....)

; ===============================================================================================================================
; This function opens a pipe to the server
; ===============================================================================================================================
Func OpenPipe()
    Local $sName, $sPipe
    ; Get pipe handle
    $sName = GUICtrlRead($iServer)
    If $sName = "<local>" Then $sName = "."
    $sPipe = StringReplace($PIPE_NAME, "$", $sName)
    $hPipe = _WinAPI_CreateFile($sPipe, 2, 6)
    If $hPipe <> 0 Then Return True
    LogError("OpenPipe failed")
    Return False
EndFunc   ;==>OpenPipe

Edit: Have you tested it?

Edited by jscript

http://forum.autoitbrasil.com/ (AutoIt v3 Brazil!!!)

Somewhere Out ThereJames Ingram

somewh10.png

dropbo10.pngDownload Dropbox - Simplify your life!
Your virtual HD wherever you go, anywhere!

Link to comment
Share on other sites

Oh yes, you're right. I've been investigating this long time ago and had to rewrite/change some stuff to have this pair work on a (V)LAN. Unfortunately, I don't have a working version anymore right now.

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to comment
Share on other sites

Oh yes, you're right. I've been investigating this long time ago and had to rewrite/change some stuff to have this pair work on a (V)LAN. Unfortunately, I don't have a working version anymore right now.

Thank you for your replies,

I can not understand why does not work across the network...

Already gave away the code many times and I could not find a reason not to work!

http://forum.autoitbrasil.com/ (AutoIt v3 Brazil!!!)

Somewhere Out ThereJames Ingram

somewh10.png

dropbo10.pngDownload Dropbox - Simplify your life!
Your virtual HD wherever you go, anywhere!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...